Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x591e99cbec0c6ad13f77261d56a948cf879a21a4c44461cb3806b6bed6b50a09 | Unlock Token | (pending) | 20 days ago | IN | 0 ETH | (Pending) | |||
0x6d2e40725d397012349ab40371df81f6ef74153926a9a6d27bb3a8d4c67ac4d5 | Unlock Token | (pending) | 20 days ago | IN | 0 ETH | (Pending) | |||
0xb7e55945ee81ec0ca405ec1bb78498cff2cd1840eca7efbc36252bf93037ab3b | Unlock Token | (pending) | 20 days ago | IN | 0 ETH | (Pending) | |||
Unlock Token | 22681822 | 10 days ago | IN | 0 ETH | 0.00182237 | ||||
Unlock Token | 22681817 | 10 days ago | IN | 0 ETH | 0.0018074 | ||||
0x68747470 | 22548431 | 29 days ago | IN | 0 ETH | 0.00005296 | ||||
0x68747470 | 22547692 | 29 days ago | IN | 0 ETH | 0.00005296 | ||||
0x68747470 | 22547320 | 29 days ago | IN | 0 ETH | 0.00005296 | ||||
Unlock Token | 22477797 | 38 days ago | IN | 0 ETH | 0.00063453 | ||||
Unlock Token | 22423079 | 46 days ago | IN | 0 ETH | 0.00035799 | ||||
0x68747470 | 22420909 | 46 days ago | IN | 0 ETH | 0.00001717 | ||||
0x68747470 | 22420591 | 47 days ago | IN | 0 ETH | 0.00001717 | ||||
0x68747470 | 22420279 | 47 days ago | IN | 0 ETH | 0.00001717 | ||||
0x68747470 | 22419986 | 47 days ago | IN | 0 ETH | 0.00001717 | ||||
0x68747470 | 22419697 | 47 days ago | IN | 0 ETH | 0.00001717 | ||||
0x68747470 | 22419406 | 47 days ago | IN | 0 ETH | 0.00001717 | ||||
0x68747470 | 22419120 | 47 days ago | IN | 0 ETH | 0.00001717 | ||||
0x68747470 | 22417969 | 47 days ago | IN | 0 ETH | 0.00001717 | ||||
0x68747470 | 22417678 | 47 days ago | IN | 0 ETH | 0.00001717 | ||||
0x68747470 | 22417390 | 47 days ago | IN | 0 ETH | 0.00001717 | ||||
0x68747470 | 22417109 | 47 days ago | IN | 0 ETH | 0.00001717 | ||||
0x68747470 | 22416826 | 47 days ago | IN | 0 ETH | 0.00001717 | ||||
0x68747470 | 22416543 | 47 days ago | IN | 0 ETH | 0.00001717 | ||||
0x68747470 | 22416257 | 47 days ago | IN | 0 ETH | 0.00001717 | ||||
0x68747470 | 22415972 | 47 days ago | IN | 0 ETH | 0.00001717 |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
ERC20Locker
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-28 */ // 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/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, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/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); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/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: rainbow-bridge/contracts/eth/nearbridge/contracts/AdminControlled.sol pragma solidity ^0.6; contract AdminControlled { address public admin; uint public paused; constructor(address _admin, uint flags) public { admin = _admin; // Add the possibility to set pause flags on the initialization paused = flags; } modifier onlyAdmin { require(msg.sender == admin); _; } modifier pausable(uint flag) { require((paused & flag) == 0 || msg.sender == admin); _; } function adminPause(uint flags) public onlyAdmin { paused = flags; } function adminSstore(uint key, uint value) public onlyAdmin { assembly { sstore(key, value) } } function adminSendEth(address payable destination, uint amount) public onlyAdmin { destination.transfer(amount); } function adminReceiveEth() public payable onlyAdmin {} function adminDelegatecall(address target, bytes memory data) public payable onlyAdmin returns (bytes memory) { (bool success, bytes memory rdata) = target.delegatecall(data); require(success); return rdata; } } // File: rainbow-bridge/contracts/eth/nearbridge/contracts/Borsh.sol pragma solidity ^0.6; library Borsh { using SafeMath for uint256; struct Data { uint256 offset; bytes raw; } function from(bytes memory data) internal pure returns (Data memory) { return Data({offset: 0, raw: data}); } modifier shift(Data memory data, uint256 size) { require(data.raw.length >= data.offset + size, "Borsh: Out of range"); _; data.offset += size; } function finished(Data memory data) internal pure returns (bool) { return data.offset == data.raw.length; } function peekKeccak256(Data memory data, uint256 length) internal pure returns (bytes32 res) { return bytesKeccak256(data.raw, data.offset, length); } function bytesKeccak256( bytes memory ptr, uint256 offset, uint256 length ) internal pure returns (bytes32 res) { // solium-disable-next-line security/no-inline-assembly assembly { res := keccak256(add(add(ptr, 32), offset), length) } } function peekSha256(Data memory data, uint256 length) internal view returns (bytes32) { return bytesSha256(data.raw, data.offset, length); } function bytesSha256( bytes memory ptr, uint256 offset, uint256 length ) internal view returns (bytes32) { bytes32[1] memory result; // solium-disable-next-line security/no-inline-assembly assembly { pop(staticcall(gas(), 0x02, add(add(ptr, 32), offset), length, result, 32)) } return result[0]; } function decodeU8(Data memory data) internal pure shift(data, 1) returns (uint8 value) { value = uint8(data.raw[data.offset]); } function decodeI8(Data memory data) internal pure shift(data, 1) returns (int8 value) { value = int8(data.raw[data.offset]); } function decodeU16(Data memory data) internal pure returns (uint16 value) { value = uint16(decodeU8(data)); value |= (uint16(decodeU8(data)) << 8); } function decodeI16(Data memory data) internal pure returns (int16 value) { value = int16(decodeI8(data)); value |= (int16(decodeI8(data)) << 8); } function decodeU32(Data memory data) internal pure returns (uint32 value) { value = uint32(decodeU16(data)); value |= (uint32(decodeU16(data)) << 16); } function decodeI32(Data memory data) internal pure returns (int32 value) { value = int32(decodeI16(data)); value |= (int32(decodeI16(data)) << 16); } function decodeU64(Data memory data) internal pure returns (uint64 value) { value = uint64(decodeU32(data)); value |= (uint64(decodeU32(data)) << 32); } function decodeI64(Data memory data) internal pure returns (int64 value) { value = int64(decodeI32(data)); value |= (int64(decodeI32(data)) << 32); } function decodeU128(Data memory data) internal pure returns (uint128 value) { value = uint128(decodeU64(data)); value |= (uint128(decodeU64(data)) << 64); } function decodeI128(Data memory data) internal pure returns (int128 value) { value = int128(decodeI64(data)); value |= (int128(decodeI64(data)) << 64); } function decodeU256(Data memory data) internal pure returns (uint256 value) { value = uint256(decodeU128(data)); value |= (uint256(decodeU128(data)) << 128); } function decodeI256(Data memory data) internal pure returns (int256 value) { value = int256(decodeI128(data)); value |= (int256(decodeI128(data)) << 128); } function decodeBool(Data memory data) internal pure returns (bool value) { value = (decodeU8(data) != 0); } function decodeBytes(Data memory data) internal pure returns (bytes memory value) { value = new bytes(decodeU32(data)); for (uint i = 0; i < value.length; i++) { value[i] = byte(decodeU8(data)); } } function decodeBytes32(Data memory data) internal pure shift(data, 32) returns (bytes32 value) { bytes memory raw = data.raw; uint256 offset = data.offset; // solium-disable-next-line security/no-inline-assembly assembly { value := mload(add(add(raw, 32), offset)) } } function decodeBytes20(Data memory data) internal pure returns (bytes20 value) { for (uint i = 0; i < 20; i++) { value |= bytes20(byte(decodeU8(data)) & 0xFF) >> (i * 8); } } // Public key struct SECP256K1PublicKey { uint256 x; uint256 y; } function decodeSECP256K1PublicKey(Borsh.Data memory data) internal pure returns (SECP256K1PublicKey memory key) { key.x = decodeU256(data); key.y = decodeU256(data); } struct ED25519PublicKey { bytes32 xy; } function decodeED25519PublicKey(Borsh.Data memory data) internal pure returns (ED25519PublicKey memory key) { key.xy = decodeBytes32(data); } // Signature struct SECP256K1Signature { bytes32 r; bytes32 s; uint8 v; } function decodeSECP256K1Signature(Borsh.Data memory data) internal pure returns (SECP256K1Signature memory sig) { sig.r = decodeBytes32(data); sig.s = decodeBytes32(data); sig.v = decodeU8(data); } struct ED25519Signature { bytes32[2] rs; } function decodeED25519Signature(Borsh.Data memory data) internal pure returns (ED25519Signature memory sig) { sig.rs[0] = decodeBytes32(data); sig.rs[1] = decodeBytes32(data); } } // File: rainbow-bridge/contracts/eth/nearbridge/contracts/NearDecoder.sol pragma solidity ^0.6; library NearDecoder { using Borsh for Borsh.Data; using NearDecoder for Borsh.Data; struct PublicKey { uint8 enumIndex; Borsh.ED25519PublicKey ed25519; Borsh.SECP256K1PublicKey secp256k1; } function decodePublicKey(Borsh.Data memory data) internal pure returns (PublicKey memory key) { key.enumIndex = data.decodeU8(); if (key.enumIndex == 0) { key.ed25519 = data.decodeED25519PublicKey(); } else if (key.enumIndex == 1) { key.secp256k1 = data.decodeSECP256K1PublicKey(); } else { revert("NearBridge: Only ED25519 and SECP256K1 public keys are supported"); } } struct ValidatorStake { string account_id; PublicKey public_key; uint128 stake; } function decodeValidatorStake(Borsh.Data memory data) internal pure returns (ValidatorStake memory validatorStake) { validatorStake.account_id = string(data.decodeBytes()); validatorStake.public_key = data.decodePublicKey(); validatorStake.stake = data.decodeU128(); } struct OptionalValidatorStakes { bool none; ValidatorStake[] validatorStakes; bytes32 hash; // Additional computable element } function decodeOptionalValidatorStakes(Borsh.Data memory data) internal view returns (OptionalValidatorStakes memory stakes) { stakes.none = (data.decodeU8() == 0); if (!stakes.none) { uint256 start = data.offset; stakes.validatorStakes = new ValidatorStake[](data.decodeU32()); for (uint i = 0; i < stakes.validatorStakes.length; i++) { stakes.validatorStakes[i] = data.decodeValidatorStake(); } uint256 stop = data.offset; data.offset = start; stakes.hash = data.peekSha256(stop - start); data.offset = stop; } } struct Signature { uint8 enumIndex; Borsh.ED25519Signature ed25519; Borsh.SECP256K1Signature secp256k1; } function decodeSignature(Borsh.Data memory data) internal pure returns (Signature memory sig) { sig.enumIndex = data.decodeU8(); if (sig.enumIndex == 0) { sig.ed25519 = data.decodeED25519Signature(); } else if (sig.enumIndex == 1) { sig.secp256k1 = data.decodeSECP256K1Signature(); } else { revert("NearBridge: Only ED25519 and SECP256K1 signatures are supported"); } } struct OptionalSignature { bool none; Signature signature; } function decodeOptionalSignature(Borsh.Data memory data) internal pure returns (OptionalSignature memory sig) { sig.none = (data.decodeU8() == 0); if (!sig.none) { sig.signature = data.decodeSignature(); } } struct LightClientBlock { bytes32 prev_block_hash; bytes32 next_block_inner_hash; BlockHeaderInnerLite inner_lite; bytes32 inner_rest_hash; OptionalValidatorStakes next_bps; OptionalSignature[] approvals_after_next; bytes32 hash; bytes32 next_hash; } struct InitialValidators { ValidatorStake[] validator_stakes; } function decodeInitialValidators(Borsh.Data memory data) internal view returns (InitialValidators memory validators) { validators.validator_stakes = new ValidatorStake[](data.decodeU32()); for (uint i = 0; i < validators.validator_stakes.length; i++) { validators.validator_stakes[i] = data.decodeValidatorStake(); } } function decodeLightClientBlock(Borsh.Data memory data) internal view returns (LightClientBlock memory header) { header.prev_block_hash = data.decodeBytes32(); header.next_block_inner_hash = data.decodeBytes32(); header.inner_lite = data.decodeBlockHeaderInnerLite(); header.inner_rest_hash = data.decodeBytes32(); header.next_bps = data.decodeOptionalValidatorStakes(); header.approvals_after_next = new OptionalSignature[](data.decodeU32()); for (uint i = 0; i < header.approvals_after_next.length; i++) { header.approvals_after_next[i] = data.decodeOptionalSignature(); } header.hash = sha256( abi.encodePacked( sha256(abi.encodePacked(header.inner_lite.hash, header.inner_rest_hash)), header.prev_block_hash ) ); header.next_hash = sha256(abi.encodePacked(header.next_block_inner_hash, header.hash)); } struct BlockHeaderInnerLite { uint64 height; /// Height of this block since the genesis block (height 0). bytes32 epoch_id; /// Epoch start hash of this block's epoch. Used for retrieving validator information bytes32 next_epoch_id; bytes32 prev_state_root; /// Root hash of the state at the previous block. bytes32 outcome_root; /// Root of the outcomes of transactions and receipts. uint64 timestamp; /// Timestamp at which the block was built. bytes32 next_bp_hash; /// Hash of the next epoch block producers set bytes32 block_merkle_root; bytes32 hash; // Additional computable element } function decodeBlockHeaderInnerLite(Borsh.Data memory data) internal view returns (BlockHeaderInnerLite memory header) { header.hash = data.peekSha256(208); header.height = data.decodeU64(); header.epoch_id = data.decodeBytes32(); header.next_epoch_id = data.decodeBytes32(); header.prev_state_root = data.decodeBytes32(); header.outcome_root = data.decodeBytes32(); header.timestamp = data.decodeU64(); header.next_bp_hash = data.decodeBytes32(); header.block_merkle_root = data.decodeBytes32(); } } // File: rainbow-bridge/contracts/eth/nearprover/contracts/ProofDecoder.sol pragma solidity ^0.6; library ProofDecoder { using Borsh for Borsh.Data; using ProofDecoder for Borsh.Data; using NearDecoder for Borsh.Data; struct FullOutcomeProof { ExecutionOutcomeWithIdAndProof outcome_proof; MerklePath outcome_root_proof; // TODO: now empty array BlockHeaderLight block_header_lite; MerklePath block_proof; } function decodeFullOutcomeProof(Borsh.Data memory data) internal view returns (FullOutcomeProof memory proof) { proof.outcome_proof = data.decodeExecutionOutcomeWithIdAndProof(); proof.outcome_root_proof = data.decodeMerklePath(); proof.block_header_lite = data.decodeBlockHeaderLight(); proof.block_proof = data.decodeMerklePath(); } struct BlockHeaderLight { bytes32 prev_block_hash; bytes32 inner_rest_hash; NearDecoder.BlockHeaderInnerLite inner_lite; bytes32 hash; // Computable } function decodeBlockHeaderLight(Borsh.Data memory data) internal view returns (BlockHeaderLight memory header) { header.prev_block_hash = data.decodeBytes32(); header.inner_rest_hash = data.decodeBytes32(); header.inner_lite = data.decodeBlockHeaderInnerLite(); header.hash = sha256( abi.encodePacked( sha256(abi.encodePacked(header.inner_lite.hash, header.inner_rest_hash)), header.prev_block_hash ) ); } struct ExecutionStatus { uint8 enumIndex; bool unknown; bool failed; bytes successValue; /// The final action succeeded and returned some value or an empty vec. bytes32 successReceiptId; /// The final action of the receipt returned a promise or the signed /// transaction was converted to a receipt. Contains the receipt_id of the generated receipt. } function decodeExecutionStatus(Borsh.Data memory data) internal pure returns (ExecutionStatus memory executionStatus) { executionStatus.enumIndex = data.decodeU8(); if (executionStatus.enumIndex == 0) { executionStatus.unknown = true; } else if (executionStatus.enumIndex == 1) { //revert("NearDecoder: decodeExecutionStatus failure case not implemented yet"); // Can avoid revert since ExecutionStatus is latest field in all parent structures executionStatus.failed = true; } else if (executionStatus.enumIndex == 2) { executionStatus.successValue = data.decodeBytes(); } else if (executionStatus.enumIndex == 3) { executionStatus.successReceiptId = data.decodeBytes32(); } else { revert("NearDecoder: decodeExecutionStatus index out of range"); } } struct ExecutionOutcome { bytes[] logs; /// Logs from this transaction or receipt. bytes32[] receipt_ids; /// Receipt IDs generated by this transaction or receipt. uint64 gas_burnt; /// The amount of the gas burnt by the given transaction or receipt. uint128 tokens_burnt; /// The total number of the tokens burnt by the given transaction or receipt. bytes executor_id; /// Hash of the transaction or receipt id that produced this outcome. ExecutionStatus status; /// Execution status. Contains the result in case of successful execution. bytes32[] merkelization_hashes; } function decodeExecutionOutcome(Borsh.Data memory data) internal view returns (ExecutionOutcome memory outcome) { outcome.logs = new bytes[](data.decodeU32()); for (uint i = 0; i < outcome.logs.length; i++) { outcome.logs[i] = data.decodeBytes(); } uint256 start = data.offset; outcome.receipt_ids = new bytes32[](data.decodeU32()); for (uint i = 0; i < outcome.receipt_ids.length; i++) { outcome.receipt_ids[i] = data.decodeBytes32(); } outcome.gas_burnt = data.decodeU64(); outcome.tokens_burnt = data.decodeU128(); outcome.executor_id = data.decodeBytes(); outcome.status = data.decodeExecutionStatus(); uint256 stop = data.offset; outcome.merkelization_hashes = new bytes32[](1 + outcome.logs.length); data.offset = start; outcome.merkelization_hashes[0] = data.peekSha256(stop - start); data.offset = stop; for (uint i = 0; i < outcome.logs.length; i++) { outcome.merkelization_hashes[i + 1] = sha256(outcome.logs[i]); } } struct ExecutionOutcomeWithId { bytes32 id; /// The transaction hash or the receipt ID. ExecutionOutcome outcome; bytes32 hash; } function decodeExecutionOutcomeWithId(Borsh.Data memory data) internal view returns (ExecutionOutcomeWithId memory outcome) { outcome.id = data.decodeBytes32(); outcome.outcome = data.decodeExecutionOutcome(); uint256 len = 1 + outcome.outcome.merkelization_hashes.length; outcome.hash = sha256( abi.encodePacked( uint8((len >> 0) & 0xFF), uint8((len >> 8) & 0xFF), uint8((len >> 16) & 0xFF), uint8((len >> 24) & 0xFF), outcome.id, outcome.outcome.merkelization_hashes ) ); } struct MerklePathItem { bytes32 hash; uint8 direction; // 0 = left, 1 = right } function decodeMerklePathItem(Borsh.Data memory data) internal pure returns (MerklePathItem memory item) { item.hash = data.decodeBytes32(); item.direction = data.decodeU8(); require(item.direction < 2, "ProofDecoder: MerklePathItem direction should be 0 or 1"); } struct MerklePath { MerklePathItem[] items; } function decodeMerklePath(Borsh.Data memory data) internal pure returns (MerklePath memory path) { path.items = new MerklePathItem[](data.decodeU32()); for (uint i = 0; i < path.items.length; i++) { path.items[i] = data.decodeMerklePathItem(); } } struct ExecutionOutcomeWithIdAndProof { MerklePath proof; bytes32 block_hash; ExecutionOutcomeWithId outcome_with_id; } function decodeExecutionOutcomeWithIdAndProof(Borsh.Data memory data) internal view returns (ExecutionOutcomeWithIdAndProof memory outcome) { outcome.proof = data.decodeMerklePath(); outcome.block_hash = data.decodeBytes32(); outcome.outcome_with_id = data.decodeExecutionOutcomeWithId(); } } // File: rainbow-bridge/contracts/eth/nearprover/contracts/INearProver.sol pragma solidity ^0.6; interface INearProver { function proveOutcome(bytes calldata proofData, uint64 blockHeight) external view returns (bool); } // File: contracts/Locker.sol pragma solidity ^0.6.12; contract Locker { using Borsh for Borsh.Data; using ProofDecoder for Borsh.Data; INearProver public prover_; bytes public nearTokenFactory_; /// Proofs from blocks that are below the acceptance height will be rejected. // If `minBlockAcceptanceHeight_` value is zero - proofs from block with any height are accepted. uint64 public minBlockAcceptanceHeight_; // OutcomeReciptId -> Used mapping(bytes32 => bool) public usedProofs_; constructor(bytes memory nearTokenFactory, INearProver prover, uint64 minBlockAcceptanceHeight) public { require(nearTokenFactory.length > 0, "Invalid Near Token Factory address"); require(address(prover) != address(0), "Invalid Near prover address"); nearTokenFactory_ = nearTokenFactory; prover_ = prover; minBlockAcceptanceHeight_ = minBlockAcceptanceHeight; } /// Parses the provided proof and consumes it if it's not already used. /// The consumed event cannot be reused for future calls. function _parseAndConsumeProof(bytes memory proofData, uint64 proofBlockHeight) internal returns (ProofDecoder.ExecutionStatus memory result) { require(proofBlockHeight >= minBlockAcceptanceHeight_, "Proof is from the ancient block"); require(prover_.proveOutcome(proofData, proofBlockHeight), "Proof should be valid"); // Unpack the proof and extract the execution outcome. Borsh.Data memory borshData = Borsh.from(proofData); ProofDecoder.FullOutcomeProof memory fullOutcomeProof = borshData.decodeFullOutcomeProof(); require(borshData.finished(), "Argument should be exact borsh serialization"); bytes32 receiptId = fullOutcomeProof.outcome_proof.outcome_with_id.outcome.receipt_ids[0]; require(!usedProofs_[receiptId], "The burn event proof cannot be reused"); usedProofs_[receiptId] = true; require(keccak256(fullOutcomeProof.outcome_proof.outcome_with_id.outcome.executor_id) == keccak256(nearTokenFactory_), "Can only unlock tokens from the linked proof producer on Near blockchain"); result = fullOutcomeProof.outcome_proof.outcome_with_id.outcome.status; require(!result.failed, "Cannot use failed execution outcome for unlocking the tokens"); require(!result.unknown, "Cannot use unknown execution outcome for unlocking the tokens"); } } // File: contracts/ERC20Locker.sol pragma solidity ^0.6.12; contract ERC20Locker is Locker, AdminControlled { using SafeMath for uint256; using SafeERC20 for IERC20; event Locked ( address indexed token, address indexed sender, uint256 amount, string accountId ); event Unlocked ( uint128 amount, address recipient ); // Function output from burning fungible token on Near side. struct BurnResult { uint128 amount; address token; address recipient; } uint constant UNPAUSED_ALL = 0; uint constant PAUSED_LOCK = 1 << 0; uint constant PAUSED_UNLOCK = 1 << 1; // ERC20Locker is linked to the bridge token factory on NEAR side. // It also links to the prover that it uses to unlock the tokens. constructor(bytes memory nearTokenFactory, INearProver prover, uint64 minBlockAcceptanceHeight, address _admin, uint pausedFlags) AdminControlled(_admin, pausedFlags) Locker(nearTokenFactory, prover, minBlockAcceptanceHeight) public { } function lockToken(address ethToken, uint256 amount, string memory accountId) public pausable (PAUSED_LOCK) { require(IERC20(ethToken).balanceOf(address(this)).add(amount) <= ((uint256(1) << 128) - 1), "Maximum tokens locked exceeded (< 2^128 - 1)"); IERC20(ethToken).safeTransferFrom(msg.sender, address(this), amount); emit Locked(address(ethToken), msg.sender, amount, accountId); } function unlockToken(bytes memory proofData, uint64 proofBlockHeight) public pausable (PAUSED_UNLOCK) { ProofDecoder.ExecutionStatus memory status = _parseAndConsumeProof(proofData, proofBlockHeight); BurnResult memory result = _decodeBurnResult(status.successValue); IERC20(result.token).safeTransfer(result.recipient, result.amount); emit Unlocked(result.amount, result.recipient); } function _decodeBurnResult(bytes memory data) internal pure returns(BurnResult memory result) { Borsh.Data memory borshData = Borsh.from(data); uint8 flag = borshData.decodeU8(); require(flag == 0, "ERR_NOT_WITHDRAW_RESULT"); result.amount = borshData.decodeU128(); bytes20 token = borshData.decodeBytes20(); result.token = address(uint160(token)); bytes20 recipient = borshData.decodeBytes20(); result.recipient = address(uint160(recipient)); } // tokenFallback implements the ContractReceiver interface from ERC223-token-standard. // This allows to support ERC223 tokens with no extra cost. // The function always passes: we don't need to make any decision and the contract always // accept token transfers transfer. function tokenFallback(address _from, uint _value, bytes memory _data) public pure {} function adminTransfer(IERC20 token, address destination, uint amount) public onlyAdmin { token.safeTransfer(destination, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"bytes","name":"nearTokenFactory","type":"bytes"},{"internalType":"contract INearProver","name":"prover","type":"address"},{"internalType":"uint64","name":"minBlockAcceptanceHeight","type":"uint64"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"uint256","name":"pausedFlags","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"accountId","type":"string"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint128","name":"amount","type":"uint128"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"Unlocked","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"adminDelegatecall","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"flags","type":"uint256"}],"name":"adminPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminReceiveEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"destination","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"adminSendEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"key","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"adminSstore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"adminTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ethToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"accountId","type":"string"}],"name":"lockToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minBlockAcceptanceHeight_","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nearTokenFactory_","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prover_","outputs":[{"internalType":"contract INearProver","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"tokenFallback","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"proofData","type":"bytes"},{"internalType":"uint64","name":"proofBlockHeight","type":"uint64"}],"name":"unlockToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"usedProofs_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200269538038062002695833981810160405260a08110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82516401000000008111828201881017156200008957600080fd5b82525081516020918201929091019080838360005b83811015620000b85781810151838201526020016200009e565b50505050905090810190601f168015620000e65780820380516001836020036101000a031916815260200191505b506040908152602082015190820151606083015160809093015186519295509093509082908290879087908790620001505760405162461bcd60e51b8152600401808060200182810382526022815260200180620026736022913960400191505060405180910390fd5b6001600160a01b038216620001ac576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c6964204e6561722070726f76657220616464726573730000000000604482015290519081900360640190fd5b8251620001c190600190602086019062000224565b50600080546001600160a01b039384166001600160a01b031991821617909155600280546001600160401b039093166001600160401b031990931692909217909155600480549590921694169390931790925560055550620002c0945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200026757805160ff191683800117855562000297565b8280016001018555821562000297579182015b82811115620002975782518255916020019190600101906200027a565b50620002a5929150620002a9565b5090565b5b80821115620002a55760008155600101620002aa565b6123a380620002d06000396000f3fe6080604052600436106100e85760003560e01c8063b8e9744c1161008a578063da72c1e811610059578063da72c1e8146105ba578063f48ab4e0146105fd578063f851a44014610605578063fc63e1291461061a576100e8565b8063b8e9744c1461036a578063bb00b69814610493578063be831a2e146104c4578063c0ee0b8a146104f4576100e8565b80634a00c629116100c65780634a00c62914610210578063530208f2146102cc5780635c975abb1461030557806384c1c5191461032c576100e8565b80630889bfe7146100ed5780631c420a20146101b55780632692c59f146101e6575b600080fd5b3480156100f957600080fd5b506101b36004803603606081101561011057600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561013f57600080fd5b82018360208201111561015157600080fd5b803590602001918460018302840111600160201b8311171561017257600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061062f945050505050565b005b3480156101c157600080fd5b506101ca6107ec565b604080516001600160401b039092168252519081900360200190f35b3480156101f257600080fd5b506101b36004803603602081101561020957600080fd5b50356107fb565b34801561021c57600080fd5b506101b36004803603604081101561023357600080fd5b810190602081018135600160201b81111561024d57600080fd5b82018360208201111561025f57600080fd5b803590602001918460018302840111600160201b8311171561028057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160401b031691506108179050565b3480156102d857600080fd5b506101b3600480360360408110156102ef57600080fd5b506001600160a01b0381351690602001356108ec565b34801561031157600080fd5b5061031a61093e565b60408051918252519081900360200190f35b34801561033857600080fd5b506103566004803603602081101561034f57600080fd5b5035610944565b604080519115158252519081900360200190f35b61041e6004803603604081101561038057600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156103aa57600080fd5b8201836020820111156103bc57600080fd5b803590602001918460018302840111600160201b831117156103dd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610959945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610458578181015183820152602001610440565b50505050905090810190601f1680156104855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561049f57600080fd5b506104a8610a2d565b604080516001600160a01b039092168252519081900360200190f35b3480156104d057600080fd5b506101b3600480360360408110156104e757600080fd5b5080359060200135610a3c565b34801561050057600080fd5b506101b36004803603606081101561051757600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561054657600080fd5b82018360208201111561055857600080fd5b803590602001918460018302840111600160201b8311171561057957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610939945050505050565b3480156105c657600080fd5b506101b3600480360360608110156105dd57600080fd5b506001600160a01b03813581169160208101359091169060400135610a57565b6101b3610a82565b34801561061157600080fd5b506104a8610a9b565b34801561062657600080fd5b5061041e610aaa565b600180600554166000148061064e57506004546001600160a01b031633145b61065757600080fd5b604080516370a0823160e01b815230600482015290516001600160801b03916106df9186916001600160a01b038916916370a0823191602480820192602092909190829003018186803b1580156106ad57600080fd5b505afa1580156106c1573d6000803e3d6000fd5b505050506040513d60208110156106d757600080fd5b505190610b37565b111561071c5760405162461bcd60e51b815260040180806020018281038252602c81526020018061224e602c913960400191505060405180910390fd5b6107316001600160a01b038516333086610b98565b336001600160a01b0316846001600160a01b03167fdd85dc56b5b4da387bf69c28ec19b1d66e793e0d51b567882fa31dc50bbd32c585856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107ab578181015183820152602001610793565b50505050905090810190601f1680156107d85780820380516001836020036101000a031916815260200191505b50935050505060405180910390a350505050565b6002546001600160401b031681565b6004546001600160a01b0316331461081257600080fd5b600555565b600280600554166000148061083657506004546001600160a01b031633145b61083f57600080fd5b610847611f76565b6108518484610bf8565b905061085b611fa3565b6108688260600151610ffa565b604081015181516020830151929350610894926001600160a01b031691906001600160801b03166110c0565b805160408083015181516001600160801b0390931683526001600160a01b0316602083015280517f5fd575e9a8dd4ba1e9f434728800fe78c3c5ffccfa6a852bc7415294ecc0c2d59281900390910190a15050505050565b6004546001600160a01b0316331461090357600080fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610939573d6000803e3d6000fd5b505050565b60055481565b60036020526000908152604090205460ff1681565b6004546060906001600160a01b0316331461097357600080fd5b60006060846001600160a01b0316846040518082805190602001908083835b602083106109b15780518252601f199092019160209182019101610992565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610a11576040519150601f19603f3d011682016040523d82523d6000602084013e610a16565b606091505b509150915081610a2557600080fd5b949350505050565b6000546001600160a01b031681565b6004546001600160a01b03163314610a5357600080fd5b9055565b6004546001600160a01b03163314610a6e57600080fd5b6109396001600160a01b03841683836110c0565b6004546001600160a01b03163314610a9957600080fd5b565b6004546001600160a01b031681565b60018054604080516020600284861615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b505050505081565b600082820183811015610b91576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bf290859061110e565b50505050565b610c00611f76565b6002546001600160401b039081169083161015610c64576040805162461bcd60e51b815260206004820152601f60248201527f50726f6f662069732066726f6d2074686520616e6369656e7420626c6f636b00604482015290519081900360640190fd5b60008054604080516392d68dfd60e01b81526001600160401b0386166024820152600481019182528651604482015286516001600160a01b03909316936392d68dfd93889388939092839260649092019160208701918190849084905b83811015610cd9578181015183820152602001610cc1565b50505050905090810190601f168015610d065780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015610d2457600080fd5b505afa158015610d38573d6000803e3d6000fd5b505050506040513d6020811015610d4e57600080fd5b5051610d99576040805162461bcd60e51b8152602060048201526015602482015274141c9bdbd9881cda1bdd5b19081899481d985b1a59605a1b604482015290519081900360640190fd5b610da1611fc3565b610daa846111bf565b9050610db4611fdd565b610dbd826111e5565b9050610dc882611227565b610e035760405162461bcd60e51b815260040180806020018281038252602c8152602001806122b6602c913960400191505060405180910390fd5b60008160000151604001516020015160200151600081518110610e2257fe5b6020908102919091018101516000818152600390925260409091205490915060ff1615610e805760405162461bcd60e51b81526004018080602001828103825260258152602001806122e26025913960400191505060405180910390fd5b60008181526003602052604090819020805460ff1916600190811790915590518154819083906002600019828416156101000201909116048015610efb5780601f10610ed9576101008083540402835291820191610efb565b820191906000526020600020905b815481529060010190602001808311610ee7575b5050915050604051809103902082600001516040015160200151608001518051906020012014610f5c5760405162461bcd60e51b81526004018080602001828103825260488152602001806121746048913960600191505060405180910390fd5b8160000151604001516020015160a001519350836040015115610fb05760405162461bcd60e51b815260040180806020018281038252603c81526020018061227a603c913960400191505060405180910390fd5b836020015115610ff15760405162461bcd60e51b815260040180806020018281038252603d815260200180612307603d913960400191505060405180910390fd5b50505092915050565b611002611fa3565b61100a611fc3565b611013836111bf565b9050600061102082611233565b905060ff811615611078576040805162461bcd60e51b815260206004820152601760248201527f4552525f4e4f545f57495448445241575f524553554c54000000000000000000604482015290519081900360640190fd5b611081826112b5565b6001600160801b031683526000611097836112e7565b606081901c6020860152905060006110ae846112e7565b60601c60408601525092949350505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526109399084905b6060611163826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166113239092919063ffffffff16565b8051909150156109395780806020019051602081101561118257600080fd5b50516109395760405162461bcd60e51b815260040180806020018281038252602a815260200180612344602a913960400191505060405180910390fd5b6111c7611fc3565b6040518060400160405280600081526020018381525090505b919050565b6111ed611fdd565b6111f682611332565b815261120182611366565b602082015261120f82611406565b604082015261121d82611366565b6060820152919050565b60208101515190511490565b600081600180826000015101826020015151101561128e576040805162461bcd60e51b8152602060048201526013602482015272426f7273683a204f7574206f662072616e676560681b604482015290519081900360640190fd5b602084015184518151811061129f57fe5b0160200151825190910190915260f81c92915050565b60006112c0826115ab565b6001600160401b0316905060406112d6836115ab565b6001600160401b0316901b17919050565b6000805b601481101561131d578060080261130184611233565b60f81b6001600160f81b031916901c91909117906001016112eb565b50919050565b6060610a2584846000856115d7565b61133a61201c565b61134382611366565b815261134e82611733565b602082015261135c826117a8565b6040820152919050565b61136e612043565b61137782611921565b63ffffffff166001600160401b038111801561139257600080fd5b506040519080825280602002602001820160405280156113cc57816020015b6113b9612056565b8152602001906001900390816113b15790505b50815260005b81515181101561131d576113e583611949565b82518051839081106113f357fe5b60209081029190910101526001016113d2565b61140e61206d565b61141782611733565b815261142282611733565b6020820152611430826119ad565b816040018190525060028082604001516101000151836020015160405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061149f5780518252601f199092019160209182019101611480565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa1580156114de573d6000803e3d6000fd5b5050506040513d60208110156114f357600080fd5b50518251604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b6020831061154b5780518252601f19909201916020918201910161152c565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa15801561158a573d6000803e3d6000fd5b5050506040513d602081101561159f57600080fd5b50516060820152919050565b60006115b682611921565b63ffffffff16905060206115c983611921565b63ffffffff16901b17919050565b6060824710156116185760405162461bcd60e51b81526004018080602001828103825260268152602001806121f36026913960400191505060405180910390fd5b61162185611a4a565b611672576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106116b15780518252601f199092019160209182019101611692565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611713576040519150601f19603f3d011682016040523d82523d6000602084013e611718565b606091505b5091509150611728828286611a50565b979650505050505050565b600081602080826000015101826020015151101561178e576040805162461bcd60e51b8152602060048201526013602482015272426f7273683a204f7574206f662072616e676560681b604482015290519081900360640190fd5b602080850151945190940190930151815190930190525090565b6117b0612099565b6117b982611733565b81526117c482611af4565b81602001819052506000816020015160c001515160010190506002600082901c60ff16600883901c60ff16601084901c60ff16601885901c60ff168660000151876020015160c00151604051602001808760ff1660f81b81526001018660ff1660f81b81526001018560ff1660f81b81526001018460ff1660f81b8152600101838152602001828051906020019060200280838360005b8381101561187357818101518382015260200161185b565b5050505090500196505050505050506040516020818303038152906040526040518082805190602001908083835b602083106118c05780518252601f1990920191602091820191016118a1565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa1580156118ff573d6000803e3d6000fd5b5050506040513d602081101561191457600080fd5b5051604083015250919050565b600061192c82611dc2565b61ffff169050601061193d83611dc2565b61ffff16901b17919050565b611951612056565b61195a82611733565b815261196582611233565b60ff16602082018190526002116111e05760405162461bcd60e51b81526004018080602001828103825260378152602001806121bc6037913960400191505060405180910390fd5b6119b56120b4565b6119c08260d0611de8565b6101008201526119cf826115ab565b6001600160401b031681526119e382611733565b60208201526119f182611733565b60408201526119ff82611733565b6060820152611a0d82611733565b6080820152611a1b826115ab565b6001600160401b031660a0820152611a3282611733565b60c0820152611a4082611733565b60e0820152919050565b3b151590565b60608315611a5f575081610b91565b825115611a6f5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611ab9578181015183820152602001611aa1565b50505050905090810190601f168015611ae65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b611afc612100565b611b0582611921565b63ffffffff166001600160401b0381118015611b2057600080fd5b50604051908082528060200260200182016040528015611b5457816020015b6060815260200190600190039081611b3f5790505b50815260005b815151811015611b8e57611b6d83611dfd565b8251805183908110611b7b57fe5b6020908102919091010152600101611b5a565b508151611b9a83611921565b63ffffffff166001600160401b0381118015611bb557600080fd5b50604051908082528060200260200182016040528015611bdf578160200160208202803683370190505b50602083015260005b826020015151811015611c2157611bfe84611733565b83602001518281518110611c0e57fe5b6020908102919091010152600101611be8565b50611c2b836115ab565b6001600160401b03166040830152611c42836112b5565b6001600160801b03166060830152611c5983611dfd565b6080830152611c6783611e94565b60a083015282518251516001016001600160401b0381118015611c8957600080fd5b50604051908082528060200260200182016040528015611cb3578160200160208202803683370190505b5060c0840152818452611cc884838303611de8565b8360c00151600081518110611cd957fe5b602090810291909101015280845260005b835151811015611dba57600284600001518281518110611d0657fe5b60200260200101516040518082805190602001908083835b60208310611d3d5780518252601f199092019160209182019101611d1e565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015611d7c573d6000803e3d6000fd5b5050506040513d6020811015611d9157600080fd5b505160c0850151805160018401908110611da757fe5b6020908102919091010152600101611cea565b505050919050565b6000611dcd82611233565b60ff1690506008611ddd83611233565b60ff16901b17919050565b6000610b918360200151846000015184611f54565b6060611e0882611921565b63ffffffff166001600160401b0381118015611e2357600080fd5b506040519080825280601f01601f191660200182016040528015611e4e576020820181803683370190505b50905060005b815181101561131d57611e6683611233565b60f81b828281518110611e7557fe5b60200101906001600160f81b031916908160001a905350600101611e54565b611e9c611f76565b611ea582611233565b60ff16808252611ebb57600160208201526111e0565b806000015160ff1660011415611ed757600160408201526111e0565b806000015160ff1660021415611efa57611ef082611dfd565b60608201526111e0565b806000015160ff1660031415611f1d57611f1382611733565b60808201526111e0565b60405162461bcd60e51b81526004018080602001828103825260358152602001806122196035913960400191505060405180910390fd5b6000611f5e612155565b6020818486602089010160025afa5051949350505050565b6040805160a081018252600080825260208201819052918101829052606080820152608081019190915290565b604080516060810182526000808252602082018190529181019190915290565b604051806040016040528060008152602001606081525090565b6040518060800160405280611ff061201c565b8152602001611ffd612043565b815260200161200a61206d565b8152602001612017612043565b905290565b604051806060016040528061202f612043565b815260006020820152604001612017612099565b6040518060200160405280606081525090565b604080518082019091526000808252602082015290565b604080516080810182526000808252602082015290810161208c6120b4565b8152600060209091015290565b6040805160608101909152600081526020810161208c612100565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6040518060e00160405280606081526020016060815260200160006001600160401b0316815260200160006001600160801b0316815260200160608152602001612148611f76565b8152602001606081525090565b6040518060200160405280600190602082028036833750919291505056fe43616e206f6e6c7920756e6c6f636b20746f6b656e732066726f6d20746865206c696e6b65642070726f6f662070726f6475636572206f6e204e65617220626c6f636b636861696e50726f6f664465636f6465723a204d65726b6c65506174684974656d20646972656374696f6e2073686f756c642062652030206f722031416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4e6561724465636f6465723a206465636f6465457865637574696f6e53746174757320696e646578206f7574206f662072616e67654d6178696d756d20746f6b656e73206c6f636b656420657863656564656420283c20325e313238202d20312943616e6e6f7420757365206661696c656420657865637574696f6e206f7574636f6d6520666f7220756e6c6f636b696e672074686520746f6b656e73417267756d656e742073686f756c6420626520657861637420626f7273682073657269616c697a6174696f6e546865206275726e206576656e742070726f6f662063616e6e6f742062652072657573656443616e6e6f742075736520756e6b6e6f776e20657865637574696f6e206f7574636f6d6520666f7220756e6c6f636b696e672074686520746f6b656e735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212206d64ebe7e8dc8585f64892cbd13c339ad76ab238b814ae2fd251f805a7149dd064736f6c634300060c0033496e76616c6964204e65617220546f6b656e20466163746f7279206164647265737300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000051ad3f020274910065dcb421629cd2e6e5b46c40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b8e11a1ad588863379a3e523b37d8c78070c16d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013666163746f72792e6272696467652e6e65617200000000000000000000000000
Deployed Bytecode
0x6080604052600436106100e85760003560e01c8063b8e9744c1161008a578063da72c1e811610059578063da72c1e8146105ba578063f48ab4e0146105fd578063f851a44014610605578063fc63e1291461061a576100e8565b8063b8e9744c1461036a578063bb00b69814610493578063be831a2e146104c4578063c0ee0b8a146104f4576100e8565b80634a00c629116100c65780634a00c62914610210578063530208f2146102cc5780635c975abb1461030557806384c1c5191461032c576100e8565b80630889bfe7146100ed5780631c420a20146101b55780632692c59f146101e6575b600080fd5b3480156100f957600080fd5b506101b36004803603606081101561011057600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561013f57600080fd5b82018360208201111561015157600080fd5b803590602001918460018302840111600160201b8311171561017257600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061062f945050505050565b005b3480156101c157600080fd5b506101ca6107ec565b604080516001600160401b039092168252519081900360200190f35b3480156101f257600080fd5b506101b36004803603602081101561020957600080fd5b50356107fb565b34801561021c57600080fd5b506101b36004803603604081101561023357600080fd5b810190602081018135600160201b81111561024d57600080fd5b82018360208201111561025f57600080fd5b803590602001918460018302840111600160201b8311171561028057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160401b031691506108179050565b3480156102d857600080fd5b506101b3600480360360408110156102ef57600080fd5b506001600160a01b0381351690602001356108ec565b34801561031157600080fd5b5061031a61093e565b60408051918252519081900360200190f35b34801561033857600080fd5b506103566004803603602081101561034f57600080fd5b5035610944565b604080519115158252519081900360200190f35b61041e6004803603604081101561038057600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156103aa57600080fd5b8201836020820111156103bc57600080fd5b803590602001918460018302840111600160201b831117156103dd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610959945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610458578181015183820152602001610440565b50505050905090810190601f1680156104855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561049f57600080fd5b506104a8610a2d565b604080516001600160a01b039092168252519081900360200190f35b3480156104d057600080fd5b506101b3600480360360408110156104e757600080fd5b5080359060200135610a3c565b34801561050057600080fd5b506101b36004803603606081101561051757600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561054657600080fd5b82018360208201111561055857600080fd5b803590602001918460018302840111600160201b8311171561057957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610939945050505050565b3480156105c657600080fd5b506101b3600480360360608110156105dd57600080fd5b506001600160a01b03813581169160208101359091169060400135610a57565b6101b3610a82565b34801561061157600080fd5b506104a8610a9b565b34801561062657600080fd5b5061041e610aaa565b600180600554166000148061064e57506004546001600160a01b031633145b61065757600080fd5b604080516370a0823160e01b815230600482015290516001600160801b03916106df9186916001600160a01b038916916370a0823191602480820192602092909190829003018186803b1580156106ad57600080fd5b505afa1580156106c1573d6000803e3d6000fd5b505050506040513d60208110156106d757600080fd5b505190610b37565b111561071c5760405162461bcd60e51b815260040180806020018281038252602c81526020018061224e602c913960400191505060405180910390fd5b6107316001600160a01b038516333086610b98565b336001600160a01b0316846001600160a01b03167fdd85dc56b5b4da387bf69c28ec19b1d66e793e0d51b567882fa31dc50bbd32c585856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107ab578181015183820152602001610793565b50505050905090810190601f1680156107d85780820380516001836020036101000a031916815260200191505b50935050505060405180910390a350505050565b6002546001600160401b031681565b6004546001600160a01b0316331461081257600080fd5b600555565b600280600554166000148061083657506004546001600160a01b031633145b61083f57600080fd5b610847611f76565b6108518484610bf8565b905061085b611fa3565b6108688260600151610ffa565b604081015181516020830151929350610894926001600160a01b031691906001600160801b03166110c0565b805160408083015181516001600160801b0390931683526001600160a01b0316602083015280517f5fd575e9a8dd4ba1e9f434728800fe78c3c5ffccfa6a852bc7415294ecc0c2d59281900390910190a15050505050565b6004546001600160a01b0316331461090357600080fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610939573d6000803e3d6000fd5b505050565b60055481565b60036020526000908152604090205460ff1681565b6004546060906001600160a01b0316331461097357600080fd5b60006060846001600160a01b0316846040518082805190602001908083835b602083106109b15780518252601f199092019160209182019101610992565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610a11576040519150601f19603f3d011682016040523d82523d6000602084013e610a16565b606091505b509150915081610a2557600080fd5b949350505050565b6000546001600160a01b031681565b6004546001600160a01b03163314610a5357600080fd5b9055565b6004546001600160a01b03163314610a6e57600080fd5b6109396001600160a01b03841683836110c0565b6004546001600160a01b03163314610a9957600080fd5b565b6004546001600160a01b031681565b60018054604080516020600284861615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b505050505081565b600082820183811015610b91576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bf290859061110e565b50505050565b610c00611f76565b6002546001600160401b039081169083161015610c64576040805162461bcd60e51b815260206004820152601f60248201527f50726f6f662069732066726f6d2074686520616e6369656e7420626c6f636b00604482015290519081900360640190fd5b60008054604080516392d68dfd60e01b81526001600160401b0386166024820152600481019182528651604482015286516001600160a01b03909316936392d68dfd93889388939092839260649092019160208701918190849084905b83811015610cd9578181015183820152602001610cc1565b50505050905090810190601f168015610d065780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015610d2457600080fd5b505afa158015610d38573d6000803e3d6000fd5b505050506040513d6020811015610d4e57600080fd5b5051610d99576040805162461bcd60e51b8152602060048201526015602482015274141c9bdbd9881cda1bdd5b19081899481d985b1a59605a1b604482015290519081900360640190fd5b610da1611fc3565b610daa846111bf565b9050610db4611fdd565b610dbd826111e5565b9050610dc882611227565b610e035760405162461bcd60e51b815260040180806020018281038252602c8152602001806122b6602c913960400191505060405180910390fd5b60008160000151604001516020015160200151600081518110610e2257fe5b6020908102919091018101516000818152600390925260409091205490915060ff1615610e805760405162461bcd60e51b81526004018080602001828103825260258152602001806122e26025913960400191505060405180910390fd5b60008181526003602052604090819020805460ff1916600190811790915590518154819083906002600019828416156101000201909116048015610efb5780601f10610ed9576101008083540402835291820191610efb565b820191906000526020600020905b815481529060010190602001808311610ee7575b5050915050604051809103902082600001516040015160200151608001518051906020012014610f5c5760405162461bcd60e51b81526004018080602001828103825260488152602001806121746048913960600191505060405180910390fd5b8160000151604001516020015160a001519350836040015115610fb05760405162461bcd60e51b815260040180806020018281038252603c81526020018061227a603c913960400191505060405180910390fd5b836020015115610ff15760405162461bcd60e51b815260040180806020018281038252603d815260200180612307603d913960400191505060405180910390fd5b50505092915050565b611002611fa3565b61100a611fc3565b611013836111bf565b9050600061102082611233565b905060ff811615611078576040805162461bcd60e51b815260206004820152601760248201527f4552525f4e4f545f57495448445241575f524553554c54000000000000000000604482015290519081900360640190fd5b611081826112b5565b6001600160801b031683526000611097836112e7565b606081901c6020860152905060006110ae846112e7565b60601c60408601525092949350505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526109399084905b6060611163826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166113239092919063ffffffff16565b8051909150156109395780806020019051602081101561118257600080fd5b50516109395760405162461bcd60e51b815260040180806020018281038252602a815260200180612344602a913960400191505060405180910390fd5b6111c7611fc3565b6040518060400160405280600081526020018381525090505b919050565b6111ed611fdd565b6111f682611332565b815261120182611366565b602082015261120f82611406565b604082015261121d82611366565b6060820152919050565b60208101515190511490565b600081600180826000015101826020015151101561128e576040805162461bcd60e51b8152602060048201526013602482015272426f7273683a204f7574206f662072616e676560681b604482015290519081900360640190fd5b602084015184518151811061129f57fe5b0160200151825190910190915260f81c92915050565b60006112c0826115ab565b6001600160401b0316905060406112d6836115ab565b6001600160401b0316901b17919050565b6000805b601481101561131d578060080261130184611233565b60f81b6001600160f81b031916901c91909117906001016112eb565b50919050565b6060610a2584846000856115d7565b61133a61201c565b61134382611366565b815261134e82611733565b602082015261135c826117a8565b6040820152919050565b61136e612043565b61137782611921565b63ffffffff166001600160401b038111801561139257600080fd5b506040519080825280602002602001820160405280156113cc57816020015b6113b9612056565b8152602001906001900390816113b15790505b50815260005b81515181101561131d576113e583611949565b82518051839081106113f357fe5b60209081029190910101526001016113d2565b61140e61206d565b61141782611733565b815261142282611733565b6020820152611430826119ad565b816040018190525060028082604001516101000151836020015160405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061149f5780518252601f199092019160209182019101611480565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa1580156114de573d6000803e3d6000fd5b5050506040513d60208110156114f357600080fd5b50518251604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b6020831061154b5780518252601f19909201916020918201910161152c565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa15801561158a573d6000803e3d6000fd5b5050506040513d602081101561159f57600080fd5b50516060820152919050565b60006115b682611921565b63ffffffff16905060206115c983611921565b63ffffffff16901b17919050565b6060824710156116185760405162461bcd60e51b81526004018080602001828103825260268152602001806121f36026913960400191505060405180910390fd5b61162185611a4a565b611672576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106116b15780518252601f199092019160209182019101611692565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611713576040519150601f19603f3d011682016040523d82523d6000602084013e611718565b606091505b5091509150611728828286611a50565b979650505050505050565b600081602080826000015101826020015151101561178e576040805162461bcd60e51b8152602060048201526013602482015272426f7273683a204f7574206f662072616e676560681b604482015290519081900360640190fd5b602080850151945190940190930151815190930190525090565b6117b0612099565b6117b982611733565b81526117c482611af4565b81602001819052506000816020015160c001515160010190506002600082901c60ff16600883901c60ff16601084901c60ff16601885901c60ff168660000151876020015160c00151604051602001808760ff1660f81b81526001018660ff1660f81b81526001018560ff1660f81b81526001018460ff1660f81b8152600101838152602001828051906020019060200280838360005b8381101561187357818101518382015260200161185b565b5050505090500196505050505050506040516020818303038152906040526040518082805190602001908083835b602083106118c05780518252601f1990920191602091820191016118a1565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa1580156118ff573d6000803e3d6000fd5b5050506040513d602081101561191457600080fd5b5051604083015250919050565b600061192c82611dc2565b61ffff169050601061193d83611dc2565b61ffff16901b17919050565b611951612056565b61195a82611733565b815261196582611233565b60ff16602082018190526002116111e05760405162461bcd60e51b81526004018080602001828103825260378152602001806121bc6037913960400191505060405180910390fd5b6119b56120b4565b6119c08260d0611de8565b6101008201526119cf826115ab565b6001600160401b031681526119e382611733565b60208201526119f182611733565b60408201526119ff82611733565b6060820152611a0d82611733565b6080820152611a1b826115ab565b6001600160401b031660a0820152611a3282611733565b60c0820152611a4082611733565b60e0820152919050565b3b151590565b60608315611a5f575081610b91565b825115611a6f5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611ab9578181015183820152602001611aa1565b50505050905090810190601f168015611ae65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b611afc612100565b611b0582611921565b63ffffffff166001600160401b0381118015611b2057600080fd5b50604051908082528060200260200182016040528015611b5457816020015b6060815260200190600190039081611b3f5790505b50815260005b815151811015611b8e57611b6d83611dfd565b8251805183908110611b7b57fe5b6020908102919091010152600101611b5a565b508151611b9a83611921565b63ffffffff166001600160401b0381118015611bb557600080fd5b50604051908082528060200260200182016040528015611bdf578160200160208202803683370190505b50602083015260005b826020015151811015611c2157611bfe84611733565b83602001518281518110611c0e57fe5b6020908102919091010152600101611be8565b50611c2b836115ab565b6001600160401b03166040830152611c42836112b5565b6001600160801b03166060830152611c5983611dfd565b6080830152611c6783611e94565b60a083015282518251516001016001600160401b0381118015611c8957600080fd5b50604051908082528060200260200182016040528015611cb3578160200160208202803683370190505b5060c0840152818452611cc884838303611de8565b8360c00151600081518110611cd957fe5b602090810291909101015280845260005b835151811015611dba57600284600001518281518110611d0657fe5b60200260200101516040518082805190602001908083835b60208310611d3d5780518252601f199092019160209182019101611d1e565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015611d7c573d6000803e3d6000fd5b5050506040513d6020811015611d9157600080fd5b505160c0850151805160018401908110611da757fe5b6020908102919091010152600101611cea565b505050919050565b6000611dcd82611233565b60ff1690506008611ddd83611233565b60ff16901b17919050565b6000610b918360200151846000015184611f54565b6060611e0882611921565b63ffffffff166001600160401b0381118015611e2357600080fd5b506040519080825280601f01601f191660200182016040528015611e4e576020820181803683370190505b50905060005b815181101561131d57611e6683611233565b60f81b828281518110611e7557fe5b60200101906001600160f81b031916908160001a905350600101611e54565b611e9c611f76565b611ea582611233565b60ff16808252611ebb57600160208201526111e0565b806000015160ff1660011415611ed757600160408201526111e0565b806000015160ff1660021415611efa57611ef082611dfd565b60608201526111e0565b806000015160ff1660031415611f1d57611f1382611733565b60808201526111e0565b60405162461bcd60e51b81526004018080602001828103825260358152602001806122196035913960400191505060405180910390fd5b6000611f5e612155565b6020818486602089010160025afa5051949350505050565b6040805160a081018252600080825260208201819052918101829052606080820152608081019190915290565b604080516060810182526000808252602082018190529181019190915290565b604051806040016040528060008152602001606081525090565b6040518060800160405280611ff061201c565b8152602001611ffd612043565b815260200161200a61206d565b8152602001612017612043565b905290565b604051806060016040528061202f612043565b815260006020820152604001612017612099565b6040518060200160405280606081525090565b604080518082019091526000808252602082015290565b604080516080810182526000808252602082015290810161208c6120b4565b8152600060209091015290565b6040805160608101909152600081526020810161208c612100565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6040518060e00160405280606081526020016060815260200160006001600160401b0316815260200160006001600160801b0316815260200160608152602001612148611f76565b8152602001606081525090565b6040518060200160405280600190602082028036833750919291505056fe43616e206f6e6c7920756e6c6f636b20746f6b656e732066726f6d20746865206c696e6b65642070726f6f662070726f6475636572206f6e204e65617220626c6f636b636861696e50726f6f664465636f6465723a204d65726b6c65506174684974656d20646972656374696f6e2073686f756c642062652030206f722031416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4e6561724465636f6465723a206465636f6465457865637574696f6e53746174757320696e646578206f7574206f662072616e67654d6178696d756d20746f6b656e73206c6f636b656420657863656564656420283c20325e313238202d20312943616e6e6f7420757365206661696c656420657865637574696f6e206f7574636f6d6520666f7220756e6c6f636b696e672074686520746f6b656e73417267756d656e742073686f756c6420626520657861637420626f7273682073657269616c697a6174696f6e546865206275726e206576656e742070726f6f662063616e6e6f742062652072657573656443616e6e6f742075736520756e6b6e6f776e20657865637574696f6e206f7574636f6d6520666f7220756e6c6f636b696e672074686520746f6b656e735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212206d64ebe7e8dc8585f64892cbd13c339ad76ab238b814ae2fd251f805a7149dd064736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000051ad3f020274910065dcb421629cd2e6e5b46c40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b8e11a1ad588863379a3e523b37d8c78070c16d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013666163746f72792e6272696467652e6e65617200000000000000000000000000
-----Decoded View---------------
Arg [0] : nearTokenFactory (bytes): 0x666163746f72792e6272696467652e6e656172
Arg [1] : prover (address): 0x051AD3F020274910065Dcb421629cd2e6E5b46c4
Arg [2] : minBlockAcceptanceHeight (uint64): 0
Arg [3] : _admin (address): 0xb8e11A1Ad588863379A3e523b37D8C78070C16D9
Arg [4] : pausedFlags (uint256): 0
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 000000000000000000000000051ad3f020274910065dcb421629cd2e6e5b46c4
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 000000000000000000000000b8e11a1ad588863379a3e523b37d8c78070c16d9
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [6] : 666163746f72792e6272696467652e6e65617200000000000000000000000000
Deployed Bytecode Sourcemap
45261:3138:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46406:440;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46406:440:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46406:440:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46406:440:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46406:440:0;;-1:-1:-1;46406:440:0;;-1:-1:-1;;;;;46406:440:0:i;:::-;;43047:39;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;43047:39:0;;;;;;;;;;;;;;22626:82;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22626:82:0;;:::i;46854:449::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46854:449:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46854:449:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46854:449:0;;-1:-1:-1;;;46854:449:0;;-1:-1:-1;;;;;46854:449:0;;-1:-1:-1;46854:449:0;;-1:-1:-1;46854:449:0:i;22855:128::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22855:128:0;;;;;;;;:::i;22205:18::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43127:43;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43127:43:0;;:::i;:::-;;;;;;;;;;;;;;;;;;23053:241;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23053:241:0;;;;;;;;;;;;;;;-1:-1:-1;;;23053:241:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23053:241:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23053:241:0;;-1:-1:-1;23053:241:0;;-1:-1:-1;;;;;23053:241:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42789:26;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;42789:26:0;;;;;;;;;;;;;;22716:131;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22716:131:0;;;;;;;:::i;48134:85::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48134:85:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48134:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48134:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48134:85:0;;-1:-1:-1;48134:85:0;;-1:-1:-1;;;;;48134:85:0:i;48227:169::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48227:169:0;;;;;;;;;;;;;;;;;:::i;22991:54::-;;;:::i;22178:20::-;;;;;;;;;;;;;:::i;42822:30::-;;;;;;;;;;;;;:::i;46406:440::-;45856:6;22564:4;22555:6;;:13;22573:1;22554:20;:43;;;-1:-1:-1;22592:5:0;;-1:-1:-1;;;;;22592:5:0;22578:10;:19;22554:43;22546:52;;;;;;46556:41:::1;::::0;;-1:-1:-1;;;46556:41:0;;46591:4:::1;46556:41;::::0;::::1;::::0;;;-1:-1:-1;;;;;46614:23:0;46556:53:::1;::::0;46602:6;;-1:-1:-1;;;;;46556:26:0;::::1;::::0;::::1;::::0;:41;;;;;::::1;::::0;;;;;;;;;:26;:41;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46556:41:0;;:45:::1;:53::i;:::-;:82;;46548:139;;;;-1:-1:-1::0;;;46548:139:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46698:68;-1:-1:-1::0;;;;;46698:33:0;::::1;46732:10;46752:4;46759:6:::0;46698:33:::1;:68::i;:::-;46808:10;-1:-1:-1::0;;;;;46782:56:0::1;46797:8;-1:-1:-1::0;;;;;46782:56:0::1;;46820:6;46828:9;46782:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46406:440:::0;;;;:::o;43047:39::-;;;-1:-1:-1;;;;;43047:39:0;;:::o;22626:82::-;22472:5;;-1:-1:-1;;;;;22472:5:0;22458:10;:19;22450:28;;;;;;22686:6:::1;:14:::0;22626:82::o;46854:449::-;45899:6;22564:4;22555:6;;:13;22573:1;22554:20;:43;;;-1:-1:-1;22592:5:0;;-1:-1:-1;;;;;22592:5:0;22578:10;:19;22554:43;22546:52;;;;;;46990:42:::1;;:::i;:::-;47035:50;47057:9;47068:16;47035:21;:50::i;:::-;46990:95;;47096:24;;:::i;:::-;47123:38;47141:6;:19;;;47123:17;:38::i;:::-;47206:16;::::0;::::1;::::0;47224:13;;47179:12:::1;::::0;::::1;::::0;47096:65;;-1:-1:-1;47172:66:0::1;::::0;-1:-1:-1;;;;;47172:33:0::1;::::0;47206:16;-1:-1:-1;;;;;47172:66:0::1;:33;:66::i;:::-;47263:13:::0;;47278:16:::1;::::0;;::::1;::::0;47254:41;;-1:-1:-1;;;;;47254:41:0;;::::1;::::0;;-1:-1:-1;;;;;47254:41:0::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;22609:1;;46854:449:::0;;;:::o;22855:128::-;22472:5;;-1:-1:-1;;;;;22472:5:0;22458:10;:19;22450:28;;;;;;22947::::1;::::0;-1:-1:-1;;;;;22947:20:0;::::1;::::0;:28;::::1;;;::::0;22968:6;;22947:28:::1;::::0;;;22968:6;22947:20;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;22855:128:::0;;:::o;22205:18::-;;;;:::o;43127:43::-;;;;;;;;;;;;;;;:::o;23053:241::-;22472:5;;23149:12;;-1:-1:-1;;;;;22472:5:0;22458:10;:19;22450:28;;;;;;23175:12:::1;23189:18;23211:6;-1:-1:-1::0;;;;;23211:19:0::1;23231:4;23211:25;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;23211:25:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23174:62;;;;23255:7;23247:16;;;::::0;::::1;;23281:5:::0;23053:241;-1:-1:-1;;;;23053:241:0:o;42789:26::-;;;-1:-1:-1;;;;;42789:26:0;;:::o;22716:131::-;22472:5;;-1:-1:-1;;;;;22472:5:0;22458:10;:19;22450:28;;;;;;22811:18;;22716:131::o;48227:169::-;22472:5;;-1:-1:-1;;;;;22472:5:0;22458:10;:19;22450:28;;;;;;48349:39:::1;-1:-1:-1::0;;;;;48349:18:0;::::1;48368:11:::0;48381:6;48349:18:::1;:39::i;22991:54::-:0;22472:5;;-1:-1:-1;;;;;22472:5:0;22458:10;:19;22450:28;;;;;;22991:54::o;22178:20::-;;;-1:-1:-1;;;;;22178:20:0;;:::o;42822:30::-;;;;;;;;;;;;;;;-1:-1:-1;;42822:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5604:179::-;5662:7;5694:5;;;5718:6;;;;5710:46;;;;;-1:-1:-1;;;5710:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5774:1;5604:179;-1:-1:-1;;;5604:179:0:o;19151:205::-;19279:68;;;-1:-1:-1;;;;;19279:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19279:68:0;-1:-1:-1;;;19279:68:0;;;19252:96;;19272:5;;19252:19;:96::i;:::-;19151:205;;;;:::o;43742:1432::-;43858:42;;:::i;:::-;43946:25;;-1:-1:-1;;;;;43946:25:0;;;43926:45;;;;;43918:89;;;;;-1:-1:-1;;;43918:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44026:7;;;:49;;;-1:-1:-1;;;44026:49:0;;-1:-1:-1;;;;;44026:49:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44026:7:0;;;;:20;;44047:9;;44058:16;;44026:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44026:49:0;44018:83;;;;;-1:-1:-1;;;44018:83:0;;;;;;;;;;;;-1:-1:-1;;;44018:83:0;;;;;;;;;;;;;;;44178:27;;:::i;:::-;44208:21;44219:9;44208:10;:21::i;:::-;44178:51;;44240:53;;:::i;:::-;44296:34;:9;:32;:34::i;:::-;44240:90;;44349:20;:9;:18;:20::i;:::-;44341:77;;;;-1:-1:-1;;;44341:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44431:17;44451:16;:30;;;:46;;;:54;;;:66;;;44518:1;44451:69;;;;;;;;;;;;;;;;;;;44540:22;;;;:11;:22;;;;;;;;44451:69;;-1:-1:-1;44540:22:0;;44539:23;44531:73;;;;-1:-1:-1;;;44531:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44615:22;;;;:11;:22;;;;;;;:29;;-1:-1:-1;;44615:29:0;44640:4;44615:29;;;;;;44763:28;;;;;;44640:4;;44763:28;-1:-1:-1;;44763:28:0;;;;44615:29;44763:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44675:16;:30;;;:46;;;:54;;;:66;;;44665:77;;;;;;:126;44657:228;;;;-1:-1:-1;;;44657:228:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44907:16;:30;;;:46;;;:54;;;:61;;;44898:70;;44988:6;:13;;;44987:14;44979:87;;;;-1:-1:-1;;;44979:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45086:6;:14;;;45085:15;45077:89;;;;-1:-1:-1;;;45077:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43742:1432;;;;;;;:::o;47311:522::-;47379:24;;:::i;:::-;47416:27;;:::i;:::-;47446:16;47457:4;47446:10;:16::i;:::-;47416:46;;47473:10;47486:20;:9;:18;:20::i;:::-;47473:33;-1:-1:-1;47525:9:0;;;;47517:45;;;;;-1:-1:-1;;;47517:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47589:22;:9;:20;:22::i;:::-;-1:-1:-1;;;;;47573:38:0;;;:13;47638:25;:9;:23;:25::i;:::-;47697:14;;;;47674:12;;;:38;47622:41;-1:-1:-1;47723:17:0;47743:25;:9;:23;:25::i;:::-;47806:18;;47779:16;;;:46;-1:-1:-1;47779:6:0;;47311:522;-1:-1:-1;;;;47311:522:0:o;18966:177::-;19076:58;;;-1:-1:-1;;;;;19076:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19076:58:0;-1:-1:-1;;;19076:58:0;;;19049:86;;19069:5;;21271:761;21695:23;21721:69;21749:4;21721:69;;;;;;;;;;;;;;;;;21729:5;-1:-1:-1;;;;;21721:27:0;;;:69;;;;;:::i;:::-;21805:17;;21695:95;;-1:-1:-1;21805:21:0;21801:224;;21947:10;21936:30;;;;;;;;;;;;;;;-1:-1:-1;21936:30:0;21928:85;;;;-1:-1:-1;;;21928:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23529:123;23585:11;;:::i;:::-;23616:28;;;;;;;;23630:1;23616:28;;;;23638:4;23616:28;;;23609:35;;23529:123;;;;:::o;35956:375::-;36035:29;;:::i;:::-;36099:43;:4;:41;:43::i;:::-;36077:65;;36180:23;:4;:21;:23::i;:::-;36153:24;;;:50;36240:29;:4;:27;:29::i;:::-;36214:23;;;:55;36300:23;:4;:21;:23::i;:::-;36280:17;;;:43;:5;35956:375;-1:-1:-1;35956:375:0:o;23845:121::-;23943:8;;;;:15;23928:11;;:30;;23845:121::o;25029:142::-;25103:11;25085:4;25091:1;23759:4;23745;:11;;;:18;23726:4;:8;;;:15;:37;;23718:69;;;;;-1:-1:-1;;;23718:69:0;;;;;;;;;;;;-1:-1:-1;;;23718:69:0;;;;;;;;;;;;;;;25141:8:::1;::::0;::::1;::::0;25150:11;;25141:21;;;::::1;;;;;::::0;::::1;::::0;;23810:19;;;;;;;;25141:21:::1;;::::0;25029:142;-1:-1:-1;;25029:142:0:o;26410:179::-;26471:13;26513:15;26523:4;26513:9;:15::i;:::-;-1:-1:-1;;;;;26505:24:0;26497:32;;26578:2;26558:15;26568:4;26558:9;:15::i;:::-;-1:-1:-1;;;;;26550:24:0;:30;;26540:41;;26410:179;-1:-1:-1;26410:179:0:o;27877:210::-;27941:13;;27967:113;27988:2;27984:1;:6;27967:113;;;28062:1;28066;28062:5;28034:14;28043:4;28034:8;:14::i;:::-;28029:20;;-1:-1:-1;;;;;;28029:27:0;28021:47;;28012:56;;;;;27992:3;;27967:113;;;;27877:210;;;:::o;13961:195::-;14064:12;14096:52;14118:6;14126:4;14132:1;14135:12;14096:21;:52::i;42027:354::-;42147:45;;:::i;:::-;42226:23;:4;:21;:23::i;:::-;42210:39;;42281:20;:4;:18;:20::i;:::-;42260:18;;;:41;42338:35;:4;:33;:35::i;:::-;42312:23;;;:61;:7;42027:354;-1:-1:-1;42027:354:0:o;41568:292::-;41641:22;;:::i;:::-;41710:16;:4;:14;:16::i;:::-;41689:38;;-1:-1:-1;;;;;41689:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;41676:51:0;;:10;41738:115;41759:10;;:17;41755:21;;41738:115;;;41814:27;:4;:25;:27::i;:::-;41798:10;;:13;;41809:1;;41798:13;;;;;;;;;;;;;;;:43;41778:3;;41738:115;;36538:517;36617:30;;:::i;:::-;36685:20;:4;:18;:20::i;:::-;36660:45;;36741:20;:4;:18;:20::i;:::-;36716:22;;;:45;36792:33;:4;:31;:33::i;:::-;36772:6;:17;;:53;;;;36852:195;36908:72;36932:6;:17;;;:22;;;36956:6;:22;;;36915:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36908:72;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36908:72:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36908:72:0;;;;;;;;;;;;;;;;;;-1:-1:-1;36908:72:0;;-1:-1:-1;;36908:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36908:72:0;36999:22;;36873:163;;;36908:72;36873:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36852:195;;36873:163;;;;;;36852:195;;;;36873:163;36852:195;;;;;;;;;;;-1:-1:-1;;36852:195:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36852:195:0;;;;;;;;;;;;;;;;;;-1:-1:-1;36852:195:0;;-1:-1:-1;;36852:195:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36852:195:0;36838:11;;;:209;:6;36538:517;-1:-1:-1;36538:517:0:o;26047:175::-;26107:12;26147:15;26157:4;26147:9;:15::i;:::-;26140:23;;26132:31;;26211:2;26191:15;26201:4;26191:9;:15::i;:::-;26184:23;;:29;;26174:40;;26047:175;-1:-1:-1;26047:175:0:o;15013:530::-;15140:12;15198:5;15173:21;:30;;15165:81;;;;-1:-1:-1;;;15165:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15265:18;15276:6;15265:10;:18::i;:::-;15257:60;;;;;-1:-1:-1;;;15257:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15391:12;15405:23;15432:6;-1:-1:-1;;;;;15432:11:0;15452:5;15460:4;15432:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15432:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15390:75;;;;15483:52;15501:7;15510:10;15522:12;15483:17;:52::i;:::-;15476:59;15013:530;-1:-1:-1;;;;;;;15013:530:0:o;27538:331::-;27618:13;27599:4;27605:2;23759:4;23745;:11;;;:18;23726:4;:8;;;:15;:37;;23718:69;;;;;-1:-1:-1;;;23718:69:0;;;;;;;;;;;;-1:-1:-1;;;23718:69:0;;;;;;;;;;;;;;;27663:8:::1;::::0;;::::1;::::0;27699:11;;27825:25;;;;;;27819:32;23810:19;;;;;;;-1:-1:-1;27819:32:0;27538:331::o;40392:687::-;40504:37;;:::i;:::-;40572:20;:4;:18;:20::i;:::-;40559:33;;40621:29;:4;:27;:29::i;:::-;40603:7;:15;;:47;;;;40663:11;40681:7;:15;;;:36;;;:43;40677:1;:47;40663:61;;40750:321;40820:1;40813:3;:8;;40825:4;40812:17;40863:1;40856:3;:8;;40868:4;40855:17;40906:2;40899:3;:9;;40912:4;40898:18;40950:2;40943:3;:9;;40956:4;40942:18;40980:7;:10;;;41009:7;:15;;;:36;;;40771:289;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40750:321;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40750:321:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40750:321:0;;;;;;;;;;;;;;;;;;-1:-1:-1;40750:321:0;;-1:-1:-1;;40750:321:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40750:321:0;40735:12;;;:336;-1:-1:-1;40735:7:0;40392:687;-1:-1:-1;40392:687:0:o;25684:175::-;25744:12;25784:15;25794:4;25784:9;:15::i;:::-;25777:23;;25769:31;;25848:2;25828:15;25838:4;25828:9;:15::i;:::-;25821:23;;:29;;25811:40;;25684:175;-1:-1:-1;25684:175:0:o;41197:296::-;41274:26;;:::i;:::-;41325:20;:4;:18;:20::i;:::-;41313:32;;41373:15;:4;:13;:15::i;:::-;41356:32;;:14;;;:32;;;41424:1;-1:-1:-1;41399:86:0;;;;-1:-1:-1;;;41399:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34845:616;34955:34;;:::i;:::-;35021:20;:4;35037:3;35021:15;:20::i;:::-;35007:11;;;:34;35068:16;:4;:14;:16::i;:::-;-1:-1:-1;;;;;35052:32:0;;;35113:20;:4;:18;:20::i;:::-;35095:15;;;:38;35167:20;:4;:18;:20::i;:::-;35144;;;:43;35223:20;:4;:18;:20::i;:::-;35198:22;;;:45;35276:20;:4;:18;:20::i;:::-;35254:19;;;:42;35326:16;:4;:14;:16::i;:::-;-1:-1:-1;;;;;35307:35:0;:16;;;:35;35375:20;:4;:18;:20::i;:::-;35353:19;;;:42;35433:20;:4;:18;:20::i;:::-;35406:24;;;:47;:6;34845:616;-1:-1:-1;34845:616:0:o;11043:422::-;11410:20;11449:8;;;11043:422::o;17553:742::-;17668:12;17697:7;17693:595;;;-1:-1:-1;17728:10:0;17721:17;;17693:595;17842:17;;:21;17838:439;;18105:10;18099:17;18166:15;18153:10;18149:2;18145:19;18138:44;18053:148;18248:12;18241:20;;-1:-1:-1;;;18241:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39078:1137;39157:31;;:::i;:::-;39228:16;:4;:14;:16::i;:::-;39216:29;;-1:-1:-1;;;;;39216:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39201:44:0;;:12;39256:110;39277:12;;:19;39273:23;;39256:110;;;39336:18;:4;:16;:18::i;:::-;39318:12;;:15;;39331:1;;39318:15;;;;;;;;;;;;;;;:36;39298:3;;39256:110;;;-1:-1:-1;39394:11:0;;39452:16;39394:4;39452:14;:16::i;:::-;39438:31;;-1:-1:-1;;;;;39438:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39438:31:0;-1:-1:-1;39416:19:0;;;:53;39485:6;39480:126;39501:7;:19;;;:26;39497:1;:30;39480:126;;;39574:20;:4;:18;:20::i;:::-;39549:7;:19;;;39569:1;39549:22;;;;;;;;;;;;;;;;;:45;39529:3;;39480:126;;;;39636:16;:4;:14;:16::i;:::-;-1:-1:-1;;;;;39616:36:0;:17;;;:36;39686:17;:4;:15;:17::i;:::-;-1:-1:-1;;;;;39663:40:0;:20;;;:40;39736:18;:4;:16;:18::i;:::-;39714:19;;;:40;39782:28;:4;:26;:28::i;:::-;39765:14;;;:45;39836:11;;39909:12;;:19;39905:1;:23;-1:-1:-1;;;;;39891:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39891:38:0;-1:-1:-1;39860:28:0;;;:69;39940:19;;;40004:29;39940:4;40020:12;;;40004:15;:29::i;:::-;39970:7;:28;;;39999:1;39970:31;;;;;;;;;;;;;;;;;:63;40044:18;;;:11;40073:135;40094:12;;:19;40090:23;;40073:135;;;40173:23;40180:7;:12;;;40193:1;40180:15;;;;;;;;;;;;;;40173:23;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40173:23:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40173:23:0;;;;;;;;;;;;;;;;;;-1:-1:-1;40173:23:0;;-1:-1:-1;;40173:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40173:23:0;40135:28;;;;:35;;40168:1;40164:5;;;40135:35;;;;;;;;;;;;;;;:61;40115:3;;40073:135;;;;39078:1137;;;;;:::o;25327:172::-;25387:12;25427:14;25436:4;25427:8;:14::i;:::-;25420:22;;25412:30;;25489:1;25470:14;25479:4;25470:8;:14::i;:::-;25463:22;;:27;;25453:38;;25327:172;-1:-1:-1;25327:172:0:o;24467:154::-;24544:7;24571:42;24583:4;:8;;;24593:4;:11;;;24606:6;24571:11;:42::i;27287:243::-;27349:18;27398:15;27408:4;27398:9;:15::i;:::-;27388:26;;-1:-1:-1;;;;;27388:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27388:26:0;;27380:34;;27430:6;27425:98;27446:5;:12;27442:1;:16;27425:98;;;27496:14;27505:4;27496:8;:14::i;:::-;27491:20;;27480:5;27486:1;27480:8;;;;;;;;;;;:31;-1:-1:-1;;;;;27480:31:0;;;;;;;;-1:-1:-1;27460:3:0;;27425:98;;37481:941;37586:38;;:::i;:::-;37670:15;:4;:13;:15::i;:::-;37642:43;;;;;37696:719;;37773:4;37747:23;;;:30;37696:719;;;37799:15;:25;;;:30;;37828:1;37799:30;37795:620;;;38061:4;38036:22;;;:29;37795:620;;;38087:15;:25;;;:30;;38116:1;38087:30;38083:332;;;38165:18;:4;:16;:18::i;:::-;38134:28;;;:49;38083:332;;;38205:15;:25;;;:30;;38234:1;38205:30;38201:214;;;38287:20;:4;:18;:20::i;:::-;38252:32;;;:55;38201:214;;;38340:63;;-1:-1:-1;;;38340:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24629:392;24757:7;24777:24;;:::i;:::-;24972:2;24964:6;24956;24947;24942:2;24937:3;24933:12;24929:25;24923:4;24916:5;24905:70;-1:-1:-1;25004:9:0;;;-1:-1:-1;;;;24629:392:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://6d64ebe7e8dc8585f64892cbd13c339ad76ab238b814ae2fd251f805a7149dd0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 77.24% | $0.999808 | 18,035,800.3114 | $18,032,337.44 | |
ETH | 21.85% | $1 | 5,101,126.0756 | $5,101,126.08 | |
ETH | 0.39% | $0.999766 | 91,922.3965 | $91,900.89 | |
ETH | 0.36% | $101,637 | 0.8172 | $83,060.65 | |
ETH | 0.07% | $0.000073 | 229,999,679 | $16,803.78 | |
ETH | 0.03% | $2,244.19 | 3.1452 | $7,058.32 | |
ETH | 0.03% | $0.07008 | 85,821.4844 | $6,014.37 | |
ETH | 0.01% | $0.401113 | 6,110.302 | $2,450.92 | |
ETH | <0.01% | $0.99918 | 1,909.1029 | $1,907.54 | |
ETH | <0.01% | $2.62 | 677.6843 | $1,775.53 | |
ETH | <0.01% | $6.63 | 109.8436 | $728.26 | |
ETH | <0.01% | $11.91 | 51.6837 | $615.55 | |
ETH | <0.01% | $0.072441 | 7,308.64 | $529.45 | |
ETH | <0.01% | $0.012556 | 11,419.0421 | $143.38 | |
ETH | <0.01% | $0.998223 | 107.1663 | $106.98 | |
ETH | <0.01% | $0.035402 | 2,824.1808 | $99.98 | |
ETH | <0.01% | $0.171397 | 516.8605 | $88.59 | |
ETH | <0.01% | $1,763.5 | 0.0452 | $79.77 | |
ETH | <0.01% | $0.058977 | 999.962 | $58.97 | |
ETH | <0.01% | $0.115519 | 425.1643 | $49.11 | |
ETH | <0.01% | $232.42 | 0.2049 | $47.63 | |
ETH | <0.01% | $1.95 | 19.72 | $38.45 | |
ETH | <0.01% | $0.016066 | 2,369.7296 | $38.07 | |
ETH | <0.01% | $0.000021 | 1,578,637.7042 | $33.5 | |
ETH | <0.01% | $0.550165 | 54.623 | $30.05 | |
ETH | <0.01% | $0.007974 | 1,610.817 | $12.84 | |
ETH | <0.01% | $0.00124 | 9,678.6499 | $12 | |
ETH | <0.01% | $0.00054 | 21,913.4091 | $11.84 | |
ETH | <0.01% | $0.656898 | 16.6293 | $10.92 | |
ETH | <0.01% | $0.143395 | 73.358 | $10.52 | |
ETH | <0.01% | $0.0015 | 6,800 | $10.2 | |
ETH | <0.01% | $0.063219 | 143.2337 | $9.06 | |
ETH | <0.01% | $0.0758 | 84 | $6.37 | |
ETH | <0.01% | $0.014913 | 209.6181 | $3.13 | |
ETH | <0.01% | $0.003401 | 917.3588 | $3.12 | |
ETH | <0.01% | $0.171805 | 15 | $2.58 | |
ETH | <0.01% | $0.519386 | 4.6082 | $2.39 | |
ETH | <0.01% | $0.999211 | 2 | $2 | |
ETH | <0.01% | $0.218861 | 8.32 | $1.82 | |
ETH | <0.01% | $0.01998 | 70.2995 | $1.4 | |
ETH | <0.01% | $0.013772 | 100.0059 | $1.38 | |
ETH | <0.01% | $27.14 | 0.05 | $1.36 | |
ETH | <0.01% | $1.14 | 1 | $1.14 | |
ETH | <0.01% | $0.968417 | 1 | $0.9684 | |
ETH | <0.01% | $46.42 | 0.02 | $0.9284 | |
ETH | <0.01% | $0.001004 | 489.0991 | $0.4908 | |
ETH | <0.01% | $0.000262 | 1,000 | $0.2624 | |
BSC | <0.01% | $2,266.31 | 0.0181 | $41.09 | |
BASE | <0.01% | $0.001233 | 4,324.6182 | $5.33 | |
BASE | <0.01% | <$0.000001 | 295,774,647 | $3.02 | |
BASE | <0.01% | $0.00 | 100 | $0.00 | |
POL | <0.01% | $0.00 | 0.0001 | $0.00 |
Loading...
Loading
Loading...
Loading
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.