Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,593 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Batch Exec | 12794946 | 1263 days ago | IN | 0 ETH | 0.00479009 | ||||
Batch Exec | 12794946 | 1263 days ago | IN | 0 ETH | 0.00515856 | ||||
Batch Exec | 12579511 | 1296 days ago | IN | 0.12551 ETH | 0.00072793 | ||||
Batch Exec | 12541775 | 1302 days ago | IN | 0 ETH | 0.0010419 | ||||
Batch Exec | 12416549 | 1322 days ago | IN | 0 ETH | 0.02537494 | ||||
Batch Exec | 12415786 | 1322 days ago | IN | 0 ETH | 0.03012871 | ||||
Batch Exec | 12415621 | 1322 days ago | IN | 1.69681 ETH | 0.14907321 | ||||
Batch Exec | 12414614 | 1322 days ago | IN | 0.05 ETH | 0.015 | ||||
Batch Exec | 12411884 | 1322 days ago | IN | 5 ETH | 0.02426608 | ||||
Batch Exec | 12411777 | 1322 days ago | IN | 0 ETH | 0.03263386 | ||||
Batch Exec | 12411369 | 1322 days ago | IN | 0 ETH | 0.0227126 | ||||
Batch Exec | 12409110 | 1323 days ago | IN | 2.9 ETH | 0.0153846 | ||||
Batch Exec | 12407524 | 1323 days ago | IN | 1.9044 ETH | 0.0523318 | ||||
Batch Exec | 12406658 | 1323 days ago | IN | 23 ETH | 0.03093872 | ||||
Batch Exec | 12406164 | 1323 days ago | IN | 0 ETH | 0.02747934 | ||||
Batch Exec | 12406135 | 1323 days ago | IN | 0 ETH | 0.05675096 | ||||
Batch Exec | 12406042 | 1323 days ago | IN | 0 ETH | 0.02283425 | ||||
Batch Exec | 12405934 | 1323 days ago | IN | 0 ETH | 0.0217314 | ||||
Batch Exec | 12405803 | 1323 days ago | IN | 2.01544 ETH | 0.05202991 | ||||
Batch Exec | 12405564 | 1323 days ago | IN | 0 ETH | 0.0367486 | ||||
Batch Exec | 12405127 | 1323 days ago | IN | 0 ETH | 0.02645434 | ||||
Batch Exec | 12404721 | 1324 days ago | IN | 0.5 ETH | 0.03105685 | ||||
Batch Exec | 12404684 | 1324 days ago | IN | 0 ETH | 0.019338 | ||||
Batch Exec | 12404562 | 1324 days ago | IN | 0.05 ETH | 0.02313563 | ||||
Batch Exec | 12404517 | 1324 days ago | IN | 5.38028 ETH | 0.03125034 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
12415621 | 1322 days ago | 0.00000096 ETH | ||||
12415621 | 1322 days ago | 4 ETH | ||||
12415621 | 1322 days ago | 2.30319096 ETH | ||||
12411884 | 1322 days ago | 5 ETH | ||||
12409110 | 1323 days ago | 2.9 ETH | ||||
12407524 | 1323 days ago | 1.9044 ETH | ||||
12406658 | 1323 days ago | 23 ETH | ||||
12406135 | 1323 days ago | 23.36469639 ETH | ||||
12406135 | 1323 days ago | 23.36469639 ETH | ||||
12405803 | 1323 days ago | 0.00000281 ETH | ||||
12405803 | 1323 days ago | 4 ETH | ||||
12405803 | 1323 days ago | 1.98456281 ETH | ||||
12405127 | 1323 days ago | 1.98782527 ETH | ||||
12405127 | 1323 days ago | 1.98782527 ETH | ||||
12404721 | 1324 days ago | 0.5 ETH | ||||
12404562 | 1324 days ago | 0.05 ETH | ||||
12404517 | 1324 days ago | 5.38028 ETH | ||||
12403425 | 1324 days ago | 2.1788543 ETH | ||||
12403425 | 1324 days ago | 2.1788543 ETH | ||||
12402624 | 1324 days ago | 2.37937926 ETH | ||||
12402624 | 1324 days ago | 2.37937926 ETH | ||||
12402480 | 1324 days ago | 2.27358297 ETH | ||||
12402480 | 1324 days ago | 1.3751869 ETH | ||||
12402480 | 1324 days ago | 0.03471242 ETH | ||||
12402480 | 1324 days ago | 0.0348169 ETH |
Loading...
Loading
Contract Name:
Proxy
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-02 */ /** *Submitted for verification at Etherscan.io on 2021-01-09 */ // File: localhost/contracts/lib/LibParam.sol pragma solidity ^0.6.0; library LibParam { bytes32 private constant STATIC_MASK = 0x0100000000000000000000000000000000000000000000000000000000000000; bytes32 private constant PARAMS_MASK = 0x0000000000000000000000000000000000000000000000000000000000000001; bytes32 private constant REFS_MASK = 0x00000000000000000000000000000000000000000000000000000000000000FF; bytes32 private constant RETURN_NUM_MASK = 0x00FF000000000000000000000000000000000000000000000000000000000000; uint256 private constant REFS_LIMIT = 22; uint256 private constant PARAMS_SIZE_LIMIT = 64; uint256 private constant RETURN_NUM_OFFSET = 240; function isStatic(bytes32 conf) internal pure returns (bool) { if (conf & STATIC_MASK == 0) return true; else return false; } function isReferenced(bytes32 conf) internal pure returns (bool) { if (getReturnNum(conf) == 0) return false; else return true; } function getReturnNum(bytes32 conf) internal pure returns (uint256 num) { bytes32 temp = (conf & RETURN_NUM_MASK) >> RETURN_NUM_OFFSET; num = uint256(temp); } function getParams(bytes32 conf) internal pure returns (uint256[] memory refs, uint256[] memory params) { require(!isStatic(conf), "Static params"); uint256 n = 0; while (conf & REFS_MASK == REFS_MASK && n < REFS_LIMIT) { n++; conf = conf >> 8; } n = REFS_LIMIT - n; require(n > 0, "No dynamic param"); refs = new uint256[](n); params = new uint256[](n); for (uint256 i = 0; i < n; i++) { refs[i] = uint256(conf & REFS_MASK); conf = conf >> 8; } uint256 i = 0; for (uint256 k = 0; k < PARAMS_SIZE_LIMIT; k++) { if (conf & PARAMS_MASK != 0) { require(i < n, "Location count exceeds ref count"); params[i] = k * 32 + 4; i++; } conf = conf >> 1; } require(i == n, "Location count less than ref count"); } } // File: localhost/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, uint256 _input) internal { require(_input < uint96(-1), "Invalid Handler Type"); _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: localhost/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: localhost/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"); _; } function _setSender() internal { if (_getSender() == address(0)) 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: localhost/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: localhost/contracts/interface/IRegistry.sol pragma solidity ^0.6.0; interface IRegistry { function infos(address) external view returns (bytes32); function isValid(address handler) external view returns (bool result); } // File: @openzeppelin/contracts/utils/Address.sol // SPDX-License-Identifier: MIT 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: localhost/contracts/Proxy.sol pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; /** * @title The entrance of Furucombo * @author Ben Huang */ contract Proxy is Storage, Config { using Address for address; using SafeERC20 for IERC20; using LibParam for bytes32; // keccak256 hash of "furucombo.handler.registry" // prettier-ignore bytes32 private constant HANDLER_REGISTRY = 0x6874162fd62902201ea0f4bf541086067b3b88bd802fac9e150fd2d1db584e19; constructor(address registry) public { bytes32 slot = HANDLER_REGISTRY; assembly { sstore(slot, registry) } } /** * @notice Direct transfer from EOA should be reverted. * @dev Callback function will be handled here. */ fallback() external payable { require(Address.isContract(msg.sender), "Not allowed from EOA"); // If triggered by a function call, caller should be registered in registry. // The function call will then be forwarded to the location registered in // registry. if (msg.data.length != 0) { require(_isValid(msg.sender), "Invalid caller"); address target = address(bytes20(IRegistry(_getRegistry()).infos(msg.sender))); bytes memory result = _exec(target, msg.data); // return result for aave v2 flashloan() uint256 size = result.length; assembly { let loc := add(result, 0x20) return(loc, size) } } } /** * @notice Combo execution function. Including three phases: pre-process, * exection and post-process. * @param tos The handlers of combo. * @param configs The configurations of executing cubes. * @param datas The combo datas. */ function batchExec( address[] memory tos, bytes32[] memory configs, bytes[] memory datas ) public payable { _preProcess(); _execs(tos, configs, datas); _postProcess(); } /** * @notice The execution interface for callback function to be executed. * @dev This function can only be called through the handler, which makes * the caller become proxy itself. */ function execs( address[] memory tos, bytes32[] memory configs, bytes[] memory datas ) public payable { require(msg.sender == address(this), "Does not allow external calls"); require(_getSender() != address(0), "Sender should be initialized"); _execs(tos, configs, datas); } /** * @notice The execution phase. * @param tos The handlers of combo. * @param configs The configurations of executing cubes. * @param datas The combo datas. */ function _execs( address[] memory tos, bytes32[] memory configs, bytes[] memory datas ) internal { bytes32[256] memory localStack; uint256 index = 0; require( tos.length == datas.length, "Tos and datas length inconsistent" ); require( tos.length == configs.length, "Tos and configs length inconsistent" ); for (uint256 i = 0; i < tos.length; i++) { // Check if the data contains dynamic parameter if (!configs[i].isStatic()) { // If so, trim the exectution data base on the configuration and stack content _trim(datas[i], configs[i], localStack, index); } // Check if the output will be referenced afterwards if (configs[i].isReferenced()) { // If so, parse the output and place it into local stack uint256 num = configs[i].getReturnNum(); uint256 newIndex = _parse(localStack, _exec(tos[i], datas[i]), index); require( newIndex == index + num, "Return num and parsed return num not matched" ); index = newIndex; } else { _exec(tos[i], datas[i]); } // Setup the process to be triggered in the post-process phase _setPostProcess(tos[i]); } } /** * @notice Trimming the execution data. * @param data The execution data. * @param config The configuration. * @param localStack The stack the be referenced. * @param index Current element count of localStack. */ function _trim( bytes memory data, bytes32 config, bytes32[256] memory localStack, uint256 index ) internal pure { // Fetch the parameter configuration from config (uint256[] memory refs, uint256[] memory params) = config.getParams(); // Trim the data with the reference and parameters for (uint256 i = 0; i < refs.length; i++) { require(refs[i] < index, "Reference to out of localStack"); bytes32 ref = localStack[refs[i]]; uint256 offset = params[i]; uint256 base = PERCENTAGE_BASE; assembly { let loc := add(add(data, 0x20), offset) let m := mload(loc) // Adjust the value by multiplier if a dynamic parameter is not zero if iszero(iszero(m)) { // Assert no overflow first let p := mul(m, ref) if iszero(eq(div(p, m), ref)) { revert(0, 0) } // require(p / m == ref) ref := div(p, base) } mstore(loc, ref) } } } /** * @notice Parse the return data to the local stack. * @param localStack The local stack to place the return values. * @param ret The return data. * @param index The current tail. */ function _parse( bytes32[256] memory localStack, bytes memory ret, uint256 index ) internal pure returns (uint256 newIndex) { uint256 len = ret.length; // Estimate the tail after the process. newIndex = index + len / 32; require(newIndex <= 256, "stack overflow"); assembly { let offset := shl(5, index) // Store the data into localStack for { let i := 0 } lt(i, len) { i := add(i, 0x20) } { mstore( add(localStack, add(i, offset)), mload(add(add(ret, i), 0x20)) ) } } } /** * @notice The execution of a single cube. * @param _to The handler of cube. * @param _data The cube execution data. */ function _exec(address _to, bytes memory _data) internal returns (bytes memory result) { require(_isValid(_to), "Invalid handler"); _addCubeCounter(); assembly { let succeeded := delegatecall( sub(gas(), 5000), _to, add(_data, 0x20), mload(_data), 0, 0 ) let size := returndatasize() result := mload(0x40) mstore( 0x40, add(result, and(add(add(size, 0x20), 0x1f), not(0x1f))) ) mstore(result, size) returndatacopy(add(result, 0x20), 0, size) switch iszero(succeeded) case 1 { revert(add(result, 0x20), size) } } } /** * @notice Setup the post-process. * @param _to The handler of post-process. */ function _setPostProcess(address _to) internal { // If the stack length equals 0, just skip // If the top is a custom post-process, replace it with the handler // address. if (stack.length == 0) { return; } else if ( stack.peek() == bytes32(bytes12(uint96(HandlerType.Custom))) ) { stack.pop(); // Check if the handler is already set. if (bytes4(stack.peek()) != 0x00000000) stack.setAddress(_to); stack.setHandlerType(uint256(HandlerType.Custom)); } } /// @notice The pre-process phase. function _preProcess() internal virtual isStackEmpty isCubeCounterZero { // Set the sender. _setSender(); } /// @notice The post-process phase. function _postProcess() internal { // If the top of stack is HandlerType.Custom (which makes it being zero // address when `stack.getAddress()`), get the handler address and execute // the handler with it and the post-process function selector. // If not, use it as token address and send the token back to user. while (stack.length > 0) { address addr = stack.getAddress(); if (addr == address(0)) { addr = stack.getAddress(); _exec(addr, abi.encodeWithSelector(POSTPROCESS_SIG)); } else { uint256 amount = IERC20(addr).balanceOf(address(this)); if (amount > 0) IERC20(addr).safeTransfer(msg.sender, amount); } } // Balance should also be returned to user uint256 amount = address(this).balance; if (amount > 0) msg.sender.transfer(amount); // Reset the msg.sender and cube counter _resetSender(); _resetCubeCounter(); } /// @notice Get the registry contract address. function _getRegistry() internal view returns (address registry) { bytes32 slot = HANDLER_REGISTRY; assembly { registry := sload(slot) } } /// @notice Check if the handler is valid in registry. function _isValid(address handler) internal view returns (bool result) { return IRegistry(_getRegistry()).isValid(handler); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"registry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"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":"address[]","name":"tos","type":"address[]"},{"internalType":"bytes32[]","name":"configs","type":"bytes32[]"},{"internalType":"bytes[]","name":"datas","type":"bytes[]"}],"name":"batchExec","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"cache","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"bytes32[]","name":"configs","type":"bytes32[]"},{"internalType":"bytes[]","name":"datas","type":"bytes[]"}],"name":"execs","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
608060405234801561001057600080fd5b5060405161189838038061189883398101604081905261002f91610056565b7f6874162fd62902201ea0f4bf541086067b3b88bd802fac9e150fd2d1db584e1955610084565b600060208284031215610067578081fd5b81516001600160a01b038116811461007d578182fd5b9392505050565b611805806100936000396000f3fe60806040526004361061007b5760003560e01c806387c139431161004e57806387c139431461021657806399eb59b91461022b578063dc9031c41461024b578063fa2901a51461026b5761007b565b80630f532d18146101b05780631413dc7d146101db57806338c5c08e146101f05780637193850914610203575b6100843361028d565b6100a95760405162461bcd60e51b81526004016100a090611400565b60405180910390fd5b36156101ae576100b833610297565b6100d45760405162461bcd60e51b81526004016100a0906112ec565b60006100de610322565b6001600160a01b031663c6ddb642336040518263ffffffff1660e01b81526004016101099190611244565b60206040518083038186803b15801561012157600080fd5b505afa158015610135573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101599190611210565b60601c905060606101a1826000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061034792505050565b8051909150602082018181f35b005b3480156101bc57600080fd5b506101c56103c6565b6040516101d29190611271565b60405180910390f35b3480156101e757600080fd5b506101c56103d8565b6101ae6101fe3660046110f3565b6103ea565b6101ae6102113660046110f3565b61040a565b34801561022257600080fd5b506101c5610465565b34801561023757600080fd5b506101c56102463660046111f8565b610471565b34801561025757600080fd5b506101c56102663660046111f8565b610483565b34801561027757600080fd5b506102806104a1565b6040516101d2919061127a565b803b15155b919050565b60006102a1610322565b6001600160a01b0316638b1b925f836040518263ffffffff1660e01b81526004016102cc9190611244565b60206040518083038186803b1580156102e457600080fd5b505afa1580156102f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061031c91906111d8565b92915050565b7f6874162fd62902201ea0f4bf541086067b3b88bd802fac9e150fd2d1db584e195490565b606061035283610297565b61036e5760405162461bcd60e51b81526004016100a090611483565b6103766104ac565b600080835160208501866113885a03f43d6040519250601f19601f6020830101168301604052808352806000602085013e8115600181146103b6576103bd565b8160208501fd5b50505092915050565b60008051602061179083398151915281565b6000805160206117b083398151915281565b6103f26104d3565b6103fd838383610520565b6104056106c4565b505050565b3330146104295760405162461bcd60e51b81526004016100a0906114ac565b600061043361081b565b6001600160a01b0316141561045a5760405162461bcd60e51b81526004016100a0906116e1565b610405838383610520565b670de0b6b3a764000081565b60016020526000908152604090205481565b6000818154811061049057fe5b600091825260209091200154905081565b636139148b60e11b81565b6104d16000805160206117b08339815191526104c661083b565b600191908201610856565b565b600054156104f35760405162461bcd60e51b81526004016100a0906115bd565b6104fb61083b565b156105185760405162461bcd60e51b81526004016100a090611314565b6104d1610868565b610528610f90565b6000825185511461054b5760405162461bcd60e51b81526004016100a09061157c565b835185511461056c5760405162461bcd60e51b81526004016100a0906115e6565b60005b85518110156106bc5761059485828151811061058757fe5b602002602001015161089b565b6105ca576105ca8482815181106105a757fe5b60200260200101518683815181106105bb57fe5b602002602001015185856108b8565b6105e68582815181106105d957fe5b6020026020010151610991565b156106735760006106098683815181106105fc57fe5b60200260200101516109b0565b90506000610647856106418a868151811061062057fe5b602002602001015189878151811061063457fe5b6020026020010151610347565b866109b9565b9050818401811461066a5760405162461bcd60e51b81526004016100a0906114e3565b92506106989050565b61069686828151811061068257fe5b602002602001015185838151811061063457fe5b505b6106b48682815181106106a757fe5b6020026020010151610a11565b60010161056f565b505050505050565b600054156107d25760006106d86000610a83565b90506001600160a01b03811661072f576106f26000610a83565b6040805160048152602481019091526020810180516001600160e01b0316636139148b60e11b179052909150610729908290610347565b506107cc565b6040516370a0823160e01b81526000906001600160a01b038316906370a082319061075e903090600401611244565b60206040518083038186803b15801561077657600080fd5b505afa15801561078a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ae9190611210565b905080156107ca576107ca6001600160a01b0383163383610ab8565b505b506106c4565b47801561080857604051339082156108fc029083906000818181858888f19350505050158015610806573d6000803e3d6000fd5b505b610810610b0e565b610818610b29565b50565b60006108366001600080516020611790833981519152610b44565b905090565b600061083660016000805160206117b0833981519152610b44565b60009182526020929092526040902055565b600061087261081b565b6001600160a01b031614156104d1576104d1600160008051602061179083398151915233610b57565b6000600160f81b82166108b057506001610292565b506000610292565b6060806108c485610b75565b9150915060005b825181101561098857838382815181106108e157fe5b6020026020010151106109065760405162461bcd60e51b81526004016100a090611660565b60008584838151811061091557fe5b6020026020010151610100811061092857fe5b60200201519050600083838151811061093d57fe5b602002602001015190506000670de0b6b3a764000090508160208b01018051801561097957848102858282041461097357600080fd5b83900494505b509290925250506001016108cb565b50505050505050565b600061099c826109b0565b6109a857506000610292565b506001610292565b60f01c60ff1690565b8151602081048201906101008211156109e45760405162461bcd60e51b81526004016100a090611554565b8260051b60005b82811015610a07576020818701810151838301890152016109eb565b5050509392505050565b600054610a1d57610818565b600160a01b610a2c6000610d35565b1415610818576000805480610a3d57fe5b60019003818190600052602060002001600090559055610a5d6000610d35565b6001600160e01b03191615610a7757610a77600082610d7a565b61081860006001610d9c565b6000610a8e82610d35565b60001c905081805480610a9d57fe5b60019003818190600052602060002001600090559055919050565b6104058363a9059cbb60e01b8484604051602401610ad7929190611258565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610dee565b6104d160016000805160206117908339815191526000610b57565b6104d160016000805160206117b08339815191526000610856565b6000908152602091909152604090205490565b6000918252602092909252604090206001600160a01b039091169055565b606080610b818361089b565b15610b9e5760405162461bcd60e51b81526004016100a09061145c565b60005b60ff848116148015610bb35750601681105b15610bc75760089390931c92600101610ba1565b60160380610be75760405162461bcd60e51b81526004016100a0906112c2565b8067ffffffffffffffff81118015610bfe57600080fd5b50604051908082528060200260200182016040528015610c28578160200160208202803683370190505b5092508067ffffffffffffffff81118015610c4257600080fd5b50604051908082528060200260200182016040528015610c6c578160200160208202803683370190505b50915060005b81811015610ca757835160ff861690859083908110610c8d57fe5b602090810291909101015260089490941c93600101610c72565b506000805b6040811015610d0e576001861615610d0257828210610cdd5760405162461bcd60e51b81526004016100a090611385565b80602002600401848381518110610cf057fe5b60209081029190910101526001909101905b600195861c9501610cac565b50818114610d2e5760405162461bcd60e51b81526004016100a090611343565b5050915091565b8054600090610d565760405162461bcd60e51b81526004016100a09061152f565b815482906000198101908110610d6857fe5b90600052602060002001549050919050565b8154600181018355600092835260209092206001600160a01b03909116910155565b6bffffffffffffffffffffffff8110610dc75760405162461bcd60e51b81526004016100a09061142e565b81546001810183556000928352602090922060a09190911b6001600160a01b031916910155565b6060610e43826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610e7d9092919063ffffffff16565b8051909150156104055780806020019051810190610e6191906111d8565b6104055760405162461bcd60e51b81526004016100a090611697565b6060610e8c8484600085610e96565b90505b9392505050565b606082471015610eb85760405162461bcd60e51b81526004016100a0906113ba565b610ec18561028d565b610edd5760405162461bcd60e51b81526004016100a090611629565b60006060866001600160a01b03168587604051610efa9190611228565b60006040518083038185875af1925050503d8060008114610f37576040519150601f19603f3d011682016040523d82523d6000602084013e610f3c565b606091505b5091509150610f4c828286610f57565b979650505050505050565b60608315610f66575081610e8f565b825115610f765782518084602001fd5b8160405162461bcd60e51b81526004016100a0919061128f565b604051806120000160405280610100906020820280368337509192915050565b80356001600160a01b038116811461031c57600080fd5b600082601f830112610fd7578081fd5b8135610fea610fe58261173f565b611718565b81815291506020808301908481018184028601820187101561100b57600080fd5b60005b8481101561102a5781358452928201929082019060010161100e565b505050505092915050565b6000601f8381840112611046578182fd5b8235611054610fe58261173f565b818152925060208084019085810160005b848110156110e7578135880189603f82011261108057600080fd5b8381013567ffffffffffffffff81111561109957600080fd5b6110aa818901601f19168601611718565b81815260408c818486010111156110c057600080fd5b82818501888401375060009181018601919091528552509282019290820190600101611065565b50505050505092915050565b600080600060608486031215611107578283fd5b833567ffffffffffffffff8082111561111e578485fd5b818601915086601f830112611131578485fd5b813561113f610fe58261173f565b80828252602080830192508086018b82838702890101111561115f57898afd5b8996505b84871015611189576111758c82610fb0565b845260019690960195928101928101611163565b5090975088013593505050808211156111a0578384fd5b6111ac87838801610fc7565b935060408601359150808211156111c1578283fd5b506111ce86828701611035565b9150509250925092565b6000602082840312156111e9578081fd5b81518015158114610e8f578182fd5b600060208284031215611209578081fd5b5035919050565b600060208284031215611221578081fd5b5051919050565b6000825161123a81846020870161175f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b90815260200190565b6001600160e01b031991909116815260200190565b60006020825282518060208401526112ae81604085016020870161175f565b601f01601f19169190910160400192915050565b60208082526010908201526f4e6f2064796e616d696320706172616d60801b604082015260600190565b6020808252600e908201526d24b73b30b634b21031b0b63632b960911b604082015260600190565b6020808252601590820152744375626520636f756e746572206e6f74207a65726f60581b604082015260600190565b60208082526022908201527f4c6f636174696f6e20636f756e74206c657373207468616e2072656620636f756040820152611b9d60f21b606082015260800190565b6020808252818101527f4c6f636174696f6e20636f756e7420657863656564732072656620636f756e74604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601490820152734e6f7420616c6c6f7765642066726f6d20454f4160601b604082015260600190565b602080825260149082015273496e76616c69642048616e646c6572205479706560601b604082015260600190565b6020808252600d908201526c53746174696320706172616d7360981b604082015260600190565b6020808252600f908201526e24b73b30b634b2103430b7323632b960891b604082015260600190565b6020808252601d908201527f446f6573206e6f7420616c6c6f772065787465726e616c2063616c6c73000000604082015260600190565b6020808252602c908201527f52657475726e206e756d20616e64207061727365642072657475726e206e756d60408201526b081b9bdd081b585d18da195960a21b606082015260800190565b6020808252600b908201526a737461636b20656d70747960a81b604082015260600190565b6020808252600e908201526d737461636b206f766572666c6f7760901b604082015260600190565b60208082526021908201527f546f7320616e64206461746173206c656e67746820696e636f6e73697374656e6040820152601d60fa1b606082015260800190565b6020808252600f908201526e537461636b206e6f7420656d70747960881b604082015260600190565b60208082526023908201527f546f7320616e6420636f6e66696773206c656e67746820696e636f6e73697374604082015262195b9d60ea1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601e908201527f5265666572656e636520746f206f7574206f66206c6f63616c537461636b0000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601c908201527f53656e6465722073686f756c6420626520696e697469616c697a656400000000604082015260600190565b60405181810167ffffffffffffffff8111828210171561173757600080fd5b604052919050565b600067ffffffffffffffff821115611755578081fd5b5060209081020190565b60005b8381101561177a578181015183820152602001611762565b83811115611789576000848401525b5050505056feb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453af9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446bea264697066735822122035f279f5f67b43f086e837aed0f67eeb658bc0e8935e08ddfc24723970672d4a64736f6c634300060c0033000000000000000000000000d4258b13c9fadb7623ca4b15dda34b7b85b842c7
Deployed Bytecode
0x60806040526004361061007b5760003560e01c806387c139431161004e57806387c139431461021657806399eb59b91461022b578063dc9031c41461024b578063fa2901a51461026b5761007b565b80630f532d18146101b05780631413dc7d146101db57806338c5c08e146101f05780637193850914610203575b6100843361028d565b6100a95760405162461bcd60e51b81526004016100a090611400565b60405180910390fd5b36156101ae576100b833610297565b6100d45760405162461bcd60e51b81526004016100a0906112ec565b60006100de610322565b6001600160a01b031663c6ddb642336040518263ffffffff1660e01b81526004016101099190611244565b60206040518083038186803b15801561012157600080fd5b505afa158015610135573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101599190611210565b60601c905060606101a1826000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061034792505050565b8051909150602082018181f35b005b3480156101bc57600080fd5b506101c56103c6565b6040516101d29190611271565b60405180910390f35b3480156101e757600080fd5b506101c56103d8565b6101ae6101fe3660046110f3565b6103ea565b6101ae6102113660046110f3565b61040a565b34801561022257600080fd5b506101c5610465565b34801561023757600080fd5b506101c56102463660046111f8565b610471565b34801561025757600080fd5b506101c56102663660046111f8565b610483565b34801561027757600080fd5b506102806104a1565b6040516101d2919061127a565b803b15155b919050565b60006102a1610322565b6001600160a01b0316638b1b925f836040518263ffffffff1660e01b81526004016102cc9190611244565b60206040518083038186803b1580156102e457600080fd5b505afa1580156102f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061031c91906111d8565b92915050565b7f6874162fd62902201ea0f4bf541086067b3b88bd802fac9e150fd2d1db584e195490565b606061035283610297565b61036e5760405162461bcd60e51b81526004016100a090611483565b6103766104ac565b600080835160208501866113885a03f43d6040519250601f19601f6020830101168301604052808352806000602085013e8115600181146103b6576103bd565b8160208501fd5b50505092915050565b60008051602061179083398151915281565b6000805160206117b083398151915281565b6103f26104d3565b6103fd838383610520565b6104056106c4565b505050565b3330146104295760405162461bcd60e51b81526004016100a0906114ac565b600061043361081b565b6001600160a01b0316141561045a5760405162461bcd60e51b81526004016100a0906116e1565b610405838383610520565b670de0b6b3a764000081565b60016020526000908152604090205481565b6000818154811061049057fe5b600091825260209091200154905081565b636139148b60e11b81565b6104d16000805160206117b08339815191526104c661083b565b600191908201610856565b565b600054156104f35760405162461bcd60e51b81526004016100a0906115bd565b6104fb61083b565b156105185760405162461bcd60e51b81526004016100a090611314565b6104d1610868565b610528610f90565b6000825185511461054b5760405162461bcd60e51b81526004016100a09061157c565b835185511461056c5760405162461bcd60e51b81526004016100a0906115e6565b60005b85518110156106bc5761059485828151811061058757fe5b602002602001015161089b565b6105ca576105ca8482815181106105a757fe5b60200260200101518683815181106105bb57fe5b602002602001015185856108b8565b6105e68582815181106105d957fe5b6020026020010151610991565b156106735760006106098683815181106105fc57fe5b60200260200101516109b0565b90506000610647856106418a868151811061062057fe5b602002602001015189878151811061063457fe5b6020026020010151610347565b866109b9565b9050818401811461066a5760405162461bcd60e51b81526004016100a0906114e3565b92506106989050565b61069686828151811061068257fe5b602002602001015185838151811061063457fe5b505b6106b48682815181106106a757fe5b6020026020010151610a11565b60010161056f565b505050505050565b600054156107d25760006106d86000610a83565b90506001600160a01b03811661072f576106f26000610a83565b6040805160048152602481019091526020810180516001600160e01b0316636139148b60e11b179052909150610729908290610347565b506107cc565b6040516370a0823160e01b81526000906001600160a01b038316906370a082319061075e903090600401611244565b60206040518083038186803b15801561077657600080fd5b505afa15801561078a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ae9190611210565b905080156107ca576107ca6001600160a01b0383163383610ab8565b505b506106c4565b47801561080857604051339082156108fc029083906000818181858888f19350505050158015610806573d6000803e3d6000fd5b505b610810610b0e565b610818610b29565b50565b60006108366001600080516020611790833981519152610b44565b905090565b600061083660016000805160206117b0833981519152610b44565b60009182526020929092526040902055565b600061087261081b565b6001600160a01b031614156104d1576104d1600160008051602061179083398151915233610b57565b6000600160f81b82166108b057506001610292565b506000610292565b6060806108c485610b75565b9150915060005b825181101561098857838382815181106108e157fe5b6020026020010151106109065760405162461bcd60e51b81526004016100a090611660565b60008584838151811061091557fe5b6020026020010151610100811061092857fe5b60200201519050600083838151811061093d57fe5b602002602001015190506000670de0b6b3a764000090508160208b01018051801561097957848102858282041461097357600080fd5b83900494505b509290925250506001016108cb565b50505050505050565b600061099c826109b0565b6109a857506000610292565b506001610292565b60f01c60ff1690565b8151602081048201906101008211156109e45760405162461bcd60e51b81526004016100a090611554565b8260051b60005b82811015610a07576020818701810151838301890152016109eb565b5050509392505050565b600054610a1d57610818565b600160a01b610a2c6000610d35565b1415610818576000805480610a3d57fe5b60019003818190600052602060002001600090559055610a5d6000610d35565b6001600160e01b03191615610a7757610a77600082610d7a565b61081860006001610d9c565b6000610a8e82610d35565b60001c905081805480610a9d57fe5b60019003818190600052602060002001600090559055919050565b6104058363a9059cbb60e01b8484604051602401610ad7929190611258565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610dee565b6104d160016000805160206117908339815191526000610b57565b6104d160016000805160206117b08339815191526000610856565b6000908152602091909152604090205490565b6000918252602092909252604090206001600160a01b039091169055565b606080610b818361089b565b15610b9e5760405162461bcd60e51b81526004016100a09061145c565b60005b60ff848116148015610bb35750601681105b15610bc75760089390931c92600101610ba1565b60160380610be75760405162461bcd60e51b81526004016100a0906112c2565b8067ffffffffffffffff81118015610bfe57600080fd5b50604051908082528060200260200182016040528015610c28578160200160208202803683370190505b5092508067ffffffffffffffff81118015610c4257600080fd5b50604051908082528060200260200182016040528015610c6c578160200160208202803683370190505b50915060005b81811015610ca757835160ff861690859083908110610c8d57fe5b602090810291909101015260089490941c93600101610c72565b506000805b6040811015610d0e576001861615610d0257828210610cdd5760405162461bcd60e51b81526004016100a090611385565b80602002600401848381518110610cf057fe5b60209081029190910101526001909101905b600195861c9501610cac565b50818114610d2e5760405162461bcd60e51b81526004016100a090611343565b5050915091565b8054600090610d565760405162461bcd60e51b81526004016100a09061152f565b815482906000198101908110610d6857fe5b90600052602060002001549050919050565b8154600181018355600092835260209092206001600160a01b03909116910155565b6bffffffffffffffffffffffff8110610dc75760405162461bcd60e51b81526004016100a09061142e565b81546001810183556000928352602090922060a09190911b6001600160a01b031916910155565b6060610e43826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610e7d9092919063ffffffff16565b8051909150156104055780806020019051810190610e6191906111d8565b6104055760405162461bcd60e51b81526004016100a090611697565b6060610e8c8484600085610e96565b90505b9392505050565b606082471015610eb85760405162461bcd60e51b81526004016100a0906113ba565b610ec18561028d565b610edd5760405162461bcd60e51b81526004016100a090611629565b60006060866001600160a01b03168587604051610efa9190611228565b60006040518083038185875af1925050503d8060008114610f37576040519150601f19603f3d011682016040523d82523d6000602084013e610f3c565b606091505b5091509150610f4c828286610f57565b979650505050505050565b60608315610f66575081610e8f565b825115610f765782518084602001fd5b8160405162461bcd60e51b81526004016100a0919061128f565b604051806120000160405280610100906020820280368337509192915050565b80356001600160a01b038116811461031c57600080fd5b600082601f830112610fd7578081fd5b8135610fea610fe58261173f565b611718565b81815291506020808301908481018184028601820187101561100b57600080fd5b60005b8481101561102a5781358452928201929082019060010161100e565b505050505092915050565b6000601f8381840112611046578182fd5b8235611054610fe58261173f565b818152925060208084019085810160005b848110156110e7578135880189603f82011261108057600080fd5b8381013567ffffffffffffffff81111561109957600080fd5b6110aa818901601f19168601611718565b81815260408c818486010111156110c057600080fd5b82818501888401375060009181018601919091528552509282019290820190600101611065565b50505050505092915050565b600080600060608486031215611107578283fd5b833567ffffffffffffffff8082111561111e578485fd5b818601915086601f830112611131578485fd5b813561113f610fe58261173f565b80828252602080830192508086018b82838702890101111561115f57898afd5b8996505b84871015611189576111758c82610fb0565b845260019690960195928101928101611163565b5090975088013593505050808211156111a0578384fd5b6111ac87838801610fc7565b935060408601359150808211156111c1578283fd5b506111ce86828701611035565b9150509250925092565b6000602082840312156111e9578081fd5b81518015158114610e8f578182fd5b600060208284031215611209578081fd5b5035919050565b600060208284031215611221578081fd5b5051919050565b6000825161123a81846020870161175f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b90815260200190565b6001600160e01b031991909116815260200190565b60006020825282518060208401526112ae81604085016020870161175f565b601f01601f19169190910160400192915050565b60208082526010908201526f4e6f2064796e616d696320706172616d60801b604082015260600190565b6020808252600e908201526d24b73b30b634b21031b0b63632b960911b604082015260600190565b6020808252601590820152744375626520636f756e746572206e6f74207a65726f60581b604082015260600190565b60208082526022908201527f4c6f636174696f6e20636f756e74206c657373207468616e2072656620636f756040820152611b9d60f21b606082015260800190565b6020808252818101527f4c6f636174696f6e20636f756e7420657863656564732072656620636f756e74604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601490820152734e6f7420616c6c6f7765642066726f6d20454f4160601b604082015260600190565b602080825260149082015273496e76616c69642048616e646c6572205479706560601b604082015260600190565b6020808252600d908201526c53746174696320706172616d7360981b604082015260600190565b6020808252600f908201526e24b73b30b634b2103430b7323632b960891b604082015260600190565b6020808252601d908201527f446f6573206e6f7420616c6c6f772065787465726e616c2063616c6c73000000604082015260600190565b6020808252602c908201527f52657475726e206e756d20616e64207061727365642072657475726e206e756d60408201526b081b9bdd081b585d18da195960a21b606082015260800190565b6020808252600b908201526a737461636b20656d70747960a81b604082015260600190565b6020808252600e908201526d737461636b206f766572666c6f7760901b604082015260600190565b60208082526021908201527f546f7320616e64206461746173206c656e67746820696e636f6e73697374656e6040820152601d60fa1b606082015260800190565b6020808252600f908201526e537461636b206e6f7420656d70747960881b604082015260600190565b60208082526023908201527f546f7320616e6420636f6e66696773206c656e67746820696e636f6e73697374604082015262195b9d60ea1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601e908201527f5265666572656e636520746f206f7574206f66206c6f63616c537461636b0000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601c908201527f53656e6465722073686f756c6420626520696e697469616c697a656400000000604082015260600190565b60405181810167ffffffffffffffff8111828210171561173757600080fd5b604052919050565b600067ffffffffffffffff821115611755578081fd5b5060209081020190565b60005b8381101561177a578181015183820152602001611762565b83811115611789576000848401525b5050505056feb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453af9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446bea264697066735822122035f279f5f67b43f086e837aed0f67eeb658bc0e8935e08ddfc24723970672d4a64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d4258b13c9fadb7623ca4b15dda34b7b85b842c7
-----Decoded View---------------
Arg [0] : registry (address): 0xd4258B13C9FADb7623Ca4b15DdA34b7b85b842C7
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d4258b13c9fadb7623ca4b15dda34b7b85b842c7
Deployed Bytecode Sourcemap
26349:10210:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27029:30;27048:10;27029:18;:30::i;:::-;27021:63;;;;-1:-1:-1;;;27021:63:0;;;;;;;:::i;:::-;;;;;;;;;27292:8;:20;27288:491;;27337:20;27346:10;27337:8;:20::i;:::-;27329:47;;;;-1:-1:-1;;;27329:47:0;;;;;;;:::i;:::-;27393:14;27453;:12;:14::i;:::-;-1:-1:-1;;;;;27443:31:0;;27475:10;27443:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27427:61;;27393:95;;27503:19;27525:23;27531:6;27539:8;;27525:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27525:5:0;;-1:-1:-1;;;27525:23:0:i;:::-;27634:13;;27503:45;;-1:-1:-1;27713:4:0;27701:17;;27634:13;27701:17;27736;27671:97;26349:10210;5248:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5429:109;;;;;;;;;;;;;:::i;28068:233::-;;;;;;:::i;:::-;;:::i;28524:338::-;;;;;;:::i;:::-;;:::i;6744:49::-;;;;;;;;;;;;;:::i;5136:40::-;;;;;;;;;;-1:-1:-1;5136:40:0;;;;;:::i;:::-;;:::i;5107:22::-;;;;;;;;;;-1:-1:-1;5107:22:0;;;;;:::i;:::-;;:::i;6637:51::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;7972:422::-;8339:20;;8378:8;;7972:422;;;;:::o;36417:139::-;36475:11;36516:14;:12;:14::i;:::-;-1:-1:-1;;;;;36506:33:0;;36540:7;36506:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36499:49;36417:139;-1:-1:-1;;36417:139:0:o;36166:183::-;26613:66;36320:11;;36293:49::o;33220:889::-;33304:19;33349:13;33358:3;33349:8;:13::i;:::-;33341:41;;;;-1:-1:-1;;;33341:41:0;;;;;;;:::i;:::-;33393:17;:15;:17::i;:::-;33636:1;33616;33591:5;33585:12;33561:4;33554:5;33550:16;33528:3;33504:4;33497:5;33493:16;33462:190;33678:16;33726:4;33720:11;33710:21;;33841:4;33837:9;33830:4;33823;33817;33813:15;33809:26;33805:42;33797:6;33793:55;33770:4;33745:118;33892:4;33884:6;33877:20;33948:4;33945:1;33938:4;33930:6;33926:17;33911:42;33983:9;33976:17;34016:1;34011:80;;;;33969:122;;34011:80;34067:4;34060;34052:6;34048:17;34041:31;33969:122;;;;33430:672;;;;:::o;5248:107::-;-1:-1:-1;;;;;;;;;;;5248:107:0;:::o;5429:109::-;-1:-1:-1;;;;;;;;;;;5429:109:0;:::o;28068:233::-;28217:13;:11;:13::i;:::-;28241:27;28248:3;28253:7;28262:5;28241:6;:27::i;:::-;28279:14;:12;:14::i;:::-;28068:233;;;:::o;28524:338::-;28677:10;28699:4;28677:27;28669:69;;;;-1:-1:-1;;;28669:69:0;;;;;;;:::i;:::-;28781:1;28757:12;:10;:12::i;:::-;-1:-1:-1;;;;;28757:26:0;;;28749:67;;;;-1:-1:-1;;;28749:67:0;;;;;;;:::i;:::-;28827:27;28834:3;28839:7;28848:5;28827:6;:27::i;6744:49::-;6786:7;6744:49;:::o;5136:40::-;;;;;;;;;;;;;:::o;5107:22::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5107:22:0;:::o;6637:51::-;-1:-1:-1;;;6637:51:0;:::o;6150:112::-;6197:57;-1:-1:-1;;;;;;;;;;;6232:17:0;:15;:17::i;:::-;6252:1;;6197:57;6232:21;;6197:16;:57::i;:::-;6150:112::o;34869:130::-;5590:5;:12;:17;5582:45;;;;-1:-1:-1;;;5582:45:0;;;;;;;:::i;:::-;5703:17:::1;:15;:17::i;:::-;:22:::0;5695:56:::1;;;;-1:-1:-1::0;;;5695:56:0::1;;;;;;;:::i;:::-;34979:12:::2;:10;:12::i;29067:1536::-:0;29207:30;;:::i;:::-;29248:13;29314:5;:12;29300:3;:10;:26;29278:109;;;;-1:-1:-1;;;29278:109:0;;;;;;;:::i;:::-;29434:7;:14;29420:3;:10;:28;29398:113;;;;-1:-1:-1;;;29398:113:0;;;;;;;:::i;:::-;29527:9;29522:1074;29546:3;:10;29542:1;:14;29522:1074;;;29644:21;:7;29652:1;29644:10;;;;;;;;;;;;;;:19;:21::i;:::-;29639:205;;29782:46;29788:5;29794:1;29788:8;;;;;;;;;;;;;;29798:7;29806:1;29798:10;;;;;;;;;;;;;;29810;29822:5;29782;:46::i;:::-;29928:25;:7;29936:1;29928:10;;;;;;;;;;;;;;:23;:25::i;:::-;29924:547;;;30048:11;30062:25;:7;30070:1;30062:10;;;;;;;;;;;;;;:23;:25::i;:::-;30048:39;;30106:16;30146:50;30153:10;30165:23;30171:3;30175:1;30171:6;;;;;;;;;;;;;;30179:5;30185:1;30179:8;;;;;;;;;;;;;;30165:5;:23::i;:::-;30190:5;30146:6;:50::i;:::-;30106:90;;30265:3;30257:5;:11;30245:8;:23;30215:141;;;;-1:-1:-1;;;30215:141:0;;;;;;;:::i;:::-;30383:8;-1:-1:-1;29924:547:0;;-1:-1:-1;29924:547:0;;30432:23;30438:3;30442:1;30438:6;;;;;;;;;;;;;;30446:5;30452:1;30446:8;;;;;;;30432:23;;29924:547;30561:23;30577:3;30581:1;30577:6;;;;;;;;;;;;;;30561:15;:23::i;:::-;29558:3;;29522:1074;;;;29067:1536;;;;;:::o;35048:1058::-;35428:1;35413:12;:16;35406:429;;35446:12;35461:18;:5;:16;:18::i;:::-;35446:33;-1:-1:-1;;;;;;35498:18:0;;35494:330;;35544:18;:5;:16;:18::i;:::-;35593:39;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35593:39:0;-1:-1:-1;;;35593:39:0;;;35537:25;;-1:-1:-1;35581:52:0;;35537:25;;35581:5;:52::i;:::-;;35494:330;;;35691:37;;-1:-1:-1;;;35691:37:0;;35674:14;;-1:-1:-1;;;;;35691:22:0;;;;;:37;;35722:4;;35691:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35674:54;-1:-1:-1;35751:10:0;;35747:61;;35763:45;-1:-1:-1;;;;;35763:25:0;;35789:10;35801:6;35763:25;:45::i;:::-;35494:330;;35406:429;;;;35916:21;35952:10;;35948:43;;35964:27;;:10;;:27;;;;;35984:6;;35964:27;;;;35984:6;35964:10;:27;;;;;;;;;;;;;;;;;;;;;35948:43;36054:14;:12;:14::i;:::-;36079:19;:17;:19::i;:::-;35048:1058;:::o;6030:112::-;6075:7;6102:32;:5;-1:-1:-1;;;;;;;;;;;6102:16:0;:32::i;:::-;6095:39;;6030:112;:::o;6372:119::-;6422:7;6449:34;:5;-1:-1:-1;;;;;;;;;;;6449:16:0;:34::i;4078:186::-;4241:15;4226:12;;;;;;;;;;;:30;4078:186::o;5779:139::-;5849:1;5825:12;:10;:12::i;:::-;-1:-1:-1;;;;;5825:26:0;;5821:89;;;5866:44;:5;-1:-1:-1;;;;;;;;;;;5899:10:0;5866:16;:44::i;817:148::-;872:4;-1:-1:-1;;;893:18:0;;889:68;;-1:-1:-1;925:4:0;918:11;;889:68;-1:-1:-1;952:5:0;945:12;;30868:1214;31092:21;31115:23;31142:18;:6;:16;:18::i;:::-;31091:69;;;;31236:9;31231:844;31255:4;:11;31251:1;:15;31231:844;;;31306:5;31296:4;31301:1;31296:7;;;;;;;;;;;;;;:15;31288:58;;;;-1:-1:-1;;;31288:58:0;;;;;;;:::i;:::-;31361:11;31375:10;31386:4;31391:1;31386:7;;;;;;;;;;;;;;31375:19;;;;;;;;;;;31361:33;;31409:14;31426:6;31433:1;31426:9;;;;;;;;;;;;;;31409:26;;31450:12;6786:7;31450:30;;31555:6;31548:4;31542;31538:15;31534:28;31595:3;31589:10;31720:1;31713:9;31703:2;;31812:3;31809:1;31805:11;31862:3;31858:1;31855;31851:9;31848:18;31838:2;;31905:1;31902;31895:12;31838:2;31984:12;;;;-1:-1:-1;31703:2:0;-1:-1:-1;32033:16:0;;;;-1:-1:-1;;31268:3:0;;31231:844;;;;30868:1214;;;;;;:::o;973:152::-;1032:4;1053:18;1066:4;1053:12;:18::i;:::-;1049:68;;-1:-1:-1;1085:5:0;1078:12;;1049:68;-1:-1:-1;1113:4:0;1106:11;;1133:181;805:3;1231:45;;;;1133:181::o;32311:749::-;32492:10;;32587:2;32581:8;;32573:16;;;32620:3;32608:15;;;32600:42;;;;-1:-1:-1;;;32600:42:0;;;;;;;:::i;:::-;32698:5;32695:1;32691:13;32797:1;32765:277;32820:3;32817:1;32814:10;32765:277;;;33002:4;32989:11;;;32985:22;;32979:29;32941:14;;;32925:31;;32896:131;32849:12;32765:277;;;32769:44;;32662:391;;;;;;:::o;34223:598::-;34435:5;:12;34431:383;;34469:7;;34431:383;-1:-1:-1;;;34511:12:0;:5;:10;:12::i;:::-;:60;34493:321;;;34598:5;:11;;;;;;;;;;;;;;;;;;;;;;;;34688:12;:5;:10;:12::i;:::-;-1:-1:-1;;;;;;34681:34:0;;34677:61;;34717:21;:5;34734:3;34717:16;:21::i;:::-;34753:49;:5;34782:18;34753:20;:49::i;2890:187::-;2972:11;3031:12;3036:6;3031:4;:12::i;:::-;3023:21;;3001:45;;3057:6;:12;;;;;;;;;;;;;;;;;;;;;;;;2890:187;;;:::o;23091:177::-;23174:86;23194:5;23224:23;;;23249:2;23253:5;23201:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;23201:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;23201:58:0;-1:-1:-1;;;;;;23201:58:0;;;;;;;;;;23174:19;:86::i;5926:96::-;5970:44;:5;-1:-1:-1;;;;;;;;;;;5987:14:0;5970:16;:44::i;6270:94::-;6319:37;:5;-1:-1:-1;;;;;;;;;;;6336:16:0;6319;:37::i;4272:203::-;4398:11;4452:12;;;;;;;;;;;;;4272:203::o;3866:204::-;4029:33;4014:12;;;;;;;;;;;-1:-1:-1;;;;;4037:24:0;;;4014:48;;3866:204::o;1322:1006::-;1405:21;1428:23;1478:14;1487:4;1478:8;:14::i;:::-;1477:15;1469:41;;;;-1:-1:-1;;;1469:41:0;;;;;;;:::i;:::-;1521:9;1545:117;459:66;1552:16;;;:29;:47;;;;;697:2;1585:1;:14;1552:47;1545:117;;;1649:1;1641:9;;;;;1616:3;;1545:117;;;697:2;1676:14;1709:5;1701:34;;;;-1:-1:-1;;;1701:34:0;;;;;;;:::i;:::-;1767:1;1753:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1753:16:0;;1746:23;;1803:1;1789:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1789:16:0;;1780:25;;1821:9;1816:125;1840:1;1836;:5;1816:125;;;1863:7;;459:66;1881:16;;;1863:4;;1868:1;;1863:7;;;;;;;;;;;;;;;:35;1928:1;1920:9;;;;;1843:3;;1816:125;;;;1951:9;1980;1975:282;751:2;1995:1;:21;1975:282;;;340:66;2042:18;;:23;2038:177;;2098:1;2094;:5;2086:50;;;;-1:-1:-1;;;2086:50:0;;;;;;;:::i;:::-;2167:1;2171:2;2167:6;2176:1;2167:10;2155:6;2162:1;2155:9;;;;;;;;;;;;;;;;;:22;2196:3;;;;;2038:177;2244:1;2236:9;;;;2018:3;1975:282;;;;2280:1;2275;:6;2267:53;;;;-1:-1:-1;;;2267:53:0;;;;;;;:::i;:::-;1322:1006;;;;;:::o;3371:210::-;3498:13;;3461:11;;3490:41;;;;-1:-1:-1;;;3490:41:0;;;;;;;:::i;:::-;3555:13;;3548:6;;-1:-1:-1;;3555:17:0;;;3548:25;;;;;;;;;;;;;;3542:31;;3371:210;;;:::o;2435:136::-;2517:46;;;;;;;2529:33;2517:46;;;;;;;-1:-1:-1;;;;;2537:24:0;;;2517:46;;;2435:136::o;2689:193::-;2783:19;;;2775:52;;;;-1:-1:-1;;;2775:52:0;;;;;;;:::i;:::-;2838:36;;;;;;;-1:-1:-1;2838:36:0;;;;;;;2850:23;;;;;-1:-1:-1;;;;;;2838:36:0;;;;2689:193::o;25396:761::-;25820:23;25846:69;25874:4;25846:69;;;;;;;;;;;;;;;;;25854:5;-1:-1:-1;;;;;25846:27:0;;;:69;;;;;:::i;:::-;25930:17;;25820:95;;-1:-1:-1;25930:21:0;25926:224;;26072:10;26061:30;;;;;;;;;;;;:::i;:::-;26053:85;;;;-1:-1:-1;;;26053:85:0;;;;;;;:::i;10890:195::-;10993:12;11025:52;11047:6;11055:4;11061:1;11064:12;11025:21;:52::i;:::-;11018:59;;10890:195;;;;;;:::o;11942:530::-;12069:12;12127:5;12102:21;:30;;12094:81;;;;-1:-1:-1;;;12094:81:0;;;;;;;:::i;:::-;12194:18;12205:6;12194:10;:18::i;:::-;12186:60;;;;-1:-1:-1;;;12186:60:0;;;;;;;:::i;:::-;12320:12;12334:23;12361:6;-1:-1:-1;;;;;12361:11:0;12381:5;12389:4;12361:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12319:75;;;;12412:52;12430:7;12439:10;12451:12;12412:17;:52::i;:::-;12405:59;11942:530;-1:-1:-1;;;;;;;11942:530:0:o;13478:742::-;13593:12;13622:7;13618:595;;;-1:-1:-1;13653:10:0;13646:17;;13618:595;13767:17;;:21;13763:439;;14030:10;14024:17;14091:15;14078:10;14074:2;14070:19;14063:44;13978:148;14173:12;14166:20;;-1:-1:-1;;;14166:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;-1:-1;;;;;27860:54;;28979:35;;28969:2;;29028:1;;29018:12;893:707;;1010:3;1003:4;995:6;991:17;987:27;977:2;;-1:-1;;1018:12;977:2;1065:6;1052:20;1087:80;1102:64;1159:6;1102:64;:::i;:::-;1087:80;:::i;:::-;1195:21;;;1078:89;-1:-1;1239:4;1252:14;;;;1227:17;;;1341;;;1332:27;;;;1329:36;-1:-1;1326:2;;;1378:1;;1368:12;1326:2;1403:1;1388:206;1413:6;1410:1;1407:13;1388:206;;;2539:20;;1481:50;;1545:14;;;;1573;;;;1435:1;1428:9;1388:206;;;1392:14;;;;;970:630;;;;:::o;1624:705::-;;1743:4;1750:3;1743:4;1735:6;1731:17;1727:27;1717:2;;-1:-1;;1758:12;1717:2;1805:6;1792:20;1827:89;1842:73;1908:6;1842:73;:::i;1827:89::-;1944:21;;;1818:98;-1:-1;1988:4;2001:14;;;;1976:17;;;2096:1;2081:242;2106:6;2103:1;2100:13;2081:242;;;2189:3;2176:17;1980:6;2164:30;2852:3;2833:17;2164:30;2833:17;2829:27;2819:2;;2096:1;;2860:12;2819:2;1988:4;2164:30;;2894:20;26611:18;26603:6;26600:30;26597:2;;;2096:1;;26633:12;26597:2;2929:64;26687:17;;;-1:-1;;26683:33;26764:15;;2929:64;:::i;:::-;3013:6;3006:5;2999:21;3037:17;3117:3;3037:17;3108:6;2164:30;3099:16;;3096:25;3093:2;;;2096:1;;3124:12;3093:2;28466:6;3037:17;2164:30;3037:17;1988:4;3075:5;3071:16;28443:30;-1:-1;2096:1;28504:16;;;;;28497:27;;;;2201:59;;-1:-1;2274:14;;;;2302;;;;2128:1;2121:9;2081:242;;;2085:14;;;;;;1710:619;;;;:::o;3477:917::-;;;;3699:2;3687:9;3678:7;3674:23;3670:32;3667:2;;;-1:-1;;3705:12;3667:2;3763:17;3750:31;3801:18;;3793:6;3790:30;3787:2;;;-1:-1;;3823:12;3787:2;3914:6;3903:9;3899:22;;;277:3;270:4;262:6;258:17;254:27;244:2;;-1:-1;;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;:::i;354:80::-;440:16;476:6;469:5;462:21;506:4;;523:3;519:14;512:21;;506:4;498:6;494:17;628:3;506:4;;612:6;608:17;498:6;599:27;;596:36;593:2;;;-1:-1;;635:12;593:2;-1:-1;661:10;;655:206;680:6;677:1;674:13;655:206;;;760:37;793:3;781:10;760:37;:::i;:::-;748:50;;702:1;695:9;;;;;812:14;;;;840;;655:206;;;-1:-1;3843:88;;-1:-1;3981:18;;3968:32;;-1:-1;;;4009:30;;;4006:2;;;-1:-1;;4042:12;4006:2;4072:78;4142:7;4133:6;4122:9;4118:22;4072:78;:::i;:::-;4062:88;;4215:2;4204:9;4200:18;4187:32;4173:46;;3801:18;4231:6;4228:30;4225:2;;;-1:-1;;4261:12;4225:2;;4291:87;4370:7;4361:6;4350:9;4346:22;4291:87;:::i;:::-;4281:97;;;3661:733;;;;;:::o;4401:257::-;;4513:2;4501:9;4492:7;4488:23;4484:32;4481:2;;;-1:-1;;4519:12;4481:2;2418:6;2412:13;29125:5;27542:13;27535:21;29103:5;29100:32;29090:2;;-1:-1;;29136:12;4665:241;;4769:2;4757:9;4748:7;4744:23;4740:32;4737:2;;;-1:-1;;4775:12;4737:2;-1:-1;2539:20;;4731:175;-1:-1;4731:175::o;4913:263::-;;5028:2;5016:9;5007:7;5003:23;4999:32;4996:2;;;-1:-1;;5034:12;4996:2;-1:-1;2687:13;;4990:186;-1:-1;4990:186::o;14288:271::-;;6367:5;26883:12;6478:52;6523:6;6518:3;6511:4;6504:5;6500:16;6478:52;:::i;:::-;6542:16;;;;;14422:137;-1:-1;;14422:137::o;14566:222::-;-1:-1;;;;;27860:54;;;;5921:37;;14693:2;14678:18;;14664:124::o;15040:333::-;-1:-1;;;;;27860:54;;;;5921:37;;15359:2;15344:18;;6041:37;15195:2;15180:18;;15166:207::o;15380:222::-;6041:37;;;15507:2;15492:18;;15478:124::o;15609:218::-;-1:-1;;;;;;27708:78;;;;6159:36;;15734:2;15719:18;;15705:122::o;15834:310::-;;15981:2;16002:17;15995:47;6715:5;26883:12;27322:6;15981:2;15970:9;15966:18;27310:19;6809:52;6854:6;27350:14;15970:9;27350:14;15981:2;6835:5;6831:16;6809:52;:::i;:::-;26706:9;28883:14;-1:-1;;28879:28;6873:39;;;;27350:14;6873:39;;15952:192;-1:-1;;15952:192::o;16151:416::-;16351:2;16365:47;;;7149:2;16336:18;;;27310:19;-1:-1;;;27350:14;;;7165:39;7223:12;;;16322:245::o;16574:416::-;16774:2;16788:47;;;7474:2;16759:18;;;27310:19;-1:-1;;;27350:14;;;7490:37;7546:12;;;16745:245::o;16997:416::-;17197:2;17211:47;;;7797:2;17182:18;;;27310:19;-1:-1;;;27350:14;;;7813:44;7876:12;;;17168:245::o;17420:416::-;17620:2;17634:47;;;8127:2;17605:18;;;27310:19;8163:34;27350:14;;;8143:55;-1:-1;;;8218:12;;;8211:26;8256:12;;;17591:245::o;17843:416::-;18043:2;18057:47;;;18028:18;;;27310:19;8543:34;27350:14;;;8523:55;8597:12;;;18014:245::o;18266:416::-;18466:2;18480:47;;;8848:2;18451:18;;;27310:19;8884:34;27350:14;;;8864:55;-1:-1;;;8939:12;;;8932:30;8981:12;;;18437:245::o;18689:416::-;18889:2;18903:47;;;9232:2;18874:18;;;27310:19;-1:-1;;;27350:14;;;9248:43;9310:12;;;18860:245::o;19112:416::-;19312:2;19326:47;;;9561:2;19297:18;;;27310:19;-1:-1;;;27350:14;;;9577:43;9639:12;;;19283:245::o;19535:416::-;19735:2;19749:47;;;9890:2;19720:18;;;27310:19;-1:-1;;;27350:14;;;9906:36;9961:12;;;19706:245::o;19958:416::-;20158:2;20172:47;;;10212:2;20143:18;;;27310:19;-1:-1;;;27350:14;;;10228:38;10285:12;;;20129:245::o;20381:416::-;20581:2;20595:47;;;10536:2;20566:18;;;27310:19;10572:31;27350:14;;;10552:52;10623:12;;;20552:245::o;20804:416::-;21004:2;21018:47;;;10874:2;20989:18;;;27310:19;10910:34;27350:14;;;10890:55;-1:-1;;;10965:12;;;10958:36;11013:12;;;20975:245::o;21227:416::-;21427:2;21441:47;;;11264:2;21412:18;;;27310:19;-1:-1;;;27350:14;;;11280:34;11333:12;;;21398:245::o;21650:416::-;21850:2;21864:47;;;11584:2;21835:18;;;27310:19;-1:-1;;;27350:14;;;11600:37;11656:12;;;21821:245::o;22073:416::-;22273:2;22287:47;;;11907:2;22258:18;;;27310:19;11943:34;27350:14;;;11923:55;-1:-1;;;11998:12;;;11991:25;12035:12;;;22244:245::o;22496:416::-;22696:2;22710:47;;;12286:2;22681:18;;;27310:19;-1:-1;;;27350:14;;;12302:38;12359:12;;;22667:245::o;22919:416::-;23119:2;23133:47;;;12610:2;23104:18;;;27310:19;12646:34;27350:14;;;12626:55;-1:-1;;;12701:12;;;12694:27;12740:12;;;23090:245::o;23342:416::-;23542:2;23556:47;;;12991:2;23527:18;;;27310:19;13027:31;27350:14;;;13007:52;13078:12;;;23513:245::o;23765:416::-;23965:2;23979:47;;;13329:2;23950:18;;;27310:19;13365:32;27350:14;;;13345:53;13417:12;;;23936:245::o;24188:416::-;24388:2;24402:47;;;13668:2;24373:18;;;27310:19;13704:34;27350:14;;;13684:55;-1:-1;;;13759:12;;;13752:34;13805:12;;;24359:245::o;24611:416::-;24811:2;24825:47;;;14056:2;24796:18;;;27310:19;14092:30;27350:14;;;14072:51;14142:12;;;24782:245::o;25263:256::-;25325:2;25319:9;25351:17;;;25426:18;25411:34;;25447:22;;;25408:62;25405:2;;;25483:1;;25473:12;25405:2;25325;25492:22;25303:216;;-1:-1;25303:216::o;25526:304::-;;25685:18;25677:6;25674:30;25671:2;;;-1:-1;;25707:12;25671:2;-1:-1;25752:4;25740:17;;;25805:15;;25608:222::o;28539:268::-;28604:1;28611:101;28625:6;28622:1;28619:13;28611:101;;;28692:11;;;28686:18;28673:11;;;28666:39;28647:2;28640:10;28611:101;;;28727:6;28724:1;28721:13;28718:2;;;28604:1;28783:6;28778:3;28774:16;28767:27;28718:2;;28588:219;;;:::o
Swarm Source
ipfs://35f279f5f67b43f086e837aed0f67eeb658bc0e8935e08ddfc24723970672d4a
Loading...
Loading
Loading...
Loading
OVERVIEW
Furucombo Proxy v1.0.0-1Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.