Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Sponsored
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 13358309 | 722 days 22 hrs ago | IN | Create: HOneInchV3 | 0 ETH | 0.08981472 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
HOneInchV3
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-05 */ // SPDX-License-Identifier: MIT // 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/oneinchV3/IAggregationRouterV3.sol pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; interface IAggregationRouterV3 { struct SwapDescriptionV3 { IERC20 srcToken; IERC20 dstToken; address srcReceiver; address dstReceiver; uint256 amount; uint256 minReturnAmount; uint256 flags; bytes permit; } function discountedSwap( IAggregationExecutor caller, SwapDescriptionV3 calldata desc, bytes calldata data ) external payable returns (uint256 returnAmount, uint256 gasLeft, uint256 chiSpent); function swap( IAggregationExecutor caller, SwapDescriptionV3 calldata desc, bytes calldata data ) external payable returns (uint256 returnAmount, uint256 gasLeft); function unoswap( IERC20 srcToken, uint256 amount, uint256 minReturn, bytes32[] calldata /* pools */ ) external payable returns (uint256 returnAmount); } // File: contracts/handlers/oneinchV2/IChi.sol pragma solidity ^0.6.12; interface IChi is IERC20 { function mint(uint256 value) external; function free(uint256 value) external returns (uint256 freed); function freeFromUpTo(address from, uint256 value) external returns (uint256 freed); } // File: contracts/handlers/oneinchV2/IGasDiscountExtension.sol pragma solidity ^0.6.12; interface IGasDiscountExtension { function calculateGas(uint256 gasUsed, uint256 flags, uint256 calldataLength) external pure returns (IChi, uint256); } // File: contracts/handlers/oneinchV3/IAggregationExecutor.sol pragma solidity ^0.6.0; interface IAggregationExecutor is IGasDiscountExtension { function callBytes(bytes calldata data) external payable; // 0xd9c45357 } // 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: @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: 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/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: contracts/handlers/oneinchV3/HOneInchV3.sol pragma solidity ^0.6.0; contract HOneInchV3 is HandlerBase { using SafeMath for uint256; // prettier-ignore address private constant _ONEINCH_SPENDER = 0x11111112542D85B3EF69AE05771c2dCCff4fAa26; // prettier-ignore address private constant _ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; function getContractName() public pure override returns (string memory) { return "HOneInchV3"; } function swap( IAggregationExecutor caller, IAggregationRouterV3.SwapDescriptionV3 calldata desc, bytes calldata data ) external payable returns (uint256 returnAmount) { if (_isNotNativeToken(address(desc.srcToken))) { _tokenApprove( address(desc.srcToken), _ONEINCH_SPENDER, desc.amount ); try IAggregationRouterV3(_ONEINCH_SPENDER).swap(caller, desc, data) returns (uint256 ret, uint256) { returnAmount = ret; } catch Error(string memory message) { _revertMsg("swap", message); } catch { _revertMsg("swap"); } } else { try IAggregationRouterV3(_ONEINCH_SPENDER).swap{value: desc.amount}( caller, desc, data ) returns (uint256 ret, uint256) { returnAmount = ret; } catch Error(string memory message) { _revertMsg("swap", message); } catch { _revertMsg("swap"); } } // Update involved token if (_isNotNativeToken(address(desc.dstToken))) _updateToken(address(desc.dstToken)); } function unoswap( IERC20 srcToken, uint256 amount, IERC20 dstToken, bytes calldata data ) external payable returns (uint256 returnAmount) { // Get dstToken balance before executing unoswap uint256 dstTokenBalanceBefore = _getBalance(address(dstToken), type(uint256).max); // Interact with 1inch if (_isNotNativeToken(address(srcToken))) { // ERC20 token need to approve before unoswap _tokenApprove(address(srcToken), _ONEINCH_SPENDER, amount); returnAmount = _unoswapCall(0, data); } else { returnAmount = _unoswapCall(amount, data); } // Check, dstToken balance should be increased uint256 dstTokenBalanceAfter = _getBalance(address(dstToken), type(uint256).max); if (dstTokenBalanceAfter.sub(dstTokenBalanceBefore) != returnAmount) { _revertMsg("unoswap", "Invalid output token amount"); } // Update involved token if (_isNotNativeToken(address(dstToken))) { _updateToken(address(dstToken)); } } function _unoswapCall(uint256 value, bytes calldata data) internal returns (uint256 returnAmount) { // Interact with 1inch through contract call with data (bool success, bytes memory returnData) = _ONEINCH_SPENDER.call{value: value}(data); // Verify return status and data if (success) { returnAmount = abi.decode(returnData, (uint256)); } else { if (returnData.length < 68) { // If the returnData length is less than 68, then the transaction failed silently. _revertMsg("unoswap"); } else { // Look for revert reason and bubble it up if present assembly { returnData := add(returnData, 0x04) } _revertMsg("unoswap", abi.decode(returnData, (string))); } } } function _isNotNativeToken(address token) internal pure returns (bool) { return (token != address(0) && token != _ETH_ADDRESS); } }
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":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"cache","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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"},{"inputs":[{"internalType":"contract IAggregationExecutor","name":"caller","type":"address"},{"components":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"contract IERC20","name":"dstToken","type":"address"},{"internalType":"address","name":"srcReceiver","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"flags","type":"uint256"},{"internalType":"bytes","name":"permit","type":"bytes"}],"internalType":"struct IAggregationRouterV3.SwapDescriptionV3","name":"desc","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"contract IERC20","name":"dstToken","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unoswap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50611491806100206000396000f3fe6080604052600436106100915760003560e01c806399eb59b91161005957806399eb59b914610111578063c272291614610131578063dc9031c41461013b578063f5f5ba721461015b578063fa2901a51461017d57610091565b80630f532d18146100965780631413dc7d146100c15780637c025200146100d657806387c13943146100e95780638afa623c146100fe575b600080fd5b3480156100a257600080fd5b506100ab61019f565b6040516100b891906110ea565b60405180910390f35b3480156100cd57600080fd5b506100ab6101c3565b6100ab6100e4366004610de1565b6101e7565b3480156100f557600080fd5b506100ab61045c565b6100ab61010c366004610e7b565b610468565b34801561011d57600080fd5b506100ab61012c366004610dc9565b610567565b610139610579565b005b34801561014757600080fd5b506100ab610156366004610dc9565b61059a565b34801561016757600080fd5b506101706105b8565b6040516100b891906111e1565b34801561018957600080fd5b506101926105dd565b6040516100b891906110f3565b7fb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453a81565b7ff9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be81565b60006101fe6101f96020860186610e5f565b6105e8565b1561032d576102326102136020860186610e5f565b7311111112542d85b3ef69ae05771c2dccff4faa268660800135610627565b604051623e012960e91b81527311111112542d85b3ef69ae05771c2dccff4faa2690637c0252009061026e908890889088908890600401611108565b6040805180830381600087803b15801561028757600080fd5b505af19250505080156102b7575060408051601f3d908101601f191682019092526102b491810190610f9f565b60015b610324576102c36113a1565b806102ce57506102fa565b6102f4604051806040016040528060048152602001630737761760e41b815250826106b2565b5061031f565b61031f604051806040016040528060048152602001630737761760e41b815250610705565b610328565b5090505b610424565b604051623e012960e91b81527311111112542d85b3ef69ae05771c2dccff4faa2690637c0252009060808701359061036f908990899089908990600401611108565b60408051808303818588803b15801561038757600080fd5b505af1935050505080156103b8575060408051601f3d908101601f191682019092526103b591810190610f9f565b60015b610420576103c46113a1565b806103cf57506103fb565b6103f5604051806040016040528060048152602001630737761760e41b815250826106b2565b50610328565b610328604051806040016040528060048152602001630737761760e41b815250610705565b5090505b6104376101f96040860160208701610e5f565b156104545761045461044f6040860160208701610e5f565b610735565b949350505050565b670de0b6b3a764000081565b60008061047785600019610740565b9050610482876105e8565b156104b9576104a6877311111112542d85b3ef69ae05771c2dccff4faa2688610627565b6104b260008585610815565b91506104c7565b6104c4868585610815565b91505b60006104d586600019610740565b9050826104e28284610933565b1461054557610545604051806040016040528060078152602001660756e6f737761760cc1b8152506040518060400160405280601b81526020017f496e76616c6964206f757470757420746f6b656e20616d6f756e7400000000008152506106b2565b61054e866105e8565b1561055c5761055c86610735565b505095945050505050565b60016020526000908152604090205481565b60405162461bcd60e51b815260040161059190611214565b60405180910390fd5b600081815481106105a757fe5b600091825260209091200154905081565b60408051808201909152600a815269484f6e65496e6368563360b01b60208201525b90565b636139148b60e11b81565b60006001600160a01b0382161580159061061f57506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b90505b919050565b60405163095ea7b360e01b81526001600160a01b0384169063095ea7b39061065590859085906004016110d1565b600060405180830381600087803b15801561066f57600080fd5b505af1925050508015610680575060015b6106ad576106996001600160a01b038416836000610975565b6106ad6001600160a01b0384168383610975565b505050565b6106c26106bd610a6f565b610aa1565b6106ca6105b8565b83836040516020016106df9493929190611025565b60408051601f198184030181529082905262461bcd60e51b8252610591916004016111e1565b610732816040518060400160405280600b81526020016a155b9cdc1958da599a595960aa1b8152506106b2565b50565b610732600082610b79565b6000600019821461075257508061080f565b6001600160a01b038316158061078457506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b1561079057504761080f565b6040516370a0823160e01b81526001600160a01b038416906370a08231906107bc9030906004016110a3565b60206040518083038186803b1580156107d457600080fd5b505afa1580156107e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080c9190610f87565b90505b92915050565b60008060607311111112542d85b3ef69ae05771c2dccff4faa266001600160a01b0316868686604051610849929190610ff9565b60006040518083038185875af1925050503d8060008114610886576040519150601f19603f3d011682016040523d82523d6000602084013e61088b565b606091505b509150915081156108b157808060200190518101906108aa9190610f87565b925061092a565b6044815110156108e8576108e3604051806040016040528060078152602001660756e6f737761760cc1b815250610705565b61092a565b60048101905061092a604051806040016040528060078152602001660756e6f737761760cc1b815250828060200190518101906109259190610eec565b6106b2565b50509392505050565b600061080c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610b9b565b8015806109fd5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906109ab90309086906004016110b7565b60206040518083038186803b1580156109c357600080fd5b505afa1580156109d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fb9190610f87565b155b610a195760405162461bcd60e51b8152600401610591906112c3565b6106ad8363095ea7b360e01b8484604051602401610a389291906110d1565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610bcc565b6000610a9c60017ff9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be610c5b565b905090565b606081610ac657506040805180820190915260018152600360fc1b6020820152610622565b6000825b8015610ae05760019190910190600a9004610aca565b5060608167ffffffffffffffff81118015610afa57600080fd5b506040519080825280601f01601f191660200182016040528015610b25576020820181803683370190505b509050815b8015610b6f57600a850660300160f81b826001830381518110610b4957fe5b60200101906001600160f81b031916908160001a905350600a8504945060001901610b2a565b5091506106229050565b8154600181018355600092835260209092206001600160a01b03909116910155565b60008184841115610bbf5760405162461bcd60e51b815260040161059191906111e1565b50508183035b9392505050565b6060610c21826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610c6e9092919063ffffffff16565b8051909150156106ad5780806020019051810190610c3f9190610da9565b6106ad5760405162461bcd60e51b815260040161059190611279565b6000908152602091909152604090205490565b6060610454848460008585610c8285610d18565b610c9e5760405162461bcd60e51b815260040161059190611242565b60006060866001600160a01b03168587604051610cbb9190611009565b60006040518083038185875af1925050503d8060008114610cf8576040519150601f19603f3d011682016040523d82523d6000602084013e610cfd565b606091505b5091509150610d0d828286610d1e565b979650505050505050565b3b151590565b60608315610d2d575081610bc5565b825115610d3d5782518084602001fd5b8160405162461bcd60e51b815260040161059191906111e1565b60008083601f840112610d68578182fd5b50813567ffffffffffffffff811115610d7f578182fd5b602083019150836020828501011115610d9757600080fd5b9250929050565b803561080f81611446565b600060208284031215610dba578081fd5b81518015158114610bc5578182fd5b600060208284031215610dda578081fd5b5035919050565b60008060008060608587031215610df6578283fd5b8435610e0181611446565b9350602085013567ffffffffffffffff80821115610e1d578485fd5b908601906101008289031215610e31578485fd5b90935060408601359080821115610e46578384fd5b50610e5387828801610d57565b95989497509550505050565b600060208284031215610e70578081fd5b8135610bc581611446565b600080600080600060808688031215610e92578081fd5b8535610e9d81611446565b9450602086013593506040860135610eb481611446565b9250606086013567ffffffffffffffff811115610ecf578182fd5b610edb88828901610d57565b969995985093965092949392505050565b600060208284031215610efd578081fd5b815167ffffffffffffffff80821115610f14578283fd5b818401915084601f830112610f27578283fd5b815181811115610f35578384fd5b604051601f8201601f191681016020018381118282101715610f55578586fd5b604052818152838201602001871015610f6c578485fd5b610f7d82602083016020870161136b565b9695505050505050565b600060208284031215610f98578081fd5b5051919050565b60008060408385031215610fb1578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6000828483379101908152919050565b6000825161101b81846020870161136b565b9190910192915050565b60008551611037818460208a0161136b565b8083019050605f60f81b8082528651611057816001850160208b0161136b565b6001920191820152845161107281600284016020890161136b565b6101d160f51b60029290910191820152835161109581600484016020880161136b565b016004019695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b90815260200190565b6001600160e01b031991909116815260200190565b600060018060a01b03861682526060602083015260208501611136606084016111318389610d9e565b610fc2565b6111408187611319565b905061114f6080840182610fc2565b5061115d6040860186611319565b61116a60a0840182610fc2565b506111786060860186611319565b61118560c0840182610fc2565b50608085013560e083015261010060a08601358184015260c08601356101208401526111b460e0870187611326565b826101408601526111ca61016086018284610fcf565b925050508281036040840152610d0d818587610fcf565b600060208252825180602084015261120081604085016020870161136b565b601f01601f19169190910160400192915050565b602080825260149082015273496e76616c696420706f73742070726f6365737360601b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60008235610bc581611446565b6000808335601e1984360301811261133c578283fd5b830160208101925035905067ffffffffffffffff81111561135c57600080fd5b803603831315610d9757600080fd5b60005b8381101561138657818101518382015260200161136e565b83811115611395576000848401525b50505050565b60e01c90565b600060443d10156113b1576105da565b600481823e6308c379a06113c5825161139b565b146113cf576105da565b6040513d600319016004823e80513d67ffffffffffffffff81602484011181841117156113ff57505050506105da565b8284019250825191508082111561141957505050506105da565b503d83016020828401011115611431575050506105da565b601f01601f1916810160200160405291505090565b6001600160a01b038116811461073257600080fdfea2646970667358221220dba90d8dbbf52b177ee1abc999f5d21901cb9df8e8a643ef55c67c859f5165f864736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106100915760003560e01c806399eb59b91161005957806399eb59b914610111578063c272291614610131578063dc9031c41461013b578063f5f5ba721461015b578063fa2901a51461017d57610091565b80630f532d18146100965780631413dc7d146100c15780637c025200146100d657806387c13943146100e95780638afa623c146100fe575b600080fd5b3480156100a257600080fd5b506100ab61019f565b6040516100b891906110ea565b60405180910390f35b3480156100cd57600080fd5b506100ab6101c3565b6100ab6100e4366004610de1565b6101e7565b3480156100f557600080fd5b506100ab61045c565b6100ab61010c366004610e7b565b610468565b34801561011d57600080fd5b506100ab61012c366004610dc9565b610567565b610139610579565b005b34801561014757600080fd5b506100ab610156366004610dc9565b61059a565b34801561016757600080fd5b506101706105b8565b6040516100b891906111e1565b34801561018957600080fd5b506101926105dd565b6040516100b891906110f3565b7fb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453a81565b7ff9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be81565b60006101fe6101f96020860186610e5f565b6105e8565b1561032d576102326102136020860186610e5f565b7311111112542d85b3ef69ae05771c2dccff4faa268660800135610627565b604051623e012960e91b81527311111112542d85b3ef69ae05771c2dccff4faa2690637c0252009061026e908890889088908890600401611108565b6040805180830381600087803b15801561028757600080fd5b505af19250505080156102b7575060408051601f3d908101601f191682019092526102b491810190610f9f565b60015b610324576102c36113a1565b806102ce57506102fa565b6102f4604051806040016040528060048152602001630737761760e41b815250826106b2565b5061031f565b61031f604051806040016040528060048152602001630737761760e41b815250610705565b610328565b5090505b610424565b604051623e012960e91b81527311111112542d85b3ef69ae05771c2dccff4faa2690637c0252009060808701359061036f908990899089908990600401611108565b60408051808303818588803b15801561038757600080fd5b505af1935050505080156103b8575060408051601f3d908101601f191682019092526103b591810190610f9f565b60015b610420576103c46113a1565b806103cf57506103fb565b6103f5604051806040016040528060048152602001630737761760e41b815250826106b2565b50610328565b610328604051806040016040528060048152602001630737761760e41b815250610705565b5090505b6104376101f96040860160208701610e5f565b156104545761045461044f6040860160208701610e5f565b610735565b949350505050565b670de0b6b3a764000081565b60008061047785600019610740565b9050610482876105e8565b156104b9576104a6877311111112542d85b3ef69ae05771c2dccff4faa2688610627565b6104b260008585610815565b91506104c7565b6104c4868585610815565b91505b60006104d586600019610740565b9050826104e28284610933565b1461054557610545604051806040016040528060078152602001660756e6f737761760cc1b8152506040518060400160405280601b81526020017f496e76616c6964206f757470757420746f6b656e20616d6f756e7400000000008152506106b2565b61054e866105e8565b1561055c5761055c86610735565b505095945050505050565b60016020526000908152604090205481565b60405162461bcd60e51b815260040161059190611214565b60405180910390fd5b600081815481106105a757fe5b600091825260209091200154905081565b60408051808201909152600a815269484f6e65496e6368563360b01b60208201525b90565b636139148b60e11b81565b60006001600160a01b0382161580159061061f57506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b90505b919050565b60405163095ea7b360e01b81526001600160a01b0384169063095ea7b39061065590859085906004016110d1565b600060405180830381600087803b15801561066f57600080fd5b505af1925050508015610680575060015b6106ad576106996001600160a01b038416836000610975565b6106ad6001600160a01b0384168383610975565b505050565b6106c26106bd610a6f565b610aa1565b6106ca6105b8565b83836040516020016106df9493929190611025565b60408051601f198184030181529082905262461bcd60e51b8252610591916004016111e1565b610732816040518060400160405280600b81526020016a155b9cdc1958da599a595960aa1b8152506106b2565b50565b610732600082610b79565b6000600019821461075257508061080f565b6001600160a01b038316158061078457506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b1561079057504761080f565b6040516370a0823160e01b81526001600160a01b038416906370a08231906107bc9030906004016110a3565b60206040518083038186803b1580156107d457600080fd5b505afa1580156107e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080c9190610f87565b90505b92915050565b60008060607311111112542d85b3ef69ae05771c2dccff4faa266001600160a01b0316868686604051610849929190610ff9565b60006040518083038185875af1925050503d8060008114610886576040519150601f19603f3d011682016040523d82523d6000602084013e61088b565b606091505b509150915081156108b157808060200190518101906108aa9190610f87565b925061092a565b6044815110156108e8576108e3604051806040016040528060078152602001660756e6f737761760cc1b815250610705565b61092a565b60048101905061092a604051806040016040528060078152602001660756e6f737761760cc1b815250828060200190518101906109259190610eec565b6106b2565b50509392505050565b600061080c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610b9b565b8015806109fd5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906109ab90309086906004016110b7565b60206040518083038186803b1580156109c357600080fd5b505afa1580156109d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fb9190610f87565b155b610a195760405162461bcd60e51b8152600401610591906112c3565b6106ad8363095ea7b360e01b8484604051602401610a389291906110d1565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610bcc565b6000610a9c60017ff9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be610c5b565b905090565b606081610ac657506040805180820190915260018152600360fc1b6020820152610622565b6000825b8015610ae05760019190910190600a9004610aca565b5060608167ffffffffffffffff81118015610afa57600080fd5b506040519080825280601f01601f191660200182016040528015610b25576020820181803683370190505b509050815b8015610b6f57600a850660300160f81b826001830381518110610b4957fe5b60200101906001600160f81b031916908160001a905350600a8504945060001901610b2a565b5091506106229050565b8154600181018355600092835260209092206001600160a01b03909116910155565b60008184841115610bbf5760405162461bcd60e51b815260040161059191906111e1565b50508183035b9392505050565b6060610c21826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610c6e9092919063ffffffff16565b8051909150156106ad5780806020019051810190610c3f9190610da9565b6106ad5760405162461bcd60e51b815260040161059190611279565b6000908152602091909152604090205490565b6060610454848460008585610c8285610d18565b610c9e5760405162461bcd60e51b815260040161059190611242565b60006060866001600160a01b03168587604051610cbb9190611009565b60006040518083038185875af1925050503d8060008114610cf8576040519150601f19603f3d011682016040523d82523d6000602084013e610cfd565b606091505b5091509150610d0d828286610d1e565b979650505050505050565b3b151590565b60608315610d2d575081610bc5565b825115610d3d5782518084602001fd5b8160405162461bcd60e51b815260040161059191906111e1565b60008083601f840112610d68578182fd5b50813567ffffffffffffffff811115610d7f578182fd5b602083019150836020828501011115610d9757600080fd5b9250929050565b803561080f81611446565b600060208284031215610dba578081fd5b81518015158114610bc5578182fd5b600060208284031215610dda578081fd5b5035919050565b60008060008060608587031215610df6578283fd5b8435610e0181611446565b9350602085013567ffffffffffffffff80821115610e1d578485fd5b908601906101008289031215610e31578485fd5b90935060408601359080821115610e46578384fd5b50610e5387828801610d57565b95989497509550505050565b600060208284031215610e70578081fd5b8135610bc581611446565b600080600080600060808688031215610e92578081fd5b8535610e9d81611446565b9450602086013593506040860135610eb481611446565b9250606086013567ffffffffffffffff811115610ecf578182fd5b610edb88828901610d57565b969995985093965092949392505050565b600060208284031215610efd578081fd5b815167ffffffffffffffff80821115610f14578283fd5b818401915084601f830112610f27578283fd5b815181811115610f35578384fd5b604051601f8201601f191681016020018381118282101715610f55578586fd5b604052818152838201602001871015610f6c578485fd5b610f7d82602083016020870161136b565b9695505050505050565b600060208284031215610f98578081fd5b5051919050565b60008060408385031215610fb1578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6000828483379101908152919050565b6000825161101b81846020870161136b565b9190910192915050565b60008551611037818460208a0161136b565b8083019050605f60f81b8082528651611057816001850160208b0161136b565b6001920191820152845161107281600284016020890161136b565b6101d160f51b60029290910191820152835161109581600484016020880161136b565b016004019695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b90815260200190565b6001600160e01b031991909116815260200190565b600060018060a01b03861682526060602083015260208501611136606084016111318389610d9e565b610fc2565b6111408187611319565b905061114f6080840182610fc2565b5061115d6040860186611319565b61116a60a0840182610fc2565b506111786060860186611319565b61118560c0840182610fc2565b50608085013560e083015261010060a08601358184015260c08601356101208401526111b460e0870187611326565b826101408601526111ca61016086018284610fcf565b925050508281036040840152610d0d818587610fcf565b600060208252825180602084015261120081604085016020870161136b565b601f01601f19169190910160400192915050565b602080825260149082015273496e76616c696420706f73742070726f6365737360601b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60008235610bc581611446565b6000808335601e1984360301811261133c578283fd5b830160208101925035905067ffffffffffffffff81111561135c57600080fd5b803603831315610d9757600080fd5b60005b8381101561138657818101518382015260200161136e565b83811115611395576000848401525b50505050565b60e01c90565b600060443d10156113b1576105da565b600481823e6308c379a06113c5825161139b565b146113cf576105da565b6040513d600319016004823e80513d67ffffffffffffffff81602484011181841117156113ff57505050506105da565b8284019250825191508082111561141957505050506105da565b503d83016020828401011115611431575050506105da565b601f01601f1916810160200160405291505090565b6001600160a01b038116811461073257600080fdfea2646970667358221220dba90d8dbbf52b177ee1abc999f5d21901cb9df8e8a643ef55c67c859f5165f864736f6c634300060c0033
Deployed Bytecode Sourcemap
29635:4094:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11357:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11538:109;;;;;;;;;;;;;:::i;30062:1397::-;;;;;;:::i;:::-;;:::i;13070:49::-;;;;;;;;;;;;;:::i;31467:1171::-;;;;;;:::i;:::-;;:::i;11245:40::-;;;;;;;;;;-1:-1:-1;11245:40:0;;;;;:::i;:::-;;:::i;21168:479::-;;;:::i;:::-;;11216:22;;;;;;;;;;-1:-1:-1;11216:22:0;;;;;:::i;:::-;;:::i;29944:110::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;12963:51::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;11357:107::-;11398:66;11357:107;:::o;11538:109::-;11581:66;11538:109;:::o;30062:1397::-;30240:20;30277:41;30303:13;;;;:4;:13;:::i;:::-;30277:17;:41::i;:::-;30273:1036;;;30335:134;30375:13;;;;:4;:13;:::i;:::-;29780:42;30443:4;:11;;;30335:13;:134::i;:::-;30505:63;;-1:-1:-1;;;30505:63:0;;29780:42;;30505:43;;:63;;30549:6;;30557:4;;30563;;;;30505:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30505:63:0;;;;;;;;-1:-1:-1;;30505:63:0;;;;;;;;;;;;:::i;:::-;;;30484:340;;;;:::i;:::-;;;;;;;;30721:27;;;;;;;;;;;;;;-1:-1:-1;;;30721:27:0;;;30740:7;30721:10;:27::i;:::-;30667:97;30484:340;;;30790:18;;;;;;;;;;;;;;-1:-1:-1;;;30790:18:0;;;:10;:18::i;:::-;30484:340;;;-1:-1:-1;30647:3:0;-1:-1:-1;30484:340:0;30273:1036;;;30877:165;;-1:-1:-1;;;30877:165:0;;29780:42;;30877:43;;30928:11;;;;;30877:165;;30963:6;;30928:4;;31019;;;;30877:165;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30877:165:0;;;;;;;;-1:-1:-1;;30877:165:0;;;;;;;;;;;;:::i;:::-;;;30856:442;;;;:::i;:::-;;;;;;;;31195:27;;;;;;;;;;;;;;-1:-1:-1;;;31195:27:0;;;31214:7;31195:10;:27::i;:::-;31141:97;30856:442;;;31264:18;;;;;;;;;;;;;;-1:-1:-1;;;31264:18:0;;;:10;:18::i;30856:442::-;-1:-1:-1;31121:3:0;-1:-1:-1;30856:442:0;31359:41;31385:13;;;;;;;;:::i;31359:41::-;31355:96;;;31415:36;31436:13;;;;;;;;:::i;:::-;31415:12;:36::i;:::-;30062:1397;;;;;;:::o;13070:49::-;13112:7;13070:49;:::o;31467:1171::-;31624:20;31715:29;31760:49;31780:8;-1:-1:-1;;31760:11:0;:49::i;:::-;31715:94;;31858:36;31884:8;31858:17;:36::i;:::-;31854:311;;;31970:58;31992:8;29780:42;32021:6;31970:13;:58::i;:::-;32058:21;32071:1;32074:4;;32058:12;:21::i;:::-;32043:36;;31854:311;;;32127:26;32140:6;32148:4;;32127:12;:26::i;:::-;32112:41;;31854:311;32233:28;32277:49;32297:8;-1:-1:-1;;32277:11:0;:49::i;:::-;32233:93;-1:-1:-1;32392:12:0;32341:47;32233:93;32366:21;32341:24;:47::i;:::-;:63;32337:148;;32421:52;;;;;;;;;;;;;;-1:-1:-1;;;32421:52:0;;;;;;;;;;;;;;;;;;;;:10;:52::i;:::-;32535:36;32561:8;32535:17;:36::i;:::-;32531:100;;;32588:31;32609:8;32588:12;:31::i;:::-;31467:1171;;;;;;;;;:::o;11245:40::-;;;;;;;;;;;;;:::o;21168:479::-;21227:30;;-1:-1:-1;;;21227:30:0;;;;;;;:::i;:::-;;;;;;;;11216:22;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11216:22:0;:::o;29944:110::-;30027:19;;;;;;;;;;;;-1:-1:-1;;;30027:19:0;;;;29944:110;;:::o;12963:51::-;-1:-1:-1;;;12963:51:0;:::o;33583:143::-;33648:4;-1:-1:-1;;;;;33673:19:0;;;;;;:44;;-1:-1:-1;;;;;;33696:21:0;;29893:42;33696:21;;33673:44;33665:53;;33583:143;;;;:::o;23843:309::-;23972:42;;-1:-1:-1;;;23972:42:0;;-1:-1:-1;;;;;23972:25:0;;;;;:42;;23998:7;;24007:6;;23972:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23968:177;;24039:37;-1:-1:-1;;;;;24039:25:0;;24065:7;24074:1;24039:25;:37::i;:::-;24091:42;-1:-1:-1;;;;;24091:25:0;;24117:7;24126:6;24091:25;:42::i;:::-;23843:309;;;:::o;22205:470::-;22408:31;22421:17;:15;:17::i;:::-;22408:12;:31::i;:::-;22488:17;:15;:17::i;:::-;22554:12;22616:6;22369:272;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;22369:272:0;;;;;;;;;;-1:-1:-1;;;22323:344:0;;;;;;;:::i;22683:120::-;22756:39;22767:12;22756:39;;;;;;;;;;;;;-1:-1:-1;;;22756:39:0;;;:10;:39::i;:::-;22683:120;:::o;21655:200::-;21712:23;:5;21729;21712:16;:23::i;23335:500::-;23437:7;-1:-1:-1;;23466:6:0;:21;23462:67;;-1:-1:-1;23511:6:0;23504:13;;23462:67;-1:-1:-1;;;;;23580:19:0;;;;:96;;-1:-1:-1;;;;;;23616:60:0;;23633:42;23616:60;23580:96;23562:181;;;-1:-1:-1;23710:21:0;23703:28;;23562:181;23789:38;;-1:-1:-1;;;23789:38:0;;-1:-1:-1;;;;;23789:23:0;;;;;:38;;23821:4;;23789:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23782:45;;23335:500;;;;;:::o;32646:929::-;32740:20;32843:12;32857:23;29780:42;-1:-1:-1;;;;;32897:21:0;32926:5;32933:4;;32897:41;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32842:96;;;;32997:7;32993:575;;;33047:10;33036:33;;;;;;;;;;;;:::i;:::-;33021:48;;32993:575;;;33126:2;33106:10;:17;:22;33102:455;;;33249:21;;;;;;;;;;;;;;-1:-1:-1;;;33249:21:0;;;:10;:21::i;:::-;33102:455;;;33444:4;33432:10;33428:21;33414:35;;33486:55;;;;;;;;;;;;;;-1:-1:-1;;;33486:55:0;;;33519:10;33508:32;;;;;;;;;;;;:::i;:::-;33486:10;:55::i;:::-;32646:929;;;;;;;:::o;25556:136::-;25614:7;25641:43;25645:1;25648;25641:43;;;;;;;;;;;;;;;;;:3;:43::i;4171:622::-;4541:10;;;4540:62;;-1:-1:-1;4557:39:0;;-1:-1:-1;;;4557:39:0;;-1:-1:-1;;;;;4557:15:0;;;;;:39;;4581:4;;4588:7;;4557:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;4540:62;4532:152;;;;-1:-1:-1;;;4532:152:0;;;;;;;:::i;:::-;4695:90;4715:5;4745:22;;;4769:7;4778:5;4722:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4722:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;4722:62:0;-1:-1:-1;;;;;;4722:62:0;;;;;;;;;;4695:19;:90::i;12708:119::-;12758:7;12785:34;:5;11581:66;12785:16;:34::i;:::-;12778:41;;12708:119;:::o;22811:516::-;22867:13;22897:6;22893:427;;-1:-1:-1;22920:10:0;;;;;;;;;;;;-1:-1:-1;;;22920:10:0;;;;;;22893:427;22963:11;23013:1;22993:85;23016:8;;22993:85;;23057:5;;;;;;23034:2;23026:10;;22993:85;;;;23092:16;23121:3;23111:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23111:14:0;-1:-1:-1;23092:33:0;-1:-1:-1;23157:3:0;23140:136;23162:5;;23140:136;;23229:2;23225:1;:6;23219:2;:13;23206:28;;23193:3;23201:1;23197;:5;23193:10;;;;;;;;;;;:41;-1:-1:-1;;;;;23193:41:0;;;;;;;;-1:-1:-1;23258:2:0;23253:7;;;-1:-1:-1;;;23169:3:0;23140:136;;;-1:-1:-1;23304:3:0;-1:-1:-1;23290:18:0;;-1:-1:-1;23290:18:0;8602:136;8684:46;;;;;;;8696:33;8684:46;;;;;;;-1:-1:-1;;;;;8704:24:0;;;8684:46;;;8602:136::o;25995:192::-;26081:7;26117:12;26109:6;;;;26101:29;;;;-1:-1:-1;;;26101:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;26153:5:0;;;25995:192;;;;;;:::o;5817:761::-;6241:23;6267:69;6295:4;6267:69;;;;;;;;;;;;;;;;;6275:5;-1:-1:-1;;;;;6267:27:0;;;:69;;;;;:::i;:::-;6351:17;;6241:95;;-1:-1:-1;6351:21:0;6347:224;;6493:10;6482:30;;;;;;;;;;;;:::i;:::-;6474:85;;;;-1:-1:-1;;;6474:85:0;;;;;;;:::i;10602:185::-;10728:11;10766:12;;;;;;;;;;;;;10602:185::o;17656:195::-;17759:12;17791:52;17813:6;17821:4;17827:1;17830:12;17759;18960:18;18971:6;18960:10;:18::i;:::-;18952:60;;;;-1:-1:-1;;;18952:60:0;;;;;;;:::i;:::-;19086:12;19100:23;19127:6;-1:-1:-1;;;;;19127:11:0;19147:5;19155:4;19127:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19085:75;;;;19178:52;19196:7;19205:10;19217:12;19178:17;:52::i;:::-;19171:59;18708:530;-1:-1:-1;;;;;;;18708:530:0:o;14738:422::-;15105:20;15144:8;;;14738:422::o;20244:742::-;20359:12;20388:7;20384:595;;;-1:-1:-1;20419:10:0;20412:17;;20384:595;20533:17;;:21;20529:439;;20796:10;20790:17;20857:15;20844:10;20840:2;20836:19;20829:44;20744:148;20939:12;20932:20;;-1:-1:-1;;;20932:20:0;;;;;;;;:::i;428:336:-1:-;;;542:3;535:4;527:6;523:17;519:27;509:2;;-1:-1;;550:12;509:2;-1:-1;580:20;;620:18;609:30;;606:2;;;-1:-1;;642:12;606:2;686:4;678:6;674:17;662:29;;737:3;686:4;717:17;678:6;703:32;;700:41;697:2;;;754:1;;744:12;697:2;502:262;;;;;:::o;965:156::-;1045:20;;1070:46;1045:20;1070:46;:::i;2088:257::-;;2200:2;2188:9;2179:7;2175:23;2171:32;2168:2;;;-1:-1;;2206:12;2168:2;223:6;217:13;26016:5;23106:13;23099:21;25994:5;25991:32;25981:2;;-1:-1;;26027:12;2352:241;;2456:2;2444:9;2435:7;2431:23;2427:32;2424:2;;;-1:-1;;2462:12;2424:2;-1:-1;344:20;;2418:175;-1:-1;2418:175::o;2600:829::-;;;;;2821:2;2809:9;2800:7;2796:23;2792:32;2789:2;;;-1:-1;;2827:12;2789:2;880:6;867:20;892:61;947:5;892:61;:::i;:::-;2879:91;-1:-1;3035:2;3020:18;;3007:32;3059:18;3048:30;;;3045:2;;;-1:-1;;3081:12;3045:2;3168:22;;;;1755:3;1737:16;;;1733:26;1730:2;;;-1:-1;;1762:12;1730:2;3101:99;;-1:-1;3265:2;3250:18;;3237:32;;3278:30;;;3275:2;;;-1:-1;;3311:12;3275:2;;3349:64;3405:7;3396:6;3385:9;3381:22;3349:64;:::i;:::-;2783:646;;;;-1:-1;3331:82;-1:-1;;;;2783:646::o;3436:267::-;;3553:2;3541:9;3532:7;3528:23;3524:32;3521:2;;;-1:-1;;3559:12;3521:2;1058:6;1045:20;1070:46;1110:5;1070:46;:::i;3710:793::-;;;;;;3910:3;3898:9;3889:7;3885:23;3881:33;3878:2;;;-1:-1;;3917:12;3878:2;1058:6;1045:20;1070:46;1110:5;1070:46;:::i;:::-;3969:76;-1:-1;4082:2;4121:22;;1877:20;;-1:-1;4190:2;4242:22;;1045:20;1070:46;1045:20;1070:46;:::i;:::-;4198:76;-1:-1;4339:2;4324:18;;4311:32;4363:18;4352:30;;4349:2;;;-1:-1;;4385:12;4349:2;4423:64;4479:7;4470:6;4459:9;4455:22;4423:64;:::i;:::-;3872:631;;;;-1:-1;3872:631;;-1:-1;4405:82;;;3872:631;-1:-1;;;3872:631::o;4510:362::-;;4635:2;4623:9;4614:7;4610:23;4606:32;4603:2;;;-1:-1;;4641:12;4603:2;4692:17;4686:24;4730:18;;4722:6;4719:30;4716:2;;;-1:-1;;4752:12;4716:2;4839:6;4828:9;4824:22;;;1242:3;1235:4;1227:6;1223:17;1219:27;1209:2;;-1:-1;;1250:12;1209:2;1290:6;1284:13;4730:18;20761:6;20758:30;20755:2;;;-1:-1;;20791:12;20755:2;20424;20418:9;20864;20845:17;;-1:-1;;20841:33;20450:17;;4635:2;20450:17;20510:34;;;20546:22;;;20507:62;20504:2;;;-1:-1;;20572:12;20504:2;20424;20591:22;1383:21;;;1483:16;;;4635:2;1483:16;1480:25;-1:-1;1477:2;;;-1:-1;;1508:12;1477:2;1528:39;1560:6;4635:2;1459:5;1455:16;4635:2;1425:6;1421:17;1528:39;:::i;:::-;4772:84;4597:275;-1:-1;;;;;;4597:275::o;5127:263::-;;5242:2;5230:9;5221:7;5217:23;5213:32;5210:2;;;-1:-1;;5248:12;5210:2;-1:-1;2025:13;;5204:186;-1:-1;5204:186::o;5397:399::-;;;5529:2;5517:9;5508:7;5504:23;5500:32;5497:2;;;-1:-1;;5535:12;5497:2;-1:-1;;2025:13;;5698:2;5748:22;;;2025:13;;;;;-1:-1;5491:305::o;5803:103::-;-1:-1;;;;;23661:54;5864:37;;5858:48::o;6293:277::-;;21316:6;21311:3;21304:19;24497:6;24492:3;21353:4;21348:3;21344:14;24474:30;-1:-1;21353:4;24544:6;21348:3;24535:16;;24528:27;21353:4;20864:9;;24934:2;6556:6;24914:14;24910:28;21348:3;6525:39;;6518:46;;6383:187;;;;;:::o;13397:291::-;;24497:6;24492:3;24487;24474:30;24535:16;;24528:27;;;24535:16;13541:147;-1:-1;13541:147::o;13695:271::-;;7407:5;21041:12;7518:52;7563:6;7558:3;7551:4;7544:5;7540:16;7518:52;:::i;:::-;7582:16;;;;;13829:137;-1:-1;;13829:137::o;13973:1559::-;;7407:5;21041:12;7518:52;7563:6;7558:3;7551:4;7544:5;7540:16;7518:52;:::i;:::-;7591:6;7586:3;7582:16;7575:23;;-1:-1;;;10016:3;10003:11;9996:24;7407:5;21041:12;7518:52;7563:6;9981:1;10043:3;10039:11;7551:4;7544:5;7540:16;7518:52;:::i;:::-;9981:1;7582:16;;;;;9996:24;21041:12;;7518:52;21041:12;10039:11;;;7551:4;7540:16;;7518:52;:::i;:::-;-1:-1;;;10039:11;7582:16;;;;;;;10728:25;21041:12;;7518:52;21041:12;10772:11;;;7551:4;7540:16;;7518:52;:::i;:::-;7582:16;10772:11;7582:16;;14556:976;-1:-1;;;;;;14556:976::o;15539:222::-;-1:-1;;;;;23661:54;;;;5864:37;;15666:2;15651:18;;15637:124::o;15768:333::-;-1:-1;;;;;23661:54;;;5864:37;;23661:54;;16087:2;16072:18;;5864:37;15923:2;15908:18;;15894:207::o;16108:333::-;-1:-1;;;;;23661:54;;;;5864:37;;16427:2;16412:18;;6104:37;16263:2;16248:18;;16234:207::o;16448:222::-;6104:37;;;16575:2;16560:18;;16546:124::o;16677:218::-;-1:-1;;;;;;23272:78;;;;6222:36;;16802:2;16787:18;;16773:122::o;16902:792::-;;620:18;;23672:42;;;7780:5;23661:54;7716:3;7709:78;17211:2;17357;17346:9;17342:18;17335:48;17357:2;11587:16;22787:12;11610:76;17211:2;17200:9;17196:18;22748:52;22787:12;11587:16;22748:52;:::i;:::-;11610:76;:::i;:::-;11752:63;11798:16;11791:5;11752:63;:::i;:::-;11732:83;;11821:76;11882:14;17200:9;11882:14;11868:12;11821:76;:::i;:::-;;11966:50;12010:4;12003:5;11999:16;11992:5;11966:50;:::i;:::-;12022:63;12070:14;17200:9;12070:14;12056:12;12022:63;:::i;:::-;;12154:50;17211:2;12191:5;12187:16;12180:5;12154:50;:::i;:::-;12210:63;12258:14;17200:9;12258:14;12244:12;12210:63;:::i;:::-;;11882:14;12374:5;12370:16;1877:20;12441:14;17200:9;12441:14;6104:37;11469:6;12070:14;12566:5;12562:16;1877:20;11469:6;17200:9;12633:14;6104:37;12258:14;12748:5;12744:16;1877:20;12815:14;17200:9;12815:14;6104:37;12908:61;12441:14;12956:5;12952:16;12945:5;12908:61;:::i;:::-;11469:6;12989:14;17200:9;12989:14;12982:38;13035:87;11460:16;17200:9;11460:16;13103:12;13089;13035:87;:::i;:::-;13144:11;;;;17573:9;17567:4;17563:20;12010:4;17547:9;17543:18;17536:48;17598:86;17679:4;17670:6;17662;17598:86;:::i;17701:310::-;;17848:2;17869:17;17862:47;8093:5;21041:12;21316:6;17848:2;17837:9;17833:18;21304:19;8187:52;8232:6;21344:14;17837:9;21344:14;17848:2;8213:5;8209:16;8187:52;:::i;:::-;20864:9;24914:14;-1:-1;;24910:28;8251:39;;;;21344:14;8251:39;;17819:192;-1:-1;;17819:192::o;18441:416::-;18641:2;18655:47;;;9278:2;18626:18;;;21304:19;-1:-1;;;21344:14;;;9294:43;9356:12;;;18612:245::o;18864:416::-;19064:2;19078:47;;;9607:2;19049:18;;;21304:19;9643:31;21344:14;;;9623:52;9694:12;;;19035:245::o;19287:416::-;19487:2;19501:47;;;10289:2;19472:18;;;21304:19;10325:34;21344:14;;;10305:55;-1:-1;;;10380:12;;;10373:34;10426:12;;;19458:245::o;19710:416::-;19910:2;19924:47;;;11022:2;19895:18;;;21304:19;11058:34;21344:14;;;11038:55;-1:-1;;;11113:12;;;11106:46;11171:12;;;19881:245::o;22023:119::-;;85:6;72:20;97:33;124:5;97:33;:::i;22151:501::-;;;22275:3;22262:17;22319:48;;22343:8;22327:14;22323:29;22319:48;22299:18;22295:73;22285:2;;-1:-1;;22372:12;22285:2;22401:33;;22358:4;22490:16;;;-1:-1;22456:19;;-1:-1;22526:18;22515:30;;22512:2;;;22558:1;;22548:12;22512:2;22605:17;22327:14;22585:38;22575:8;22571:53;22568:2;;;22637:1;;22627:12;24570:268;24635:1;24642:101;24656:6;24653:1;24650:13;24642:101;;;24723:11;;;24717:18;24704:11;;;24697:39;24678:2;24671:10;24642:101;;;24758:6;24755:1;24752:13;24749:2;;;24635:1;24814:6;24809:3;24805:16;24798:27;24749:2;;24619:219;;;:::o;24951:106::-;25036:3;25032:15;;25004:53::o;25065:739::-;;25138:4;25120:16;25117:26;25114:2;;;25146:5;;25114:2;25180:1;-1:-1;;25159:23;25255:10;25198:34;-1:-1;25223:8;25198:34;:::i;:::-;25247:19;25237:2;;25270:5;;25237:2;25301;25295:9;25337:16;-1:-1;;25333:24;25180:1;25295:9;25309:49;25384:4;25378:11;25465:16;25417:18;25465:16;25458:4;25450:6;25446:17;25443:39;25417:18;25409:6;25406:30;25397:91;25394:2;;;25496:5;;;;;;25394:2;25534:6;25528:4;25524:17;25513:28;;25566:3;25560:10;25546:24;;25417:18;25581:6;25578:30;25575:2;;;25611:5;;;;;;25575:2;;25688:16;25682:4;25678:27;25648:4;25655:6;25643:3;25635:27;;25670:36;25667:2;;;25709:5;;;;;25667:2;20864:9;24914:14;-1:-1;;24910:28;25733:50;;25648:4;25733:50;25301:2;25722:62;25741:3;-1:-1;;25108:696;:::o;25811:117::-;-1:-1;;;;;23661:54;;25870:35;;25860:2;;25919:1;;25909:12
Swarm Source
ipfs://dba90d8dbbf52b177ee1abc999f5d21901cb9df8e8a643ef55c67c859f5165f8
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.