Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
HUniswapV3
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-21 */ // File: contracts/handlers/uniswapv3/libraries/BytesLib.sol // SPDX-License-Identifier: GPL-2.0-or-later /* * @title Solidity Bytes Arrays Utils * @author Gonçalo Sá <[email protected]> * * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity. * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage. */ pragma solidity >=0.5.0 <0.8.0; library BytesLib { function slice( bytes memory _bytes, uint256 _start, uint256 _length ) internal pure returns (bytes memory) { require(_length + 31 >= _length, "slice_overflow"); require(_start + _length >= _start, "slice_overflow"); require(_bytes.length >= _start + _length, "slice_outOfBounds"); bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add( add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)) ) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add( add( add(_bytes, lengthmod), mul(0x20, iszero(lengthmod)) ), _start ) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) //zero out the 32 bytes slice we are about to return //we need to do it because Solidity does not garbage collect mstore(tempBytes, 0) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) { require(_start + 20 >= _start, "toAddress_overflow"); require(_bytes.length >= _start + 20, "toAddress_outOfBounds"); address tempAddress; assembly { tempAddress := div( mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000 ) } return tempAddress; } function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) { require(_start + 3 >= _start, "toUint24_overflow"); require(_bytes.length >= _start + 3, "toUint24_outOfBounds"); uint24 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x3), _start)) } return tempUint; } } // File: @uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol pragma solidity >=0.5.0; /// @title Callback for IUniswapV3PoolActions#swap /// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface interface IUniswapV3SwapCallback { /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap. /// @dev In the implementation you must pay the pool tokens owed for the swap. /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory. /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped. /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by /// the end of the swap. If positive, the callback must send that amount of token0 to the pool. /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by /// the end of the swap. If positive, the callback must send that amount of token1 to the pool. /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call function uniswapV3SwapCallback( int256 amount0Delta, int256 amount1Delta, bytes calldata data ) external; } // File: contracts/handlers/uniswapv3/ISwapRouter.sol pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; /// @title Periphery Payments /// @notice Functions to ease deposits and withdrawals of ETH interface IPeripheryPayments { /// @notice Unwraps the contract's WETH9 balance and sends it to recipient as ETH. /// @dev The amountMinimum parameter prevents malicious contracts from stealing WETH9 from users. /// @param amountMinimum The minimum amount of WETH9 to unwrap /// @param recipient The address receiving ETH function unwrapWETH9(uint256 amountMinimum, address recipient) external payable; /// @notice Refunds any ETH balance held by this contract to the `msg.sender` /// @dev Useful for bundling with mint or increase liquidity that uses ether, or exact output swaps /// that use ether for the input amount function refundETH() external payable; /// @notice Transfers the full amount of a token held by this contract to recipient /// @dev The amountMinimum parameter prevents malicious contracts from stealing the token from users /// @param token The contract address of the token which will be transferred to `recipient` /// @param amountMinimum The minimum amount of token required for a transfer /// @param recipient The destination address of the token function sweepToken( address token, uint256 amountMinimum, address recipient ) external payable; } /// @title Router token swapping functionality /// @notice Functions for swapping tokens via Uniswap V3 interface ISwapRouter is IUniswapV3SwapCallback, IPeripheryPayments { struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } /// @notice Swaps `amountIn` of one token for as much as possible of another token /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata /// @return amountOut The amount of the received token function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; } /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata /// @return amountOut The amount of the received token function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); struct ExactOutputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; uint160 sqrtPriceLimitX96; } /// @notice Swaps as little as possible of one token for `amountOut` of another token /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata /// @return amountIn The amount of the input token function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn); struct ExactOutputParams { bytes path; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; } /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed) /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata /// @return amountIn The amount of the input token function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn); } // File: contracts/handlers/weth/IWETH9.sol pragma solidity ^0.6.0; interface IWETH9 { fallback() external payable; function deposit() external payable; function withdraw(uint256 wad) external; } // File: contracts/lib/LibStack.sol pragma solidity ^0.6.0; library LibStack { function setAddress(bytes32[] storage _stack, address _input) internal { _stack.push(bytes32(uint256(uint160(_input)))); } function set(bytes32[] storage _stack, bytes32 _input) internal { _stack.push(_input); } function setHandlerType(bytes32[] storage _stack, Config.HandlerType _input) internal { _stack.push(bytes12(uint96(_input))); } function getAddress(bytes32[] storage _stack) internal returns (address ret) { ret = address(uint160(uint256(peek(_stack)))); _stack.pop(); } function getSig(bytes32[] storage _stack) internal returns (bytes4 ret) { ret = bytes4(peek(_stack)); _stack.pop(); } function get(bytes32[] storage _stack) internal returns (bytes32 ret) { ret = peek(_stack); _stack.pop(); } function peek(bytes32[] storage _stack) internal view returns (bytes32 ret) { require(_stack.length > 0, "stack empty"); ret = _stack[_stack.length - 1]; } } // File: contracts/lib/LibCache.sol pragma solidity ^0.6.0; library LibCache { function set( mapping(bytes32 => bytes32) storage _cache, bytes32 _key, bytes32 _value ) internal { _cache[_key] = _value; } function setAddress( mapping(bytes32 => bytes32) storage _cache, bytes32 _key, address _value ) internal { _cache[_key] = bytes32(uint256(uint160(_value))); } function setUint256( mapping(bytes32 => bytes32) storage _cache, bytes32 _key, uint256 _value ) internal { _cache[_key] = bytes32(_value); } function getAddress( mapping(bytes32 => bytes32) storage _cache, bytes32 _key ) internal view returns (address ret) { ret = address(uint160(uint256(_cache[_key]))); } function getUint256( mapping(bytes32 => bytes32) storage _cache, bytes32 _key ) internal view returns (uint256 ret) { ret = uint256(_cache[_key]); } function get(mapping(bytes32 => bytes32) storage _cache, bytes32 _key) internal view returns (bytes32 ret) { ret = _cache[_key]; } } // File: contracts/Storage.sol pragma solidity ^0.6.0; /// @notice A cache structure composed by a bytes32 array contract Storage { using LibCache for mapping(bytes32 => bytes32); using LibStack for bytes32[]; bytes32[] public stack; mapping(bytes32 => bytes32) public cache; // keccak256 hash of "msg.sender" // prettier-ignore bytes32 public constant MSG_SENDER_KEY = 0xb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453a; // keccak256 hash of "cube.counter" // prettier-ignore bytes32 public constant CUBE_COUNTER_KEY = 0xf9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be; modifier isStackEmpty() { require(stack.length == 0, "Stack not empty"); _; } modifier isCubeCounterZero() { require(_getCubeCounter() == 0, "Cube counter not zero"); _; } modifier isInitialized() { require(_getSender() != address(0), "Sender is not initialized"); _; } modifier isNotInitialized() { require(_getSender() == address(0), "Sender is initialized"); _; } function _setSender() internal isNotInitialized { cache.setAddress(MSG_SENDER_KEY, msg.sender); } function _resetSender() internal { cache.setAddress(MSG_SENDER_KEY, address(0)); } function _getSender() internal view returns (address) { return cache.getAddress(MSG_SENDER_KEY); } function _addCubeCounter() internal { cache.setUint256(CUBE_COUNTER_KEY, _getCubeCounter() + 1); } function _resetCubeCounter() internal { cache.setUint256(CUBE_COUNTER_KEY, 0); } function _getCubeCounter() internal view returns (uint256) { return cache.getUint256(CUBE_COUNTER_KEY); } } // File: contracts/Config.sol pragma solidity ^0.6.0; contract Config { // function signature of "postProcess()" bytes4 public constant POSTPROCESS_SIG = 0xc2722916; // The base amount of percentage function uint256 public constant PERCENTAGE_BASE = 1 ether; // Handler post-process type. Others should not happen now. enum HandlerType {Token, Custom, Others} } // File: contracts/interface/IERC20Usdt.sol pragma solidity ^0.6.0; interface IERC20Usdt { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external; function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external; function transferFrom(address sender, address recipient, uint256 amount) external; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/handlers/HandlerBase.sol pragma solidity ^0.6.0; abstract contract HandlerBase is Storage, Config { using SafeERC20 for IERC20; function postProcess() external payable virtual { revert("Invalid post process"); /* Implementation template bytes4 sig = stack.getSig(); if (sig == bytes4(keccak256(bytes("handlerFunction_1()")))) { // Do something } else if (sig == bytes4(keccak256(bytes("handlerFunction_2()")))) { bytes32 temp = stack.get(); // Do something } else revert("Invalid post process"); */ } function _updateToken(address token) internal { stack.setAddress(token); // Ignore token type to fit old handlers // stack.setHandlerType(uint256(HandlerType.Token)); } function _updatePostProcess(bytes32[] memory params) internal { for (uint256 i = params.length; i > 0; i--) { stack.set(params[i - 1]); } stack.set(msg.sig); stack.setHandlerType(HandlerType.Custom); } function getContractName() public pure virtual returns (string memory); function _revertMsg(string memory functionName, string memory reason) internal view { revert( string( abi.encodePacked( _uint2String(_getCubeCounter()), "_", getContractName(), "_", functionName, ": ", reason ) ) ); } function _revertMsg(string memory functionName) internal view { _revertMsg(functionName, "Unspecified"); } function _uint2String(uint256 n) internal pure returns (string memory) { if (n == 0) { return "0"; } else { uint256 len = 0; for (uint256 temp = n; temp > 0; temp /= 10) { len++; } bytes memory str = new bytes(len); for (uint256 i = len; i > 0; i--) { str[i - 1] = bytes1(uint8(48 + (n % 10))); n /= 10; } return string(str); } } function _getBalance(address token, uint256 amount) internal view returns (uint256) { if (amount != uint256(-1)) { return amount; } // ETH case if ( token == address(0) || token == address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) ) { return address(this).balance; } // ERC20 token case return IERC20(token).balanceOf(address(this)); } function _tokenApprove( address token, address spender, uint256 amount ) internal { try IERC20Usdt(token).approve(spender, amount) {} catch { IERC20(token).safeApprove(spender, 0); IERC20(token).safeApprove(spender, amount); } } } // File: @openzeppelin/contracts/utils/Address.sol 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); } 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/math/SafeMath.sol 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, 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) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * 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); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol 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/token/ERC20/SafeERC20.sol 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/handlers/uniswapv3/HUniswapV3.sol pragma solidity ^0.6.0; contract HUniswapV3 is HandlerBase { using SafeERC20 for IERC20; using SafeMath for uint256; using BytesLib for bytes; // prettier-ignore ISwapRouter public constant ROUTER = ISwapRouter(0xE592427A0AEce92De3Edee1F18E0157C05861564); // prettier-ignore IWETH9 public constant WETH = IWETH9(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); uint256 private constant PATH_SIZE = 43; // address + address + uint24 uint256 private constant ADDRESS_SIZE = 20; function getContractName() public pure override returns (string memory) { return "HUniswapV3"; } function exactInputSingleFromEther( address tokenOut, uint24 fee, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96 ) external payable returns (uint256 amountOut) { // Build params for router call ISwapRouter.ExactInputSingleParams memory params; params.tokenIn = address(WETH); params.tokenOut = tokenOut; params.fee = fee; params.amountIn = _getBalance(address(0), amountIn); params.amountOutMinimum = amountOutMinimum; params.sqrtPriceLimitX96 = sqrtPriceLimitX96; amountOut = _exactInputSingle(params.amountIn, params); _updateToken(tokenOut); } function exactInputSingleToEther( address tokenIn, uint24 fee, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96 ) external payable returns (uint256 amountOut) { // Build params for router call ISwapRouter.ExactInputSingleParams memory params; params.tokenIn = tokenIn; params.tokenOut = address(WETH); params.fee = fee; params.amountIn = _getBalance(tokenIn, amountIn); params.amountOutMinimum = amountOutMinimum; params.sqrtPriceLimitX96 = sqrtPriceLimitX96; // Approve token _tokenApprove(tokenIn, address(ROUTER), params.amountIn); amountOut = _exactInputSingle(0, params); WETH.withdraw(amountOut); } function exactInputSingle( address tokenIn, address tokenOut, uint24 fee, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96 ) external payable returns (uint256 amountOut) { // Build params for router call ISwapRouter.ExactInputSingleParams memory params; params.tokenIn = tokenIn; params.tokenOut = tokenOut; params.fee = fee; params.amountIn = _getBalance(tokenIn, amountIn); params.amountOutMinimum = amountOutMinimum; params.sqrtPriceLimitX96 = sqrtPriceLimitX96; // Approve token _tokenApprove(tokenIn, address(ROUTER), params.amountIn); amountOut = _exactInputSingle(0, params); _updateToken(tokenOut); } function exactInputFromEther( bytes memory path, uint256 amountIn, uint256 amountOutMinimum ) external payable returns (uint256 amountOut) { // Extract tokenIn and tokenOut address tokenIn = _getFirstToken(path); address tokenOut = _getLastToken(path); // Input token must be WETH if (tokenIn != address(WETH)) _revertMsg("exactInputFromEther", "Input not WETH"); // Build params for router call ISwapRouter.ExactInputParams memory params; params.path = path; params.amountIn = _getBalance(address(0), amountIn); params.amountOutMinimum = amountOutMinimum; amountOut = _exactInput(params.amountIn, params); _updateToken(tokenOut); } function exactInputToEther( bytes memory path, uint256 amountIn, uint256 amountOutMinimum ) external payable returns (uint256 amountOut) { // Extract tokenIn and tokenOut address tokenIn = _getFirstToken(path); address tokenOut = _getLastToken(path); // Output token must be WETH if (tokenOut != address(WETH)) _revertMsg("exactInputToEther", "Output not WETH"); // Build params for router call ISwapRouter.ExactInputParams memory params; params.path = path; params.amountIn = _getBalance(tokenIn, amountIn); params.amountOutMinimum = amountOutMinimum; // Approve token _tokenApprove(tokenIn, address(ROUTER), params.amountIn); amountOut = _exactInput(0, params); WETH.withdraw(amountOut); } function exactInput( bytes memory path, uint256 amountIn, uint256 amountOutMinimum ) external payable returns (uint256 amountOut) { // Extract tokenIn and tokenOut address tokenIn = _getFirstToken(path); address tokenOut = _getLastToken(path); // Build params for router call ISwapRouter.ExactInputParams memory params; params.path = path; params.amountIn = _getBalance(tokenIn, amountIn); params.amountOutMinimum = amountOutMinimum; // Approve token _tokenApprove(tokenIn, address(ROUTER), params.amountIn); amountOut = _exactInput(0, params); _updateToken(tokenOut); } function exactOutputSingleFromEther( address tokenOut, uint24 fee, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96 ) external payable returns (uint256 amountIn) { // Build params for router call ISwapRouter.ExactOutputSingleParams memory params; params.tokenIn = address(WETH); params.tokenOut = tokenOut; params.fee = fee; params.amountOut = amountOut; // if amount == uint256(-1) return balance of Proxy params.amountInMaximum = _getBalance(address(0), amountInMaximum); params.sqrtPriceLimitX96 = sqrtPriceLimitX96; amountIn = _exactOutputSingle(params.amountInMaximum, params); ROUTER.refundETH(); _updateToken(tokenOut); } function exactOutputSingleToEther( address tokenIn, uint24 fee, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96 ) external payable returns (uint256 amountIn) { // Build params for router call ISwapRouter.ExactOutputSingleParams memory params; params.tokenIn = tokenIn; params.tokenOut = address(WETH); params.fee = fee; params.amountOut = amountOut; // if amount == uint256(-1) return balance of Proxy params.amountInMaximum = _getBalance(tokenIn, amountInMaximum); params.sqrtPriceLimitX96 = sqrtPriceLimitX96; // Approve token _tokenApprove(params.tokenIn, address(ROUTER), params.amountInMaximum); amountIn = _exactOutputSingle(0, params); WETH.withdraw(params.amountOut); } function exactOutputSingle( address tokenIn, address tokenOut, uint24 fee, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96 ) external payable returns (uint256 amountIn) { // Build params for router call ISwapRouter.ExactOutputSingleParams memory params; params.tokenIn = tokenIn; params.tokenOut = tokenOut; params.fee = fee; params.amountOut = amountOut; // if amount == uint256(-1) return balance of Proxy params.amountInMaximum = _getBalance(tokenIn, amountInMaximum); params.sqrtPriceLimitX96 = sqrtPriceLimitX96; // Approve token _tokenApprove(params.tokenIn, address(ROUTER), params.amountInMaximum); amountIn = _exactOutputSingle(0, params); _updateToken(params.tokenOut); } function exactOutputFromEther( bytes memory path, uint256 amountOut, uint256 amountInMaximum ) external payable returns (uint256 amountIn) { // Extract tokenIn and tokenOut // Note that the first token is tokenOut in exactOutput functions, vice versa address tokenIn = _getLastToken(path); address tokenOut = _getFirstToken(path); // Input token must be WETH if (tokenIn != address(WETH)) _revertMsg("exactOutputFromEther", "Input not WETH"); // Build params for router call ISwapRouter.ExactOutputParams memory params; params.path = path; params.amountOut = amountOut; params.amountInMaximum = _getBalance(address(0), amountInMaximum); amountIn = _exactOutput(params.amountInMaximum, params); ROUTER.refundETH(); _updateToken(tokenOut); } function exactOutputToEther( bytes memory path, uint256 amountOut, uint256 amountInMaximum ) external payable returns (uint256 amountIn) { // Extract tokenIn and tokenOut // Note that the first token is tokenOut in exactOutput functions, vice versa address tokenIn = _getLastToken(path); address tokenOut = _getFirstToken(path); // Out token must be WETH if (tokenOut != address(WETH)) _revertMsg("exactOutputToEther", "Output not WETH"); // Build params for router call ISwapRouter.ExactOutputParams memory params; params.path = path; params.amountOut = amountOut; // if amount == uint256(-1) return balance of Proxy params.amountInMaximum = _getBalance(tokenIn, amountInMaximum); // Approve token _tokenApprove(tokenIn, address(ROUTER), params.amountInMaximum); amountIn = _exactOutput(0, params); WETH.withdraw(amountOut); } function exactOutput( bytes memory path, uint256 amountOut, uint256 amountInMaximum ) external payable returns (uint256 amountIn) { // Extract tokenIn and tokenOut // Note that the first token is tokenOut in exactOutput functions, vice versa address tokenIn = _getLastToken(path); address tokenOut = _getFirstToken(path); // Build params for router call ISwapRouter.ExactOutputParams memory params; params.path = path; params.amountOut = amountOut; // if amount == uint256(-1) return balance of Proxy params.amountInMaximum = _getBalance(tokenIn, amountInMaximum); // Approve token _tokenApprove(tokenIn, address(ROUTER), params.amountInMaximum); amountIn = _exactOutput(0, params); _updateToken(tokenOut); } function _getFirstToken(bytes memory path) internal pure returns (address) { return path.toAddress(0); } function _getLastToken(bytes memory path) internal view returns (address) { if (path.length < PATH_SIZE) _revertMsg("General", "Path size too small"); return path.toAddress(path.length - ADDRESS_SIZE); } function _exactInputSingle( uint256 value, ISwapRouter.ExactInputSingleParams memory params ) internal returns (uint256) { params.deadline = now; params.recipient = address(this); try ROUTER.exactInputSingle{value: value}(params) returns ( uint256 amountOut ) { return amountOut; } catch Error(string memory reason) { _revertMsg("exactInputSingle", reason); } catch { _revertMsg("exactInputSingle"); } } function _exactInput( uint256 value, ISwapRouter.ExactInputParams memory params ) internal returns (uint256) { params.deadline = now; params.recipient = address(this); try ROUTER.exactInput{value: value}(params) returns ( uint256 amountOut ) { return amountOut; } catch Error(string memory reason) { _revertMsg("exactInput", reason); } catch { _revertMsg("exactInput"); } } function _exactOutputSingle( uint256 value, ISwapRouter.ExactOutputSingleParams memory params ) internal returns (uint256) { params.deadline = now; params.recipient = address(this); try ROUTER.exactOutputSingle{value: value}(params) returns ( uint256 amountIn ) { return amountIn; } catch Error(string memory reason) { _revertMsg("exactOutputSingle", reason); } catch { _revertMsg("exactOutputSingle"); } } function _exactOutput( uint256 value, ISwapRouter.ExactOutputParams memory params ) internal returns (uint256) { params.deadline = now; params.recipient = address(this); try ROUTER.exactOutput{value: value}(params) returns ( uint256 amountIn ) { return amountIn; } catch Error(string memory reason) { _revertMsg("exactOutput", reason); } catch { _revertMsg("exactOutput"); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"CUBE_COUNTER_KEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MSG_SENDER_KEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POSTPROCESS_SIG","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUTER","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH9","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"cache","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"}],"name":"exactInput","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"}],"name":"exactInputFromEther","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"name":"exactInputSingle","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"name":"exactInputSingleFromEther","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"name":"exactInputSingleToEther","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"}],"name":"exactInputToEther","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"}],"name":"exactOutput","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"}],"name":"exactOutputFromEther","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"name":"exactOutputSingle","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"name":"exactOutputSingleFromEther","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"name":"exactOutputSingleToEther","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"}],"name":"exactOutputToEther","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getContractName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"postProcess","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stack","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50611f9e806100206000396000f3fe6080604052600436106101355760003560e01c8063bfd62c5e116100ab578063e473efd31161006f578063e473efd3146102a8578063f4f47ee1146102bb578063f5f5ba72146102ce578063f900e577146102f0578063fa2901a514610303578063fd9b19121461032557610135565b8063bfd62c5e14610245578063c272291614610258578063d3695b0914610262578063dc9031c414610275578063df58a96f1461029557610135565b806387c13943116100fd57806387c13943146101c25780638aa5b89b146101d757806399eb59b9146101ea578063a26082101461020a578063ad5c46481461021d578063b5619b551461023257610135565b80630f532d181461013a578063110cb594146101655780631413dc7d1461017857806332fe7b261461018d5780634eb4ccef146101af575b600080fd5b34801561014657600080fd5b5061014f610338565b60405161015c9190611c3f565b60405180910390f35b61014f6101733660046119c0565b61035c565b34801561018457600080fd5b5061014f6103d5565b34801561019957600080fd5b506101a26103f9565b60405161015c9190611bf8565b61014f6101bd36600461192b565b61040b565b3480156101ce57600080fd5b5061014f6104e8565b61014f6101e536600461192b565b6104f4565b3480156101f657600080fd5b5061014f6102053660046119a8565b610566565b61014f6102183660046118bd565b610578565b34801561022957600080fd5b506101a2610604565b61014f6102403660046119c0565b610616565b61014f61025336600461192b565b6106d8565b6102606107cd565b005b61014f6102703660046119c0565b6107ee565b34801561028157600080fd5b5061014f6102903660046119a8565b61093a565b61014f6102a33660046119c0565b610958565b61014f6102b636600461192b565b6109bc565b61014f6102c93660046119c0565b610a72565b3480156102da57600080fd5b506102e3610ba1565b60405161015c9190611c5d565b61014f6102fe3660046118bd565b610bc6565b34801561030f57600080fd5b50610318610c4b565b60405161015c9190611c48565b61014f6103333660046119c0565b610c56565b7fb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453a81565b60008061036885610d67565b9050600061037586610de0565b905061037f61182e565b868152606081018690526103938386610dec565b608082018190526103b5908490600080516020611f4983398151915290610ec1565b6103c0600082610f4c565b93506103cb8261105c565b5050509392505050565b7ff9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be81565b600080516020611f4983398151915281565b6000610415611866565b600080516020611f2983398151915281526001600160a01b038716602082015262ffffff8616604082015260a08101859052610452600085610dec565b60c082018190526001600160a01b03841660e0830152610472908261106a565b9150600080516020611f498339815191526001600160a01b03166312210e8a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156104bd57600080fd5b505af11580156104d1573d6000803e3d6000fd5b505050506104de8761105c565b5095945050505050565b670de0b6b3a764000081565b60006104fe611866565b600080516020611f2983398151915281526001600160a01b038716602082015262ffffff86166040820152610534600086610dec565b60a0820181905260c082018590526001600160a01b03841660e083015261055b9082611172565b91506104de8761105c565b60016020526000908152604090205481565b6000610582611866565b6001600160a01b0380891682528716602082015262ffffff861660408201526105ab8886610dec565b60a0820181905260c082018590526001600160a01b03841660e08301526105e3908990600080516020611f4983398151915290610ec1565b6105ee600082611172565b91506105f98761105c565b509695505050505050565b600080516020611f2983398151915281565b60008061062285610de0565b9050600061062f86610d67565b90506001600160a01b038216600080516020611f29833981519152146106aa576106aa6040518060400160405280601381526020017232bc30b1ba24b7383aba233937b6a2ba3432b960691b8152506040518060400160405280600e81526020016d092dce0eae840dcdee840ae8aa8960931b815250611278565b6106b261182e565b8681526106c0600087610dec565b60608201819052608082018690526103c090826112cb565b60006106e2611866565b6001600160a01b0387168152600080516020611f29833981519152602082015262ffffff8616604082015260a0810185905261071e8785610dec565b60c082018190526001600160a01b03841660e0830152815161074f91600080516020611f4983398151915290610ec1565b61075a60008261106a565b60a0820151604051632e1a7d4d60e01b8152919350600080516020611f2983398151915291632e1a7d4d9161079191600401611c3f565b600060405180830381600087803b1580156107ab57600080fd5b505af11580156107bf573d6000803e3d6000fd5b505050505095945050505050565b60405162461bcd60e51b81526004016107e590611ce5565b60405180910390fd5b6000806107fa85610de0565b9050600061080786610d67565b90506001600160a01b038116600080516020611f2983398151915214610881576108816040518060400160405280601181526020017032bc30b1ba24b7383aba2a37a2ba3432b960791b8152506040518060400160405280600f81526020016e09eeae8e0eae840dcdee840ae8aa89608b1b815250611278565b61088961182e565b8681526108968387610dec565b60608201819052608082018690526108bf908490600080516020611f4983398151915290610ec1565b6108ca6000826112cb565b604051632e1a7d4d60e01b8152909450600080516020611f2983398151915290632e1a7d4d906108fe908790600401611c3f565b600060405180830381600087803b15801561091857600080fd5b505af115801561092c573d6000803e3d6000fd5b505050505050509392505050565b6000818154811061094757fe5b600091825260209091200154905081565b60008061096485610de0565b9050600061097186610d67565b905061097b61182e565b8681526109888387610dec565b60608201819052608082018690526109b1908490600080516020611f4983398151915290610ec1565b6103c06000826112cb565b60006109c6611866565b6001600160a01b0387168152600080516020611f29833981519152602082015262ffffff861660408201526109fb8786610dec565b60a0820181905260c082018590526001600160a01b03841660e0830152610a33908890600080516020611f4983398151915290610ec1565b610a3e600082611172565b604051632e1a7d4d60e01b8152909250600080516020611f2983398151915290632e1a7d4d90610791908590600401611c3f565b600080610a7e85610d67565b90506000610a8b86610de0565b90506001600160a01b038216600080516020611f2983398151915214610b0757610b076040518060400160405280601481526020017332bc30b1ba27baba383aba233937b6a2ba3432b960611b8152506040518060400160405280600e81526020016d092dce0eae840dcdee840ae8aa8960931b815250611278565b610b0f61182e565b86815260608101869052610b24600086610dec565b60808201819052610b359082610f4c565b9350600080516020611f498339815191526001600160a01b03166312210e8a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610b8057600080fd5b505af1158015610b94573d6000803e3d6000fd5b505050506103cb8261105c565b60408051808201909152600a81526948556e6973776170563360b01b60208201525b90565b6000610bd0611866565b6001600160a01b0380891682528716602082015262ffffff8616604082015260a08101859052610c008885610dec565b60c082018190526001600160a01b03841660e08301528151610c3191600080516020611f4983398151915290610ec1565b610c3c60008261106a565b91506105f9816020015161105c565b636139148b60e11b81565b600080610c6285610d67565b90506000610c6f86610de0565b90506001600160a01b038116600080516020611f2983398151915214610cea57610cea6040518060400160405280601281526020017132bc30b1ba27baba383aba2a37a2ba3432b960711b8152506040518060400160405280600f81526020016e09eeae8e0eae840dcdee840ae8aa89608b1b815250611278565b610cf261182e565b86815260608101869052610d068386610dec565b60808201819052610d28908490600080516020611f4983398151915290610ec1565b610d33600082610f4c565b604051632e1a7d4d60e01b8152909450600080516020611f2983398151915290632e1a7d4d906108fe908990600401611c3f565b6000602b82511015610dc757610dc76040518060400160405280600781526020016611d95b995c985b60ca1b8152506040518060400160405280601381526020017214185d1a081cda5e99481d1bdbc81cdb585b1b606a1b815250611278565b8151610dd8908390601319016113c7565b90505b919050565b6000610dd882826113c7565b60006000198214610dfe575080610ebb565b6001600160a01b0383161580610e3057506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b15610e3c575047610ebb565b6040516370a0823160e01b81526001600160a01b038416906370a0823190610e68903090600401611bf8565b60206040518083038186803b158015610e8057600080fd5b505afa158015610e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb89190611a69565b90505b92915050565b60405163095ea7b360e01b81526001600160a01b0384169063095ea7b390610eef9085908590600401611c26565b600060405180830381600087803b158015610f0957600080fd5b505af1925050508015610f1a575060015b610f4757610f336001600160a01b038416836000611420565b610f476001600160a01b0384168383611420565b505050565b4260408083019190915230602083015251631e51809360e31b8152600090600080516020611f498339815191529063f28c0498908590610f90908690600401611e16565b6020604051808303818588803b158015610fa957600080fd5b505af193505050508015610fda575060408051601f3d908101601f19168201909252610fd791810190611a69565b60015b61105557610fe6611e6e565b80610ff15750611024565b61101e6040518060400160405280600b81526020016a195e1858dd13dd5d1c1d5d60aa1b81525082611278565b50611050565b6110506040518060400160405280600b81526020016a195e1858dd13dd5d1c1d5d60aa1b81525061151a565b610ebb565b9050610ebb565b611067600082611547565b50565b426080820152306060820152604051631b67c43360e31b8152600090600080516020611f498339815191529063db3e21989085906110ac908690600401611e29565b6020604051808303818588803b1580156110c557600080fd5b505af1935050505080156110f6575060408051601f3d908101601f191682019092526110f391810190611a69565b60015b61105557611102611e6e565b8061110d5750611140565b61101e6040518060400160405280601181526020017065786163744f757470757453696e676c6560781b81525082611278565b6110506040518060400160405280601181526020017065786163744f757470757453696e676c6560781b81525061151a565b42608082015230606082015260405163414bf38960e01b8152600090600080516020611f498339815191529063414bf3899085906111b4908690600401611e29565b6020604051808303818588803b1580156111cd57600080fd5b505af1935050505080156111fe575060408051601f3d908101601f191682019092526111fb91810190611a69565b60015b6110555761120a611e6e565b806112155750611247565b61101e6040518060400160405280601081526020016f6578616374496e70757453696e676c6560801b81525082611278565b6110506040518060400160405280601081526020016f6578616374496e70757453696e676c6560801b81525061151a565b611288611283611569565b61159b565b611290610ba1565b83836040516020016112a59493929190611b7a565b60408051601f198184030181529082905262461bcd60e51b82526107e591600401611c5d565b426040808301919091523060208301525163c04b8d5960e01b8152600090600080516020611f498339815191529063c04b8d5990859061130f908690600401611e16565b6020604051808303818588803b15801561132857600080fd5b505af193505050508015611359575060408051601f3d908101601f1916820190925261135691810190611a69565b60015b61105557611365611e6e565b80611370575061139c565b61101e6040518060400160405280600a815260200169195e1858dd125b9c1d5d60b21b81525082611278565b6110506040518060400160405280600a815260200169195e1858dd125b9c1d5d60b21b81525061151a565b6000818260140110156113ec5760405162461bcd60e51b81526004016107e590611dea565b81601401835110156114105760405162461bcd60e51b81526004016107e590611cb6565b500160200151600160601b900490565b8015806114a85750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906114569030908690600401611c0c565b60206040518083038186803b15801561146e57600080fd5b505afa158015611482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a69190611a69565b155b6114c45760405162461bcd60e51b81526004016107e590611d94565b610f478363095ea7b360e01b84846040516024016114e3929190611c26565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611673565b611067816040518060400160405280600b81526020016a155b9cdc1958da599a595960aa1b815250611278565b8154600181018355600092835260209092206001600160a01b03909116910155565b600061159660017ff9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be611702565b905090565b6060816115c057506040805180820190915260018152600360fc1b6020820152610ddb565b6000825b80156115da5760019190910190600a90046115c4565b5060608167ffffffffffffffff811180156115f457600080fd5b506040519080825280601f01601f19166020018201604052801561161f576020820181803683370190505b509050815b801561166957600a850660300160f81b82600183038151811061164357fe5b60200101906001600160f81b031916908160001a905350600a8504945060001901611624565b509150610ddb9050565b60606116c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166117159092919063ffffffff16565b805190915015610f4757808060200190518101906116e69190611988565b610f475760405162461bcd60e51b81526004016107e590611d4a565b6000908152602091909152604090205490565b6060611724848460008561172e565b90505b9392505050565b6060824710156117505760405162461bcd60e51b81526004016107e590611c70565b611759856117ef565b6117755760405162461bcd60e51b81526004016107e590611d13565b60006060866001600160a01b031685876040516117929190611b5e565b60006040518083038185875af1925050503d80600081146117cf576040519150601f19603f3d011682016040523d82523d6000602084013e6117d4565b606091505b50915091506117e48282866117f5565b979650505050505050565b3b151590565b60608315611804575081611727565b8251156118145782518084602001fd5b8160405162461bcd60e51b81526004016107e59190611c5d565b6040518060a001604052806060815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b803562ffffff81168114610ebb57600080fd5b60008060008060008060c087890312156118d5578182fd5b86356118e081611f13565b955060208701356118f081611f13565b94506118ff88604089016118aa565b9350606087013592506080870135915060a087013561191d81611f13565b809150509295509295509295565b600080600080600060a08688031215611942578081fd5b853561194d81611f13565b945061195c87602088016118aa565b93506040860135925060608601359150608086013561197a81611f13565b809150509295509295909350565b600060208284031215611999578081fd5b81518015158114611727578182fd5b6000602082840312156119b9578081fd5b5035919050565b6000806000606084860312156119d4578283fd5b833567ffffffffffffffff808211156119eb578485fd5b818601915086601f8301126119fe578485fd5b813581811115611a0c578586fd5b6040516020601f8301601f1916820181018481118382101715611a2d578889fd5b60405282825284830181018a1015611a43578788fd5b828186018284013791810182019690965294979486013596505050604090930135925050565b600060208284031215611a7a578081fd5b5051919050565b60008151808452611a99816020860160208601611e38565b601f01601f19169290920160200192915050565b6000815160a08452611ac260a0850182611a81565b6020848101516001600160a01b031690860152604080850151908601526060808501519086015260809384015193909401929092525090919050565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff16908401526060808301518216908401526080808301519084015260a0828101519084015260c0808301519084015260e09182015116910152565b60008251611b70818460208701611e38565b9190910192915050565b60008551611b8c818460208a01611e38565b8083019050605f60f81b8082528651611bac816001850160208b01611e38565b60019201918201528451611bc7816002840160208901611e38565b6101d160f51b600292909101918201528351611bea816004840160208801611e38565b016004019695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b90815260200190565b6001600160e01b031991909116815260200190565b600060208252610eb86020830184611a81565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b602080825260159082015274746f416464726573735f6f75744f66426f756e647360581b604082015260600190565b602080825260149082015273496e76616c696420706f73742070726f6365737360601b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b602080825260129082015271746f416464726573735f6f766572666c6f7760701b604082015260600190565b600060208252610eb86020830184611aad565b6101008101610ebb8284611afe565b60005b83811015611e53578181015183820152602001611e3b565b83811115611e62576000848401525b50505050565b60e01c90565b600060443d1015611e7e57610bc3565b600481823e6308c379a0611e928251611e68565b14611e9c57610bc3565b6040513d600319016004823e80513d67ffffffffffffffff8160248401118184111715611ecc5750505050610bc3565b82840192508251915080821115611ee65750505050610bc3565b503d83016020828401011115611efe57505050610bc3565b601f01601f1916810160200160405291505090565b6001600160a01b038116811461106757600080fdfe000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564a2646970667358221220159a026a421e4d347071d806133944225412ddcc35e17992fdd6d0206f8d837264736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106101355760003560e01c8063bfd62c5e116100ab578063e473efd31161006f578063e473efd3146102a8578063f4f47ee1146102bb578063f5f5ba72146102ce578063f900e577146102f0578063fa2901a514610303578063fd9b19121461032557610135565b8063bfd62c5e14610245578063c272291614610258578063d3695b0914610262578063dc9031c414610275578063df58a96f1461029557610135565b806387c13943116100fd57806387c13943146101c25780638aa5b89b146101d757806399eb59b9146101ea578063a26082101461020a578063ad5c46481461021d578063b5619b551461023257610135565b80630f532d181461013a578063110cb594146101655780631413dc7d1461017857806332fe7b261461018d5780634eb4ccef146101af575b600080fd5b34801561014657600080fd5b5061014f610338565b60405161015c9190611c3f565b60405180910390f35b61014f6101733660046119c0565b61035c565b34801561018457600080fd5b5061014f6103d5565b34801561019957600080fd5b506101a26103f9565b60405161015c9190611bf8565b61014f6101bd36600461192b565b61040b565b3480156101ce57600080fd5b5061014f6104e8565b61014f6101e536600461192b565b6104f4565b3480156101f657600080fd5b5061014f6102053660046119a8565b610566565b61014f6102183660046118bd565b610578565b34801561022957600080fd5b506101a2610604565b61014f6102403660046119c0565b610616565b61014f61025336600461192b565b6106d8565b6102606107cd565b005b61014f6102703660046119c0565b6107ee565b34801561028157600080fd5b5061014f6102903660046119a8565b61093a565b61014f6102a33660046119c0565b610958565b61014f6102b636600461192b565b6109bc565b61014f6102c93660046119c0565b610a72565b3480156102da57600080fd5b506102e3610ba1565b60405161015c9190611c5d565b61014f6102fe3660046118bd565b610bc6565b34801561030f57600080fd5b50610318610c4b565b60405161015c9190611c48565b61014f6103333660046119c0565b610c56565b7fb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453a81565b60008061036885610d67565b9050600061037586610de0565b905061037f61182e565b868152606081018690526103938386610dec565b608082018190526103b5908490600080516020611f4983398151915290610ec1565b6103c0600082610f4c565b93506103cb8261105c565b5050509392505050565b7ff9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be81565b600080516020611f4983398151915281565b6000610415611866565b600080516020611f2983398151915281526001600160a01b038716602082015262ffffff8616604082015260a08101859052610452600085610dec565b60c082018190526001600160a01b03841660e0830152610472908261106a565b9150600080516020611f498339815191526001600160a01b03166312210e8a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156104bd57600080fd5b505af11580156104d1573d6000803e3d6000fd5b505050506104de8761105c565b5095945050505050565b670de0b6b3a764000081565b60006104fe611866565b600080516020611f2983398151915281526001600160a01b038716602082015262ffffff86166040820152610534600086610dec565b60a0820181905260c082018590526001600160a01b03841660e083015261055b9082611172565b91506104de8761105c565b60016020526000908152604090205481565b6000610582611866565b6001600160a01b0380891682528716602082015262ffffff861660408201526105ab8886610dec565b60a0820181905260c082018590526001600160a01b03841660e08301526105e3908990600080516020611f4983398151915290610ec1565b6105ee600082611172565b91506105f98761105c565b509695505050505050565b600080516020611f2983398151915281565b60008061062285610de0565b9050600061062f86610d67565b90506001600160a01b038216600080516020611f29833981519152146106aa576106aa6040518060400160405280601381526020017232bc30b1ba24b7383aba233937b6a2ba3432b960691b8152506040518060400160405280600e81526020016d092dce0eae840dcdee840ae8aa8960931b815250611278565b6106b261182e565b8681526106c0600087610dec565b60608201819052608082018690526103c090826112cb565b60006106e2611866565b6001600160a01b0387168152600080516020611f29833981519152602082015262ffffff8616604082015260a0810185905261071e8785610dec565b60c082018190526001600160a01b03841660e0830152815161074f91600080516020611f4983398151915290610ec1565b61075a60008261106a565b60a0820151604051632e1a7d4d60e01b8152919350600080516020611f2983398151915291632e1a7d4d9161079191600401611c3f565b600060405180830381600087803b1580156107ab57600080fd5b505af11580156107bf573d6000803e3d6000fd5b505050505095945050505050565b60405162461bcd60e51b81526004016107e590611ce5565b60405180910390fd5b6000806107fa85610de0565b9050600061080786610d67565b90506001600160a01b038116600080516020611f2983398151915214610881576108816040518060400160405280601181526020017032bc30b1ba24b7383aba2a37a2ba3432b960791b8152506040518060400160405280600f81526020016e09eeae8e0eae840dcdee840ae8aa89608b1b815250611278565b61088961182e565b8681526108968387610dec565b60608201819052608082018690526108bf908490600080516020611f4983398151915290610ec1565b6108ca6000826112cb565b604051632e1a7d4d60e01b8152909450600080516020611f2983398151915290632e1a7d4d906108fe908790600401611c3f565b600060405180830381600087803b15801561091857600080fd5b505af115801561092c573d6000803e3d6000fd5b505050505050509392505050565b6000818154811061094757fe5b600091825260209091200154905081565b60008061096485610de0565b9050600061097186610d67565b905061097b61182e565b8681526109888387610dec565b60608201819052608082018690526109b1908490600080516020611f4983398151915290610ec1565b6103c06000826112cb565b60006109c6611866565b6001600160a01b0387168152600080516020611f29833981519152602082015262ffffff861660408201526109fb8786610dec565b60a0820181905260c082018590526001600160a01b03841660e0830152610a33908890600080516020611f4983398151915290610ec1565b610a3e600082611172565b604051632e1a7d4d60e01b8152909250600080516020611f2983398151915290632e1a7d4d90610791908590600401611c3f565b600080610a7e85610d67565b90506000610a8b86610de0565b90506001600160a01b038216600080516020611f2983398151915214610b0757610b076040518060400160405280601481526020017332bc30b1ba27baba383aba233937b6a2ba3432b960611b8152506040518060400160405280600e81526020016d092dce0eae840dcdee840ae8aa8960931b815250611278565b610b0f61182e565b86815260608101869052610b24600086610dec565b60808201819052610b359082610f4c565b9350600080516020611f498339815191526001600160a01b03166312210e8a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610b8057600080fd5b505af1158015610b94573d6000803e3d6000fd5b505050506103cb8261105c565b60408051808201909152600a81526948556e6973776170563360b01b60208201525b90565b6000610bd0611866565b6001600160a01b0380891682528716602082015262ffffff8616604082015260a08101859052610c008885610dec565b60c082018190526001600160a01b03841660e08301528151610c3191600080516020611f4983398151915290610ec1565b610c3c60008261106a565b91506105f9816020015161105c565b636139148b60e11b81565b600080610c6285610d67565b90506000610c6f86610de0565b90506001600160a01b038116600080516020611f2983398151915214610cea57610cea6040518060400160405280601281526020017132bc30b1ba27baba383aba2a37a2ba3432b960711b8152506040518060400160405280600f81526020016e09eeae8e0eae840dcdee840ae8aa89608b1b815250611278565b610cf261182e565b86815260608101869052610d068386610dec565b60808201819052610d28908490600080516020611f4983398151915290610ec1565b610d33600082610f4c565b604051632e1a7d4d60e01b8152909450600080516020611f2983398151915290632e1a7d4d906108fe908990600401611c3f565b6000602b82511015610dc757610dc76040518060400160405280600781526020016611d95b995c985b60ca1b8152506040518060400160405280601381526020017214185d1a081cda5e99481d1bdbc81cdb585b1b606a1b815250611278565b8151610dd8908390601319016113c7565b90505b919050565b6000610dd882826113c7565b60006000198214610dfe575080610ebb565b6001600160a01b0383161580610e3057506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b15610e3c575047610ebb565b6040516370a0823160e01b81526001600160a01b038416906370a0823190610e68903090600401611bf8565b60206040518083038186803b158015610e8057600080fd5b505afa158015610e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb89190611a69565b90505b92915050565b60405163095ea7b360e01b81526001600160a01b0384169063095ea7b390610eef9085908590600401611c26565b600060405180830381600087803b158015610f0957600080fd5b505af1925050508015610f1a575060015b610f4757610f336001600160a01b038416836000611420565b610f476001600160a01b0384168383611420565b505050565b4260408083019190915230602083015251631e51809360e31b8152600090600080516020611f498339815191529063f28c0498908590610f90908690600401611e16565b6020604051808303818588803b158015610fa957600080fd5b505af193505050508015610fda575060408051601f3d908101601f19168201909252610fd791810190611a69565b60015b61105557610fe6611e6e565b80610ff15750611024565b61101e6040518060400160405280600b81526020016a195e1858dd13dd5d1c1d5d60aa1b81525082611278565b50611050565b6110506040518060400160405280600b81526020016a195e1858dd13dd5d1c1d5d60aa1b81525061151a565b610ebb565b9050610ebb565b611067600082611547565b50565b426080820152306060820152604051631b67c43360e31b8152600090600080516020611f498339815191529063db3e21989085906110ac908690600401611e29565b6020604051808303818588803b1580156110c557600080fd5b505af1935050505080156110f6575060408051601f3d908101601f191682019092526110f391810190611a69565b60015b61105557611102611e6e565b8061110d5750611140565b61101e6040518060400160405280601181526020017065786163744f757470757453696e676c6560781b81525082611278565b6110506040518060400160405280601181526020017065786163744f757470757453696e676c6560781b81525061151a565b42608082015230606082015260405163414bf38960e01b8152600090600080516020611f498339815191529063414bf3899085906111b4908690600401611e29565b6020604051808303818588803b1580156111cd57600080fd5b505af1935050505080156111fe575060408051601f3d908101601f191682019092526111fb91810190611a69565b60015b6110555761120a611e6e565b806112155750611247565b61101e6040518060400160405280601081526020016f6578616374496e70757453696e676c6560801b81525082611278565b6110506040518060400160405280601081526020016f6578616374496e70757453696e676c6560801b81525061151a565b611288611283611569565b61159b565b611290610ba1565b83836040516020016112a59493929190611b7a565b60408051601f198184030181529082905262461bcd60e51b82526107e591600401611c5d565b426040808301919091523060208301525163c04b8d5960e01b8152600090600080516020611f498339815191529063c04b8d5990859061130f908690600401611e16565b6020604051808303818588803b15801561132857600080fd5b505af193505050508015611359575060408051601f3d908101601f1916820190925261135691810190611a69565b60015b61105557611365611e6e565b80611370575061139c565b61101e6040518060400160405280600a815260200169195e1858dd125b9c1d5d60b21b81525082611278565b6110506040518060400160405280600a815260200169195e1858dd125b9c1d5d60b21b81525061151a565b6000818260140110156113ec5760405162461bcd60e51b81526004016107e590611dea565b81601401835110156114105760405162461bcd60e51b81526004016107e590611cb6565b500160200151600160601b900490565b8015806114a85750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906114569030908690600401611c0c565b60206040518083038186803b15801561146e57600080fd5b505afa158015611482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a69190611a69565b155b6114c45760405162461bcd60e51b81526004016107e590611d94565b610f478363095ea7b360e01b84846040516024016114e3929190611c26565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611673565b611067816040518060400160405280600b81526020016a155b9cdc1958da599a595960aa1b815250611278565b8154600181018355600092835260209092206001600160a01b03909116910155565b600061159660017ff9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be611702565b905090565b6060816115c057506040805180820190915260018152600360fc1b6020820152610ddb565b6000825b80156115da5760019190910190600a90046115c4565b5060608167ffffffffffffffff811180156115f457600080fd5b506040519080825280601f01601f19166020018201604052801561161f576020820181803683370190505b509050815b801561166957600a850660300160f81b82600183038151811061164357fe5b60200101906001600160f81b031916908160001a905350600a8504945060001901611624565b509150610ddb9050565b60606116c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166117159092919063ffffffff16565b805190915015610f4757808060200190518101906116e69190611988565b610f475760405162461bcd60e51b81526004016107e590611d4a565b6000908152602091909152604090205490565b6060611724848460008561172e565b90505b9392505050565b6060824710156117505760405162461bcd60e51b81526004016107e590611c70565b611759856117ef565b6117755760405162461bcd60e51b81526004016107e590611d13565b60006060866001600160a01b031685876040516117929190611b5e565b60006040518083038185875af1925050503d80600081146117cf576040519150601f19603f3d011682016040523d82523d6000602084013e6117d4565b606091505b50915091506117e48282866117f5565b979650505050505050565b3b151590565b60608315611804575081611727565b8251156118145782518084602001fd5b8160405162461bcd60e51b81526004016107e59190611c5d565b6040518060a001604052806060815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b803562ffffff81168114610ebb57600080fd5b60008060008060008060c087890312156118d5578182fd5b86356118e081611f13565b955060208701356118f081611f13565b94506118ff88604089016118aa565b9350606087013592506080870135915060a087013561191d81611f13565b809150509295509295509295565b600080600080600060a08688031215611942578081fd5b853561194d81611f13565b945061195c87602088016118aa565b93506040860135925060608601359150608086013561197a81611f13565b809150509295509295909350565b600060208284031215611999578081fd5b81518015158114611727578182fd5b6000602082840312156119b9578081fd5b5035919050565b6000806000606084860312156119d4578283fd5b833567ffffffffffffffff808211156119eb578485fd5b818601915086601f8301126119fe578485fd5b813581811115611a0c578586fd5b6040516020601f8301601f1916820181018481118382101715611a2d578889fd5b60405282825284830181018a1015611a43578788fd5b828186018284013791810182019690965294979486013596505050604090930135925050565b600060208284031215611a7a578081fd5b5051919050565b60008151808452611a99816020860160208601611e38565b601f01601f19169290920160200192915050565b6000815160a08452611ac260a0850182611a81565b6020848101516001600160a01b031690860152604080850151908601526060808501519086015260809384015193909401929092525090919050565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff16908401526060808301518216908401526080808301519084015260a0828101519084015260c0808301519084015260e09182015116910152565b60008251611b70818460208701611e38565b9190910192915050565b60008551611b8c818460208a01611e38565b8083019050605f60f81b8082528651611bac816001850160208b01611e38565b60019201918201528451611bc7816002840160208901611e38565b6101d160f51b600292909101918201528351611bea816004840160208801611e38565b016004019695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b90815260200190565b6001600160e01b031991909116815260200190565b600060208252610eb86020830184611a81565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b602080825260159082015274746f416464726573735f6f75744f66426f756e647360581b604082015260600190565b602080825260149082015273496e76616c696420706f73742070726f6365737360601b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b602080825260129082015271746f416464726573735f6f766572666c6f7760701b604082015260600190565b600060208252610eb86020830184611aad565b6101008101610ebb8284611afe565b60005b83811015611e53578181015183820152602001611e3b565b83811115611e62576000848401525b50505050565b60e01c90565b600060443d1015611e7e57610bc3565b600481823e6308c379a0611e928251611e68565b14611e9c57610bc3565b6040513d600319016004823e80513d67ffffffffffffffff8160248401118184111715611ecc5750505050610bc3565b82840192508251915080821115611ee65750505050610bc3565b503d83016020828401011115611efe57505050610bc3565b601f01601f1916810160200160405291505090565b6001600160a01b038116811461106757600080fdfe000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564a2646970667358221220159a026a421e4d347071d806133944225412ddcc35e17992fdd6d0206f8d837264736f6c634300060c0033
Deployed Bytecode Sourcemap
38117:13349:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13289:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48045:875;;;;;;:::i;:::-;;:::i;13470:109::-;;;;;;;;;;;;;:::i;38282:92::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43484:816::-;;;;;;:::i;:::-;;:::i;15002:49::-;;;;;;;;;;;;;:::i;38739:718::-;;;;;;:::i;:::-;;:::i;13177:40::-;;;;;;;;;;-1:-1:-1;13177:40:0;;;;;:::i;:::-;;:::i;40263:805::-;;;;;;:::i;:::-;;:::i;38405:80::-;;;;;;;;;;;;;:::i;41076:794::-;;;;;;:::i;:::-;;:::i;44308:873::-;;;;;;:::i;:::-;;:::i;16069:479::-;;;:::i;:::-;;41878:871;;;;;;:::i;:::-;;:::i;13148:22::-;;;;;;;;;;-1:-1:-1;13148:22:0;;;;;:::i;:::-;;:::i;42757:719::-;;;;;;:::i;:::-;;:::i;39465:790::-;;;;;;:::i;:::-;;:::i;46085:919::-;;;;;;:::i;:::-;;:::i;38621:110::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45189:888::-;;;;;;:::i;:::-;;:::i;14895:51::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47012:1025::-;;;;;;:::i;:::-;;:::i;13289:107::-;13330:66;13289:107;:::o;48045:875::-;48189:16;48346:15;48364:19;48378:4;48364:13;:19::i;:::-;48346:37;;48394:16;48413:20;48428:4;48413:14;:20::i;:::-;48394:39;;48485:43;;:::i;:::-;48539:18;;;48568:16;;;:28;;;48693:37;48705:7;48714:15;48693:11;:37::i;:::-;48668:22;;;:62;;;48769:63;;48783:7;;-1:-1:-1;;;;;;;;;;;38331:42:0;48769:13;:63::i;:::-;48854:23;48867:1;48870:6;48854:12;:23::i;:::-;48843:34;;48890:22;48903:8;48890:12;:22::i;:::-;48045:875;;;;;;;;:::o;13470:109::-;13513:66;13470:109;:::o;38282:92::-;-1:-1:-1;;;;;;;;;;;38282:92:0;:::o;43484:816::-;43699:16;43769:49;;:::i;:::-;-1:-1:-1;;;;;;;;;;;43829:30:0;;-1:-1:-1;;;;;43870:26:0;;:15;;;:26;43907:16;;;:10;;;:16;43934;;;:28;;;44059:40;43829:14;44083:15;44059:11;:40::i;:::-;44034:22;;;:65;;;-1:-1:-1;;;;;44110:44:0;;:24;;;:44;44178:50;;44034:6;44178:18;:50::i;:::-;44167:61;;-1:-1:-1;;;;;;;;;;;;;;;;44239:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44270:22;44283:8;44270:12;:22::i;:::-;43484:816;;;;;;;;:::o;15002:49::-;15044:7;15002:49;:::o;38739:718::-;38953:17;39024:48;;:::i;:::-;-1:-1:-1;;;;;;;;;;;39083:30:0;;-1:-1:-1;;;;;39124:26:0;;:15;;;:26;39161:16;;;:10;;;:16;39206:33;39083:14;39230:8;39206:11;:33::i;:::-;39188:15;;;:51;;;39250:23;;;:42;;;-1:-1:-1;;;;;39303:44:0;;:24;;;:44;39372:42;;39188:6;39372:17;:42::i;:::-;39360:54;;39427:22;39440:8;39427:12;:22::i;13177:40::-;;;;;;;;;;;;;:::o;40263:805::-;40494:17;40565:48;;:::i;:::-;-1:-1:-1;;;;;40624:24:0;;;;;40659:26;;:15;;;:26;40696:16;;;:10;;;:16;40741:30;40641:7;40762:8;40741:11;:30::i;:::-;40723:15;;;:48;;;40782:23;;;:42;;;-1:-1:-1;;;;;40835:44:0;;:24;;;:44;40918:56;;40932:7;;-1:-1:-1;;;;;;;;;;;38331:42:0;40918:13;:56::i;:::-;40997:28;41015:1;41018:6;40997:17;:28::i;:::-;40985:40;;41038:22;41051:8;41038:12;:22::i;:::-;40263:805;;;;;;;;;:::o;38405:80::-;-1:-1:-1;;;;;;;;;;;38405:80:0;:::o;41076:794::-;41228:17;41299:15;41317:20;41332:4;41317:14;:20::i;:::-;41299:38;;41348:16;41367:19;41381:4;41367:13;:19::i;:::-;41348:38;-1:-1:-1;;;;;;41438:24:0;;-1:-1:-1;;;;;;;;;;;41438:24:0;41434:94;;41477:51;;;;;;;;;;;;;;-1:-1:-1;;;41477:51:0;;;;;;;;;;;;;;;;-1:-1:-1;;;41477:51:0;;;:10;:51::i;:::-;41580:42;;:::i;:::-;41633:18;;;41680:33;41633:11;41704:8;41680:11;:33::i;:::-;41662:15;;;:51;;;41724:23;;;:42;;;41791:36;;41662:6;41791:11;:36::i;44308:873::-;44520:16;44590:49;;:::i;:::-;-1:-1:-1;;;;;44650:24:0;;;;-1:-1:-1;;;;;;;;;;;44685:15:0;;;:31;44727:16;;;:10;;;:16;44754;;;:28;;;44879:37;44667:7;44900:15;44879:11;:37::i;:::-;44854:22;;;:62;;;-1:-1:-1;;;;;44927:44:0;;:24;;;:44;45024:14;;45010:70;;-1:-1:-1;;;;;;;;;;;38331:42:0;45010:13;:70::i;:::-;45102:29;45121:1;45124:6;45102:18;:29::i;:::-;45156:16;;;;45142:31;;-1:-1:-1;;;45142:31:0;;45091:40;;-1:-1:-1;;;;;;;;;;;;38442:42:0;45142:13;;:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44308:873;;;;;;;;:::o;16069:479::-;16128:30;;-1:-1:-1;;;16128:30:0;;;;;;;:::i;:::-;;;;;;;;41878:871;42028:17;42099:15;42117:20;42132:4;42117:14;:20::i;:::-;42099:38;;42148:16;42167:19;42181:4;42167:13;:19::i;:::-;42148:38;-1:-1:-1;;;;;;42239:25:0;;-1:-1:-1;;;;;;;;;;;42239:25:0;42235:94;;42279:50;;;;;;;;;;;;;;-1:-1:-1;;;42279:50:0;;;;;;;;;;;;;;;;-1:-1:-1;;;42279:50:0;;;:10;:50::i;:::-;42381:42;;:::i;:::-;42434:18;;;42481:30;42493:7;42502:8;42481:11;:30::i;:::-;42463:15;;;:48;;;42522:23;;;:42;;;42603:56;;42617:7;;-1:-1:-1;;;;;;;;;;;38331:42:0;42603:13;:56::i;:::-;42682:22;42694:1;42697:6;42682:11;:22::i;:::-;42717:24;;-1:-1:-1;;;42717:24:0;;42670:34;;-1:-1:-1;;;;;;;;;;;;38442:42:0;42717:13;;:24;;42670:34;;42717:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41878:871;;;;;;;;:::o;13148:22::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13148:22:0;:::o;42757:719::-;42900:17;42971:15;42989:20;43004:4;42989:14;:20::i;:::-;42971:38;;43020:16;43039:19;43053:4;43039:13;:19::i;:::-;43020:38;;43110:42;;:::i;:::-;43163:18;;;43210:30;43222:7;43231:8;43210:11;:30::i;:::-;43192:15;;;:48;;;43251:23;;;:42;;;43332:56;;43346:7;;-1:-1:-1;;;;;;;;;;;38331:42:0;43332:13;:56::i;:::-;43411:22;43423:1;43426:6;43411:11;:22::i;39465:790::-;39676:17;39747:48;;:::i;:::-;-1:-1:-1;;;;;39806:24:0;;;;-1:-1:-1;;;;;;;;;;;39841:15:0;;;:31;39883:16;;;:10;;;:16;39928:30;39823:7;39949:8;39928:11;:30::i;:::-;39910:15;;;:48;;;39969:23;;;:42;;;-1:-1:-1;;;;;40022:44:0;;:24;;;:44;40105:56;;40119:7;;-1:-1:-1;;;;;;;;;;;38331:42:0;40105:13;:56::i;:::-;40184:28;40202:1;40205:6;40184:17;:28::i;:::-;40223:24;;-1:-1:-1;;;40223:24:0;;40172:40;;-1:-1:-1;;;;;;;;;;;;38442:42:0;40223:13;;:24;;40172:40;;40223:24;;;:::i;46085:919::-;46238:16;46395:15;46413:19;46427:4;46413:13;:19::i;:::-;46395:37;;46443:16;46462:20;46477:4;46462:14;:20::i;:::-;46443:39;-1:-1:-1;;;;;;46534:24:0;;-1:-1:-1;;;;;;;;;;;46534:24:0;46530:95;;46573:52;;;;;;;;;;;;;;-1:-1:-1;;;46573:52:0;;;;;;;;;;;;;;;;-1:-1:-1;;;46573:52:0;;;:10;:52::i;:::-;46677:43;;:::i;:::-;46731:18;;;46760:16;;;:28;;;46824:40;46731:11;46848:15;46824:11;:40::i;:::-;46799:22;;;:65;;;46888:44;;46799:6;46888:12;:44::i;:::-;46877:55;;-1:-1:-1;;;;;;;;;;;;;;;;46943:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46974:22;46987:8;46974:12;:22::i;38621:110::-;38704:19;;;;;;;;;;;;-1:-1:-1;;;38704:19:0;;;;38621:110;;:::o;45189:888::-;45421:16;45491:49;;:::i;:::-;-1:-1:-1;;;;;45551:24:0;;;;;45586:26;;:15;;;:26;45623:16;;;:10;;;:16;45650;;;:28;;;45775:37;45568:7;45796:15;45775:11;:37::i;:::-;45750:22;;;:62;;;-1:-1:-1;;;;;45823:44:0;;:24;;;:44;45920:14;;45906:70;;-1:-1:-1;;;;;;;;;;;38331:42:0;45906:13;:70::i;:::-;45998:29;46017:1;46020:6;45998:18;:29::i;:::-;45987:40;;46040:29;46053:6;:15;;;46040:12;:29::i;14895:51::-;-1:-1:-1;;;14895:51:0;:::o;47012:1025::-;47163:16;47320:15;47338:19;47352:4;47338:13;:19::i;:::-;47320:37;;47368:16;47387:20;47402:4;47387:14;:20::i;:::-;47368:39;-1:-1:-1;;;;;;47457:25:0;;-1:-1:-1;;;;;;;;;;;47457:25:0;47453:95;;47497:51;;;;;;;;;;;;;;-1:-1:-1;;;47497:51:0;;;;;;;;;;;;;;;;-1:-1:-1;;;47497:51:0;;;:10;:51::i;:::-;47600:43;;:::i;:::-;47654:18;;;47683:16;;;:28;;;47808:37;47820:7;47829:15;47808:11;:37::i;:::-;47783:22;;;:62;;;47884:63;;47898:7;;-1:-1:-1;;;;;;;;;;;38331:42:0;47884:13;:63::i;:::-;47969:23;47982:1;47985:6;47969:12;:23::i;:::-;48005:24;;-1:-1:-1;;;48005:24:0;;47958:34;;-1:-1:-1;;;;;;;;;;;;38442:42:0;48005:13;;:24;;48019:9;;48005:24;;;:::i;49054:239::-;49119:7;38531:2;49143:4;:11;:23;49139:86;;;49181:44;;;;;;;;;;;;;;-1:-1:-1;;;49181:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;49181:44:0;;;:10;:44::i;:::-;49258:11;;49243:42;;49258:4;;-1:-1:-1;;49258:26:0;49243:14;:42::i;:::-;49236:49;;49054:239;;;;:::o;48928:118::-;48994:7;49021:17;:4;48994:7;49021:14;:17::i;18236:500::-;18338:7;-1:-1:-1;;18367:6:0;:21;18363:67;;-1:-1:-1;18412:6:0;18405:13;;18363:67;-1:-1:-1;;;;;18481:19:0;;;;:96;;-1:-1:-1;;;;;;18517:60:0;;18534:42;18517:60;18481:96;18463:181;;;-1:-1:-1;18611:21:0;18604:28;;18463:181;18690:38;;-1:-1:-1;;;18690:38:0;;-1:-1:-1;;;;;18690:23:0;;;;;:38;;18722:4;;18690:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18683:45;;18236:500;;;;;:::o;18744:309::-;18873:42;;-1:-1:-1;;;18873:42:0;;-1:-1:-1;;;;;18873:25:0;;;;;:42;;18899:7;;18908:6;;18873:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18869:177;;18940:37;-1:-1:-1;;;;;18940:25:0;;18966:7;18975:1;18940:25;:37::i;:::-;18992:42;-1:-1:-1;;;;;18992:25:0;;19018:7;19027:6;18992:25;:42::i;:::-;18744:309;;;:::o;50942:521::-;51105:3;51087:15;;;;:21;;;;51146:4;51119:16;;;:32;51168:40;-1:-1:-1;;;51168:40:0;;51067:7;;-1:-1:-1;;;;;;;;;;;38331:42:0;51168:18;;51194:5;;51168:40;;51087:6;;51168:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51168:40:0;;;;;;;;-1:-1:-1;;51168:40:0;;;;;;;;;;;;:::i;:::-;;;51164:292;;;;:::i;:::-;;;;;;;;51352:33;;;;;;;;;;;;;;-1:-1:-1;;;51352:33:0;;;51378:6;51352:10;:33::i;:::-;51303:94;51164:292;;;51419:25;;;;;;;;;;;;;;-1:-1:-1;;;51419:25:0;;;:10;:25::i;:::-;51164:292;;;51282:8;-1:-1:-1;51275:15:0;;16556:200;16613:23;:5;16630;16613:16;:23::i;:::-;16556:200;:::o;50383:551::-;50558:3;50540:15;;;:21;50599:4;50572:16;;;:32;50621:46;;-1:-1:-1;;;50621:46:0;;50520:7;;-1:-1:-1;;;;;;;;;;;38331:42:0;50621:24;;50653:5;;50621:46;;50540:6;;50621:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50621:46:0;;;;;;;;-1:-1:-1;;50621:46:0;;;;;;;;;;;;:::i;:::-;;;50617:310;;;;:::i;:::-;;;;;;;;50811:39;;;;;;;;;;;;;;-1:-1:-1;;;50811:39:0;;;50843:6;50811:10;:39::i;50617:310::-;50884:31;;;;;;;;;;;;;;-1:-1:-1;;;50884:31:0;;;:10;:31::i;49301:548::-;49474:3;49456:15;;;:21;49515:4;49488:16;;;:32;49537:45;;-1:-1:-1;;;49537:45:0;;49436:7;;-1:-1:-1;;;;;;;;;;;38331:42:0;49537:23;;49568:5;;49537:45;;49456:6;;49537:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49537:45:0;;;;;;;;-1:-1:-1;;49537:45:0;;;;;;;;;;;;:::i;:::-;;;49533:309;;;;:::i;:::-;;;;;;;;49728:38;;;;;;;;;;;;;;-1:-1:-1;;;49728:38:0;;;49759:6;49728:10;:38::i;49533:309::-;49800:30;;;;;;;;;;;;;;-1:-1:-1;;;49800:30:0;;;:10;:30::i;17106:470::-;17309:31;17322:17;:15;:17::i;:::-;17309:12;:31::i;:::-;17389:17;:15;:17::i;:::-;17455:12;17517:6;17270:272;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;17270:272:0;;;;;;;;;;-1:-1:-1;;;17224:344:0;;;;;;;:::i;49857:518::-;50018:3;50000:15;;;;:21;;;;50059:4;50032:16;;;:32;50081:39;-1:-1:-1;;;50081:39:0;;49980:7;;-1:-1:-1;;;;;;;;;;;38331:42:0;50081:17;;50106:5;;50081:39;;50000:6;;50081:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50081:39:0;;;;;;;;-1:-1:-1;;50081:39:0;;;;;;;;;;;;:::i;:::-;;;50077:291;;;;:::i;:::-;;;;;;;;50266:32;;;;;;;;;;;;;;-1:-1:-1;;;50266:32:0;;;50291:6;50266:10;:32::i;50077:291::-;50332:24;;;;;;;;;;;;;;-1:-1:-1;;;50332:24:0;;;:10;:24::i;3808:507::-;3914:7;3962:6;3947;3956:2;3947:11;:21;;3939:52;;;;-1:-1:-1;;;3939:52:0;;;;;;;:::i;:::-;4027:6;4036:2;4027:11;4010:6;:13;:28;;4002:62;;;;-1:-1:-1;;;4002:62:0;;;;;;;:::i;:::-;-1:-1:-1;4174:30:0;4190:4;4174:30;4168:37;-1:-1:-1;;;4146:120:0;;;3808:507::o;35610:622::-;35980:10;;;35979:62;;-1:-1:-1;35996:39:0;;-1:-1:-1;;;35996:39:0;;-1:-1:-1;;;;;35996:15:0;;;;;:39;;36020:4;;36027:7;;35996:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;35979:62;35971:152;;;;-1:-1:-1;;;35971:152:0;;;;;;;:::i;:::-;36134:90;36154:5;36184:22;;;36208:7;36217:5;36161:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;36161:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;36161:62:0;-1:-1:-1;;;;;;36161:62:0;;;;;;;;;;36134:19;:90::i;17584:120::-;17657:39;17668:12;17657:39;;;;;;;;;;;;;-1:-1:-1;;;17657:39:0;;;:10;:39::i;10534:136::-;10616:46;;;;;;;10628:33;10616:46;;;;;;;-1:-1:-1;;;;;10636:24:0;;;10616:46;;;10534:136::o;14640:119::-;14690:7;14717:34;:5;13513:66;14717:16;:34::i;:::-;14710:41;;14640:119;:::o;17712:516::-;17768:13;17798:6;17794:427;;-1:-1:-1;17821:10:0;;;;;;;;;;;;-1:-1:-1;;;17821:10:0;;;;;;17794:427;17864:11;17914:1;17894:85;17917:8;;17894:85;;17958:5;;;;;;17935:2;17927:10;;17894:85;;;;17993:16;18022:3;18012:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18012:14:0;-1:-1:-1;17993:33:0;-1:-1:-1;18058:3:0;18041:136;18063:5;;18041:136;;18130:2;18126:1;:6;18120:2;:13;18107:28;;18094:3;18102:1;18098;:5;18094:10;;;;;;;;;;;:41;-1:-1:-1;;;;;18094:41:0;;;;;;;;-1:-1:-1;18159:2:0;18154:7;;;-1:-1:-1;;;18070:3:0;18041:136;;;-1:-1:-1;18205:3:0;-1:-1:-1;18191:18:0;;-1:-1:-1;18191:18:0;37256:761;37680:23;37706:69;37734:4;37706:69;;;;;;;;;;;;;;;;;37714:5;-1:-1:-1;;;;;37706:27:0;;;:69;;;;;:::i;:::-;37790:17;;37680:95;;-1:-1:-1;37790:21:0;37786:224;;37932:10;37921:30;;;;;;;;;;;;:::i;:::-;37913:85;;;;-1:-1:-1;;;37913:85:0;;;;;;;:::i;12534:185::-;12660:11;12698:12;;;;;;;;;;;;;12534:185::o;22750:195::-;22853:12;22885:52;22907:6;22915:4;22921:1;22924:12;22885:21;:52::i;:::-;22878:59;;22750:195;;;;;;:::o;23802:530::-;23929:12;23987:5;23962:21;:30;;23954:81;;;;-1:-1:-1;;;23954:81:0;;;;;;;:::i;:::-;24054:18;24065:6;24054:10;:18::i;:::-;24046:60;;;;-1:-1:-1;;;24046:60:0;;;;;;;:::i;:::-;24180:12;24194:23;24221:6;-1:-1:-1;;;;;24221:11:0;24241:5;24249:4;24221:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24179:75;;;;24272:52;24290:7;24299:10;24311:12;24272:17;:52::i;:::-;24265:59;23802:530;-1:-1:-1;;;;;;;23802:530:0:o;19832:422::-;20199:20;20238:8;;;19832:422::o;25338:742::-;25453:12;25482:7;25478:595;;;-1:-1:-1;25513:10:0;25506:17;;25478:595;25627:17;;:21;25623:439;;25890:10;25884:17;25951:15;25938:10;25934:2;25930:19;25923:44;25838:148;26033:12;26026:20;;-1:-1:-1;;;26026:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1000:128::-;1066:20;;26960:8;26949:20;;29597:34;;29587:2;;29645:1;;29635:12;1413:867;;;;;;;1601:3;1589:9;1580:7;1576:23;1572:33;1569:2;;;-1:-1;;1608:12;1569:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1660:63;-1:-1;1760:2;1799:22;;72:20;97:33;72:20;97:33;:::i;:::-;1768:63;-1:-1;1886:52;1930:7;1868:2;1906:22;;1886:52;:::i;:::-;1876:62;;1975:2;2018:9;2014:22;1202:20;1983:63;;2083:3;2127:9;2123:22;1202:20;2092:63;;2192:3;2236:9;2232:22;930:20;955:33;982:5;955:33;:::i;:::-;2201:63;;;;1563:717;;;;;;;;:::o;2287:741::-;;;;;;2458:3;2446:9;2437:7;2433:23;2429:33;2426:2;;;-1:-1;;2465:12;2426:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2517:63;-1:-1;2635:52;2679:7;2617:2;2655:22;;2635:52;:::i;:::-;2625:62;;2724:2;2767:9;2763:22;1202:20;2732:63;;2832:2;2875:9;2871:22;1202:20;2840:63;;2940:3;2984:9;2980:22;930:20;955:33;982:5;955:33;:::i;:::-;2949:63;;;;2420:608;;;;;;;;:::o;3035:257::-;;3147:2;3135:9;3126:7;3122:23;3118:32;3115:2;;;-1:-1;;3153:12;3115:2;223:6;217:13;29254:5;26504:13;26497:21;29232:5;29229:32;29219:2;;-1:-1;;29265:12;3299:241;;3403:2;3391:9;3382:7;3378:23;3374:32;3371:2;;;-1:-1;;3409:12;3371:2;-1:-1;344:20;;3365:175;-1:-1;3365:175::o;3547:595::-;;;;3694:2;3682:9;3673:7;3669:23;3665:32;3662:2;;;-1:-1;;3700:12;3662:2;3758:17;3745:31;3796:18;;3788:6;3785:30;3782:2;;;-1:-1;;3818:12;3782:2;3893:6;3882:9;3878:22;;;516:3;509:4;501:6;497:17;493:27;483:2;;-1:-1;;524:12;483:2;571:6;558:20;3796:18;25250:6;25247:30;25244:2;;;-1:-1;;25280:12;25244:2;24914;24908:9;25421:4;25353:9;25334:17;;-1:-1;;25330:33;24940:17;;;;25000:34;;;25036:22;;;24997:62;24994:2;;;-1:-1;;25062:12;24994:2;24914;25081:22;663:21;;;763:16;;;;;760:25;-1:-1;757:2;;;-1:-1;;788:12;757:2;27735:6;25421:4;705:6;701:17;25421:4;739:5;735:16;27712:30;27773:16;;;;;27766:27;;;;739:5;;3986:22;;;1202:20;;-1:-1;;;24914:2;4094:22;;;1202:20;;-1:-1;;3656:486::o;4397:263::-;;4512:2;4500:9;4491:7;4487:23;4483:32;4480:2;;;-1:-1;;4518:12;4480:2;-1:-1;1350:13;;4474:186;-1:-1;4474:186::o;5134:323::-;;5266:5;25530:12;25805:6;25800:3;25793:19;5349:52;5394:6;25842:4;25837:3;25833:14;25842:4;5375:5;5371:16;5349:52;:::i;:::-;25353:9;28152:14;-1:-1;;28148:28;5413:39;;;;25842:4;5413:39;;5214:243;-1:-1;;5214:243::o;10162:1072::-;;10401:16;10395:23;10329:4;10438:14;10431:38;10484:71;10329:4;10324:3;10320:14;10536:12;10484:71;:::i;:::-;10645:4;10634:16;;;10628:23;-1:-1;;;;;26822:54;10705:14;;;4728:37;10803:4;10792:16;;;10786:23;10863:14;;;4968:37;10961:4;10950:16;;;10944:23;11021:14;;;4968:37;11127:4;11116:16;;;11110:23;11187:14;;;;4968:37;;;;-1:-1;10476:79;;10302:932;-1:-1;10302:932::o;11334:1472::-;11576:23;;-1:-1;;;;;26822:54;;;4728:37;;11751:4;11740:16;;;11734:23;26822:54;;11811:14;;;4728:37;11904:4;11893:16;;;11887:23;26960:8;26949:20;11962:14;;;15722:36;12061:4;12050:16;;;12044:23;26822:54;;12121:14;;;4728:37;12219:4;12208:16;;;12202:23;12279:14;;;4968:37;26833:42;12366:16;;;12360:23;12437:14;;;4968:37;12543:4;12532:16;;;12526:23;12603:14;;;4968:37;12710:4;12699:16;;;12693:23;26822:54;12770:14;;15614:37;11478:1328::o;16000:271::-;;5624:5;25530:12;5735:52;5780:6;5775:3;5768:4;5761:5;5757:16;5735:52;:::i;:::-;5799:16;;;;;16134:137;-1:-1;;16134:137::o;16278:1559::-;;5624:5;25530:12;5735:52;5780:6;5775:3;5768:4;5761:5;5757:16;5735:52;:::i;:::-;5808:6;5803:3;5799:16;5792:23;;-1:-1;;;8573:3;8560:11;8553:24;5624:5;25530:12;5735:52;5780:6;8538:1;8600:3;8596:11;5768:4;5761:5;5757:16;5735:52;:::i;:::-;8538:1;5799:16;;;;;8553:24;25530:12;;5735:52;25530:12;8596:11;;;5768:4;5757:16;;5735:52;:::i;:::-;-1:-1;;;8596:11;5799:16;;;;;;;9285:25;25530:12;;5735:52;25530:12;9329:11;;;5768:4;5757:16;;5735:52;:::i;:::-;5799:16;9329:11;5799:16;;16861:976;-1:-1;;;;;;16861:976::o;17844:222::-;-1:-1;;;;;26822:54;;;;4728:37;;17971:2;17956:18;;17942:124::o;18073:333::-;-1:-1;;;;;26822:54;;;4728:37;;26822:54;;18392:2;18377:18;;4728:37;18228:2;18213:18;;18199:207::o;18413:333::-;-1:-1;;;;;26822:54;;;;4728:37;;18732:2;18717:18;;4968:37;18568:2;18553:18;;18539:207::o;18753:222::-;4968:37;;;18880:2;18865:18;;18851:124::o;18982:218::-;-1:-1;;;;;;26670:78;;;;5086:36;;19107:2;19092:18;;19078:122::o;19747:310::-;;19894:2;19915:17;19908:47;19969:78;19894:2;19883:9;19879:18;20033:6;19969:78;:::i;20064:416::-;20264:2;20278:47;;;7121:2;20249:18;;;25793:19;7157:34;25833:14;;;7137:55;-1:-1;;;7212:12;;;7205:30;7254:12;;;20235:245::o;20487:416::-;20687:2;20701:47;;;7505:2;20672:18;;;25793:19;-1:-1;;;25833:14;;;7521:44;7584:12;;;20658:245::o;20910:416::-;21110:2;21124:47;;;7835:2;21095:18;;;25793:19;-1:-1;;;25833:14;;;7851:43;7913:12;;;21081:245::o;21333:416::-;21533:2;21547:47;;;8164:2;21518:18;;;25793:19;8200:31;25833:14;;;8180:52;8251:12;;;21504:245::o;21756:416::-;21956:2;21970:47;;;8846:2;21941:18;;;25793:19;8882:34;25833:14;;;8862:55;-1:-1;;;8937:12;;;8930:34;8983:12;;;21927:245::o;22179:416::-;22379:2;22393:47;;;9579:2;22364:18;;;25793:19;9615:34;25833:14;;;9595:55;-1:-1;;;9670:12;;;9663:46;9728:12;;;22350:245::o;22602:416::-;22802:2;22816:47;;;9979:2;22787:18;;;25793:19;-1:-1;;;25833:14;;;9995:41;10055:12;;;22773:245::o;23025:402::-;;23218:2;23239:17;23232:47;23293:124;23218:2;23207:9;23203:18;23403:6;23293:124;:::i;23434:379::-;23639:3;23624:19;;23654:149;23628:9;23776:6;23654:149;:::i;27808:268::-;27873:1;27880:101;27894:6;27891:1;27888:13;27880:101;;;27961:11;;;27955:18;27942:11;;;27935:39;27916:2;27909:10;27880:101;;;27996:6;27993:1;27990:13;27987:2;;;27873:1;28052:6;28047:3;28043:16;28036:27;27987:2;;27857:219;;;:::o;28189:106::-;28274:3;28270:15;;28242:53::o;28303:739::-;;28376:4;28358:16;28355:26;28352:2;;;28384:5;;28352:2;28418:1;-1:-1;;28397:23;28493:10;28436:34;-1:-1;28461:8;28436:34;:::i;:::-;28485:19;28475:2;;28508:5;;28475:2;28539;28533:9;28575:16;-1:-1;;28571:24;28418:1;28533:9;28547:49;28622:4;28616:11;28703:16;28655:18;28703:16;28696:4;28688:6;28684:17;28681:39;28655:18;28647:6;28644:30;28635:91;28632:2;;;28734:5;;;;;;28632:2;28772:6;28766:4;28762:17;28751:28;;28804:3;28798:10;28784:24;;28655:18;28819:6;28816:30;28813:2;;;28849:5;;;;;;28813:2;;28926:16;28920:4;28916:27;28886:4;28893:6;28881:3;28873:27;;28908:36;28905:2;;;28947:5;;;;;28905:2;25353:9;28152:14;-1:-1;;28148:28;28971:50;;28886:4;28971:50;28539:2;28960:62;28979:3;-1:-1;;28346:696;:::o;29049:117::-;-1:-1;;;;;26822:54;;29108:35;;29098:2;;29157:1;;29147:12
Swarm Source
ipfs://159a026a421e4d347071d806133944225412ddcc35e17992fdd6d0206f8d8372
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.