Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 37 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transmute Claim ... | 19888177 | 108 days ago | IN | 0 ETH | 0.00027272 | ||||
Transmute Claim ... | 19888175 | 108 days ago | IN | 0 ETH | 0.00077055 | ||||
Stake | 19888084 | 108 days ago | IN | 0 ETH | 0.00059187 | ||||
Transmute Claim ... | 19788558 | 122 days ago | IN | 0 ETH | 0.00084749 | ||||
Stake | 19788553 | 122 days ago | IN | 0 ETH | 0.00071293 | ||||
Force Transmute | 19788509 | 122 days ago | IN | 0 ETH | 0.00088869 | ||||
Transmute Claim ... | 19658573 | 140 days ago | IN | 0 ETH | 0.00094581 | ||||
Force Transmute | 19658549 | 140 days ago | IN | 0 ETH | 0.00075649 | ||||
Stake | 19658278 | 140 days ago | IN | 0 ETH | 0.00075936 | ||||
Force Transmute | 19356700 | 183 days ago | IN | 0 ETH | 0.01075359 | ||||
Stake | 19304244 | 190 days ago | IN | 0 ETH | 0.00298901 | ||||
Force Transmute | 19260587 | 196 days ago | IN | 0 ETH | 0.00271206 | ||||
Force Transmute | 19260568 | 196 days ago | IN | 0 ETH | 0.00227753 | ||||
Force Transmute | 19260564 | 196 days ago | IN | 0 ETH | 0.00411761 | ||||
Force Transmute | 19260559 | 196 days ago | IN | 0 ETH | 0.00235432 | ||||
Unstake | 19260520 | 196 days ago | IN | 0 ETH | 0.00252048 | ||||
Stake | 16618527 | 567 days ago | IN | 0 ETH | 0.0023428 | ||||
Stake | 16169950 | 630 days ago | IN | 0 ETH | 0.00250439 | ||||
Transmute Claim ... | 15507299 | 723 days ago | IN | 0 ETH | 0.00141651 | ||||
Unstake | 15217062 | 769 days ago | IN | 0 ETH | 0.00075143 | ||||
Stake | 15210330 | 770 days ago | IN | 0 ETH | 0.00054865 | ||||
Unstake | 15164320 | 777 days ago | IN | 0 ETH | 0.00128785 | ||||
Stake | 15074200 | 791 days ago | IN | 0 ETH | 0.00240447 | ||||
Transmute And Cl... | 14866388 | 827 days ago | IN | 0 ETH | 0.00254002 | ||||
Transmute And Cl... | 14866279 | 827 days ago | IN | 0 ETH | 0.0018178 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MigratableLinkTransmuterV2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-18 */ // Sources flattened with hardhat v2.6.0 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @openzeppelin/contracts/GSN/[email protected] pragma solidity >=0.6.0 <0.8.0; // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/math/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/interfaces/IERC20Burnable.sol pragma solidity ^0.6.8; interface IERC20Burnable is IERC20 { function burn(uint256 amount) external; function burnFrom(address account, uint256 amount) external; } // File contracts/interfaces/ITransmuter.sol pragma solidity ^0.6.12; interface ITransmuter { function distribute (address origin, uint256 amount) external; } // File hardhat/[email protected] pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } } // File @openzeppelin/contracts/math/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File contracts/interfaces/IDetailedERC20.sol pragma solidity ^0.6.12; interface IDetailedERC20 is IERC20 { function name() external returns (string memory); function symbol() external returns (string memory); function decimals() external returns (uint8); } // File contracts/interfaces/IVaultAdapterV2WithIndirection.sol pragma solidity ^0.6.12; /// Interface for all Vault Adapter implementations. interface IVaultAdapterV2WithIndirection { /// @dev Gets the token that the adapter accepts. function token() external view returns (IDetailedERC20); /// @dev The total value of the assets deposited into the vault. function totalValue() external view returns (uint256); /// @dev Deposits funds into the vault. /// /// @param _amount the amount of funds to deposit. function deposit(uint256 _amount) external; /// @dev Attempts to withdraw funds from the wrapped vault. /// /// The amount withdrawn to the recipient may be less than the amount requested. /// /// @param _recipient the recipient of the funds. /// @param _amount the amount of funds to withdraw. function withdraw(address _recipient, uint256 _amount, bool _isHarvest) external; /// @dev Attempts to withdraw vault tokens from the wrapped vault. /// /// The amount withdrawn to the recipient may be less than the amount requested. /// /// @param _recipient the recipient of the vault tokens. /// @param _amount the amount of vault tokens to withdraw. function indirectWithdraw(address _recipient, uint256 _amount) external; } // File contracts/libraries/alchemist/VaultV2WithIndirection.sol pragma solidity ^0.6.12; /// @title BUSDVaultV2WithIndirection /// /// @dev A library which provides the Vault data struct and associated functions. library VaultV2WithIndirection { using VaultV2WithIndirection for Data; using VaultV2WithIndirection for List; using SafeMath for uint256; struct Data { IVaultAdapterV2WithIndirection adapter; uint256 totalDeposited; } struct List { Data[] elements; } /// @dev Gets the total amount of assets deposited in the vault. /// /// @return the total assets. function totalValue(Data storage _self) internal view returns (uint256) { return _self.adapter.totalValue(); } /// @dev Gets the token that the vault accepts. /// /// @return the accepted token. function token(Data storage _self) internal view returns (IDetailedERC20) { return IDetailedERC20(_self.adapter.token()); } /// @dev Deposits funds from the caller into the vault. /// /// @param _amount the amount of funds to deposit. function deposit(Data storage _self, uint256 _amount) internal returns (uint256) { // Push the token that the vault accepts onto the stack to save gas. IDetailedERC20 _token = _self.token(); _token.transfer(address(_self.adapter), _amount); _self.adapter.deposit(_amount); _self.totalDeposited = _self.totalDeposited.add(_amount); return _amount; } /// @dev Deposits the entire token balance of the caller into the vault. function depositAll(Data storage _self) internal returns (uint256) { IDetailedERC20 _token = _self.token(); return _self.deposit(_token.balanceOf(address(this))); } /// @dev Withdraw deposited funds from the vault. /// /// @param _recipient the account to withdraw the tokens to. /// @param _amount the amount of tokens to withdraw. function withdraw(Data storage _self, address _recipient, uint256 _amount, bool _isHarvest) internal returns (uint256, uint256) { (uint256 _withdrawnAmount, uint256 _decreasedValue) = _self.directWithdraw(_recipient, _amount, _isHarvest); _self.totalDeposited = _self.totalDeposited.sub(_decreasedValue); return (_withdrawnAmount, _decreasedValue); } /// @dev Directly withdraw deposited funds from the vault. /// /// @param _recipient the account to withdraw the tokens to. /// @param _amount the amount of tokens to withdraw. function directWithdraw(Data storage _self, address _recipient, uint256 _amount, bool _isHarvest) internal returns (uint256, uint256) { IDetailedERC20 _token = _self.token(); uint256 _startingBalance = _token.balanceOf(_recipient); uint256 _startingTotalValue = _self.totalValue(); _self.adapter.withdraw(_recipient, _amount, _isHarvest); uint256 _endingBalance = _token.balanceOf(_recipient); uint256 _withdrawnAmount = _endingBalance.sub(_startingBalance); uint256 _endingTotalValue = _self.totalValue(); uint256 _actualDecreaseValue = 0; if (_startingTotalValue > _endingTotalValue) { _actualDecreaseValue = _startingTotalValue.sub(_endingTotalValue); } if (_isHarvest) { return (_withdrawnAmount, _actualDecreaseValue); } uint256 _decreasedValue = _amount; if (_actualDecreaseValue > _amount) { _decreasedValue = _actualDecreaseValue; } return (_withdrawnAmount, _decreasedValue); } /// @dev Indirectly withdraw deposited funds from the vault. /// /// @param _recipient the account to withdraw the tokens to. /// @param _amount the amount of tokens to withdraw. function indirectWithdraw(Data storage _self, address _recipient, uint256 _amount) internal returns (uint256, uint256) { IDetailedERC20 _token = _self.token(); uint256 _startingBalance = _token.balanceOf(_recipient); uint256 _startingTotalValue = _self.totalValue(); _self.adapter.indirectWithdraw(_recipient, _amount); uint256 _endingBalance = _token.balanceOf(_recipient); uint256 _withdrawnAmount = _endingBalance.sub(_startingBalance); uint256 _endingTotalValue = _self.totalValue(); uint256 _decreasedValue = _startingTotalValue.sub(_endingTotalValue); return (_withdrawnAmount, _decreasedValue); } /// @dev Withdraw all the deposited funds from the vault. /// /// @param _recipient the account to withdraw the tokens to. function withdrawAll(Data storage _self, address _recipient) internal returns (uint256, uint256) { return _self.withdraw(_recipient, _self.totalDeposited, false); } /// @dev Harvests yield from the vault. /// /// @param _recipient the account to withdraw the harvested yield to. function harvest(Data storage _self, address _recipient) internal returns (uint256, uint256) { if (_self.totalValue() <= _self.totalDeposited) { return (0, 0); } uint256 _withdrawAmount = _self.totalValue().sub(_self.totalDeposited); return _self.indirectWithdraw(_recipient, _withdrawAmount); } /// @dev Adds a element to the list. /// /// @param _element the element to add. function push(List storage _self, Data memory _element) internal { _self.elements.push(_element); } /// @dev Gets a element from the list. /// /// @param _index the index in the list. /// /// @return the element at the specified index. function get(List storage _self, uint256 _index) internal view returns (Data storage) { return _self.elements[_index]; } /// @dev Gets the last element in the list. /// /// This function will revert if there are no elements in the list. /// /// @return the last element in the list. function last(List storage _self) internal view returns (Data storage) { return _self.elements[_self.lastIndex()]; } /// @dev Gets the index of the last element in the list. /// /// This function will revert if there are no elements in the list. /// /// @return the index of the last element. function lastIndex(List storage _self) internal view returns (uint256) { uint256 _length = _self.length(); return _length.sub(1, "Vault.List: empty"); } /// @dev Gets the number of elements in the list. /// /// @return the number of elements. function length(List storage _self) internal view returns (uint256) { return _self.elements.length; } } // File contracts/MigratableLinkTransmuterV2.sol pragma solidity 0.6.12; /** * @dev Implementation of the {IERC20Burnable} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20Burnable-approve}. */ contract MigratableLinkTransmuterV2 is Context { using SafeMath for uint256; using SafeERC20 for IERC20Burnable; using Address for address; using VaultV2WithIndirection for VaultV2WithIndirection.Data; using VaultV2WithIndirection for VaultV2WithIndirection.List; address public constant ZERO_ADDRESS = address(0); uint256 public TRANSMUTATION_PERIOD; address public waToken; address public token; mapping(address => uint256) public depositedWaTokens; mapping(address => uint256) public tokensInBucket; mapping(address => uint256) public realisedTokens; mapping(address => uint256) public lastDividendPoints; mapping(address => bool) public userIsKnown; mapping(uint256 => address) public userList; uint256 public nextUser; uint256 public totalSupplyWaTokens; uint256 public buffer; uint256 public lastDepositBlock; ///@dev values needed to calculate the distribution of base asset in proportion for waTokens staked uint256 public pointMultiplier = 10e18; uint256 public totalDividendPoints; uint256 public unclaimedDividends; /// @dev alchemist addresses whitelisted mapping (address => bool) public whiteList; /// @dev The threshold above which excess funds will be deployed to yield farming activities uint256 public plantableThreshold = 8000000000000000000000; // 500k /// @dev The % margin to trigger planting or recalling of funds uint256 public plantableMargin = 5; /// @dev The address of the account which currently has administrative capabilities over this contract. address public governance; /// @dev The address of the pending governance. address public pendingGovernance; /// @dev The address of the account which can perform emergency activities address public sentinel; /// @dev A flag indicating if deposits and flushes should be halted and if all parties should be able to recall /// from the active vault. bool public pause; /// @dev The address of the contract which will receive fees. address public rewards; /// @dev A list of all of the vaults. The last element of the list is the vault that is currently being used for /// deposits and withdraws. VaultV2WithIndirection before the last element are considered inactive and are expected to be cleared. VaultV2WithIndirection.List private _vaults; event GovernanceUpdated( address governance ); event PendingGovernanceUpdated( address pendingGovernance ); event SentinelUpdated( address sentinel ); event TransmuterPeriodUpdated( uint256 newTransmutationPeriod ); event TokenClaimed( address claimant, address token, uint256 amountClaimed ); event WaTokenStaked( address staker, uint256 amountStaked ); event WaTokenUnstaked( address staker, uint256 amountUnstaked ); event Transmutation( address transmutedTo, uint256 amountTransmuted ); event ForcedTransmutation( address transmutedBy, address transmutedTo, uint256 amountTransmuted ); event Distribution( address origin, uint256 amount ); event WhitelistSet( address whitelisted, bool state ); event PlantableThresholdUpdated( uint256 plantableThreshold ); event PlantableMarginUpdated( uint256 plantableMargin ); event ActiveVaultUpdated( IVaultAdapterV2WithIndirection indexed adapter ); event PauseUpdated( bool status ); event FundsRecalled( uint256 indexed vaultId, uint256 withdrawnAmount, uint256 decreasedValue ); event FundsHarvested( uint256 withdrawnAmount, uint256 decreasedValue ); event RewardsUpdated( address treasury ); event MigrationComplete( address migrateTo, uint256 fundsMigrated ); constructor(address _waToken, address _token, address _governance) public { require(_governance != ZERO_ADDRESS, "MigratableLinkTransmuterV2: 0 gov"); governance = _governance; waToken = _waToken; token = _token; TRANSMUTATION_PERIOD = 50; } ///@return displays the user's share of the pooled waTokens. function dividendsOwing(address account) public view returns (uint256) { uint256 newDividendPoints = totalDividendPoints.sub(lastDividendPoints[account]); return depositedWaTokens[account].mul(newDividendPoints).div(pointMultiplier); } ///@dev modifier to fill the bucket and keep bookkeeping correct incase of increase/decrease in shares modifier updateAccount(address account) { uint256 owing = dividendsOwing(account); if (owing > 0) { unclaimedDividends = unclaimedDividends.sub(owing); tokensInBucket[account] = tokensInBucket[account].add(owing); } lastDividendPoints[account] = totalDividendPoints; _; } ///@dev modifier add users to userlist. Users are indexed in order to keep track of when a bond has been filled modifier checkIfNewUser() { if (!userIsKnown[msg.sender]) { userList[nextUser] = msg.sender; userIsKnown[msg.sender] = true; nextUser++; } _; } ///@dev run the phased distribution of the buffered funds modifier runPhasedDistribution() { uint256 _lastDepositBlock = lastDepositBlock; uint256 _currentBlock = block.number; uint256 _toDistribute = 0; uint256 _buffer = buffer; // check if there is something in bufffer if (_buffer > 0) { // NOTE: if last deposit was updated in the same block as the current call // then the below logic gates will fail //calculate diffrence in time uint256 deltaTime = _currentBlock.sub(_lastDepositBlock); // distribute all if bigger than timeframe if(deltaTime >= TRANSMUTATION_PERIOD) { _toDistribute = _buffer; } else { //needs to be bigger than 0 cuzz solidity no decimals if(_buffer.mul(deltaTime) > TRANSMUTATION_PERIOD) { _toDistribute = _buffer.mul(deltaTime).div(TRANSMUTATION_PERIOD); } } // factually allocate if any needs distribution if(_toDistribute > 0){ // remove from buffer buffer = _buffer.sub(_toDistribute); // increase the allocation increaseAllocations(_toDistribute); } } // current timeframe is now the last lastDepositBlock = _currentBlock; _; } /// @dev A modifier which checks if whitelisted for minting. modifier onlyWhitelisted() { require(whiteList[msg.sender], "MigratableLinkTransmuterV2: !whitelisted"); _; } /// @dev Checks that the current message sender or caller is the governance address. /// /// modifier onlyGov() { require(msg.sender == governance, "MigratableLinkTransmuterV2: !governance"); _; } ///@dev set the TRANSMUTATION_PERIOD variable /// /// sets the length (in blocks) of one full distribution phase function setTransmutationPeriod(uint256 newTransmutationPeriod) public onlyGov() { TRANSMUTATION_PERIOD = newTransmutationPeriod; emit TransmuterPeriodUpdated(TRANSMUTATION_PERIOD); } ///@dev claims the base token after it has been transmuted /// ///This function reverts if there is no realisedToken balance function claim() public { address sender = msg.sender; require(realisedTokens[sender] > 0, "MigratableLinkTransmuterV2: no realisedToken balance for sender"); uint256 value = realisedTokens[sender]; realisedTokens[sender] = 0; ensureSufficientFundsExistLocally(value); IERC20Burnable(token).transfer(sender, value); emit TokenClaimed(sender, token, value); } ///@dev Withdraws staked waTokens from the transmuter /// /// This function reverts if you try to draw more tokens than you deposited /// ///@param amount the amount of waTokens to unstake function unstake(uint256 amount) public updateAccount(msg.sender) { // by calling this function before transmuting you forfeit your gained allocation address sender = msg.sender; require(depositedWaTokens[sender] >= amount, "MigratableLinkTransmuterV2: unstake amount exceeds deposited amount"); depositedWaTokens[sender] = depositedWaTokens[sender].sub(amount); totalSupplyWaTokens = totalSupplyWaTokens.sub(amount); IERC20Burnable(waToken).safeTransfer(sender, amount); emit WaTokenUnstaked(sender, amount); } ///@dev Deposits waTokens into the transmuter /// ///@param amount the amount of waTokens to stake function stake(uint256 amount) public runPhasedDistribution() updateAccount(msg.sender) checkIfNewUser() { require(!pause, "MigratableLinkTransmuterV2: emergency pause enabled"); // requires approval of waToken first address sender = msg.sender; //require tokens transferred in; IERC20Burnable(waToken).safeTransferFrom(sender, address(this), amount); totalSupplyWaTokens = totalSupplyWaTokens.add(amount); depositedWaTokens[sender] = depositedWaTokens[sender].add(amount); emit WaTokenStaked(sender, amount); } /// @dev Converts the staked waTokens to the base tokens in amount of the sum of pendingdivs and tokensInBucket /// /// once the waToken has been converted, it is burned, and the base token becomes realisedTokens which can be recieved using claim() /// /// reverts if there are no pendingdivs or tokensInBucket function transmute() public runPhasedDistribution() updateAccount(msg.sender) { address sender = msg.sender; uint256 pendingz = tokensInBucket[sender]; uint256 diff; require(pendingz > 0, "MigratableLinkTransmuterV2: need to have pending in bucket"); tokensInBucket[sender] = 0; // check bucket overflow if (pendingz > depositedWaTokens[sender]) { diff = pendingz.sub(depositedWaTokens[sender]); // remove overflow pendingz = depositedWaTokens[sender]; } // decrease watokens depositedWaTokens[sender] = depositedWaTokens[sender].sub(pendingz); // BURN WATOKENS IERC20Burnable(waToken).burn(pendingz); // adjust total totalSupplyWaTokens = totalSupplyWaTokens.sub(pendingz); // reallocate overflow increaseAllocations(diff); // add payout realisedTokens[sender] = realisedTokens[sender].add(pendingz); emit Transmutation(sender, pendingz); } /// @dev Executes transmute() on another account that has had more base tokens allocated to it than waTokens staked. /// /// The caller of this function will have the surlus base tokens credited to their tokensInBucket balance, rewarding them for performing this action /// /// This function reverts if the address to transmute is not over-filled. /// /// @param toTransmute address of the account you will force transmute. function forceTransmute(address toTransmute) public runPhasedDistribution() updateAccount(msg.sender) updateAccount(toTransmute) checkIfNewUser() { //load into memory address sender = msg.sender; uint256 pendingz = tokensInBucket[toTransmute]; // check restrictions require( pendingz > depositedWaTokens[toTransmute], "MigratableLinkTransmuterV2: !overflow" ); // empty bucket tokensInBucket[toTransmute] = 0; // calculaate diffrence uint256 diff = pendingz.sub(depositedWaTokens[toTransmute]); // remove overflow pendingz = depositedWaTokens[toTransmute]; // decrease waTokens depositedWaTokens[toTransmute] = 0; // BURN WATOKENS IERC20Burnable(waToken).burn(pendingz); // adjust total totalSupplyWaTokens = totalSupplyWaTokens.sub(pendingz); // reallocate overflow tokensInBucket[sender] = tokensInBucket[sender].add(diff); // add payout realisedTokens[toTransmute] = realisedTokens[toTransmute].add(pendingz); uint256 value = realisedTokens[toTransmute]; ensureSufficientFundsExistLocally(value); // force payout of realised tokens of the toTransmute address realisedTokens[toTransmute] = 0; IERC20Burnable(token).transfer(toTransmute, value); emit ForcedTransmutation(sender, toTransmute, value); } /// @dev Transmutes and unstakes all waTokens /// /// This function combines the transmute and unstake functions for ease of use function exit() public { transmute(); uint256 toWithdraw = depositedWaTokens[msg.sender]; unstake(toWithdraw); } /// @dev Transmutes and claims all converted base tokens. /// /// This function combines the transmute and claim functions while leaving your remaining WaTokens staked. function transmuteAndClaim() public { transmute(); claim(); } /// @dev Transmutes, claims base tokens, and withdraws waTokens. /// /// This function helps users to exit the transmuter contract completely after converting their WaTokens to the base pair. function transmuteClaimAndWithdraw() public { transmute(); claim(); uint256 toWithdraw = depositedWaTokens[msg.sender]; unstake(toWithdraw); } /// @dev Distributes the base token proportionally to all waToken stakers. /// /// This function is meant to be called by the Alchemist contract for when it is sending yield to the transmuter. /// Anyone can call this and add funds, idk why they would do that though... /// /// @param origin the account that is sending the tokens to be distributed. /// @param amount the amount of base tokens to be distributed to the transmuter. function distribute(address origin, uint256 amount) public onlyWhitelisted() runPhasedDistribution() { require(!pause, "MigratableLinkTransmuterV2: emergency pause enabled"); IERC20Burnable(token).transferFrom(origin, address(this), amount); buffer = buffer.add(amount); _plantOrRecallExcessFunds(); emit Distribution(origin, amount); } /// @dev Allocates the incoming yield proportionally to all waToken stakers. /// /// @param amount the amount of base tokens to be distributed in the transmuter. function increaseAllocations(uint256 amount) internal { if(totalSupplyWaTokens > 0 && amount > 0) { totalDividendPoints = totalDividendPoints.add( amount.mul(pointMultiplier).div(totalSupplyWaTokens) ); unclaimedDividends = unclaimedDividends.add(amount); } else { buffer = buffer.add(amount); } } /// @dev Gets the status of a user's staking position. /// /// The total amount allocated to a user is the sum of pendingdivs and inbucket. /// /// @param user the address of the user you wish to query. /// /// returns user status function userInfo(address user) public view returns ( uint256 depositedAl, uint256 pendingdivs, uint256 inbucket, uint256 realised ) { uint256 _depositedAl = depositedWaTokens[user]; uint256 _toDistribute = buffer.mul(block.number.sub(lastDepositBlock)).div(TRANSMUTATION_PERIOD); if(block.number.sub(lastDepositBlock) > TRANSMUTATION_PERIOD){ _toDistribute = buffer; } uint256 _pendingdivs = 0; if (totalSupplyWaTokens > 0) { _pendingdivs = _toDistribute.mul(depositedWaTokens[user]).div(totalSupplyWaTokens); } uint256 _inbucket = tokensInBucket[user].add(dividendsOwing(user)); uint256 _realised = realisedTokens[user]; return (_depositedAl, _pendingdivs, _inbucket, _realised); } /// @dev Gets the status of multiple users in one call /// /// This function is used to query the contract to check for /// accounts that have overfilled positions in order to check /// who can be force transmuted. /// /// @param from the first index of the userList /// @param to the last index of the userList /// /// returns the userList with their staking status in paginated form. function getMultipleUserInfo(uint256 from, uint256 to) public view returns (address[] memory theUserList, uint256[] memory theUserData) { uint256 i = from; uint256 delta = to - from; address[] memory _theUserList = new address[](delta); //user uint256[] memory _theUserData = new uint256[](delta * 2); //deposited-bucket uint256 y = 0; uint256 _toDistribute = buffer.mul(block.number.sub(lastDepositBlock)).div(TRANSMUTATION_PERIOD); if(block.number.sub(lastDepositBlock) > TRANSMUTATION_PERIOD){ _toDistribute = buffer; } for (uint256 x = 0; x < delta; x += 1) { _theUserList[x] = userList[i]; _theUserData[y] = depositedWaTokens[userList[i]]; _theUserData[y + 1] = dividendsOwing(userList[i]).add(tokensInBucket[userList[i]]).add(_toDistribute.mul(depositedWaTokens[userList[i]]).div(totalSupplyWaTokens)); y += 2; i += 1; } return (_theUserList, _theUserData); } /// @dev Gets info on the buffer /// /// This function is used to query the contract to get the /// latest state of the buffer /// /// @return _toDistribute the amount ready to be distributed /// @return _deltaBlocks the amount of time since the last phased distribution /// @return _buffer the amount in the buffer function bufferInfo() public view returns (uint256 _toDistribute, uint256 _deltaBlocks, uint256 _buffer){ _deltaBlocks = block.number.sub(lastDepositBlock); _buffer = buffer; _toDistribute = _buffer.mul(_deltaBlocks).div(TRANSMUTATION_PERIOD); } /// @dev Sets the pending governance. /// /// This function reverts if the new pending governance is the zero address or the caller is not the current /// governance. This is to prevent the contract governance being set to the zero address which would deadlock /// privileged contract functionality. /// /// @param _pendingGovernance the new pending governance. function setPendingGovernance(address _pendingGovernance) external onlyGov() { require(_pendingGovernance != ZERO_ADDRESS, "MigratableLinkTransmuterV2: 0 gov"); pendingGovernance = _pendingGovernance; emit PendingGovernanceUpdated(_pendingGovernance); } /// @dev Accepts the role as governance. /// /// This function reverts if the caller is not the new pending governance. function acceptGovernance() external { require(msg.sender == pendingGovernance, "MigratableLinkTransmuterV2: !pendingGovernance"); address _pendingGovernance = pendingGovernance; governance = _pendingGovernance; emit GovernanceUpdated(_pendingGovernance); } /// This function reverts if the caller is not governance /// /// @param _toWhitelist the account to mint tokens to. /// @param _state the whitelist state. function setWhitelist(address _toWhitelist, bool _state) external onlyGov() { whiteList[_toWhitelist] = _state; emit WhitelistSet(_toWhitelist, _state); } /// @dev Updates the active vault. /// /// This function reverts if the vault adapter is the zero address, if the token that the vault adapter accepts /// is not the token that this contract defines as the parent asset, or if the contract has not yet been initialized. /// /// @param _adapter the adapter for the new active vault. function setActiveVault(IVaultAdapterV2WithIndirection _adapter) external onlyGov() { require(_adapter != IVaultAdapterV2WithIndirection(ZERO_ADDRESS), "MigratableLinkTransmuterV2: active vault address cannot be 0x0."); require(address(_adapter.token()) == token, "MigratableLinkTransmuterV2.vault: token mismatch."); _vaults.push(VaultV2WithIndirection.Data({ adapter: _adapter, totalDeposited: 0 })); emit ActiveVaultUpdated(_adapter); } /// @dev Recalls funds from active vault if less than amt exist locally /// /// @param amt amount of funds that need to exist locally to fulfill pending request function ensureSufficientFundsExistLocally(uint256 amt) internal { uint256 currentBal = IERC20Burnable(token).balanceOf(address(this)); if (currentBal < amt) { uint256 diff = amt - currentBal; // get enough funds from active vault to replenish local holdings & fulfill claim request _recallExcessFundsFromActiveVault(plantableThreshold.add(diff)); } } /// @dev Recalls all planted funds from a target vault /// /// @param _vaultId the id of the vault from which to recall funds function recallAllFundsFromVault(uint256 _vaultId) external { require(pause && (msg.sender == governance || msg.sender == sentinel), "MigratableLinkTransmuterV2: not paused, or not governance or sentinel"); _recallAllFundsFromVault(_vaultId); } /// @dev Recalls all planted funds from a target vault /// /// @param _vaultId the id of the vault from which to recall funds function _recallAllFundsFromVault(uint256 _vaultId) internal { VaultV2WithIndirection.Data storage _vault = _vaults.get(_vaultId); (uint256 _withdrawnAmount, uint256 _decreasedValue) = _vault.withdrawAll(address(this)); emit FundsRecalled(_vaultId, _withdrawnAmount, _decreasedValue); } /// @dev Recalls planted funds from a target vault /// /// @param _vaultId the id of the vault from which to recall funds /// @param _amount the amount of funds to recall function recallFundsFromVault(uint256 _vaultId, uint256 _amount) external { require(pause && (msg.sender == governance || msg.sender == sentinel), "MigratableLinkTransmuterV2: not paused, or not governance or sentinel"); _recallFundsFromVault(_vaultId, _amount); } /// @dev Recalls planted funds from a target vault /// /// @param _vaultId the id of the vault from which to recall funds /// @param _amount the amount of funds to recall function _recallFundsFromVault(uint256 _vaultId, uint256 _amount) internal { VaultV2WithIndirection.Data storage _vault = _vaults.get(_vaultId); (uint256 _withdrawnAmount, uint256 _decreasedValue) = _vault.withdraw(address(this), _amount, false); emit FundsRecalled(_vaultId, _withdrawnAmount, _decreasedValue); } /// @dev Recalls planted funds from the active vault /// /// @param _amount the amount of funds to recall function _recallFundsFromActiveVault(uint256 _amount) internal { _recallFundsFromVault(_vaults.lastIndex(), _amount); } /// @dev Plants or recalls funds from the active vault /// /// This function plants excess funds in an external vault, or recalls them from the external vault /// Should only be called as part of distribute() function _plantOrRecallExcessFunds() internal { // check if the transmuter holds more funds than plantableThreshold uint256 bal = IERC20Burnable(token).balanceOf(address(this)); uint256 marginVal = plantableThreshold.mul(plantableMargin).div(100); if (bal > plantableThreshold.add(marginVal)) { uint256 plantAmt = bal - plantableThreshold; // if total funds above threshold, send funds to vault VaultV2WithIndirection.Data storage _activeVault = _vaults.last(); _activeVault.deposit(plantAmt); } else if (bal < plantableThreshold.sub(marginVal)) { // if total funds below threshold, recall funds from vault // first check that there are enough funds in vault uint256 harvestAmt = plantableThreshold - bal; _recallExcessFundsFromActiveVault(harvestAmt); } } /// @dev Recalls up to the harvestAmt from the active vault /// /// This function will recall less than harvestAmt if only less is available /// /// @param _recallAmt the amount to harvest from the active vault function _recallExcessFundsFromActiveVault(uint256 _recallAmt) internal { VaultV2WithIndirection.Data storage _activeVault = _vaults.last(); uint256 activeVaultVal = _activeVault.totalDeposited; if (activeVaultVal < _recallAmt) { _recallAmt = activeVaultVal; } if (_recallAmt > 0) { _recallFundsFromActiveVault(_recallAmt); } } /// @dev Sets the address of the sentinel /// /// @param _sentinel address of the new sentinel function setSentinel(address _sentinel) external onlyGov() { require(_sentinel != ZERO_ADDRESS, "MigratableLinkTransmuterV2: sentinel address cannot be 0x0."); sentinel = _sentinel; emit SentinelUpdated(_sentinel); } /// @dev Sets the threshold of total held funds above which excess funds will be planted in yield farms. /// /// This function reverts if the caller is not the current governance. /// /// @param _plantableThreshold the new plantable threshold. function setPlantableThreshold(uint256 _plantableThreshold) external onlyGov() { plantableThreshold = _plantableThreshold; emit PlantableThresholdUpdated(_plantableThreshold); } /// @dev Sets the plantableThreshold margin for triggering the planting or recalling of funds on harvest /// /// This function reverts if the caller is not the current governance. /// /// @param _plantableMargin the new plantable margin. function setPlantableMargin(uint256 _plantableMargin) external onlyGov() { plantableMargin = _plantableMargin; emit PlantableMarginUpdated(_plantableMargin); } /// @dev Sets if the contract should enter emergency exit mode. /// /// There are 2 main reasons to pause: /// 1. Need to shut down deposits in case of an emergency in one of the vaults /// 2. Need to migrate to a new transmuter /// /// While the transmuter is paused, stake() and distribute() are disabled /// /// @param _pause if the contract should enter emergency exit mode. function setPause(bool _pause) external { require(msg.sender == governance || msg.sender == sentinel, "MigratableLinkTransmuterV2: !(gov || sentinel)"); pause = _pause; emit PauseUpdated(_pause); } /// @dev Harvests yield from a vault. /// /// @param _vaultId the identifier of the vault to harvest from. /// /// @return the amount of funds that were harvested from the vault. function harvest(uint256 _vaultId) external returns (uint256, uint256) { VaultV2WithIndirection.Data storage _vault = _vaults.get(_vaultId); (uint256 _harvestedAmount, uint256 _decreasedValue) = _vault.harvest(rewards); emit FundsHarvested(_harvestedAmount, _decreasedValue); return (_harvestedAmount, _decreasedValue); } /// @dev Sets the rewards contract. /// /// This function reverts if the new rewards contract is the zero address or the caller is not the current governance. /// /// @param _rewards the new rewards contract. function setRewards(address _rewards) external onlyGov() { // Check that the rewards address is not the zero address. Setting the rewards to the zero address would break // transfers to the address because of `safeTransfer` checks. require(_rewards != ZERO_ADDRESS, "MigratableLinkTransmuterV2: rewards address cannot be 0x0."); rewards = _rewards; emit RewardsUpdated(_rewards); } /// @dev Migrates transmuter funds to a new transmuter /// /// @param migrateTo address of the new transmuter function migrateFunds(address migrateTo) external onlyGov() { require(migrateTo != address(0), "MigratableLinkTransmuterV2: cannot migrate to 0x0"); require(pause, "MigratableLinkTransmuterV2: set pause first"); // leave enough funds to service any pending transmutations uint256 totalFunds = IERC20Burnable(token).balanceOf(address(this)); uint256 migratableFunds = totalFunds.sub(totalSupplyWaTokens, "not enough funds to service stakes"); IERC20Burnable(token).approve(migrateTo, migratableFunds); ITransmuter(migrateTo).distribute(address(this), migratableFunds); emit MigrationComplete(migrateTo, migratableFunds); } /// @dev Gets the number of vaults in the vault list. /// /// @return the vault count. function vaultCount() external view returns (uint256) { return _vaults.length(); } /// @dev Get the adapter of a vault. /// /// @param _vaultId the identifier of the vault. /// /// @return the vault adapter. function getVaultAdapter(uint256 _vaultId) external view returns (IVaultAdapterV2WithIndirection) { VaultV2WithIndirection.Data storage _vault = _vaults.get(_vaultId); return _vault.adapter; } /// @dev Get the total amount of the asset that has been deposited into a vault. /// /// @param _vaultId the identifier of the vault. /// /// @return the total amount of deposited tokens. function getVaultTotalDeposited(uint256 _vaultId) external view returns (uint256) { VaultV2WithIndirection.Data storage _vault = _vaults.get(_vaultId); return _vault.totalDeposited; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_waToken","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_governance","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IVaultAdapterV2WithIndirection","name":"adapter","type":"address"}],"name":"ActiveVaultUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"origin","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Distribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"transmutedBy","type":"address"},{"indexed":false,"internalType":"address","name":"transmutedTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountTransmuted","type":"uint256"}],"name":"ForcedTransmutation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decreasedValue","type":"uint256"}],"name":"FundsHarvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decreasedValue","type":"uint256"}],"name":"FundsRecalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"governance","type":"address"}],"name":"GovernanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"migrateTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"fundsMigrated","type":"uint256"}],"name":"MigrationComplete","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"PauseUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingGovernance","type":"address"}],"name":"PendingGovernanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"plantableMargin","type":"uint256"}],"name":"PlantableMarginUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"plantableThreshold","type":"uint256"}],"name":"PlantableThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"RewardsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sentinel","type":"address"}],"name":"SentinelUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountClaimed","type":"uint256"}],"name":"TokenClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"transmutedTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountTransmuted","type":"uint256"}],"name":"Transmutation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newTransmutationPeriod","type":"uint256"}],"name":"TransmuterPeriodUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountStaked","type":"uint256"}],"name":"WaTokenStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountUnstaked","type":"uint256"}],"name":"WaTokenUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"whitelisted","type":"address"},{"indexed":false,"internalType":"bool","name":"state","type":"bool"}],"name":"WhitelistSet","type":"event"},{"inputs":[],"name":"TRANSMUTATION_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bufferInfo","outputs":[{"internalType":"uint256","name":"_toDistribute","type":"uint256"},{"internalType":"uint256","name":"_deltaBlocks","type":"uint256"},{"internalType":"uint256","name":"_buffer","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositedWaTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"origin","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendsOwing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toTransmute","type":"address"}],"name":"forceTransmute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"}],"name":"getMultipleUserInfo","outputs":[{"internalType":"address[]","name":"theUserList","type":"address[]"},{"internalType":"uint256[]","name":"theUserData","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"getVaultAdapter","outputs":[{"internalType":"contract IVaultAdapterV2WithIndirection","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"getVaultTotalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"harvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastDepositBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastDividendPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"migrateTo","type":"address"}],"name":"migrateFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nextUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"plantableMargin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"plantableThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pointMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"realisedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"recallAllFundsFromVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recallFundsFromVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sentinel","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IVaultAdapterV2WithIndirection","name":"_adapter","type":"address"}],"name":"setActiveVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_pause","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pendingGovernance","type":"address"}],"name":"setPendingGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_plantableMargin","type":"uint256"}],"name":"setPlantableMargin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_plantableThreshold","type":"uint256"}],"name":"setPlantableThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewards","type":"address"}],"name":"setRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sentinel","type":"address"}],"name":"setSentinel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTransmutationPeriod","type":"uint256"}],"name":"setTransmutationPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_toWhitelist","type":"address"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokensInBucket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividendPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyWaTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transmute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transmuteAndClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transmuteClaimAndWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unclaimedDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"depositedAl","type":"uint256"},{"internalType":"uint256","name":"pendingdivs","type":"uint256"},{"internalType":"uint256","name":"inbucket","type":"uint256"},{"internalType":"uint256","name":"realised","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userIsKnown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"userList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"waToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052678ac7230489e80000600d556901b1ae4d6e2ef500000060115560056012553480156200003057600080fd5b5060405162003dea38038062003dea833981810160405260608110156200005657600080fd5b50805160208201516040909201519091906001600160a01b038116620000ae5760405162461bcd60e51b815260040180806020018281038252602181526020018062003dc96021913960400191505060405180910390fd5b601380546001600160a01b039283166001600160a01b03199182161790915560018054948316948216949094179093556002805492909116919092161790556032600055613cc780620001026000396000f3fe608060405234801561001057600080fd5b506004361061035d5760003560e01c806379070a12116101d3578063bf51929f11610104578063ec38a862116100a2578063f39c38a01161007c578063f39c38a01461091d578063f58c251c14610925578063fb9321081461092d578063fc0c546a146109595761035d565b8063ec38a862146108e7578063edaafe201461090d578063f1f79200146109155761035d565b8063d5ce86b9116100de578063d5ce86b914610899578063ddc63262146108a1578063e044205e146108d7578063e9fad8ee146108df5761035d565b8063bf51929f14610830578063bff170b914610856578063d2c294921461087c5761035d565b8063a02fbe2d11610171578063a7c6a1001161014b578063a7c6a100146107c6578063aaf16660146107ce578063b870d598146107eb578063bedb86fb146108115761035d565b8063a02fbe2d14610784578063a196cf2e146107a1578063a694fc3a146107a95761035d565b80638456cb59116101ad5780638456cb591461073a57806394ff1199146107425780639ec5a8941461075f5780639f4216e8146107675761035d565b806379070a12146106c8578063806985f7146106ee5780638391e45c146107145761035d565b80632a3d7c81116102ad578063538ba4f91161024b578063658b98a911610225578063658b98a9146106515780636e3735b41461065957806370460eb11461067f57806375b7f650146106a25761035d565b8063538ba4f91461061357806353d6fd591461061b5780635aa6e675146106495761035d565b80633cb802b9116102875780633cb802b9146105d55780633dce68ea146105dd5780634e71d92d146105e557806352710007146105ed5761035d565b80632a3d7c81146105765780632e17de781461057e578063372c12b11461059b5761035d565b80631959a0021161031a5780632113342d116102f45780632113342d14610525578063238efcbc1461052d5780632670fdd8146105355780632a03cf681461056e5761035d565b80631959a002146104c95780631acce030146105155780631aeb19861461051d5761035d565b806301f50c8614610362578063030362901461037c57806305d2301d146104385780630668911e1461045e57806309dac0611461047d5780630abb6035146104a3575b600080fd5b61036a610961565b60408051918252519081900360200190f35b61039f6004803603604081101561039257600080fd5b5080359060200135610967565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156103e35781810151838201526020016103cb565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561042257818101518382015260200161040a565b5050505090500194505050505060405180910390f35b610440610b90565b60408051938452602084019290925282820152519081900360600190f35b61047b6004803603602081101561047457600080fd5b5035610bca565b005b61047b6004803603602081101561049357600080fd5b50356001600160a01b0316610c4e565b61047b600480360360208110156104b957600080fd5b50356001600160a01b0316610d30565b6104ef600480360360208110156104df57600080fd5b50356001600160a01b0316610e12565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61036a610f02565b61036a610f08565b61036a610f0e565b61047b610f14565b6105526004803603602081101561054b57600080fd5b5035610fb4565b604080516001600160a01b039092168252519081900360200190f35b61047b610fd3565b61036a610fe5565b61047b6004803603602081101561059457600080fd5b5035610feb565b6105c1600480360360208110156105b157600080fd5b50356001600160a01b0316611166565b604080519115158252519081900360200190f35b61036a61117b565b61036a611181565b61047b611187565b61036a6004803603602081101561060357600080fd5b50356001600160a01b03166112cb565b6105526112dd565b61047b6004803603604081101561063157600080fd5b506001600160a01b03813516906020013515156112e2565b61055261138f565b61036a61139e565b61036a6004803603602081101561066f57600080fd5b50356001600160a01b03166113a4565b61047b6004803603604081101561069557600080fd5b50803590602001356113b6565b61047b600480360360208110156106b857600080fd5b50356001600160a01b0316611436565b6105c1600480360360208110156106de57600080fd5b50356001600160a01b03166115dc565b61036a6004803603602081101561070457600080fd5b50356001600160a01b03166115f1565b61036a6004803603602081101561072a57600080fd5b50356001600160a01b0316611603565b6105c161165f565b61047b6004803603602081101561075857600080fd5b503561166f565b6105526116f3565b6105526004803603602081101561077d57600080fd5b5035611702565b61047b6004803603602081101561079a57600080fd5b503561171d565b61036a6117a1565b61047b600480360360208110156107bf57600080fd5b50356117a7565b61036a6119f1565b61036a600480360360208110156107e457600080fd5b5035611a02565b61036a6004803603602081101561080157600080fd5b50356001600160a01b0316611a1b565b61047b6004803603602081101561082757600080fd5b50351515611a2d565b61047b6004803603602081101561084657600080fd5b50356001600160a01b0316611ade565b61047b6004803603602081101561086c57600080fd5b50356001600160a01b0316611d8d565b61047b6004803603602081101561089257600080fd5b50356121ea565b610552612268565b6108be600480360360208110156108b757600080fd5b5035612277565b6040805192835260208301919091528051918290030190f35b61047b6122ef565b61047b612318565b61047b600480360360208110156108fd57600080fd5b50356001600160a01b0316612320565b61036a612402565b61047b612408565b6105526126f4565b610552612703565b61047b6004803603604081101561094357600080fd5b506001600160a01b038135169060200135612712565b61055261290f565b60005481565b60608083808403828167ffffffffffffffff8111801561098657600080fd5b506040519080825280602002602001820160405280156109b0578160200160208202803683370190505b50905060608260020267ffffffffffffffff811180156109cf57600080fd5b506040519080825280602002602001820160405280156109f9578160200160208202803683370190505b509050600080610a2c600054610a26610a1d600c544361291e90919063ffffffff16565b600b5490612980565b906129d9565b9050600054610a46600c544361291e90919063ffffffff16565b1115610a515750600b545b60005b85811015610b7d5760008781526008602052604090205485516001600160a01b0390911690869083908110610a8557fe5b6001600160a01b039283166020918202929092018101919091526000898152600882526040808220549093168152600390915220548451859085908110610ac857fe5b602090810291909101810191909152600a546000898152600883526040808220546001600160a01b0316825260039093529190912054610b5091610b1191610a26908690612980565b6000898152600860208181526040808420546001600160a01b03168085526004835290842054938d9052919052610b4a91908290611603565b90612a40565b848460010181518110610b5f57fe5b60209081029190910101526001968701966002939093019201610a54565b50929650909450505050505b9250929050565b6000806000610baa600c544361291e90919063ffffffff16565b600b546000549193509150610bc390610a268385612980565b9250909192565b6013546001600160a01b03163314610c135760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b60118190556040805182815290517fe77487d7758cc0f4820329f0d13f96448757377d4bf03ca31ce49cc9e151486f9181900360200190a150565b6013546001600160a01b03163314610c975760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b6001600160a01b038116610cdc5760405162461bcd60e51b815260040180806020018281038252603b815260200180613999603b913960400191505060405180910390fd5b601580546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fdc117600f93282860144d2cd2745f8e2e15c3ca2a32b4290c30f7cd1ae7ffcb99181900360200190a150565b6013546001600160a01b03163314610d795760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b6001600160a01b038116610dbe5760405162461bcd60e51b8152600401808060200182810382526021815260200180613c2c6021913960400191505060405180910390fd5b601480546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fc9e2377236eab4280090ce8f2317332649736d92f00dcf20a8dd6684ec5e78399181900360200190a150565b6001600160a01b0381166000908152600360205260408120548154600c548392839283928391610e4b91610a2690610a1d90439061291e565b9050600054610e65600c544361291e90919063ffffffff16565b1115610e705750600b545b600a5460009015610eaa57600a546001600160a01b038916600090815260036020526040902054610ea79190610a26908590612980565b90505b6000610ed7610eb88a611603565b6001600160a01b038b1660009081526004602052604090205490612a40565b6001600160a01b03999099166000908152600560205260409020549399919897509295509350505050565b60125481565b60115481565b600e5481565b6014546001600160a01b03163314610f5d5760405162461bcd60e51b815260040180806020018281038252602e815260200180613bd6602e913960400191505060405180910390fd5b601454601380546001600160a01b0319166001600160a01b0390921691821790556040805182815290517f9d3e522e1e47a2f6009739342b9cc7b252a1888154e843ab55ee1c81745795ab9181900360200190a150565b600080610fc2601784612a9a565b546001600160a01b03169392505050565b610fdb612408565b610fe3611187565b565b600c5481565b336000610ff782611603565b9050801561104c57600f5461100c908261291e565b600f556001600160a01b0382166000908152600460205260409020546110329082612a40565b6001600160a01b0383166000908152600460205260409020555b600e546001600160a01b038316600090815260066020908152604080832093909355338083526003909152919020548411156110b95760405162461bcd60e51b81526004018080602001828103825260438152602001806139566043913960600191505060405180910390fd5b6001600160a01b0381166000908152600360205260409020546110dc908561291e565b6001600160a01b038216600090815260036020526040902055600a54611102908561291e565b600a5560015461111c906001600160a01b03168286612ac1565b604080516001600160a01b03831681526020810186905281517f4f0ce53dc45be7a185b3a097ceb021fd342d5a35c86efdba82828e716ff7c37e929181900390910190a150505050565b60106020526000908152604090205460ff1681565b600f5481565b600a5481565b336000818152600560205260409020546111d25760405162461bcd60e51b815260040180806020018281038252603f815260200180613b15603f913960400191505060405180910390fd5b6001600160a01b038116600090815260056020526040812080549190556111f881612b18565b6002546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561124e57600080fd5b505af1158015611262573d6000803e3d6000fd5b505050506040513d602081101561127857600080fd5b5050600254604080516001600160a01b0380861682529092166020830152818101839052517f4831bdd9dcf3048a28319ce81d3cab7a15366bcf449bc7803a539107440809cc9181900360600190a15050565b60056020526000908152604090205481565b600081565b6013546001600160a01b0316331461132b5760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b6001600160a01b038216600081815260106020908152604091829020805460ff191685151590811790915582519384529083015280517f0aa5ec5ffdc7f6f9c4d0dded489d7450297155cb2f71cb771e02427f7dff4f519281900390910190a15050565b6013546001600160a01b031681565b600d5481565b60036020526000908152604090205481565b601554600160a01b900460ff1680156113ed57506013546001600160a01b03163314806113ed57506015546001600160a01b031633145b6114285760405162461bcd60e51b8152600401808060200182810382526045815260200180613c4d6045913960600191505060405180910390fd5b6114328282612bb3565b5050565b6013546001600160a01b0316331461147f5760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b6001600160a01b0381166114c45760405162461bcd60e51b815260040180806020018281038252603f815260200180613917603f913960400191505060405180910390fd5b60025460408051637e062a3560e11b815290516001600160a01b039283169284169163fc0c546a916004808301926020929190829003018186803b15801561150b57600080fd5b505afa15801561151f573d6000803e3d6000fd5b505050506040513d602081101561153557600080fd5b50516001600160a01b03161461157c5760405162461bcd60e51b81526004018080602001828103825260318152602001806138e66031913960400191505060405180910390fd5b604080518082019091526001600160a01b0382168152600060208201526115a590601790612c1c565b6040516001600160a01b038216907f0821015de34e20b0878a40f6f165801417f53b2017016d7321cacee989c8cfa790600090a250565b60076020526000908152604090205460ff1681565b60066020526000908152604090205481565b6001600160a01b038116600090815260066020526040812054600e54829161162b919061291e565b600d546001600160a01b03851660009081526003602052604090205491925061165891610a269084612980565b9392505050565b601554600160a01b900460ff1681565b6013546001600160a01b031633146116b85760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b60128190556040805182815290517fcf837c6f8ba9f94fb0b21939d04aba4ae1cf50cbeca85513c218dfdc6666f1a99181900360200190a150565b6016546001600160a01b031681565b6008602052600090815260409020546001600160a01b031681565b6013546001600160a01b031633146117665760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b60008190556040805182815290517fc2965d898897107f6f1d0e43c043ca07b7a51d487acfac1decec2ec8405364409181900360200190a150565b60095481565b600c54600b544390600090801561181c5760006117c4848661291e565b905060005481106117d7578192506117fe565b6000546117e48383612980565b11156117fe576000546117fb90610a268484612980565b92505b821561181a5761180e828461291e565b600b5561181a83612c5f565b505b600c83905533600061182d82611603565b9050801561188257600f54611842908261291e565b600f556001600160a01b0382166000908152600460205260409020546118689082612a40565b6001600160a01b0383166000908152600460205260409020555b600e546001600160a01b03831660009081526006602090815260408083209390935533825260079052205460ff166118f95760098054600090815260086020908152604080832080546001600160a01b03191633908117909155835260079091529020805460ff1916600190811790915581540190555b601554600160a01b900460ff16156119425760405162461bcd60e51b8152600401808060200182810382526033815260200180613b546033913960400191505060405180910390fd5b600154339061195c906001600160a01b031682308b612cc8565b600a546119699089612a40565b600a556001600160a01b03811660009081526003602052604090205461198f9089612a40565b6001600160a01b0382166000818152600360209081526040918290209390935580519182529181018a905281517f02b97e4596a9bc8fa447a0e645da5fa038bf5f5a38ab0bcdcb74e7c2e9c96e4f929181900390910190a15050505050505050565b60006119fd6017612d28565b905090565b600080611a10601784612a9a565b600101549392505050565b60046020526000908152604090205481565b6013546001600160a01b0316331480611a5057506015546001600160a01b031633145b611a8b5760405162461bcd60e51b815260040180806020018281038252602e815260200180613a6e602e913960400191505060405180910390fd5b60158054821515600160a01b810260ff60a01b199092169190911790915560408051918252517f77860e247ab9186dbe64e5bd0e0b93273cc4273e01818420e788f500078886f59181900360200190a150565b6013546001600160a01b03163314611b275760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b6001600160a01b038116611b6c5760405162461bcd60e51b8152600401808060200182810382526031815260200180613ae46031913960400191505060405180910390fd5b601554600160a01b900460ff16611bb45760405162461bcd60e51b815260040180806020018281038252602b815260200180613899602b913960400191505060405180910390fd5b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611bff57600080fd5b505afa158015611c13573d6000803e3d6000fd5b505050506040513d6020811015611c2957600080fd5b5051600a5460408051606081019091526022808252929350600092611c5a9291906138c46020830139849190612d2c565b6002546040805163095ea7b360e01b81526001600160a01b03878116600483015260248201859052915193945091169163095ea7b3916044808201926020929091908290030181600087803b158015611cb257600080fd5b505af1158015611cc6573d6000803e3d6000fd5b505050506040513d6020811015611cdc57600080fd5b505060408051631f72642160e31b81523060048201526024810183905290516001600160a01b0385169163fb93210891604480830192600092919082900301818387803b158015611d2c57600080fd5b505af1158015611d40573d6000803e3d6000fd5b5050604080516001600160a01b03871681526020810185905281517f491c0362a655f805cc3d5ab67c471c6b4e517051540c85134456449ce6c1a6799450908190039091019150a1505050565b600c54600b5443906000908015611e02576000611daa848661291e565b90506000548110611dbd57819250611de4565b600054611dca8383612980565b1115611de457600054611de190610a268484612980565b92505b8215611e0057611df4828461291e565b600b55611e0083612c5f565b505b600c839055336000611e1382611603565b90508015611e6857600f54611e28908261291e565b600f556001600160a01b038216600090815260046020526040902054611e4e9082612a40565b6001600160a01b0383166000908152600460205260409020555b600e546001600160a01b0383166000908152600660205260408120919091558790611e9282611603565b90508015611ee757600f54611ea7908261291e565b600f556001600160a01b038216600090815260046020526040902054611ecd9082612a40565b6001600160a01b0383166000908152600460205260409020555b600e546001600160a01b03831660009081526006602090815260408083209390935533825260079052205460ff16611f5e5760098054600090815260086020908152604080832080546001600160a01b03191633908117909155835260079091529020805460ff1916600190811790915581540190555b6001600160a01b0389166000908152600460209081526040808320546003909252909120543391908111611fc35760405162461bcd60e51b8152600401808060200182810382526025815260200180613b876025913960400191505060405180910390fd5b6001600160a01b038b1660009081526004602090815260408083208390556003909152812054611ff490839061291e565b6001600160a01b03808e166000908152600360205260408082208054908390556001548251630852cd8d60e31b815260048101839052925191975094955093909216926342966c6892602480820193929182900301818387803b15801561205a57600080fd5b505af115801561206e573d6000803e3d6000fd5b5050600a54612080925090508361291e565b600a556001600160a01b0383166000908152600460205260409020546120a69082612a40565b6001600160a01b03808516600090815260046020908152604080832094909455918f168152600590915220546120dc9083612a40565b6001600160a01b038d16600090815260056020526040902081905561210081612b18565b6001600160a01b03808e166000818152600560209081526040808320839055600254815163a9059cbb60e01b8152600481019590955260248501879052905194169363a9059cbb93604480820194918390030190829087803b15801561216557600080fd5b505af1158015612179573d6000803e3d6000fd5b505050506040513d602081101561218f57600080fd5b5050604080516001600160a01b0380871682528f16602082015280820183905290517fb1e35379b2ed6821c33158f59080978024478baafa855571cd84e46b9848b3ce9181900360600190a150505050505050505050505050565b601554600160a01b900460ff16801561222157506013546001600160a01b031633148061222157506015546001600160a01b031633145b61225c5760405162461bcd60e51b8152600401808060200182810382526045815260200180613c4d6045913960600191505060405180910390fd5b61226581612dc3565b50565b6001546001600160a01b031681565b60008080612286601785612a9a565b60165490915060009081906122a59084906001600160a01b0316612e29565b604080518381526020810183905281519395509193507f11d2034f4471d11a13f0f1798ceaf0c9db2812d450a0681958ce7d4f2fb97f0992918290030190a1909350915050915091565b6122f7612408565b6122ff611187565b3360009081526003602052604090205461226581610feb565b6122ff612408565b6013546001600160a01b031633146123695760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b6001600160a01b0381166123ae5760405162461bcd60e51b815260040180806020018281038252603a815260200180613a34603a913960400191505060405180910390fd5b601680546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f05f3326e0527f309d4015dee3bc3f36e650b53fc823bab69c99847814acfafdf9181900360200190a150565b600b5481565b600c54600b544390600090801561247d576000612425848661291e565b905060005481106124385781925061245f565b6000546124458383612980565b111561245f5760005461245c90610a268484612980565b92505b821561247b5761246f828461291e565b600b5561247b83612c5f565b505b600c83905533600061248e82611603565b905080156124e357600f546124a3908261291e565b600f556001600160a01b0382166000908152600460205260409020546124c99082612a40565b6001600160a01b0383166000908152600460205260409020555b600e546001600160a01b03831660009081526006602090815260408083209390935533808352600490915291812054908161254f5760405162461bcd60e51b815260040180806020018281038252603a8152602001806139d4603a913960400191505060405180910390fd5b6001600160a01b038316600090815260046020908152604080832083905560039091529020548211156125be576001600160a01b0383166000908152600360205260409020546125a090839061291e565b6001600160a01b038416600090815260036020526040902054925090505b6001600160a01b0383166000908152600360205260409020546125e1908361291e565b6001600160a01b03808516600090815260036020526040808220939093556001548351630852cd8d60e31b81526004810187905293519216926342966c68926024808301939282900301818387803b15801561263c57600080fd5b505af1158015612650573d6000803e3d6000fd5b5050600a54612662925090508361291e565b600a5561266e81612c5f565b6001600160a01b0383166000908152600560205260409020546126919083612a40565b6001600160a01b03841660008181526005602090815260409182902093909355805191825291810184905281517fe6b1330a9c444712d3673f05900d736c42072653e56fb82b5951477832b8d576929181900390910190a1505050505050505050565b6014546001600160a01b031681565b6015546001600160a01b031681565b3360009081526010602052604090205460ff166127605760405162461bcd60e51b8152600401808060200182810382526028815260200180613c046028913960400191505060405180910390fd5b600c54600b54439060009080156127d557600061277d848661291e565b90506000548110612790578192506127b7565b60005461279d8383612980565b11156127b7576000546127b490610a268484612980565b92505b82156127d3576127c7828461291e565b600b556127d383612c5f565b505b600c839055601554600160a01b900460ff16156128235760405162461bcd60e51b8152600401808060200182810382526033815260200180613b546033913960400191505060405180910390fd5b600254604080516323b872dd60e01b81526001600160a01b03898116600483015230602483015260448201899052915191909216916323b872dd9160648083019260209291908290030181600087803b15801561287f57600080fd5b505af1158015612893573d6000803e3d6000fd5b505050506040513d60208110156128a957600080fd5b5050600b546128b89086612a40565b600b556128c3612e7c565b604080516001600160a01b03881681526020810187905281517f33ad5d6b2a46b5457e0d36286a2686a0390b0821dedbbdf8dcdcda64f4782c68929181900390910190a1505050505050565b6002546001600160a01b031681565b600082821115612975576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b60008261298f5750600061297a565b8282028284828161299c57fe5b04146116585760405162461bcd60e51b8152600401808060200182810382526021815260200180613ac36021913960400191505060405180910390fd5b6000808211612a2f576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612a3857fe5b049392505050565b600082820183811015611658576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000826000018281548110612aab57fe5b9060005260206000209060020201905092915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612b13908490612f6e565b505050565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612b6357600080fd5b505afa158015612b77573d6000803e3d6000fd5b505050506040513d6020811015612b8d57600080fd5b50519050818110156114325760115481830390612b1390612bae9083612a40565b61301f565b6000612bc0601784612a9a565b9050600080612bd18330868461304e565b91509150847fccbd929f935422b28ee209a0db0556280b0a3d9bc4da58f1d3f0ab4f8a4996478383604051808381526020018281526020019250505060405180910390a25050505050565b8154600180820184556000938452602093849020835160029093020180546001600160a01b0319166001600160a01b039093169290921782559190920151910155565b6000600a54118015612c715750600081115b15612cb557612c9d612c94600a54610a26600d548561298090919063ffffffff16565b600e5490612a40565b600e55600f54612cad9082612a40565b600f55612265565b600b54612cc29082612a40565b600b5550565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612d22908590612f6e565b50505050565b5490565b60008184841115612dbb5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d80578181015183820152602001612d68565b50505050905090810190601f168015612dad5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000612dd0601783612a9a565b9050600080612ddf8330613087565b91509150837fccbd929f935422b28ee209a0db0556280b0a3d9bc4da58f1d3f0ab4f8a4996478383604051808381526020018281526020019250505060405180910390a250505050565b6000808360010154612e3a856130b1565b11612e4a57506000905080610b89565b6000612e638560010154612e5d876130b1565b9061291e565b9050612e70858583613127565b92509250509250929050565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612ec757600080fd5b505afa158015612edb573d6000803e3d6000fd5b505050506040513d6020811015612ef157600080fd5b5051601254601154919250600091612f0f91606491610a2691612980565b601154909150612f1f9082612a40565b821115612f4b5760115482036000612f3760176132e4565b9050612f43818361330f565b505050611432565b601154612f58908261291e565b82101561143257601154829003612b138161301f565b6060612fc3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166134219092919063ffffffff16565b805190915015612b1357808060200190516020811015612fe257600080fd5b5051612b135760405162461bcd60e51b815260040180806020018281038252602a815260200180613bac602a913960400191505060405180910390fd5b600061302b60176132e4565b60018101549091508281101561303f578092505b8215612b1357612b1383613438565b600080808061305f8888888861344b565b60018a01549193509150613073908261291e565b600189015590925090505b94509492505050565b6000806130a683856001015460008761304e909392919063ffffffff16565b915091509250929050565b8054604080516306a61f7560e51b815290516000926001600160a01b03169163d4c3eea0916004808301926020929190829003018186803b1580156130f557600080fd5b505afa158015613109573d6000803e3d6000fd5b505050506040513d602081101561311f57600080fd5b505192915050565b60008060006131358661363f565b90506000816001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561318657600080fd5b505afa15801561319a573d6000803e3d6000fd5b505050506040513d60208110156131b057600080fd5b5051905060006131bf886130b1565b885460408051632ca6a71b60e11b81526001600160a01b038b81166004830152602482018b9052915193945091169163594d4e369160448082019260009290919082900301818387803b15801561321557600080fd5b505af1158015613229573d6000803e3d6000fd5b505050506000836001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561327c57600080fd5b505afa158015613290573d6000803e3d6000fd5b505050506040513d60208110156132a657600080fd5b5051905060006132b6828561291e565b905060006132c38b6130b1565b905060006132d1858361291e565b929c929b50919950505050505050505050565b6000816132f081613683565b815481106132fa57fe5b90600052602060002090600202019050919050565b60008061331b8461363f565b84546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810187905290519293509083169163a9059cbb916044808201926020929091908290030181600087803b15801561337357600080fd5b505af1158015613387573d6000803e3d6000fd5b505050506040513d602081101561339d57600080fd5b505083546040805163b6b55f2560e01b81526004810186905290516001600160a01b039092169163b6b55f259160248082019260009290919082900301818387803b1580156133eb57600080fd5b505af11580156133ff573d6000803e3d6000fd5b5050506001850154613412915084612a40565b60018501555081905092915050565b606061343084846000856136d0565b949350505050565b6122656134456017613683565b82612bb3565b60008060006134598761363f565b90506000816001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156134aa57600080fd5b505afa1580156134be573d6000803e3d6000fd5b505050506040513d60208110156134d457600080fd5b5051905060006134e3896130b1565b89546040805163ead5d35960e01b81526001600160a01b038c81166004830152602482018c90528a15156044830152915193945091169163ead5d3599160648082019260009290919082900301818387803b15801561354157600080fd5b505af1158015613555573d6000803e3d6000fd5b505050506000836001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156135a857600080fd5b505afa1580156135bc573d6000803e3d6000fd5b505050506040513d60208110156135d257600080fd5b5051905060006135e2828561291e565b905060006135ef8c6130b1565b905060008185111561360857613605858361291e565b90505b891561361f5791975090955061307e945050505050565b8a8082111561362b5750805b929d929c50919a5050505050505050505050565b805460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b1580156130f557600080fd5b60008061368f83612d28565b90506116586001604051806040016040528060118152602001705661756c742e4c6973743a20656d70747960781b81525083612d2c9092919063ffffffff16565b6060824710156137115760405162461bcd60e51b8152600401808060200182810382526026815260200180613a0e6026913960400191505060405180910390fd5b61371a8561382c565b61376b576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106137aa5780518252601f19909201916020918201910161378b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461380c576040519150601f19603f3d011682016040523d82523d6000602084013e613811565b606091505b5091509150613821828286613832565b979650505050505050565b3b151590565b60608315613841575081611658565b8251156138515782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315612d80578181015183820152602001612d6856fe4d696772617461626c654c696e6b5472616e736d7574657256323a207365742070617573652066697273746e6f7420656e6f7567682066756e647320746f2073657276696365207374616b65734d696772617461626c654c696e6b5472616e736d7574657256322e7661756c743a20746f6b656e206d69736d617463682e4d696772617461626c654c696e6b5472616e736d7574657256323a20616374697665207661756c7420616464726573732063616e6e6f74206265203078302e4d696772617461626c654c696e6b5472616e736d7574657256323a20756e7374616b6520616d6f756e742065786365656473206465706f736974656420616d6f756e744d696772617461626c654c696e6b5472616e736d7574657256323a2073656e74696e656c20616464726573732063616e6e6f74206265203078302e4d696772617461626c654c696e6b5472616e736d7574657256323a206e65656420746f20686176652070656e64696e6720696e206275636b6574416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4d696772617461626c654c696e6b5472616e736d7574657256323a207265776172647320616464726573732063616e6e6f74206265203078302e4d696772617461626c654c696e6b5472616e736d7574657256323a202128676f76207c7c2073656e74696e656c294d696772617461626c654c696e6b5472616e736d7574657256323a2021676f7665726e616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774d696772617461626c654c696e6b5472616e736d7574657256323a2063616e6e6f74206d69677261746520746f203078304d696772617461626c654c696e6b5472616e736d7574657256323a206e6f207265616c69736564546f6b656e2062616c616e636520666f722073656e6465724d696772617461626c654c696e6b5472616e736d7574657256323a20656d657267656e637920706175736520656e61626c65644d696772617461626c654c696e6b5472616e736d7574657256323a20216f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644d696772617461626c654c696e6b5472616e736d7574657256323a202170656e64696e67476f7665726e616e63654d696772617461626c654c696e6b5472616e736d7574657256323a202177686974656c69737465644d696772617461626c654c696e6b5472616e736d7574657256323a203020676f764d696772617461626c654c696e6b5472616e736d7574657256323a206e6f74207061757365642c206f72206e6f7420676f7665726e616e6365206f722073656e74696e656ca2646970667358221220630faf1d4ba77fd8f2350951534a1aa731419eb8f1886bbca673976f92dcb6fd64736f6c634300060c00334d696772617461626c654c696e6b5472616e736d7574657256323a203020676f7600000000000000000000000029ddf2c4f1e80dc9e95cc57a9ca03a28e4ab6d6c000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca00000000000000000000000068284083acbabcb6da84f62ea341dd8c30500eee
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061035d5760003560e01c806379070a12116101d3578063bf51929f11610104578063ec38a862116100a2578063f39c38a01161007c578063f39c38a01461091d578063f58c251c14610925578063fb9321081461092d578063fc0c546a146109595761035d565b8063ec38a862146108e7578063edaafe201461090d578063f1f79200146109155761035d565b8063d5ce86b9116100de578063d5ce86b914610899578063ddc63262146108a1578063e044205e146108d7578063e9fad8ee146108df5761035d565b8063bf51929f14610830578063bff170b914610856578063d2c294921461087c5761035d565b8063a02fbe2d11610171578063a7c6a1001161014b578063a7c6a100146107c6578063aaf16660146107ce578063b870d598146107eb578063bedb86fb146108115761035d565b8063a02fbe2d14610784578063a196cf2e146107a1578063a694fc3a146107a95761035d565b80638456cb59116101ad5780638456cb591461073a57806394ff1199146107425780639ec5a8941461075f5780639f4216e8146107675761035d565b806379070a12146106c8578063806985f7146106ee5780638391e45c146107145761035d565b80632a3d7c81116102ad578063538ba4f91161024b578063658b98a911610225578063658b98a9146106515780636e3735b41461065957806370460eb11461067f57806375b7f650146106a25761035d565b8063538ba4f91461061357806353d6fd591461061b5780635aa6e675146106495761035d565b80633cb802b9116102875780633cb802b9146105d55780633dce68ea146105dd5780634e71d92d146105e557806352710007146105ed5761035d565b80632a3d7c81146105765780632e17de781461057e578063372c12b11461059b5761035d565b80631959a0021161031a5780632113342d116102f45780632113342d14610525578063238efcbc1461052d5780632670fdd8146105355780632a03cf681461056e5761035d565b80631959a002146104c95780631acce030146105155780631aeb19861461051d5761035d565b806301f50c8614610362578063030362901461037c57806305d2301d146104385780630668911e1461045e57806309dac0611461047d5780630abb6035146104a3575b600080fd5b61036a610961565b60408051918252519081900360200190f35b61039f6004803603604081101561039257600080fd5b5080359060200135610967565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156103e35781810151838201526020016103cb565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561042257818101518382015260200161040a565b5050505090500194505050505060405180910390f35b610440610b90565b60408051938452602084019290925282820152519081900360600190f35b61047b6004803603602081101561047457600080fd5b5035610bca565b005b61047b6004803603602081101561049357600080fd5b50356001600160a01b0316610c4e565b61047b600480360360208110156104b957600080fd5b50356001600160a01b0316610d30565b6104ef600480360360208110156104df57600080fd5b50356001600160a01b0316610e12565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61036a610f02565b61036a610f08565b61036a610f0e565b61047b610f14565b6105526004803603602081101561054b57600080fd5b5035610fb4565b604080516001600160a01b039092168252519081900360200190f35b61047b610fd3565b61036a610fe5565b61047b6004803603602081101561059457600080fd5b5035610feb565b6105c1600480360360208110156105b157600080fd5b50356001600160a01b0316611166565b604080519115158252519081900360200190f35b61036a61117b565b61036a611181565b61047b611187565b61036a6004803603602081101561060357600080fd5b50356001600160a01b03166112cb565b6105526112dd565b61047b6004803603604081101561063157600080fd5b506001600160a01b03813516906020013515156112e2565b61055261138f565b61036a61139e565b61036a6004803603602081101561066f57600080fd5b50356001600160a01b03166113a4565b61047b6004803603604081101561069557600080fd5b50803590602001356113b6565b61047b600480360360208110156106b857600080fd5b50356001600160a01b0316611436565b6105c1600480360360208110156106de57600080fd5b50356001600160a01b03166115dc565b61036a6004803603602081101561070457600080fd5b50356001600160a01b03166115f1565b61036a6004803603602081101561072a57600080fd5b50356001600160a01b0316611603565b6105c161165f565b61047b6004803603602081101561075857600080fd5b503561166f565b6105526116f3565b6105526004803603602081101561077d57600080fd5b5035611702565b61047b6004803603602081101561079a57600080fd5b503561171d565b61036a6117a1565b61047b600480360360208110156107bf57600080fd5b50356117a7565b61036a6119f1565b61036a600480360360208110156107e457600080fd5b5035611a02565b61036a6004803603602081101561080157600080fd5b50356001600160a01b0316611a1b565b61047b6004803603602081101561082757600080fd5b50351515611a2d565b61047b6004803603602081101561084657600080fd5b50356001600160a01b0316611ade565b61047b6004803603602081101561086c57600080fd5b50356001600160a01b0316611d8d565b61047b6004803603602081101561089257600080fd5b50356121ea565b610552612268565b6108be600480360360208110156108b757600080fd5b5035612277565b6040805192835260208301919091528051918290030190f35b61047b6122ef565b61047b612318565b61047b600480360360208110156108fd57600080fd5b50356001600160a01b0316612320565b61036a612402565b61047b612408565b6105526126f4565b610552612703565b61047b6004803603604081101561094357600080fd5b506001600160a01b038135169060200135612712565b61055261290f565b60005481565b60608083808403828167ffffffffffffffff8111801561098657600080fd5b506040519080825280602002602001820160405280156109b0578160200160208202803683370190505b50905060608260020267ffffffffffffffff811180156109cf57600080fd5b506040519080825280602002602001820160405280156109f9578160200160208202803683370190505b509050600080610a2c600054610a26610a1d600c544361291e90919063ffffffff16565b600b5490612980565b906129d9565b9050600054610a46600c544361291e90919063ffffffff16565b1115610a515750600b545b60005b85811015610b7d5760008781526008602052604090205485516001600160a01b0390911690869083908110610a8557fe5b6001600160a01b039283166020918202929092018101919091526000898152600882526040808220549093168152600390915220548451859085908110610ac857fe5b602090810291909101810191909152600a546000898152600883526040808220546001600160a01b0316825260039093529190912054610b5091610b1191610a26908690612980565b6000898152600860208181526040808420546001600160a01b03168085526004835290842054938d9052919052610b4a91908290611603565b90612a40565b848460010181518110610b5f57fe5b60209081029190910101526001968701966002939093019201610a54565b50929650909450505050505b9250929050565b6000806000610baa600c544361291e90919063ffffffff16565b600b546000549193509150610bc390610a268385612980565b9250909192565b6013546001600160a01b03163314610c135760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b60118190556040805182815290517fe77487d7758cc0f4820329f0d13f96448757377d4bf03ca31ce49cc9e151486f9181900360200190a150565b6013546001600160a01b03163314610c975760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b6001600160a01b038116610cdc5760405162461bcd60e51b815260040180806020018281038252603b815260200180613999603b913960400191505060405180910390fd5b601580546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fdc117600f93282860144d2cd2745f8e2e15c3ca2a32b4290c30f7cd1ae7ffcb99181900360200190a150565b6013546001600160a01b03163314610d795760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b6001600160a01b038116610dbe5760405162461bcd60e51b8152600401808060200182810382526021815260200180613c2c6021913960400191505060405180910390fd5b601480546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fc9e2377236eab4280090ce8f2317332649736d92f00dcf20a8dd6684ec5e78399181900360200190a150565b6001600160a01b0381166000908152600360205260408120548154600c548392839283928391610e4b91610a2690610a1d90439061291e565b9050600054610e65600c544361291e90919063ffffffff16565b1115610e705750600b545b600a5460009015610eaa57600a546001600160a01b038916600090815260036020526040902054610ea79190610a26908590612980565b90505b6000610ed7610eb88a611603565b6001600160a01b038b1660009081526004602052604090205490612a40565b6001600160a01b03999099166000908152600560205260409020549399919897509295509350505050565b60125481565b60115481565b600e5481565b6014546001600160a01b03163314610f5d5760405162461bcd60e51b815260040180806020018281038252602e815260200180613bd6602e913960400191505060405180910390fd5b601454601380546001600160a01b0319166001600160a01b0390921691821790556040805182815290517f9d3e522e1e47a2f6009739342b9cc7b252a1888154e843ab55ee1c81745795ab9181900360200190a150565b600080610fc2601784612a9a565b546001600160a01b03169392505050565b610fdb612408565b610fe3611187565b565b600c5481565b336000610ff782611603565b9050801561104c57600f5461100c908261291e565b600f556001600160a01b0382166000908152600460205260409020546110329082612a40565b6001600160a01b0383166000908152600460205260409020555b600e546001600160a01b038316600090815260066020908152604080832093909355338083526003909152919020548411156110b95760405162461bcd60e51b81526004018080602001828103825260438152602001806139566043913960600191505060405180910390fd5b6001600160a01b0381166000908152600360205260409020546110dc908561291e565b6001600160a01b038216600090815260036020526040902055600a54611102908561291e565b600a5560015461111c906001600160a01b03168286612ac1565b604080516001600160a01b03831681526020810186905281517f4f0ce53dc45be7a185b3a097ceb021fd342d5a35c86efdba82828e716ff7c37e929181900390910190a150505050565b60106020526000908152604090205460ff1681565b600f5481565b600a5481565b336000818152600560205260409020546111d25760405162461bcd60e51b815260040180806020018281038252603f815260200180613b15603f913960400191505060405180910390fd5b6001600160a01b038116600090815260056020526040812080549190556111f881612b18565b6002546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561124e57600080fd5b505af1158015611262573d6000803e3d6000fd5b505050506040513d602081101561127857600080fd5b5050600254604080516001600160a01b0380861682529092166020830152818101839052517f4831bdd9dcf3048a28319ce81d3cab7a15366bcf449bc7803a539107440809cc9181900360600190a15050565b60056020526000908152604090205481565b600081565b6013546001600160a01b0316331461132b5760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b6001600160a01b038216600081815260106020908152604091829020805460ff191685151590811790915582519384529083015280517f0aa5ec5ffdc7f6f9c4d0dded489d7450297155cb2f71cb771e02427f7dff4f519281900390910190a15050565b6013546001600160a01b031681565b600d5481565b60036020526000908152604090205481565b601554600160a01b900460ff1680156113ed57506013546001600160a01b03163314806113ed57506015546001600160a01b031633145b6114285760405162461bcd60e51b8152600401808060200182810382526045815260200180613c4d6045913960600191505060405180910390fd5b6114328282612bb3565b5050565b6013546001600160a01b0316331461147f5760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b6001600160a01b0381166114c45760405162461bcd60e51b815260040180806020018281038252603f815260200180613917603f913960400191505060405180910390fd5b60025460408051637e062a3560e11b815290516001600160a01b039283169284169163fc0c546a916004808301926020929190829003018186803b15801561150b57600080fd5b505afa15801561151f573d6000803e3d6000fd5b505050506040513d602081101561153557600080fd5b50516001600160a01b03161461157c5760405162461bcd60e51b81526004018080602001828103825260318152602001806138e66031913960400191505060405180910390fd5b604080518082019091526001600160a01b0382168152600060208201526115a590601790612c1c565b6040516001600160a01b038216907f0821015de34e20b0878a40f6f165801417f53b2017016d7321cacee989c8cfa790600090a250565b60076020526000908152604090205460ff1681565b60066020526000908152604090205481565b6001600160a01b038116600090815260066020526040812054600e54829161162b919061291e565b600d546001600160a01b03851660009081526003602052604090205491925061165891610a269084612980565b9392505050565b601554600160a01b900460ff1681565b6013546001600160a01b031633146116b85760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b60128190556040805182815290517fcf837c6f8ba9f94fb0b21939d04aba4ae1cf50cbeca85513c218dfdc6666f1a99181900360200190a150565b6016546001600160a01b031681565b6008602052600090815260409020546001600160a01b031681565b6013546001600160a01b031633146117665760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b60008190556040805182815290517fc2965d898897107f6f1d0e43c043ca07b7a51d487acfac1decec2ec8405364409181900360200190a150565b60095481565b600c54600b544390600090801561181c5760006117c4848661291e565b905060005481106117d7578192506117fe565b6000546117e48383612980565b11156117fe576000546117fb90610a268484612980565b92505b821561181a5761180e828461291e565b600b5561181a83612c5f565b505b600c83905533600061182d82611603565b9050801561188257600f54611842908261291e565b600f556001600160a01b0382166000908152600460205260409020546118689082612a40565b6001600160a01b0383166000908152600460205260409020555b600e546001600160a01b03831660009081526006602090815260408083209390935533825260079052205460ff166118f95760098054600090815260086020908152604080832080546001600160a01b03191633908117909155835260079091529020805460ff1916600190811790915581540190555b601554600160a01b900460ff16156119425760405162461bcd60e51b8152600401808060200182810382526033815260200180613b546033913960400191505060405180910390fd5b600154339061195c906001600160a01b031682308b612cc8565b600a546119699089612a40565b600a556001600160a01b03811660009081526003602052604090205461198f9089612a40565b6001600160a01b0382166000818152600360209081526040918290209390935580519182529181018a905281517f02b97e4596a9bc8fa447a0e645da5fa038bf5f5a38ab0bcdcb74e7c2e9c96e4f929181900390910190a15050505050505050565b60006119fd6017612d28565b905090565b600080611a10601784612a9a565b600101549392505050565b60046020526000908152604090205481565b6013546001600160a01b0316331480611a5057506015546001600160a01b031633145b611a8b5760405162461bcd60e51b815260040180806020018281038252602e815260200180613a6e602e913960400191505060405180910390fd5b60158054821515600160a01b810260ff60a01b199092169190911790915560408051918252517f77860e247ab9186dbe64e5bd0e0b93273cc4273e01818420e788f500078886f59181900360200190a150565b6013546001600160a01b03163314611b275760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b6001600160a01b038116611b6c5760405162461bcd60e51b8152600401808060200182810382526031815260200180613ae46031913960400191505060405180910390fd5b601554600160a01b900460ff16611bb45760405162461bcd60e51b815260040180806020018281038252602b815260200180613899602b913960400191505060405180910390fd5b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611bff57600080fd5b505afa158015611c13573d6000803e3d6000fd5b505050506040513d6020811015611c2957600080fd5b5051600a5460408051606081019091526022808252929350600092611c5a9291906138c46020830139849190612d2c565b6002546040805163095ea7b360e01b81526001600160a01b03878116600483015260248201859052915193945091169163095ea7b3916044808201926020929091908290030181600087803b158015611cb257600080fd5b505af1158015611cc6573d6000803e3d6000fd5b505050506040513d6020811015611cdc57600080fd5b505060408051631f72642160e31b81523060048201526024810183905290516001600160a01b0385169163fb93210891604480830192600092919082900301818387803b158015611d2c57600080fd5b505af1158015611d40573d6000803e3d6000fd5b5050604080516001600160a01b03871681526020810185905281517f491c0362a655f805cc3d5ab67c471c6b4e517051540c85134456449ce6c1a6799450908190039091019150a1505050565b600c54600b5443906000908015611e02576000611daa848661291e565b90506000548110611dbd57819250611de4565b600054611dca8383612980565b1115611de457600054611de190610a268484612980565b92505b8215611e0057611df4828461291e565b600b55611e0083612c5f565b505b600c839055336000611e1382611603565b90508015611e6857600f54611e28908261291e565b600f556001600160a01b038216600090815260046020526040902054611e4e9082612a40565b6001600160a01b0383166000908152600460205260409020555b600e546001600160a01b0383166000908152600660205260408120919091558790611e9282611603565b90508015611ee757600f54611ea7908261291e565b600f556001600160a01b038216600090815260046020526040902054611ecd9082612a40565b6001600160a01b0383166000908152600460205260409020555b600e546001600160a01b03831660009081526006602090815260408083209390935533825260079052205460ff16611f5e5760098054600090815260086020908152604080832080546001600160a01b03191633908117909155835260079091529020805460ff1916600190811790915581540190555b6001600160a01b0389166000908152600460209081526040808320546003909252909120543391908111611fc35760405162461bcd60e51b8152600401808060200182810382526025815260200180613b876025913960400191505060405180910390fd5b6001600160a01b038b1660009081526004602090815260408083208390556003909152812054611ff490839061291e565b6001600160a01b03808e166000908152600360205260408082208054908390556001548251630852cd8d60e31b815260048101839052925191975094955093909216926342966c6892602480820193929182900301818387803b15801561205a57600080fd5b505af115801561206e573d6000803e3d6000fd5b5050600a54612080925090508361291e565b600a556001600160a01b0383166000908152600460205260409020546120a69082612a40565b6001600160a01b03808516600090815260046020908152604080832094909455918f168152600590915220546120dc9083612a40565b6001600160a01b038d16600090815260056020526040902081905561210081612b18565b6001600160a01b03808e166000818152600560209081526040808320839055600254815163a9059cbb60e01b8152600481019590955260248501879052905194169363a9059cbb93604480820194918390030190829087803b15801561216557600080fd5b505af1158015612179573d6000803e3d6000fd5b505050506040513d602081101561218f57600080fd5b5050604080516001600160a01b0380871682528f16602082015280820183905290517fb1e35379b2ed6821c33158f59080978024478baafa855571cd84e46b9848b3ce9181900360600190a150505050505050505050505050565b601554600160a01b900460ff16801561222157506013546001600160a01b031633148061222157506015546001600160a01b031633145b61225c5760405162461bcd60e51b8152600401808060200182810382526045815260200180613c4d6045913960600191505060405180910390fd5b61226581612dc3565b50565b6001546001600160a01b031681565b60008080612286601785612a9a565b60165490915060009081906122a59084906001600160a01b0316612e29565b604080518381526020810183905281519395509193507f11d2034f4471d11a13f0f1798ceaf0c9db2812d450a0681958ce7d4f2fb97f0992918290030190a1909350915050915091565b6122f7612408565b6122ff611187565b3360009081526003602052604090205461226581610feb565b6122ff612408565b6013546001600160a01b031633146123695760405162461bcd60e51b8152600401808060200182810382526027815260200180613a9c6027913960400191505060405180910390fd5b6001600160a01b0381166123ae5760405162461bcd60e51b815260040180806020018281038252603a815260200180613a34603a913960400191505060405180910390fd5b601680546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f05f3326e0527f309d4015dee3bc3f36e650b53fc823bab69c99847814acfafdf9181900360200190a150565b600b5481565b600c54600b544390600090801561247d576000612425848661291e565b905060005481106124385781925061245f565b6000546124458383612980565b111561245f5760005461245c90610a268484612980565b92505b821561247b5761246f828461291e565b600b5561247b83612c5f565b505b600c83905533600061248e82611603565b905080156124e357600f546124a3908261291e565b600f556001600160a01b0382166000908152600460205260409020546124c99082612a40565b6001600160a01b0383166000908152600460205260409020555b600e546001600160a01b03831660009081526006602090815260408083209390935533808352600490915291812054908161254f5760405162461bcd60e51b815260040180806020018281038252603a8152602001806139d4603a913960400191505060405180910390fd5b6001600160a01b038316600090815260046020908152604080832083905560039091529020548211156125be576001600160a01b0383166000908152600360205260409020546125a090839061291e565b6001600160a01b038416600090815260036020526040902054925090505b6001600160a01b0383166000908152600360205260409020546125e1908361291e565b6001600160a01b03808516600090815260036020526040808220939093556001548351630852cd8d60e31b81526004810187905293519216926342966c68926024808301939282900301818387803b15801561263c57600080fd5b505af1158015612650573d6000803e3d6000fd5b5050600a54612662925090508361291e565b600a5561266e81612c5f565b6001600160a01b0383166000908152600560205260409020546126919083612a40565b6001600160a01b03841660008181526005602090815260409182902093909355805191825291810184905281517fe6b1330a9c444712d3673f05900d736c42072653e56fb82b5951477832b8d576929181900390910190a1505050505050505050565b6014546001600160a01b031681565b6015546001600160a01b031681565b3360009081526010602052604090205460ff166127605760405162461bcd60e51b8152600401808060200182810382526028815260200180613c046028913960400191505060405180910390fd5b600c54600b54439060009080156127d557600061277d848661291e565b90506000548110612790578192506127b7565b60005461279d8383612980565b11156127b7576000546127b490610a268484612980565b92505b82156127d3576127c7828461291e565b600b556127d383612c5f565b505b600c839055601554600160a01b900460ff16156128235760405162461bcd60e51b8152600401808060200182810382526033815260200180613b546033913960400191505060405180910390fd5b600254604080516323b872dd60e01b81526001600160a01b03898116600483015230602483015260448201899052915191909216916323b872dd9160648083019260209291908290030181600087803b15801561287f57600080fd5b505af1158015612893573d6000803e3d6000fd5b505050506040513d60208110156128a957600080fd5b5050600b546128b89086612a40565b600b556128c3612e7c565b604080516001600160a01b03881681526020810187905281517f33ad5d6b2a46b5457e0d36286a2686a0390b0821dedbbdf8dcdcda64f4782c68929181900390910190a1505050505050565b6002546001600160a01b031681565b600082821115612975576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b60008261298f5750600061297a565b8282028284828161299c57fe5b04146116585760405162461bcd60e51b8152600401808060200182810382526021815260200180613ac36021913960400191505060405180910390fd5b6000808211612a2f576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612a3857fe5b049392505050565b600082820183811015611658576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000826000018281548110612aab57fe5b9060005260206000209060020201905092915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612b13908490612f6e565b505050565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612b6357600080fd5b505afa158015612b77573d6000803e3d6000fd5b505050506040513d6020811015612b8d57600080fd5b50519050818110156114325760115481830390612b1390612bae9083612a40565b61301f565b6000612bc0601784612a9a565b9050600080612bd18330868461304e565b91509150847fccbd929f935422b28ee209a0db0556280b0a3d9bc4da58f1d3f0ab4f8a4996478383604051808381526020018281526020019250505060405180910390a25050505050565b8154600180820184556000938452602093849020835160029093020180546001600160a01b0319166001600160a01b039093169290921782559190920151910155565b6000600a54118015612c715750600081115b15612cb557612c9d612c94600a54610a26600d548561298090919063ffffffff16565b600e5490612a40565b600e55600f54612cad9082612a40565b600f55612265565b600b54612cc29082612a40565b600b5550565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612d22908590612f6e565b50505050565b5490565b60008184841115612dbb5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d80578181015183820152602001612d68565b50505050905090810190601f168015612dad5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000612dd0601783612a9a565b9050600080612ddf8330613087565b91509150837fccbd929f935422b28ee209a0db0556280b0a3d9bc4da58f1d3f0ab4f8a4996478383604051808381526020018281526020019250505060405180910390a250505050565b6000808360010154612e3a856130b1565b11612e4a57506000905080610b89565b6000612e638560010154612e5d876130b1565b9061291e565b9050612e70858583613127565b92509250509250929050565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612ec757600080fd5b505afa158015612edb573d6000803e3d6000fd5b505050506040513d6020811015612ef157600080fd5b5051601254601154919250600091612f0f91606491610a2691612980565b601154909150612f1f9082612a40565b821115612f4b5760115482036000612f3760176132e4565b9050612f43818361330f565b505050611432565b601154612f58908261291e565b82101561143257601154829003612b138161301f565b6060612fc3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166134219092919063ffffffff16565b805190915015612b1357808060200190516020811015612fe257600080fd5b5051612b135760405162461bcd60e51b815260040180806020018281038252602a815260200180613bac602a913960400191505060405180910390fd5b600061302b60176132e4565b60018101549091508281101561303f578092505b8215612b1357612b1383613438565b600080808061305f8888888861344b565b60018a01549193509150613073908261291e565b600189015590925090505b94509492505050565b6000806130a683856001015460008761304e909392919063ffffffff16565b915091509250929050565b8054604080516306a61f7560e51b815290516000926001600160a01b03169163d4c3eea0916004808301926020929190829003018186803b1580156130f557600080fd5b505afa158015613109573d6000803e3d6000fd5b505050506040513d602081101561311f57600080fd5b505192915050565b60008060006131358661363f565b90506000816001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561318657600080fd5b505afa15801561319a573d6000803e3d6000fd5b505050506040513d60208110156131b057600080fd5b5051905060006131bf886130b1565b885460408051632ca6a71b60e11b81526001600160a01b038b81166004830152602482018b9052915193945091169163594d4e369160448082019260009290919082900301818387803b15801561321557600080fd5b505af1158015613229573d6000803e3d6000fd5b505050506000836001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561327c57600080fd5b505afa158015613290573d6000803e3d6000fd5b505050506040513d60208110156132a657600080fd5b5051905060006132b6828561291e565b905060006132c38b6130b1565b905060006132d1858361291e565b929c929b50919950505050505050505050565b6000816132f081613683565b815481106132fa57fe5b90600052602060002090600202019050919050565b60008061331b8461363f565b84546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810187905290519293509083169163a9059cbb916044808201926020929091908290030181600087803b15801561337357600080fd5b505af1158015613387573d6000803e3d6000fd5b505050506040513d602081101561339d57600080fd5b505083546040805163b6b55f2560e01b81526004810186905290516001600160a01b039092169163b6b55f259160248082019260009290919082900301818387803b1580156133eb57600080fd5b505af11580156133ff573d6000803e3d6000fd5b5050506001850154613412915084612a40565b60018501555081905092915050565b606061343084846000856136d0565b949350505050565b6122656134456017613683565b82612bb3565b60008060006134598761363f565b90506000816001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156134aa57600080fd5b505afa1580156134be573d6000803e3d6000fd5b505050506040513d60208110156134d457600080fd5b5051905060006134e3896130b1565b89546040805163ead5d35960e01b81526001600160a01b038c81166004830152602482018c90528a15156044830152915193945091169163ead5d3599160648082019260009290919082900301818387803b15801561354157600080fd5b505af1158015613555573d6000803e3d6000fd5b505050506000836001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156135a857600080fd5b505afa1580156135bc573d6000803e3d6000fd5b505050506040513d60208110156135d257600080fd5b5051905060006135e2828561291e565b905060006135ef8c6130b1565b905060008185111561360857613605858361291e565b90505b891561361f5791975090955061307e945050505050565b8a8082111561362b5750805b929d929c50919a5050505050505050505050565b805460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b1580156130f557600080fd5b60008061368f83612d28565b90506116586001604051806040016040528060118152602001705661756c742e4c6973743a20656d70747960781b81525083612d2c9092919063ffffffff16565b6060824710156137115760405162461bcd60e51b8152600401808060200182810382526026815260200180613a0e6026913960400191505060405180910390fd5b61371a8561382c565b61376b576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106137aa5780518252601f19909201916020918201910161378b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461380c576040519150601f19603f3d011682016040523d82523d6000602084013e613811565b606091505b5091509150613821828286613832565b979650505050505050565b3b151590565b60608315613841575081611658565b8251156138515782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315612d80578181015183820152602001612d6856fe4d696772617461626c654c696e6b5472616e736d7574657256323a207365742070617573652066697273746e6f7420656e6f7567682066756e647320746f2073657276696365207374616b65734d696772617461626c654c696e6b5472616e736d7574657256322e7661756c743a20746f6b656e206d69736d617463682e4d696772617461626c654c696e6b5472616e736d7574657256323a20616374697665207661756c7420616464726573732063616e6e6f74206265203078302e4d696772617461626c654c696e6b5472616e736d7574657256323a20756e7374616b6520616d6f756e742065786365656473206465706f736974656420616d6f756e744d696772617461626c654c696e6b5472616e736d7574657256323a2073656e74696e656c20616464726573732063616e6e6f74206265203078302e4d696772617461626c654c696e6b5472616e736d7574657256323a206e65656420746f20686176652070656e64696e6720696e206275636b6574416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4d696772617461626c654c696e6b5472616e736d7574657256323a207265776172647320616464726573732063616e6e6f74206265203078302e4d696772617461626c654c696e6b5472616e736d7574657256323a202128676f76207c7c2073656e74696e656c294d696772617461626c654c696e6b5472616e736d7574657256323a2021676f7665726e616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774d696772617461626c654c696e6b5472616e736d7574657256323a2063616e6e6f74206d69677261746520746f203078304d696772617461626c654c696e6b5472616e736d7574657256323a206e6f207265616c69736564546f6b656e2062616c616e636520666f722073656e6465724d696772617461626c654c696e6b5472616e736d7574657256323a20656d657267656e637920706175736520656e61626c65644d696772617461626c654c696e6b5472616e736d7574657256323a20216f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644d696772617461626c654c696e6b5472616e736d7574657256323a202170656e64696e67476f7665726e616e63654d696772617461626c654c696e6b5472616e736d7574657256323a202177686974656c69737465644d696772617461626c654c696e6b5472616e736d7574657256323a203020676f764d696772617461626c654c696e6b5472616e736d7574657256323a206e6f74207061757365642c206f72206e6f7420676f7665726e616e6365206f722073656e74696e656ca2646970667358221220630faf1d4ba77fd8f2350951534a1aa731419eb8f1886bbca673976f92dcb6fd64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000029ddf2c4f1e80dc9e95cc57a9ca03a28e4ab6d6c000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca00000000000000000000000068284083acbabcb6da84f62ea341dd8c30500eee
-----Decoded View---------------
Arg [0] : _waToken (address): 0x29DDF2c4F1E80DC9E95CC57a9cA03a28E4aB6D6c
Arg [1] : _token (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA
Arg [2] : _governance (address): 0x68284083acbabCb6da84f62ea341dd8c30500EEE
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000029ddf2c4f1e80dc9e95cc57a9ca03a28e4ab6d6c
Arg [1] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [2] : 00000000000000000000000068284083acbabcb6da84f62ea341dd8c30500eee
Deployed Bytecode Sourcemap
97532:31285:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97884:35;;;:::i;:::-;;;;;;;;;;;;;;;;115047:1079;;;;;;;;;;;;;;;;-1:-1:-1;115047:1079:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;116490:277;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;124394:200;;;;;;;;;;;;;;;;-1:-1:-1;124394:200:0;;:::i;:::-;;123869:248;;;;;;;;;;;;;;;;-1:-1:-1;123869:248:0;-1:-1:-1;;;;;123869:248:0;;:::i;117172:289::-;;;;;;;;;;;;;;;;-1:-1:-1;117172:289:0;-1:-1:-1;;;;;117172:289:0;;:::i;113706:897::-;;;;;;;;;;;;;;;;-1:-1:-1;113706:897:0;-1:-1:-1;;;;;113706:897:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99034:34;;;:::i;98890:58::-;;;:::i;98612:34::-;;;:::i;117604:301::-;;;:::i;128172:215::-;;;;;;;;;;;;;;;;-1:-1:-1;128172:215:0;;:::i;:::-;;;;-1:-1:-1;;;;;128172:215:0;;;;;;;;;;;;;;111505:84;;;:::i;98420:31::-;;;:::i;106241:579::-;;;;;;;;;;;;;;;;-1:-1:-1;106241:579:0;;:::i;98741:42::-;;;;;;;;;;;;;;;;-1:-1:-1;98741:42:0;-1:-1:-1;;;;;98741:42:0;;:::i;:::-;;;;;;;;;;;;;;;;;;98653:33;;;:::i;98351:34::-;;;:::i;105593:426::-;;;:::i;98101:49::-;;;;;;;;;;;;;;;;-1:-1:-1;98101:49:0;-1:-1:-1;;;;;98101:49:0;;:::i;97828:::-;;;:::i;118091:177::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;118091:177:0;;;;;;;;;;:::i;99186:25::-;;;:::i;98565:38::-;;;:::i;97986:52::-;;;;;;;;;;;;;;;;-1:-1:-1;97986:52:0;-1:-1:-1;;;;;97986:52:0;;:::i;120846:287::-;;;;;;;;;;;;;;;;-1:-1:-1;120846:287:0;;;;;;;:::i;118637:519::-;;;;;;;;;;;;;;;;-1:-1:-1;118637:519:0;-1:-1:-1;;;;;118637:519:0;;:::i;98219:43::-;;;;;;;;;;;;;;;;-1:-1:-1;98219:43:0;-1:-1:-1;;;;;98219:43:0;;:::i;98157:53::-;;;;;;;;;;;;;;;;-1:-1:-1;98157:53:0;-1:-1:-1;;;;;98157:53:0;;:::i;102097:258::-;;;;;;;;;;;;;;;;-1:-1:-1;102097:258:0;-1:-1:-1;;;;;102097:258:0;;:::i;99575:17::-;;;:::i;124865:182::-;;;;;;;;;;;;;;;;-1:-1:-1;124865:182:0;;:::i;99668:22::-;;;:::i;98269:43::-;;;;;;;;;;;;;;;;-1:-1:-1;98269:43:0;;:::i;105239:206::-;;;;;;;;;;;;;;;;-1:-1:-1;105239:206:0;;:::i;98319:23::-;;;:::i;106942:631::-;;;;;;;;;;;;;;;;-1:-1:-1;106942:631:0;;:::i;127918:96::-;;;:::i;128608:206::-;;;;;;;;;;;;;;;;-1:-1:-1;128608:206:0;;:::i;98045:49::-;;;;;;;;;;;;;;;;-1:-1:-1;98045:49:0;-1:-1:-1;;;;;98045:49:0;;:::i;125487:229::-;;;;;;;;;;;;;;;;-1:-1:-1;125487:229:0;;;;:::i;127108:700::-;;;;;;;;;;;;;;;;-1:-1:-1;127108:700:0;-1:-1:-1;;;;;127108:700:0;;:::i;109460:1557::-;;;;;;;;;;;;;;;;-1:-1:-1;109460:1557:0;-1:-1:-1;;;;;109460:1557:0;;:::i;119913:267::-;;;;;;;;;;;;;;;;-1:-1:-1;119913:267:0;;:::i;97928:22::-;;;:::i;125928:370::-;;;;;;;;;;;;;;;;-1:-1:-1;125928:370:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;111804:183;;;:::i;111169:144::-;;;:::i;126540:435::-;;;;;;;;;;;;;;;;-1:-1:-1;126540:435:0;-1:-1:-1;;;;;126540:435:0;;:::i;98392:21::-;;;:::i;107917:1076::-;;;:::i;99273:32::-;;;:::i;99394:23::-;;;:::i;112461:386::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;112461:386:0;;;;;;;;:::i;97957:20::-;;;:::i;97884:35::-;;;;:::o;115047:1079::-;115150:28;;115238:4;115269:9;;;115150:28;115269:9;115321:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;115321:20:0;;115289:52;;115359:29;115405:5;115413:1;115405:9;115391:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;115391:24:0;;115359:56;;115445:9;115469:21;115493:72;115544:20;;115493:46;115504:34;115521:16;;115504:12;:16;;:34;;;;:::i;:::-;115493:6;;;:10;:46::i;:::-;:50;;:72::i;:::-;115469:96;;115616:20;;115579:34;115596:16;;115579:12;:16;;:34;;;;:::i;:::-;:57;115576:110;;;-1:-1:-1;115668:6:0;;115576:110;115701:9;115696:377;115720:5;115716:1;:9;115696:377;;;115768:11;;;;:8;:11;;;;;;115750:15;;-1:-1:-1;;;;;115768:11:0;;;;115750:12;;115763:1;;115750:15;;;;;;-1:-1:-1;;;;;115750:29:0;;;:15;;;;;;;;;;:29;;;;115812:30;115830:11;;;:8;:11;;;;;;;;;;115812:30;;:17;:30;;;;;115794:15;;:12;;115807:1;;115794:15;;;;;;;;;;;;;;;;:48;;;;115998:19;;115962:30;115980:11;;;:8;:11;;;;;;;-1:-1:-1;;;;;115980:11:0;115962:30;;:17;:30;;;;;;;;115879:140;;115944:74;;:49;;:13;;:17;:49::i;:74::-;115911:27;115926:11;;;:8;:11;;;;;;;;;-1:-1:-1;;;;;115926:11:0;115911:27;;;:14;:27;;;;;;115894:11;;;;;;;115879:60;;115911:27;115879:60;;:14;:27::i;:::-;:31;;:60::i;:140::-;115857:12;115870:1;115874;115870:5;115857:19;;;;;;;;;;;;;;;;;:162;116060:1;116055:6;;;;116039:1;116034:6;;;;;115727;115696:377;;;-1:-1:-1;116091:12:0;;-1:-1:-1;116105:12:0;;-1:-1:-1;;;;;115047:1079:0;;;;;;:::o;116490:277::-;116533:21;116556:20;116578:15;116620:34;116637:16;;116620:12;:16;;:34;;;;:::i;:::-;116675:6;;116738:20;;116605:49;;-1:-1:-1;116675:6:0;-1:-1:-1;116708:51:0;;:25;116675:6;116605:49;116708:11;:25::i;:51::-;116692:67;;116490:277;;;:::o;124394:200::-;105029:10;;-1:-1:-1;;;;;105029:10:0;105015;:24;105007:76;;;;-1:-1:-1;;;105007:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124484:18:::1;:40:::0;;;124540:46:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;124394:200:::0;:::o;123869:248::-;105029:10;;-1:-1:-1;;;;;105029:10:0;105015;:24;105007:76;;;;-1:-1:-1;;;105007:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;123947:25:0;::::1;123939:97;;;;-1:-1:-1::0;;;123939:97:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124047:8;:20:::0;;-1:-1:-1;;;;;124047:20:0;::::1;-1:-1:-1::0;;;;;;124047:20:0;;::::1;::::0;::::1;::::0;;;124083:26:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;123869:248:::0;:::o;117172:289::-;105029:10;;-1:-1:-1;;;;;105029:10:0;105015;:24;105007:76;;;;-1:-1:-1;;;105007:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;117268:34:0;::::1;117260:80;;;;-1:-1:-1::0;;;117260:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;117353:17;:38:::0;;-1:-1:-1;;;;;117353:38:0;::::1;-1:-1:-1::0;;;;;;117353:38:0;;::::1;::::0;::::1;::::0;;;117409:44:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;117172:289:::0;:::o;113706:897::-;-1:-1:-1;;;;;113966:23:0;;113800:19;113966:23;;;:17;:23;;;;;;114075:20;;114052:16;;113800:19;;;;;;;;114024:72;;:46;;114035:34;;:12;;:16;:34::i;114024:72::-;114000:96;;114147:20;;114110:34;114127:16;;114110:12;:16;;:34;;;;:::i;:::-;:57;114107:110;;;-1:-1:-1;114199:6:0;;114107:110;114266:19;;114227:20;;114266:23;114262:138;;114368:19;;-1:-1:-1;;;;;114339:23:0;;;;;;:17;:23;;;;;;114321:67;;114368:19;114321:42;;:13;;:17;:42::i;:67::-;114306:82;;114262:138;114410:17;114430:46;114455:20;114470:4;114455:14;:20::i;:::-;-1:-1:-1;;;;;114430:20:0;;;;;;:14;:20;;;;;;;:24;:46::i;:::-;-1:-1:-1;;;;;114507:20:0;;;;114487:17;114507:20;;;:14;:20;;;;;;114546:12;;114560;;;-1:-1:-1;114507:20:0;;-1:-1:-1;113706:897:0;-1:-1:-1;;;;113706:897:0:o;99034:34::-;;;;:::o;98890:58::-;;;;:::o;98612:34::-;;;;:::o;117604:301::-;117675:17;;-1:-1:-1;;;;;117675:17:0;117661:10;:31;117653:90;;;;-1:-1:-1;;;117653:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;117783:17;;117811:10;:31;;-1:-1:-1;;;;;;117811:31:0;-1:-1:-1;;;;;117783:17:0;;;117811:31;;;;;117860:37;;;;;;;;;;;;;;;;;117604:301;:::o;128172:215::-;128238:30;;128326:21;:7;128338:8;128326:11;:21::i;:::-;128365:14;-1:-1:-1;;;;;128365:14:0;;128172:215;-1:-1:-1;;;128172:215:0:o;111505:84::-;111552:11;:9;:11::i;:::-;111574:7;:5;:7::i;:::-;111505:84::o;98420:31::-;;;;:::o;106241:579::-;106295:10;102522:13;102538:23;102553:7;102538:14;:23::i;:::-;102522:39;-1:-1:-1;102576:9:0;;102572:167;;102623:18;;:29;;102646:5;102623:22;:29::i;:::-;102602:18;:50;-1:-1:-1;;;;;102693:23:0;;;;;;:14;:23;;;;;;:34;;102721:5;102693:27;:34::i;:::-;-1:-1:-1;;;;;102667:23:0;;;;;;:14;:23;;;;;:60;102572:167;102779:19;;-1:-1:-1;;;;;102749:27:0;;;;;;:18;:27;;;;;;;;:49;;;;106426:10:::1;106455:25:::0;;;:17:::1;:25:::0;;;;;;;:35;-1:-1:-1;106455:35:0::1;106447:115;;;;-1:-1:-1::0;;;106447:115:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;106601:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;:37:::1;::::0;106631:6;106601:29:::1;:37::i;:::-;-1:-1:-1::0;;;;;106573:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;:65;106671:19:::1;::::0;:31:::1;::::0;106695:6;106671:23:::1;:31::i;:::-;106649:19;:53:::0;106728:7:::1;::::0;106713:52:::1;::::0;-1:-1:-1;;;;;106728:7:0::1;106750:6:::0;106758;106713:36:::1;:52::i;:::-;106781:31;::::0;;-1:-1:-1;;;;;106781:31:0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;102809:1;106241:579:::0;;;:::o;98741:42::-;;;;;;;;;;;;;;;:::o;98653:33::-;;;;:::o;98351:34::-;;;;:::o;105593:426::-;105645:10;105628:14;105674:22;;;:14;:22;;;;;;105666:102;;;;-1:-1:-1;;;105666:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;105795:22:0;;105779:13;105795:22;;;:14;:22;;;;;;;105828:26;;;105865:40;105795:22;105865:33;:40::i;:::-;105931:5;;105916:45;;;-1:-1:-1;;;105916:45:0;;-1:-1:-1;;;;;105916:45:0;;;;;;;;;;;;;;;105931:5;;;;;105916:30;;:45;;;;;;;;;;;;;;105931:5;;105916:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;105998:5:0;;105977:34;;;-1:-1:-1;;;;;105977:34:0;;;;;105998:5;;;105916:45;105977:34;;;;;;;;;;;;;;;;;;;105593:426;;:::o;98101:49::-;;;;;;;;;;;;;:::o;97828:::-;97875:1;97828:49;:::o;118091:177::-;105029:10;;-1:-1:-1;;;;;105029:10:0;105015;:24;105007:76;;;;-1:-1:-1;;;105007:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;118178:23:0;::::1;;::::0;;;:9:::1;:23;::::0;;;;;;;;:32;;-1:-1:-1;;118178:32:0::1;::::0;::::1;;::::0;;::::1;::::0;;;118226:34;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;118091:177:::0;;:::o;99186:25::-;;;-1:-1:-1;;;;;99186:25:0;;:::o;98565:38::-;;;;:::o;97986:52::-;;;;;;;;;;;;;:::o;120846:287::-;120939:5;;-1:-1:-1;;;120939:5:0;;;;:61;;;;-1:-1:-1;120963:10:0;;-1:-1:-1;;;;;120963:10:0;120949;:24;;:50;;-1:-1:-1;120991:8:0;;-1:-1:-1;;;;;120991:8:0;120977:10;:22;120949:50;120931:143;;;;-1:-1:-1;;;120931:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;121085:40;121107:8;121117:7;121085:21;:40::i;:::-;120846:287;;:::o;118637:519::-;105029:10;;-1:-1:-1;;;;;105029:10:0;105015;:24;105007:76;;;;-1:-1:-1;;;105007:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;118740:56:0;::::1;118732:132;;;;-1:-1:-1::0;;;118732:132:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118912:5;::::0;118891:16:::1;::::0;;-1:-1:-1;;;118891:16:0;;;;-1:-1:-1;;;;;118912:5:0;;::::1;::::0;118891:14;::::1;::::0;::::1;::::0;:16:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:14;:16;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;118891:16:0;-1:-1:-1;;;;;118883:34:0::1;;118875:96;;;;-1:-1:-1::0;;;118875:96:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118997:104;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;118997:104:0;::::1;::::0;;-1:-1:-1;118997:104:0::1;::::0;::::1;::::0;118984:118:::1;::::0;:7:::1;::::0;:12:::1;:118::i;:::-;119120:28;::::0;-1:-1:-1;;;;;119120:28:0;::::1;::::0;::::1;::::0;;;::::1;118637:519:::0;:::o;98219:43::-;;;;;;;;;;;;;;;:::o;98157:53::-;;;;;;;;;;;;;:::o;102097:258::-;-1:-1:-1;;;;;102231:27:0;;102159:7;102231:27;;;:18;:27;;;;;;102207:19;;102159:7;;102207:52;;:19;:23;:52::i;:::-;102331:15;;-1:-1:-1;;;;;102277:26:0;;;;;;:17;:26;;;;;;102179:80;;-1:-1:-1;102277:70:0;;:49;;102179:80;102277:30;:49::i;:70::-;102270:77;102097:258;-1:-1:-1;;;102097:258:0:o;99575:17::-;;;-1:-1:-1;;;99575:17:0;;;;;:::o;124865:182::-;105029:10;;-1:-1:-1;;;;;105029:10:0;105015;:24;105007:76;;;;-1:-1:-1;;;105007:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124949:15:::1;:34:::0;;;124999:40:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;124865:182:::0;:::o;99668:22::-;;;-1:-1:-1;;;;;99668:22:0;;:::o;98269:43::-;;;;;;;;;;;;-1:-1:-1;;;;;98269:43:0;;:::o;105239:206::-;105029:10;;-1:-1:-1;;;;;105029:10:0;105015;:24;105007:76;;;;-1:-1:-1;;;105007:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105331:20:::1;:45:::0;;;105392::::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;105239:206:::0;:::o;98319:23::-;;;;:::o;106942:631::-;103298:16;;103426:6;;103349:12;;103270:25;;103500:11;;103496:1049;;103714:17;103734:36;:13;103752:17;103734;:36::i;:::-;103714:56;;103859:20;;103846:9;:33;103843:383;;103916:7;103900:23;;103843:383;;;104065:20;;104040:22;:7;104052:9;104040:11;:22::i;:::-;:45;104037:174;;;104170:20;;104143:48;;:22;:7;104155:9;104143:11;:22::i;:48::-;104127:64;;104037:174;104306:17;;104303:231;;104393:26;:7;104405:13;104393:11;:26::i;:::-;104384:6;:35;104484:34;104504:13;104484:19;:34::i;:::-;103496:1049;;104603:16;:32;;;107045:10:::1;102522:13;102538:23;107045:10:::0;102538:14:::1;:23::i;:::-;102522:39:::0;-1:-1:-1;102576:9:0;;102572:167:::1;;102623:18;::::0;:29:::1;::::0;102646:5;102623:22:::1;:29::i;:::-;102602:18;:50:::0;-1:-1:-1;;;;;102693:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;:34:::1;::::0;102721:5;102693:27:::1;:34::i;:::-;-1:-1:-1::0;;;;;102667:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;:60;102572:167:::1;102779:19;::::0;-1:-1:-1;;;;;102749:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;:49;;;;102995:10:::2;102983:23:::0;;:11:::2;:23:::0;;;;::::2;;102978:158;;103032:8;::::0;;103023:18:::2;::::0;;;:8:::2;:18;::::0;;;;;;;:31;;-1:-1:-1;;;;;;103023:31:0::2;103044:10;103023:31:::0;;::::2;::::0;;;103069:23;;:11:::2;:23:::0;;;;;:30;;-1:-1:-1;;103069:30:0::2;103023:31:::0;103069:30;;::::2;::::0;;;103114:10;;::::2;::::0;;102978:158:::2;107108:5:::3;::::0;-1:-1:-1;;;107108:5:0;::::3;;;107107:6;107099:70;;;;-1:-1:-1::0;;;107099:70:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107324:7;::::0;107246:10:::3;::::0;107309:71:::3;::::0;-1:-1:-1;;;;;107324:7:0::3;107246:10:::0;107366:4:::3;107373:6:::0;107309:40:::3;:71::i;:::-;107413:19;::::0;:31:::3;::::0;107437:6;107413:23:::3;:31::i;:::-;107391:19;:53:::0;-1:-1:-1;;;;;107483:25:0;::::3;;::::0;;;:17:::3;:25;::::0;;;;;:37:::3;::::0;107513:6;107483:29:::3;:37::i;:::-;-1:-1:-1::0;;;;;107455:25:0;::::3;;::::0;;;:17:::3;:25;::::0;;;;;;;;:65;;;;107536:29;;;;;;;::::3;::::0;;;;;::::3;::::0;;;;;;;;;::::3;103146:1;104646::::1;;106942:631:::0;;;;;:::o;127918:96::-;127963:7;127990:16;:7;:14;:16::i;:::-;127983:23;;127918:96;:::o;128608:206::-;128681:7;;128746:21;:7;128758:8;128746:11;:21::i;:::-;128785;;;;128608:206;-1:-1:-1;;;128608:206:0:o;98045:49::-;;;;;;;;;;;;;:::o;125487:229::-;125560:10;;-1:-1:-1;;;;;125560:10:0;125546;:24;;:50;;-1:-1:-1;125588:8:0;;-1:-1:-1;;;;;125588:8:0;125574:10;:22;125546:50;125538:109;;;;-1:-1:-1;;;125538:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;125658:5;:14;;;;;-1:-1:-1;;;125658:14:0;;-1:-1:-1;;;;125658:14:0;;;;;;;;;;125688:20;;;;;;;;;;;;;;;;125487:229;:::o;127108:700::-;105029:10;;-1:-1:-1;;;;;105029:10:0;105015;:24;105007:76;;;;-1:-1:-1;;;105007:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;127187:23:0;::::1;127179:85;;;;-1:-1:-1::0;;;127179:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;127283:5;::::0;-1:-1:-1;;;127283:5:0;::::1;;;127275:61;;;;-1:-1:-1::0;;;127275:61:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;127454:5;::::0;127439:46:::1;::::0;;-1:-1:-1;;;127439:46:0;;127479:4:::1;127439:46;::::0;::::1;::::0;;;127418:18:::1;::::0;-1:-1:-1;;;;;127454:5:0::1;::::0;127439:31:::1;::::0;:46;;;;;::::1;::::0;;;;;;;;127454:5;127439:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;127439:46:0;127537:19:::1;::::0;127522:73:::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;127439:46;;-1:-1:-1;127496:23:0::1;::::0;127522:73:::1;::::0;127537:19;127522:73;::::1;127439:46;127522:73:::0;::::1;;:10:::0;;:73;:14:::1;:73::i;:::-;127621:5;::::0;127606:57:::1;::::0;;-1:-1:-1;;;127606:57:0;;-1:-1:-1;;;;;127606:57:0;;::::1;;::::0;::::1;::::0;;;;;;;;;127496:99;;-1:-1:-1;127621:5:0;::::1;::::0;127606:29:::1;::::0;:57;;;;;::::1;::::0;;;;;;;;;127621:5:::1;::::0;127606:57;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;127674:65:0::1;::::0;;-1:-1:-1;;;127674:65:0;;127716:4:::1;127674:65;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;127674:33:0;::::1;::::0;::::1;::::0;:65;;;;;-1:-1:-1;;127674:65:0;;;;;;;-1:-1:-1;127674:33:0;:65;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;127755:45:0::1;::::0;;-1:-1:-1;;;;;127755:45:0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;127755:45:0;;;;;;;;-1:-1:-1;127755:45:0::1;105094:1;;127108:700:::0;:::o;109460:1557::-;103298:16;;103426:6;;103349:12;;103270:25;;103500:11;;103496:1049;;103714:17;103734:36;:13;103752:17;103734;:36::i;:::-;103714:56;;103859:20;;103846:9;:33;103843:383;;103916:7;103900:23;;103843:383;;;104065:20;;104040:22;:7;104052:9;104040:11;:22::i;:::-;:45;104037:174;;;104170:20;;104143:48;;:22;:7;104155:9;104143:11;:22::i;:48::-;104127:64;;104037:174;104306:17;;104303:231;;104393:26;:7;104405:13;104393:11;:26::i;:::-;104384:6;:35;104484:34;104504:13;104484:19;:34::i;:::-;103496:1049;;104603:16;:32;;;109577:10:::1;102522:13;102538:23;109577:10:::0;102538:14:::1;:23::i;:::-;102522:39:::0;-1:-1:-1;102576:9:0;;102572:167:::1;;102623:18;::::0;:29:::1;::::0;102646:5;102623:22:::1;:29::i;:::-;102602:18;:50:::0;-1:-1:-1;;;;;102693:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;:34:::1;::::0;102721:5;102693:27:::1;:34::i;:::-;-1:-1:-1::0;;;;;102667:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;:60;102572:167:::1;102779:19;::::0;-1:-1:-1;;;;;102749:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;:49;;;;109612:11;;102538:23:::2;109612:11:::0;102538:14:::2;:23::i;:::-;102522:39:::0;-1:-1:-1;102576:9:0;;102572:167:::2;;102623:18;::::0;:29:::2;::::0;102646:5;102623:22:::2;:29::i;:::-;102602:18;:50:::0;-1:-1:-1;;;;;102693:23:0;::::2;;::::0;;;:14:::2;:23;::::0;;;;;:34:::2;::::0;102721:5;102693:27:::2;:34::i;:::-;-1:-1:-1::0;;;;;102667:23:0;::::2;;::::0;;;:14:::2;:23;::::0;;;;:60;102572:167:::2;102779:19;::::0;-1:-1:-1;;;;;102749:27:0;::::2;;::::0;;;:18:::2;:27;::::0;;;;;;;:49;;;;102995:10:::3;102983:23:::0;;:11:::3;:23:::0;;;;::::3;;102978:158;;103032:8;::::0;;103023:18:::3;::::0;;;:8:::3;:18;::::0;;;;;;;:31;;-1:-1:-1;;;;;;103023:31:0::3;103044:10;103023:31:::0;;::::3;::::0;;;103069:23;;:11:::3;:23:::0;;;;;:30;;-1:-1:-1;;103069:30:0::3;103023:31:::0;103069:30;;::::3;::::0;;;103114:10;;::::3;::::0;;102978:158:::3;-1:-1:-1::0;;;;;109752:27:0;::::4;109695:14;109752:27:::0;;;:14:::4;:27;::::0;;;;;;;;109854:17:::4;:30:::0;;;;;;;109712:10:::4;::::0;109752:27;109843:41;::::4;109821:128;;;;-1:-1:-1::0;;;109821:128:0::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;109987:27:0;::::4;110017:1;109987:27:::0;;;:14:::4;:27;::::0;;;;;;;:31;;;110092:17:::4;:30:::0;;;;;;110079:44:::4;::::0;:8;;:12:::4;:44::i;:::-;-1:-1:-1::0;;;;;110175:30:0;;::::4;;::::0;;;:17:::4;:30;::::0;;;;;;;110248:34;;;;-1:-1:-1;110336:7:0;110321:38;;-1:-1:-1;;;110321:38:0;;::::4;::::0;::::4;::::0;;;;;110175:30;;-1:-1:-1;110064:59:0;;-1:-1:-1;110336:7:0;;;::::4;::::0;110321:28:::4;::::0;:38;;;;;110175:30;110321:38;;;;;;110175:30;110336:7;110321:38;::::4;;::::0;::::4;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;-1:-1:-1::0;;110419:19:0::4;::::0;:33:::4;::::0;-1:-1:-1;110419:19:0;-1:-1:-1;110443:8:0;110419:23:::4;:33::i;:::-;110397:19;:55:::0;-1:-1:-1;;;;;110522:22:0;::::4;;::::0;;;:14:::4;:22;::::0;;;;;:32:::4;::::0;110549:4;110522:26:::4;:32::i;:::-;-1:-1:-1::0;;;;;110497:22:0;;::::4;;::::0;;;:14:::4;:22;::::0;;;;;;;:57;;;;110620:27;;::::4;::::0;;:14:::4;:27:::0;;;;;:41:::4;::::0;110652:8;110620:31:::4;:41::i;:::-;-1:-1:-1::0;;;;;110590:27:0;::::4;;::::0;;;:14:::4;:27;::::0;;;;:71;;;110730:40:::4;110590:71:::0;110730:33:::4;:40::i;:::-;-1:-1:-1::0;;;;;110854:27:0;;::::4;110884:1;110854:27:::0;;;:14:::4;:27;::::0;;;;;;;:31;;;110911:5:::4;::::0;110896:50;;-1:-1:-1;;;110896:50:0;;::::4;::::0;::::4;::::0;;;;;;;;;;;;110911:5;::::4;::::0;110896:30:::4;::::0;:50;;;;;;;;;;;;;110911:5;110896:50;::::4;;::::0;::::4;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;::::0;::::4;;-1:-1:-1::0;;110962:47:0::4;::::0;;-1:-1:-1;;;;;110962:47:0;;::::4;::::0;;;::::4;110896:50;110962:47:::0;::::4;::::0;;;;;;;;;::::4;::::0;;;;;;;::::4;103146:1;;;;102809::::2;;104646::::1;;109460:1557:::0;;;;;:::o;119913:267::-;119992:5;;-1:-1:-1;;;119992:5:0;;;;:61;;;;-1:-1:-1;120016:10:0;;-1:-1:-1;;;;;120016:10:0;120002;:24;;:50;;-1:-1:-1;120044:8:0;;-1:-1:-1;;;;;120044:8:0;120030:10;:22;120002:50;119984:143;;;;-1:-1:-1;;;119984:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120138:34;120163:8;120138:24;:34::i;:::-;119913:267;:::o;97928:22::-;;;-1:-1:-1;;;;;97928:22:0;;:::o;125928:370::-;125981:7;;;126057:21;:7;126069:8;126057:11;:21::i;:::-;126160:7;;126012:66;;-1:-1:-1;126092:24:0;;;;126145:23;;126012:66;;-1:-1:-1;;;;;126160:7:0;126145:14;:23::i;:::-;126186:49;;;;;;;;;;;;;;126091:77;;-1:-1:-1;126091:77:0;;-1:-1:-1;126186:49:0;;;;;;;;;126256:16;;-1:-1:-1;126274:15:0;-1:-1:-1;;125928:370:0;;;:::o;111804:183::-;111859:11;:9;:11::i;:::-;111881:7;:5;:7::i;:::-;111938:10;111899:18;111920:29;;;:17;:29;;;;;;111960:19;111920:29;111960:7;:19::i;111169:144::-;111203:11;:9;:11::i;126540:435::-;105029:10;;-1:-1:-1;;;;;105029:10:0;105015;:24;105007:76;;;;-1:-1:-1;;;105007:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;126807:24:0;::::1;126799:95;;;;-1:-1:-1::0;;;126799:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;126907:7;:18:::0;;-1:-1:-1;;;;;126907:18:0;::::1;-1:-1:-1::0;;;;;;126907:18:0;;::::1;::::0;::::1;::::0;;;126943:24:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;126540:435:::0;:::o;98392:21::-;;;;:::o;107917:1076::-;103298:16;;103426:6;;103349:12;;103270:25;;103500:11;;103496:1049;;103714:17;103734:36;:13;103752:17;103734;:36::i;:::-;103714:56;;103859:20;;103846:9;:33;103843:383;;103916:7;103900:23;;103843:383;;;104065:20;;104040:22;:7;104052:9;104040:11;:22::i;:::-;:45;104037:174;;;104170:20;;104143:48;;:22;:7;104155:9;104143:11;:22::i;:48::-;104127:64;;104037:174;104306:17;;104303:231;;104393:26;:7;104405:13;104393:11;:26::i;:::-;104384:6;:35;104484:34;104504:13;104484:19;:34::i;:::-;103496:1049;;104603:16;:32;;;107983:10:::1;102522:13;102538:23;107983:10:::0;102538:14:::1;:23::i;:::-;102522:39:::0;-1:-1:-1;102576:9:0;;102572:167:::1;;102623:18;::::0;:29:::1;::::0;102646:5;102623:22:::1;:29::i;:::-;102602:18;:50:::0;-1:-1:-1;;;;;102693:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;:34:::1;::::0;102721:5;102693:27:::1;:34::i;:::-;-1:-1:-1::0;;;;;102667:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;:60;102572:167:::1;102779:19;::::0;-1:-1:-1;;;;;102749:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;:49;;;;108023:10:::2;108063:22:::0;;;:14:::2;:22:::0;;;;;;;;108129:12;108121:83:::2;;;;-1:-1:-1::0;;;108121:83:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;108217:22:0;::::2;108242:1;108217:22:::0;;;:14:::2;:22;::::0;;;;;;;:26;;;108305:17:::2;:25:::0;;;;;;108294:36;::::2;108290:200;;;-1:-1:-1::0;;;;;108367:25:0;::::2;;::::0;;;:17:::2;:25;::::0;;;;;108354:39:::2;::::0;:8;;:12:::2;:39::i;:::-;-1:-1:-1::0;;;;;108453:25:0;::::2;;::::0;;;:17:::2;:25;::::0;;;;;;-1:-1:-1;108347:46:0;-1:-1:-1;108290:200:0::2;-1:-1:-1::0;;;;;108560:25:0;::::2;;::::0;;;:17:::2;:25;::::0;;;;;:39:::2;::::0;108590:8;108560:29:::2;:39::i;:::-;-1:-1:-1::0;;;;;108532:25:0;;::::2;;::::0;;;:17:::2;:25;::::0;;;;;:67;;;;108653:7:::2;::::0;108638:38;;-1:-1:-1;;;108638:38:0;;::::2;::::0;::::2;::::0;;;;;108653:7;::::2;::::0;108638:28:::2;::::0;:38;;;;;108532:25;108638:38;;;;;108532:25;108653:7;108638:38;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;108736:19:0::2;::::0;:33:::2;::::0;-1:-1:-1;108736:19:0;-1:-1:-1;108760:8:0;108736:23:::2;:33::i;:::-;108714:19;:55:::0;108814:25:::2;108834:4:::0;108814:19:::2;:25::i;:::-;-1:-1:-1::0;;;;;108900:22:0;::::2;;::::0;;;:14:::2;:22;::::0;;;;;:36:::2;::::0;108927:8;108900:26:::2;:36::i;:::-;-1:-1:-1::0;;;;;108875:22:0;::::2;;::::0;;;:14:::2;:22;::::0;;;;;;;;:61;;;;108954:31;;;;;;;::::2;::::0;;;;;::::2;::::0;;;;;;;;;::::2;102809:1;;;104646::::1;;107917:1076:::0;;;;:::o;99273:32::-;;;-1:-1:-1;;;;;99273:32:0;;:::o;99394:23::-;;;-1:-1:-1;;;;;99394:23:0;;:::o;112461:386::-;104785:10;104775:21;;;;:9;:21;;;;;;;;104767:74;;;;-1:-1:-1;;;104767:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103298:16:::1;::::0;103426:6:::1;::::0;103349:12:::1;::::0;103270:25:::1;::::0;103500:11;;103496:1049:::1;;103714:17;103734:36;:13:::0;103752:17;103734::::1;:36::i;:::-;103714:56;;103859:20;;103846:9;:33;103843:383;;103916:7;103900:23;;103843:383;;;104065:20;::::0;104040:22:::1;:7:::0;104052:9;104040:11:::1;:22::i;:::-;:45;104037:174;;;104170:20;::::0;104143:48:::1;::::0;:22:::1;:7:::0;104155:9;104143:11:::1;:22::i;:48::-;104127:64;;104037:174;104306:17:::0;;104303:231:::1;;104393:26;:7:::0;104405:13;104393:11:::1;:26::i;:::-;104384:6;:35:::0;104484:34:::1;104504:13:::0;104484:19:::1;:34::i;:::-;103496:1049;;104603:16;:32:::0;;;112582:5:::2;::::0;-1:-1:-1;;;112582:5:0;::::2;;;112581:6;112573:70;;;;-1:-1:-1::0;;;112573:70:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112669:5;::::0;112654:65:::2;::::0;;-1:-1:-1;;;112654:65:0;;-1:-1:-1;;;;;112654:65:0;;::::2;;::::0;::::2;::::0;112705:4:::2;112654:65:::0;;;;;;;;;;;;112669:5;;;::::2;::::0;112654:34:::2;::::0;:65;;;;;::::2;::::0;;;;;;;;112669:5:::2;::::0;112654:65;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;;112739:6:0::2;::::0;:18:::2;::::0;112750:6;112739:10:::2;:18::i;:::-;112730:6;:27:::0;112768::::2;:25;:27::i;:::-;112811:28;::::0;;-1:-1:-1;;;;;112811:28:0;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;;;;;;;;::::2;104852:1:::1;;;;112461:386:::0;;:::o;97957:20::-;;;-1:-1:-1;;;;;97957:20:0;;:::o;7264:158::-;7322:7;7355:1;7350;:6;;7342:49;;;;;-1:-1:-1;;;7342:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7409:5:0;;;7264:158;;;;;:::o;7681:220::-;7739:7;7763:6;7759:20;;-1:-1:-1;7778:1:0;7771:8;;7759:20;7802:5;;;7806:1;7802;:5;:1;7826:5;;;;;:10;7818:56;;;;-1:-1:-1;;;7818:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8379:153;8437:7;8469:1;8465;:5;8457:44;;;;;-1:-1:-1;;;8457:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8523:1;8519;:5;;;;;;;8379:153;-1:-1:-1;;;8379:153:0:o;6802:179::-;6860:7;6892:5;;;6916:6;;;;6908:46;;;;;-1:-1:-1;;;6908:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;95214:128;95286:12;95314:5;:14;;95329:6;95314:22;;;;;;;;;;;;;;;;;;95307:29;;95214:128;;;;:::o;20174:177::-;20284:58;;;-1:-1:-1;;;;;20284:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20284:58:0;-1:-1:-1;;;20284:58:0;;;20257:86;;20277:5;;20257:19;:86::i;:::-;20174:177;;;:::o;119342:422::-;119454:5;;119439:46;;;-1:-1:-1;;;119439:46:0;;119479:4;119439:46;;;;;;119418:18;;-1:-1:-1;;;;;119454:5:0;;119439:31;;:46;;;;;;;;;;;;;;119454:5;119439:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;119439:46:0;;-1:-1:-1;119500:16:0;;;119496:261;;;119716:18;;119548:16;;;;119682:63;;119716:28;;119548:16;119716:22;:28::i;:::-;119682:33;:63::i;121332:345::-;121418:42;121463:21;:7;121475:8;121463:11;:21::i;:::-;121418:66;-1:-1:-1;121496:24:0;;121549:46;121418:66;121573:4;121580:7;121496:24;121549:15;:46::i;:::-;121495:100;;;;121625:8;121611:58;121635:16;121653:15;121611:58;;;;;;;;;;;;;;;;;;;;;;;;121332:345;;;;;:::o;94950:107::-;95022:29;;;;;;;;-1:-1:-1;95022:29:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;95022:29:0;-1:-1:-1;;;;;95022:29:0;;;;;;;;;;;;;;;;;94950:107::o;113032:398::-;113122:1;113100:19;;:23;:37;;;;;113136:1;113127:6;:10;113100:37;113097:326;;;113176:109;113218:52;113250:19;;113218:27;113229:15;;113218:6;:10;;:27;;;;:::i;:52::-;113176:19;;;:23;:109::i;:::-;113154:19;:131;113321:18;;:30;;113344:6;113321:22;:30::i;:::-;113300:18;:51;113097:326;;;113393:6;;:18;;113404:6;113393:10;:18::i;:::-;113384:6;:27;113032:398;:::o;20359:205::-;20487:68;;;-1:-1:-1;;;;;20487:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20487:68:0;-1:-1:-1;;;20487:68:0;;;20460:96;;20480:5;;20460:19;:96::i;:::-;20359:205;;;;:::o;96116:109::-;96198:21;;96116:109::o;9629:166::-;9715:7;9751:12;9743:6;;;;9735:29;;;;-1:-1:-1;;;9735:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9782:5:0;;;9629:166::o;120329:318::-;120401:42;120446:21;:7;120458:8;120446:11;:21::i;:::-;120401:66;-1:-1:-1;120479:24:0;;120532:33;120401:66;120559:4;120532:18;:33::i;:::-;120478:87;;;;120595:8;120581:58;120605:16;120623:15;120581:58;;;;;;;;;;;;;;;;;;;;;;;;120329:318;;;;:::o;94529:325::-;94604:7;94613;94655:5;:20;;;94633:18;:5;:16;:18::i;:::-;:42;94629:78;;-1:-1:-1;94694:1:0;;-1:-1:-1;94694:1:0;94686:13;;94629:78;94713:23;94739:44;94762:5;:20;;;94739:18;:5;:16;:18::i;:::-;:22;;:44::i;:::-;94713:70;-1:-1:-1;94797:51:0;:5;94820:10;94713:70;94797:22;:51::i;:::-;94790:58;;;;;94529:325;;;;;:::o;122176:919::-;122339:5;;122324:46;;;-1:-1:-1;;;122324:46:0;;122364:4;122324:46;;;;;;122310:11;;-1:-1:-1;;;;;122339:5:0;;122324:31;;:46;;;;;;;;;;;;;;122339:5;122324:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;122324:46:0;122424:15;;122401:18;;122324:46;;-1:-1:-1;122381:17:0;;122401:48;;122445:3;;122401:39;;:22;:39::i;:48::-;122470:18;;122381:68;;-1:-1:-1;122470:33:0;;122381:68;122470:22;:33::i;:::-;122464:3;:39;122460:628;;;122545:18;;122539:24;;122520:16;122697:14;:7;:12;:14::i;:::-;122646:65;-1:-1:-1;122726:30:0;122646:65;122747:8;122726:20;:30::i;:::-;;122460:628;;;;;122784:18;;:33;;122807:9;122784:22;:33::i;:::-;122778:3;:39;122774:314;;;122992:18;;:24;;;123031:45;122992:24;123031:33;:45::i;22479:761::-;22903:23;22929:69;22957:4;22929:69;;;;;;;;;;;;;;;;;22937:5;-1:-1:-1;;;;;22929:27:0;;;:69;;;;;:::i;:::-;23013:17;;22903:95;;-1:-1:-1;23013:21:0;23009:224;;23155:10;23144:30;;;;;;;;;;;;;;;-1:-1:-1;23144:30:0;23136:85;;;;-1:-1:-1;;;23136:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;123339:412;123422:48;123473:14;:7;:12;:14::i;:::-;123523:27;;;;123422:65;;-1:-1:-1;123565:27:0;;;123561:87;;;123622:14;123609:27;;123561:87;123662:14;;123658:86;;123693:39;123721:10;123693:27;:39::i;91657:368::-;91767:7;;;;91846:53;:5;91867:10;91879:7;91888:10;91846:20;:53::i;:::-;91929:20;;;;91792:107;;-1:-1:-1;91792:107:0;-1:-1:-1;91929:41:0;;91792:107;91929:24;:41::i;:::-;91906:20;;;:64;91985:16;;-1:-1:-1;92003:15:0;-1:-1:-1;91657:368:0;;;;;;;;:::o;94228:172::-;94307:7;94316;94339:55;94354:10;94366:5;:20;;;94388:5;94339;:14;;:55;;;;;;:::i;:::-;94332:62;;;;94228:172;;;;;:::o;90350:118::-;90436:13;;:26;;;-1:-1:-1;;;90436:26:0;;;;90413:7;;-1:-1:-1;;;;;90436:13:0;;:24;;:26;;;;;;;;;;;;;;:13;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;90436:26:0;;90350:118;-1:-1:-1;;90350:118:0:o;93429:661::-;93530:7;93539;93555:21;93579:13;:5;:11;:13::i;:::-;93555:37;;93601:24;93628:6;-1:-1:-1;;;;;93628:16:0;;93645:10;93628:28;;;;;;;;;;;;;-1:-1:-1;;;;;93628:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;93628:28:0;;-1:-1:-1;93663:27:0;93693:18;:5;:16;:18::i;:::-;93720:13;;:51;;;-1:-1:-1;;;93720:51:0;;-1:-1:-1;;;;;93720:51:0;;;;;;;;;;;;;;;93663:48;;-1:-1:-1;93720:13:0;;;:30;;:51;;;;;:13;;:51;;;;;;;;:13;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93780:22;93805:6;-1:-1:-1;;;;;93805:16:0;;93822:10;93805:28;;;;;;;;;;;;;-1:-1:-1;;;;;93805:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;93805:28:0;;-1:-1:-1;93840:24:0;93867:36;93805:28;93886:16;93867:18;:36::i;:::-;93840:63;;93912:25;93940:18;:5;:16;:18::i;:::-;93912:46;-1:-1:-1;93965:23:0;93991:42;:19;93912:46;93991:23;:42::i;:::-;94050:16;;;;-1:-1:-1;93429:661:0;;-1:-1:-1;;;;;;;;;;93429:661:0:o;95525:124::-;95582:12;95610:5;95625:17;95610:5;95625:15;:17::i;:::-;95610:33;;;;;;;;;;;;;;;;;;95603:40;;95525:124;;;:::o;90824:385::-;90896:7;90986:21;91010:13;:5;:11;:13::i;:::-;91056;;91032:48;;;-1:-1:-1;;;91032:48:0;;-1:-1:-1;;;;;91056:13:0;;;91032:48;;;;;;;;;;;;90986:37;;-1:-1:-1;91032:15:0;;;;;;:48;;;;;;;;;;;;;;;91056:13;91032:15;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;91087:13:0;;:30;;;-1:-1:-1;;;91087:30:0;;;;;;;;;;-1:-1:-1;;;;;91087:13:0;;;;:21;;:30;;;;;:13;;:30;;;;;;;;:13;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;91147:20:0;;;;:33;;-1:-1:-1;91172:7:0;91147:24;:33::i;:::-;91124:20;;;:56;-1:-1:-1;91196:7:0;;-1:-1:-1;90824:385:0;;;;:::o;15165:195::-;15268:12;15300:52;15322:6;15330:4;15336:1;15339:12;15300:21;:52::i;:::-;15293:59;15165:195;-1:-1:-1;;;;15165:195:0:o;121806:133::-;121880:51;121902:19;:7;:17;:19::i;:::-;121923:7;121880:21;:51::i;92223:1006::-;92339:7;92348;92364:21;92388:13;:5;:11;:13::i;:::-;92364:37;;92410:24;92437:6;-1:-1:-1;;;;;92437:16:0;;92454:10;92437:28;;;;;;;;;;;;;-1:-1:-1;;;;;92437:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;92437:28:0;;-1:-1:-1;92472:27:0;92502:18;:5;:16;:18::i;:::-;92529:13;;:55;;;-1:-1:-1;;;92529:55:0;;-1:-1:-1;;;;;92529:55:0;;;;;;;;;;;;;;;;;;;;;;92472:48;;-1:-1:-1;92529:13:0;;;:22;;:55;;;;;:13;;:55;;;;;;;;:13;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92593:22;92618:6;-1:-1:-1;;;;;92618:16:0;;92635:10;92618:28;;;;;;;;;;;;;-1:-1:-1;;;;;92618:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;92618:28:0;;-1:-1:-1;92653:24:0;92680:36;92618:28;92699:16;92680:18;:36::i;:::-;92653:63;;92725:25;92753:18;:5;:16;:18::i;:::-;92725:46;;92780:28;92845:17;92823:19;:39;92819:127;;;92896:42;:19;92920:17;92896:23;:42::i;:::-;92873:65;;92819:127;92958:10;92954:80;;;92987:16;;-1:-1:-1;93005:20:0;;-1:-1:-1;92979:47:0;;-1:-1:-1;;;;;92979:47:0;92954:80;93068:7;93086:30;;;93082:91;;;-1:-1:-1;93145:20:0;93082:91;93189:16;;;;-1:-1:-1;92223:1006:0;;-1:-1:-1;;;;;;;;;;;92223:1006:0:o;90567:131::-;90670:13;;:21;;;-1:-1:-1;;;90670:21:0;;;;90625:14;;-1:-1:-1;;;;;90670:13:0;;:19;;:21;;;;;;;;;;;;;;:13;:21;;;;;;;;;;95846:165;95908:7;95924:15;95942:14;:5;:12;:14::i;:::-;95924:32;;95970:35;95982:1;95970:35;;;;;;;;;;;;;-1:-1:-1;;;95970:35:0;;;:7;:11;;:35;;;;;:::i;16217:530::-;16344:12;16402:5;16377:21;:30;;16369:81;;;;-1:-1:-1;;;16369:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16469:18;16480:6;16469:10;:18::i;:::-;16461:60;;;;;-1:-1:-1;;;16461:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16595:12;16609:23;16636:6;-1:-1:-1;;;;;16636:11:0;16656:5;16664:4;16636:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16636:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16594:75;;;;16687:52;16705:7;16714:10;16726:12;16687:17;:52::i;:::-;16680:59;16217:530;-1:-1:-1;;;;;;;16217:530:0:o;12247:422::-;12614:20;12653:8;;;12247:422::o;18757:742::-;18872:12;18901:7;18897:595;;;-1:-1:-1;18932:10:0;18925:17;;18897:595;19046:17;;:21;19042:439;;19309:10;19303:17;19370:15;19357:10;19353:2;19349:19;19342:44;19257:148;19445:20;;-1:-1:-1;;;19445:20:0;;;;;;;;;;;;;;;;;19452:12;;19445:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://630faf1d4ba77fd8f2350951534a1aa731419eb8f1886bbca673976f92dcb6fd
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $10.81 | 10.4113 | $112.55 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.