Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x694e17322a594c132a696d979c44979c011318ec3f9cbec2a21a9e80755c549c | Claim | (pending) | 10 days ago | IN | 0 ETH | (Pending) | |||
Claim | 21479711 | 12 mins ago | IN | 0 ETH | 0.00096904 | ||||
Claim | 21479646 | 25 mins ago | IN | 0 ETH | 0.00087636 | ||||
Claim | 21479448 | 1 hr ago | IN | 0 ETH | 0.00080007 | ||||
Claim | 21479113 | 2 hrs ago | IN | 0 ETH | 0.00066656 | ||||
Claim | 21478857 | 3 hrs ago | IN | 0 ETH | 0.00097566 | ||||
Claim | 21478431 | 4 hrs ago | IN | 0 ETH | 0.0005218 | ||||
Claim | 21476765 | 10 hrs ago | IN | 0 ETH | 0.0007004 | ||||
Claim | 21476170 | 12 hrs ago | IN | 0 ETH | 0.00054137 | ||||
Claim | 21475298 | 14 hrs ago | IN | 0 ETH | 0.00062502 | ||||
Claim | 21474630 | 17 hrs ago | IN | 0 ETH | 0.00101409 | ||||
Claim | 21474385 | 18 hrs ago | IN | 0 ETH | 0.00110021 | ||||
Claim | 21474237 | 18 hrs ago | IN | 0 ETH | 0.00131574 | ||||
Claim | 21474098 | 19 hrs ago | IN | 0 ETH | 0.00147121 | ||||
Claim | 21474009 | 19 hrs ago | IN | 0 ETH | 0.0009861 | ||||
Claim | 21473740 | 20 hrs ago | IN | 0 ETH | 0.00102397 | ||||
Claim | 21473692 | 20 hrs ago | IN | 0 ETH | 0.0012235 | ||||
Claim | 21473387 | 21 hrs ago | IN | 0 ETH | 0.00168812 | ||||
Claim | 21472407 | 24 hrs ago | IN | 0 ETH | 0.00105295 | ||||
Claim | 21472297 | 25 hrs ago | IN | 0 ETH | 0.0009868 | ||||
Claim | 21472242 | 25 hrs ago | IN | 0 ETH | 0.00094042 | ||||
Claim | 21472002 | 26 hrs ago | IN | 0 ETH | 0.00063338 | ||||
Claim | 21471778 | 26 hrs ago | IN | 0 ETH | 0.00102342 | ||||
Claim | 21471226 | 28 hrs ago | IN | 0 ETH | 0.00092192 | ||||
Claim | 21470517 | 31 hrs ago | IN | 0 ETH | 0.0007402 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
LunexClaiming
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-10-12 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 ); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 value ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * 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. */ function functionCall( address target, bytes memory data ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall( address target, bytes memory data ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall( address target, bytes memory data ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult( bool success, bytes memory returndata ) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; /** * @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 Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance( address spender, uint256 currentAllowance, uint256 requestedDecrease ); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeCall(token.transferFrom, (from, to, value)) ); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance( IERC20 token, address spender, uint256 requestedDecrease ) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance( spender, currentAllowance, requestedDecrease ); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove( IERC20 token, address spender, uint256 value ) internal { bytes memory approvalCall = abi.encodeCall( token.approve, (spender, value) ); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn( token, abi.encodeCall(token.approve, (spender, 0)) ); _callOptionalReturn(token, approvalCall); } } /** * @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); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool( IERC20 token, bytes memory data ) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.20; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the Merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates Merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** *@dev The multiproof provided is not valid. */ error MerkleProofInvalidMultiproof(); /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. */ function processProof( bytes32[] memory proof, bytes32 leaf ) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} */ function processProofCalldata( bytes32[] calldata proof, bytes32 leaf ) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the Merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the Merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Sorts the pair (a, b) and hashes the result. */ function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } /** * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory. */ function _efficientHash( bytes32 a, bytes32 b ) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: kangamoonclaim.sol pragma solidity ^0.8.24; contract LunexClaiming is Ownable, ReentrancyGuard { using SafeERC20 for IERC20; address private token_wallet; IERC20 private token; bytes32 public root; enum Stage { STAGE_1, STAGE_2, STAGE_3, STAGE_4, STAGE_5, STAGE_6, STAGE_7, STAGE_8, STAGE_9, STAGE_10, STAGE_11, STAGE_12, STAGE_13, STAGE_14, STAGE_15, STAGE_16, STAGE_17, STAGE_18, STAGE_19, STAGE_20, STAGE_21, STAGE_22, STAGE_23, STAGE_24, STAGE_25, STAGE_26, STAGE_27 } mapping(address => bool) public userInitialized; mapping(address => uint256) public userBalance; mapping(address => uint256) public tokensClaimed; mapping(address => mapping(Stage => bool)) public userStageClaimed; mapping(uint8 => bool) public stageEnded; // Use uint8 for lower gas cost // mapping(address => mapping(uint8 => bool)) public isClaimed; mapping(uint8 => uint256) public claimableAmounts; event Claimed( address indexed tokenAddress, address indexed user, uint256 amount, uint256 indexed timestamp ); constructor(address _token, bytes32 _root, address _tokenWallet) Ownable(msg.sender) { token = IERC20(_token); root = _root; token_wallet = _tokenWallet; } function getTokenWallet() public view returns(address) { return token_wallet; } function setTokenWallet(address _tokenWallet) external onlyOwner { token_wallet = _tokenWallet; } // Function to mark the end of a presale stage by the owner function endStageAndSetRoot( Stage _stage, bytes32 _newRoot ) external onlyOwner { uint8 stageIndex = uint8(_stage); require(!stageEnded[stageIndex], "Stage already ended."); stageEnded[stageIndex] = true; // Set the new root for the next stage setRoot(_newRoot); } // Function to verify Merkle proof function isValid( bytes32[] memory proof, bytes32 leaf ) public view returns (bool) { return MerkleProof.verify(proof, root, leaf); } // Function to set Merkle root function setRoot(bytes32 _root) public onlyOwner { root = _root; } function getCurrentStage() external view returns (Stage) { for (uint8 i = 0; i <= uint8(Stage.STAGE_27); i++) { if (!stageEnded[i]) { return Stage(i); } } revert("All stages have ended"); } // Claim function for users to claim tokens for the current and previous unclaimed stages function Claim( uint256 _amount, Stage _currentStage, bytes32[] memory proof ) external nonReentrant { require(msg.sender != address(0), "CONTRACT: Caller is zero address"); require(address(token) != address(0), "CONTRACT: Token is not set."); require(token_wallet != address(0), "CONTRACT: Token wallet is not configured"); require(!userStageClaimed[msg.sender][_currentStage], "Already Claimed"); uint8 currentStageIndex = uint8(_currentStage); require( stageEnded[currentStageIndex], "Current stage has not ended yet." ); require( isValid( proof, keccak256( bytes.concat(keccak256(abi.encode(msg.sender, _amount))) ) ), "Caller not whitelisted" ); if (!userInitialized[msg.sender]) { userInitialized[msg.sender] = true; userBalance[msg.sender] = _amount; } uint256 claimAmount = 0; // Cache claim status to memory to reduce gas cost // Check if user has unclaimed balances from the current and previous stages uint256 balance = userBalance[msg.sender]; claimAmount += balance; require(claimAmount > 0, "No tokens to claim."); require(claimAmount <= balance, "Invalid claim amount."); userBalance[msg.sender] -= claimAmount; tokensClaimed[msg.sender] += claimAmount; // Transfer tokens to the user token.safeTransferFrom(token_wallet, msg.sender, claimAmount); // Update tokens claimed by the user userStageClaimed[msg.sender][_currentStage] = true; userInitialized[msg.sender] = false; // Emit event for the claim emit Claimed(address(token), msg.sender, claimAmount, block.timestamp); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"address","name":"_tokenWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"enum LunexClaiming.Stage","name":"_currentStage","type":"uint8"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"Claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"claimableAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum LunexClaiming.Stage","name":"_stage","type":"uint8"},{"internalType":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"endStageAndSetRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentStage","outputs":[{"internalType":"enum LunexClaiming.Stage","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenWallet","type":"address"}],"name":"setTokenWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"stageEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokensClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"enum LunexClaiming.Stage","name":"","type":"uint8"}],"name":"userStageClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561000f575f80fd5b506040516122dd3803806122dd8339818101604052810190610031919061029a565b335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100a2575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161009991906102f9565b60405180910390fd5b6100b18161014860201b60201c565b50600180819055508260035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816004819055508060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050610312565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6102368261020d565b9050919050565b6102468161022c565b8114610250575f80fd5b50565b5f815190506102618161023d565b92915050565b5f819050919050565b61027981610267565b8114610283575f80fd5b50565b5f8151905061029481610270565b92915050565b5f805f606084860312156102b1576102b0610209565b5b5f6102be86828701610253565b93505060206102cf86828701610286565b92505060406102e086828701610253565b9150509250925092565b6102f38161022c565b82525050565b5f60208201905061030c5f8301846102ea565b92915050565b611fbe8061031f5f395ff3fe608060405234801561000f575f80fd5b5060043610610109575f3560e01c8063715018a6116100a0578063c088b2571161006f578063c088b257146102c7578063dab5f340146102f7578063ebf0c71714610313578063eedbe31d14610331578063f2fde38b1461034f57610109565b8063715018a6146102535780638da5cb5b1461025d578063a621344a1461027b578063b8a20ed01461029757610109565b80633bb10ff8116100dc5780633bb10ff8146101b9578063624601b6146101d55780636b5d3f79146102055780636dbf72191461023557610109565b80630103c92b1461010d578063117576a91461013d578063159677b514610159578063169930ef14610189575b5f80fd5b610127600480360381019061012291906113fe565b61036b565b6040516101349190611441565b60405180910390f35b6101576004803603810190610152919061162a565b610380565b005b610173600480360381019061016e91906116cc565b610b24565b6040516101809190611711565b60405180910390f35b6101a3600480360381019061019e919061172a565b610b41565b6040516101b09190611711565b60405180910390f35b6101d360048036038101906101ce9190611768565b610b6b565b005b6101ef60048036038101906101ea91906113fe565b610c2a565b6040516101fc9190611441565b60405180910390f35b61021f600480360381019061021a91906116cc565b610c3f565b60405161022c9190611441565b60405180910390f35b61023d610c54565b60405161024a91906117b5565b60405180910390f35b61025b610c7c565b005b610265610c8f565b60405161027291906117b5565b60405180910390f35b610295600480360381019061029091906113fe565b610cb6565b005b6102b160048036038101906102ac91906117ce565b610d01565b6040516102be9190611711565b60405180910390f35b6102e160048036038101906102dc91906113fe565b610d17565b6040516102ee9190611711565b60405180910390f35b610311600480360381019061030c9190611828565b610d34565b005b61031b610d46565b6040516103289190611862565b60405180910390f35b610339610d4c565b60405161034691906118ee565b60405180910390f35b610369600480360381019061036491906113fe565b610e09565b005b6006602052805f5260405f205f915090505481565b610388610e8d565b5f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036103f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ed90611961565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047c906119c9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050b90611a57565b60405180910390fd5b60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f83601a8111156105655761056461187b565b5b601a8111156105775761057661187b565b5b81526020019081526020015f205f9054906101000a900460ff16156105d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c890611abf565b60405180910390fd5b5f82601a8111156105e5576105e461187b565b5b905060095f8260ff1660ff1681526020019081526020015f205f9054906101000a900460ff1661064a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190611b27565b60405180910390fd5b6106a2823386604051602001610661929190611b45565b604051602081830303815290604052805190602001206040516020016106879190611b8c565b60405160208183030381529060405280519060200120610d01565b6106e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d890611bf0565b60405180910390fd5b60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166107c757600160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508360065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5f8060065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905080826108159190611c3b565b91505f8211610859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085090611cb8565b60405180910390fd5b8082111561089c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089390611d20565b60405180910390fd5b8160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546108e89190611d3e565b925050819055508160075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461093b9190611c3b565b925050819055506109b160025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16338460035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610ed3909392919063ffffffff16565b600160085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f87601a811115610a0457610a0361187b565b5b601a811115610a1657610a1561187b565b5b81526020019081526020015f205f6101000a81548160ff0219169083151502179055505f60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550423373ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f2f6639d24651730c7bf57c95ddbf96d66d11477e4ec626876f92c22e5f365e6885604051610b0c9190611441565b60405180910390a4505050610b1f610f55565b505050565b6009602052805f5260405f205f915054906101000a900460ff1681565b6008602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b610b73610f5e565b5f82601a811115610b8757610b8661187b565b5b905060095f8260ff1660ff1681526020019081526020015f205f9054906101000a900460ff1615610bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be490611dbb565b60405180910390fd5b600160095f8360ff1660ff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610c2582610d34565b505050565b6007602052805f5260405f205f915090505481565b600a602052805f5260405f205f915090505481565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c84610f5e565b610c8d5f610fe5565b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610cbe610f5e565b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f610d0f83600454846110a6565b905092915050565b6005602052805f5260405f205f915054906101000a900460ff1681565b610d3c610f5e565b8060048190555050565b60045481565b5f805f90505b601a80811115610d6557610d6461187b565b5b60ff168160ff1611610dca5760095f8260ff1660ff1681526020019081526020015f205f9054906101000a900460ff16610db7578060ff16601a811115610daf57610dae61187b565b5b915050610e06565b8080610dc290611dd9565b915050610d52565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90611e4b565b60405180910390fd5b90565b610e11610f5e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e81575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610e7891906117b5565b60405180910390fd5b610e8a81610fe5565b50565b600260015403610ec9576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b610f4f848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401610f0893929190611e69565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506110bc565b50505050565b60018081905550565b610f66611151565b73ffffffffffffffffffffffffffffffffffffffff16610f84610c8f565b73ffffffffffffffffffffffffffffffffffffffff1614610fe357610fa7611151565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610fda91906117b5565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f826110b28584611158565b1490509392505050565b5f6110e6828473ffffffffffffffffffffffffffffffffffffffff166111a690919063ffffffff16565b90505f81511415801561110a5750808060200190518101906111089190611ec8565b155b1561114c57826040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161114391906117b5565b60405180910390fd5b505050565b5f33905090565b5f808290505f5b845181101561119b5761118c8286838151811061117f5761117e611ef3565b5b60200260200101516111bb565b9150808060010191505061115f565b508091505092915050565b60606111b383835f6111e5565b905092915050565b5f8183106111d2576111cd82846112ae565b6111dd565b6111dc83836112ae565b5b905092915050565b60608147101561122c57306040517fcd78605900000000000000000000000000000000000000000000000000000000815260040161122391906117b5565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff1684866040516112549190611f72565b5f6040518083038185875af1925050503d805f811461128e576040519150601f19603f3d011682016040523d82523d5f602084013e611293565b606091505b50915091506112a38683836112c2565b925050509392505050565b5f825f528160205260405f20905092915050565b6060826112d7576112d28261134f565b611347565b5f82511480156112fd57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561133f57836040517f9996b31500000000000000000000000000000000000000000000000000000000815260040161133691906117b5565b60405180910390fd5b819050611348565b5b9392505050565b5f815111156113615780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6113cd826113a4565b9050919050565b6113dd816113c3565b81146113e7575f80fd5b50565b5f813590506113f8816113d4565b92915050565b5f602082840312156114135761141261139c565b5b5f611420848285016113ea565b91505092915050565b5f819050919050565b61143b81611429565b82525050565b5f6020820190506114545f830184611432565b92915050565b61146381611429565b811461146d575f80fd5b50565b5f8135905061147e8161145a565b92915050565b601b8110611490575f80fd5b50565b5f813590506114a181611484565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6114f1826114ab565b810181811067ffffffffffffffff821117156115105761150f6114bb565b5b80604052505050565b5f611522611393565b905061152e82826114e8565b919050565b5f67ffffffffffffffff82111561154d5761154c6114bb565b5b602082029050602081019050919050565b5f80fd5b5f819050919050565b61157481611562565b811461157e575f80fd5b50565b5f8135905061158f8161156b565b92915050565b5f6115a76115a284611533565b611519565b905080838252602082019050602084028301858111156115ca576115c961155e565b5b835b818110156115f357806115df8882611581565b8452602084019350506020810190506115cc565b5050509392505050565b5f82601f830112611611576116106114a7565b5b8135611621848260208601611595565b91505092915050565b5f805f606084860312156116415761164061139c565b5b5f61164e86828701611470565b935050602061165f86828701611493565b925050604084013567ffffffffffffffff8111156116805761167f6113a0565b5b61168c868287016115fd565b9150509250925092565b5f60ff82169050919050565b6116ab81611696565b81146116b5575f80fd5b50565b5f813590506116c6816116a2565b92915050565b5f602082840312156116e1576116e061139c565b5b5f6116ee848285016116b8565b91505092915050565b5f8115159050919050565b61170b816116f7565b82525050565b5f6020820190506117245f830184611702565b92915050565b5f80604083850312156117405761173f61139c565b5b5f61174d858286016113ea565b925050602061175e85828601611493565b9150509250929050565b5f806040838503121561177e5761177d61139c565b5b5f61178b85828601611493565b925050602061179c85828601611581565b9150509250929050565b6117af816113c3565b82525050565b5f6020820190506117c85f8301846117a6565b92915050565b5f80604083850312156117e4576117e361139c565b5b5f83013567ffffffffffffffff811115611801576118006113a0565b5b61180d858286016115fd565b925050602061181e85828601611581565b9150509250929050565b5f6020828403121561183d5761183c61139c565b5b5f61184a84828501611581565b91505092915050565b61185c81611562565b82525050565b5f6020820190506118755f830184611853565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b601b81106118b9576118b861187b565b5b50565b5f8190506118c9826118a8565b919050565b5f6118d8826118bc565b9050919050565b6118e8816118ce565b82525050565b5f6020820190506119015f8301846118df565b92915050565b5f82825260208201905092915050565b7f434f4e54524143543a2043616c6c6572206973207a65726f20616464726573735f82015250565b5f61194b602083611907565b915061195682611917565b602082019050919050565b5f6020820190508181035f8301526119788161193f565b9050919050565b7f434f4e54524143543a20546f6b656e206973206e6f74207365742e00000000005f82015250565b5f6119b3601b83611907565b91506119be8261197f565b602082019050919050565b5f6020820190508181035f8301526119e0816119a7565b9050919050565b7f434f4e54524143543a20546f6b656e2077616c6c6574206973206e6f7420636f5f8201527f6e66696775726564000000000000000000000000000000000000000000000000602082015250565b5f611a41602883611907565b9150611a4c826119e7565b604082019050919050565b5f6020820190508181035f830152611a6e81611a35565b9050919050565b7f416c726561647920436c61696d656400000000000000000000000000000000005f82015250565b5f611aa9600f83611907565b9150611ab482611a75565b602082019050919050565b5f6020820190508181035f830152611ad681611a9d565b9050919050565b7f43757272656e7420737461676520686173206e6f7420656e646564207965742e5f82015250565b5f611b11602083611907565b9150611b1c82611add565b602082019050919050565b5f6020820190508181035f830152611b3e81611b05565b9050919050565b5f604082019050611b585f8301856117a6565b611b656020830184611432565b9392505050565b5f819050919050565b611b86611b8182611562565b611b6c565b82525050565b5f611b978284611b75565b60208201915081905092915050565b7f43616c6c6572206e6f742077686974656c6973746564000000000000000000005f82015250565b5f611bda601683611907565b9150611be582611ba6565b602082019050919050565b5f6020820190508181035f830152611c0781611bce565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611c4582611429565b9150611c5083611429565b9250828201905080821115611c6857611c67611c0e565b5b92915050565b7f4e6f20746f6b656e7320746f20636c61696d2e000000000000000000000000005f82015250565b5f611ca2601383611907565b9150611cad82611c6e565b602082019050919050565b5f6020820190508181035f830152611ccf81611c96565b9050919050565b7f496e76616c696420636c61696d20616d6f756e742e00000000000000000000005f82015250565b5f611d0a601583611907565b9150611d1582611cd6565b602082019050919050565b5f6020820190508181035f830152611d3781611cfe565b9050919050565b5f611d4882611429565b9150611d5383611429565b9250828203905081811115611d6b57611d6a611c0e565b5b92915050565b7f537461676520616c726561647920656e6465642e0000000000000000000000005f82015250565b5f611da5601483611907565b9150611db082611d71565b602082019050919050565b5f6020820190508181035f830152611dd281611d99565b9050919050565b5f611de382611696565b915060ff8203611df657611df5611c0e565b5b600182019050919050565b7f416c6c20737461676573206861766520656e64656400000000000000000000005f82015250565b5f611e35601583611907565b9150611e4082611e01565b602082019050919050565b5f6020820190508181035f830152611e6281611e29565b9050919050565b5f606082019050611e7c5f8301866117a6565b611e8960208301856117a6565b611e966040830184611432565b949350505050565b611ea7816116f7565b8114611eb1575f80fd5b50565b5f81519050611ec281611e9e565b92915050565b5f60208284031215611edd57611edc61139c565b5b5f611eea84828501611eb4565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f611f4c82611f20565b611f568185611f2a565b9350611f66818560208601611f34565b80840191505092915050565b5f611f7d8284611f42565b91508190509291505056fea2646970667358221220d0850bf68115f558f3d10f7eee4d22e467d8d8e182278a4192b78d56fe5adc3e64736f6c634300081a00330000000000000000000000006d3c9269bd1bc9426798a752ecebbd749e5edaa897cd3acf52f7b5086de9581457ff592043fc53074ed4dce9b7e29514d14dd2960000000000000000000000000655c311ca6f94e8389ee08929731f70e09555a0
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610109575f3560e01c8063715018a6116100a0578063c088b2571161006f578063c088b257146102c7578063dab5f340146102f7578063ebf0c71714610313578063eedbe31d14610331578063f2fde38b1461034f57610109565b8063715018a6146102535780638da5cb5b1461025d578063a621344a1461027b578063b8a20ed01461029757610109565b80633bb10ff8116100dc5780633bb10ff8146101b9578063624601b6146101d55780636b5d3f79146102055780636dbf72191461023557610109565b80630103c92b1461010d578063117576a91461013d578063159677b514610159578063169930ef14610189575b5f80fd5b610127600480360381019061012291906113fe565b61036b565b6040516101349190611441565b60405180910390f35b6101576004803603810190610152919061162a565b610380565b005b610173600480360381019061016e91906116cc565b610b24565b6040516101809190611711565b60405180910390f35b6101a3600480360381019061019e919061172a565b610b41565b6040516101b09190611711565b60405180910390f35b6101d360048036038101906101ce9190611768565b610b6b565b005b6101ef60048036038101906101ea91906113fe565b610c2a565b6040516101fc9190611441565b60405180910390f35b61021f600480360381019061021a91906116cc565b610c3f565b60405161022c9190611441565b60405180910390f35b61023d610c54565b60405161024a91906117b5565b60405180910390f35b61025b610c7c565b005b610265610c8f565b60405161027291906117b5565b60405180910390f35b610295600480360381019061029091906113fe565b610cb6565b005b6102b160048036038101906102ac91906117ce565b610d01565b6040516102be9190611711565b60405180910390f35b6102e160048036038101906102dc91906113fe565b610d17565b6040516102ee9190611711565b60405180910390f35b610311600480360381019061030c9190611828565b610d34565b005b61031b610d46565b6040516103289190611862565b60405180910390f35b610339610d4c565b60405161034691906118ee565b60405180910390f35b610369600480360381019061036491906113fe565b610e09565b005b6006602052805f5260405f205f915090505481565b610388610e8d565b5f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036103f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ed90611961565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047c906119c9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050b90611a57565b60405180910390fd5b60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f83601a8111156105655761056461187b565b5b601a8111156105775761057661187b565b5b81526020019081526020015f205f9054906101000a900460ff16156105d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c890611abf565b60405180910390fd5b5f82601a8111156105e5576105e461187b565b5b905060095f8260ff1660ff1681526020019081526020015f205f9054906101000a900460ff1661064a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190611b27565b60405180910390fd5b6106a2823386604051602001610661929190611b45565b604051602081830303815290604052805190602001206040516020016106879190611b8c565b60405160208183030381529060405280519060200120610d01565b6106e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d890611bf0565b60405180910390fd5b60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166107c757600160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508360065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5f8060065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905080826108159190611c3b565b91505f8211610859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085090611cb8565b60405180910390fd5b8082111561089c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089390611d20565b60405180910390fd5b8160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546108e89190611d3e565b925050819055508160075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461093b9190611c3b565b925050819055506109b160025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16338460035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610ed3909392919063ffffffff16565b600160085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f87601a811115610a0457610a0361187b565b5b601a811115610a1657610a1561187b565b5b81526020019081526020015f205f6101000a81548160ff0219169083151502179055505f60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550423373ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f2f6639d24651730c7bf57c95ddbf96d66d11477e4ec626876f92c22e5f365e6885604051610b0c9190611441565b60405180910390a4505050610b1f610f55565b505050565b6009602052805f5260405f205f915054906101000a900460ff1681565b6008602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b610b73610f5e565b5f82601a811115610b8757610b8661187b565b5b905060095f8260ff1660ff1681526020019081526020015f205f9054906101000a900460ff1615610bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be490611dbb565b60405180910390fd5b600160095f8360ff1660ff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610c2582610d34565b505050565b6007602052805f5260405f205f915090505481565b600a602052805f5260405f205f915090505481565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c84610f5e565b610c8d5f610fe5565b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610cbe610f5e565b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f610d0f83600454846110a6565b905092915050565b6005602052805f5260405f205f915054906101000a900460ff1681565b610d3c610f5e565b8060048190555050565b60045481565b5f805f90505b601a80811115610d6557610d6461187b565b5b60ff168160ff1611610dca5760095f8260ff1660ff1681526020019081526020015f205f9054906101000a900460ff16610db7578060ff16601a811115610daf57610dae61187b565b5b915050610e06565b8080610dc290611dd9565b915050610d52565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90611e4b565b60405180910390fd5b90565b610e11610f5e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e81575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610e7891906117b5565b60405180910390fd5b610e8a81610fe5565b50565b600260015403610ec9576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b610f4f848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401610f0893929190611e69565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506110bc565b50505050565b60018081905550565b610f66611151565b73ffffffffffffffffffffffffffffffffffffffff16610f84610c8f565b73ffffffffffffffffffffffffffffffffffffffff1614610fe357610fa7611151565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610fda91906117b5565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f826110b28584611158565b1490509392505050565b5f6110e6828473ffffffffffffffffffffffffffffffffffffffff166111a690919063ffffffff16565b90505f81511415801561110a5750808060200190518101906111089190611ec8565b155b1561114c57826040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161114391906117b5565b60405180910390fd5b505050565b5f33905090565b5f808290505f5b845181101561119b5761118c8286838151811061117f5761117e611ef3565b5b60200260200101516111bb565b9150808060010191505061115f565b508091505092915050565b60606111b383835f6111e5565b905092915050565b5f8183106111d2576111cd82846112ae565b6111dd565b6111dc83836112ae565b5b905092915050565b60608147101561122c57306040517fcd78605900000000000000000000000000000000000000000000000000000000815260040161122391906117b5565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff1684866040516112549190611f72565b5f6040518083038185875af1925050503d805f811461128e576040519150601f19603f3d011682016040523d82523d5f602084013e611293565b606091505b50915091506112a38683836112c2565b925050509392505050565b5f825f528160205260405f20905092915050565b6060826112d7576112d28261134f565b611347565b5f82511480156112fd57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561133f57836040517f9996b31500000000000000000000000000000000000000000000000000000000815260040161133691906117b5565b60405180910390fd5b819050611348565b5b9392505050565b5f815111156113615780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6113cd826113a4565b9050919050565b6113dd816113c3565b81146113e7575f80fd5b50565b5f813590506113f8816113d4565b92915050565b5f602082840312156114135761141261139c565b5b5f611420848285016113ea565b91505092915050565b5f819050919050565b61143b81611429565b82525050565b5f6020820190506114545f830184611432565b92915050565b61146381611429565b811461146d575f80fd5b50565b5f8135905061147e8161145a565b92915050565b601b8110611490575f80fd5b50565b5f813590506114a181611484565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6114f1826114ab565b810181811067ffffffffffffffff821117156115105761150f6114bb565b5b80604052505050565b5f611522611393565b905061152e82826114e8565b919050565b5f67ffffffffffffffff82111561154d5761154c6114bb565b5b602082029050602081019050919050565b5f80fd5b5f819050919050565b61157481611562565b811461157e575f80fd5b50565b5f8135905061158f8161156b565b92915050565b5f6115a76115a284611533565b611519565b905080838252602082019050602084028301858111156115ca576115c961155e565b5b835b818110156115f357806115df8882611581565b8452602084019350506020810190506115cc565b5050509392505050565b5f82601f830112611611576116106114a7565b5b8135611621848260208601611595565b91505092915050565b5f805f606084860312156116415761164061139c565b5b5f61164e86828701611470565b935050602061165f86828701611493565b925050604084013567ffffffffffffffff8111156116805761167f6113a0565b5b61168c868287016115fd565b9150509250925092565b5f60ff82169050919050565b6116ab81611696565b81146116b5575f80fd5b50565b5f813590506116c6816116a2565b92915050565b5f602082840312156116e1576116e061139c565b5b5f6116ee848285016116b8565b91505092915050565b5f8115159050919050565b61170b816116f7565b82525050565b5f6020820190506117245f830184611702565b92915050565b5f80604083850312156117405761173f61139c565b5b5f61174d858286016113ea565b925050602061175e85828601611493565b9150509250929050565b5f806040838503121561177e5761177d61139c565b5b5f61178b85828601611493565b925050602061179c85828601611581565b9150509250929050565b6117af816113c3565b82525050565b5f6020820190506117c85f8301846117a6565b92915050565b5f80604083850312156117e4576117e361139c565b5b5f83013567ffffffffffffffff811115611801576118006113a0565b5b61180d858286016115fd565b925050602061181e85828601611581565b9150509250929050565b5f6020828403121561183d5761183c61139c565b5b5f61184a84828501611581565b91505092915050565b61185c81611562565b82525050565b5f6020820190506118755f830184611853565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b601b81106118b9576118b861187b565b5b50565b5f8190506118c9826118a8565b919050565b5f6118d8826118bc565b9050919050565b6118e8816118ce565b82525050565b5f6020820190506119015f8301846118df565b92915050565b5f82825260208201905092915050565b7f434f4e54524143543a2043616c6c6572206973207a65726f20616464726573735f82015250565b5f61194b602083611907565b915061195682611917565b602082019050919050565b5f6020820190508181035f8301526119788161193f565b9050919050565b7f434f4e54524143543a20546f6b656e206973206e6f74207365742e00000000005f82015250565b5f6119b3601b83611907565b91506119be8261197f565b602082019050919050565b5f6020820190508181035f8301526119e0816119a7565b9050919050565b7f434f4e54524143543a20546f6b656e2077616c6c6574206973206e6f7420636f5f8201527f6e66696775726564000000000000000000000000000000000000000000000000602082015250565b5f611a41602883611907565b9150611a4c826119e7565b604082019050919050565b5f6020820190508181035f830152611a6e81611a35565b9050919050565b7f416c726561647920436c61696d656400000000000000000000000000000000005f82015250565b5f611aa9600f83611907565b9150611ab482611a75565b602082019050919050565b5f6020820190508181035f830152611ad681611a9d565b9050919050565b7f43757272656e7420737461676520686173206e6f7420656e646564207965742e5f82015250565b5f611b11602083611907565b9150611b1c82611add565b602082019050919050565b5f6020820190508181035f830152611b3e81611b05565b9050919050565b5f604082019050611b585f8301856117a6565b611b656020830184611432565b9392505050565b5f819050919050565b611b86611b8182611562565b611b6c565b82525050565b5f611b978284611b75565b60208201915081905092915050565b7f43616c6c6572206e6f742077686974656c6973746564000000000000000000005f82015250565b5f611bda601683611907565b9150611be582611ba6565b602082019050919050565b5f6020820190508181035f830152611c0781611bce565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611c4582611429565b9150611c5083611429565b9250828201905080821115611c6857611c67611c0e565b5b92915050565b7f4e6f20746f6b656e7320746f20636c61696d2e000000000000000000000000005f82015250565b5f611ca2601383611907565b9150611cad82611c6e565b602082019050919050565b5f6020820190508181035f830152611ccf81611c96565b9050919050565b7f496e76616c696420636c61696d20616d6f756e742e00000000000000000000005f82015250565b5f611d0a601583611907565b9150611d1582611cd6565b602082019050919050565b5f6020820190508181035f830152611d3781611cfe565b9050919050565b5f611d4882611429565b9150611d5383611429565b9250828203905081811115611d6b57611d6a611c0e565b5b92915050565b7f537461676520616c726561647920656e6465642e0000000000000000000000005f82015250565b5f611da5601483611907565b9150611db082611d71565b602082019050919050565b5f6020820190508181035f830152611dd281611d99565b9050919050565b5f611de382611696565b915060ff8203611df657611df5611c0e565b5b600182019050919050565b7f416c6c20737461676573206861766520656e64656400000000000000000000005f82015250565b5f611e35601583611907565b9150611e4082611e01565b602082019050919050565b5f6020820190508181035f830152611e6281611e29565b9050919050565b5f606082019050611e7c5f8301866117a6565b611e8960208301856117a6565b611e966040830184611432565b949350505050565b611ea7816116f7565b8114611eb1575f80fd5b50565b5f81519050611ec281611e9e565b92915050565b5f60208284031215611edd57611edc61139c565b5b5f611eea84828501611eb4565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f611f4c82611f20565b611f568185611f2a565b9350611f66818560208601611f34565b80840191505092915050565b5f611f7d8284611f42565b91508190509291505056fea2646970667358221220d0850bf68115f558f3d10f7eee4d22e467d8d8e182278a4192b78d56fe5adc3e64736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006d3c9269bd1bc9426798a752ecebbd749e5edaa897cd3acf52f7b5086de9581457ff592043fc53074ed4dce9b7e29514d14dd2960000000000000000000000000655c311ca6f94e8389ee08929731f70e09555a0
-----Decoded View---------------
Arg [0] : _token (address): 0x6d3C9269BD1Bc9426798a752EcEBbD749E5eDaA8
Arg [1] : _root (bytes32): 0x97cd3acf52f7b5086de9581457ff592043fc53074ed4dce9b7e29514d14dd296
Arg [2] : _tokenWallet (address): 0x0655C311ca6F94e8389ee08929731f70E09555a0
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000006d3c9269bd1bc9426798a752ecebbd749e5edaa8
Arg [1] : 97cd3acf52f7b5086de9581457ff592043fc53074ed4dce9b7e29514d14dd296
Arg [2] : 0000000000000000000000000655c311ca6f94e8389ee08929731f70e09555a0
Deployed Bytecode Sourcemap
37509:4803:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38276:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40362:1947;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38459:40;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38384:66;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39305:340;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38329:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38607:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39020:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26371:103;;;:::i;:::-;;25696:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39121:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39693:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38222:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39907:80;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37664:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39995:264;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26629:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38276:46;;;;;;;;;;;;;;;;;:::o;40362:1947::-;22076:21;:19;:21::i;:::-;40536:1:::1;40514:24;;:10;:24;;::::0;40506:69:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;40620:1;40594:28;;40602:5;;;;;;;;;;;40594:28;;::::0;40586:68:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;40697:1;40673:26;;:12;;;;;;;;;;;:26;;::::0;40665:79:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;40764:16;:28;40781:10;40764:28;;;;;;;;;;;;;;;:43;40793:13;40764:43;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;40763:44;40755:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;40840:23;40872:13;40866:20;;;;;;;;:::i;:::-;;40840:46;;40919:10;:29;40930:17;40919:29;;;;;;;;;;;;;;;;;;;;;;;;;40897:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;41041:172;41067:5;41157:10;41169:7;41146:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41136:42;;;;;;41123:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;41091:107;;;;;;41041:7;:172::i;:::-;41019:244;;;;;;;;;;;;:::i;:::-;;;;;;;;;41281:15;:27;41297:10;41281:27;;;;;;;;;;;;;;;;;;;;;;;;;41276:143;;41355:4;41325:15;:27;41341:10;41325:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;41400:7;41374:11;:23;41386:10;41374:23;;;;;;;;;;;;;;;:33;;;;41276:143;41431:19;41615:15:::0;41633:11:::1;:23;41645:10;41633:23;;;;;;;;;;;;;;;;41615:41;;41682:7;41667:22;;;;;:::i;:::-;;;41722:1;41708:11;:15;41700:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;41781:7;41766:11;:22;;41758:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;41852:11;41825;:23;41837:10;41825:23;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;41903:11;41874:13;:25;41888:10;41874:25;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;41965:61;41988:12;;;;;;;;;;;42002:10;42014:11;41965:5;;;;;;;;;;;:22;;;;:61;;;;;;:::i;:::-;42131:4;42085:16;:28;42102:10;42085:28;;;;;;;;;;;;;;;:43;42114:13;42085:43;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;42176:5;42146:15;:27;42162:10;42146:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;42285:15;42260:10;42236:65;;42252:5;;;;;;;;;;;42236:65;;;42272:11;42236:65;;;;;;:::i;:::-;;;;;;;;40495:1814;;;22120:20:::0;:18;:20::i;:::-;40362:1947;;;:::o;38459:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;38384:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39305:340::-;25582:13;:11;:13::i;:::-;39420:16:::1;39445:6;39439:13;;;;;;;;:::i;:::-;;39420:32;;39472:10;:22;39483:10;39472:22;;;;;;;;;;;;;;;;;;;;;;;;;39471:23;39463:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;39555:4;39530:10;:22;39541:10;39530:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39620:17;39628:8;39620:7;:17::i;:::-;39409:236;39305:340:::0;;:::o;38329:48::-;;;;;;;;;;;;;;;;;:::o;38607:49::-;;;;;;;;;;;;;;;;;:::o;39020:93::-;39066:7;39093:12;;;;;;;;;;;39086:19;;39020:93;:::o;26371:103::-;25582:13;:11;:13::i;:::-;26436:30:::1;26463:1;26436:18;:30::i;:::-;26371:103::o:0;25696:87::-;25742:7;25769:6;;;;;;;;;;;25762:13;;25696:87;:::o;39121:111::-;25582:13;:11;:13::i;:::-;39212:12:::1;39197;;:27;;;;;;;;;;;;;;;;;;39121:111:::0;:::o;39693:170::-;39794:4;39818:37;39837:5;39844:4;;39850;39818:18;:37::i;:::-;39811:44;;39693:170;;;;:::o;38222:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;39907:80::-;25582:13;:11;:13::i;:::-;39974:5:::1;39967:4;:12;;;;39907:80:::0;:::o;37664:19::-;;;;:::o;39995:264::-;40045:5;40068:7;40078:1;40068:11;;40063:147;40092:14;40086:21;;;;;;;;:::i;:::-;;40081:26;;:1;:26;;;40063:147;;40134:10;:13;40145:1;40134:13;;;;;;;;;;;;;;;;;;;;;;;;;40129:70;;40181:1;40175:8;;;;;;;;;;:::i;:::-;;40168:15;;;;;40129:70;40109:3;;;;;:::i;:::-;;;;40063:147;;;;40220:31;;;;;;;;;;:::i;:::-;;;;;;;;39995:264;;:::o;26629:220::-;25582:13;:11;:13::i;:::-;26734:1:::1;26714:22;;:8;:22;;::::0;26710:93:::1;;26788:1;26760:31;;;;;;;;;;;:::i;:::-;;;;;;;;26710:93;26813:28;26832:8;26813:18;:28::i;:::-;26629:220:::0;:::o;22156:315::-;21454:1;22285:7;;:18;22281:88;;22327:30;;;;;;;;;;;;;;22281:88;21454:1;22446:7;:17;;;;22156:315::o;15077:270::-;15221:118;15255:5;15290;:18;;;15311:4;15317:2;15321:5;15275:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15221:19;:118::i;:::-;15077:270;;;;:::o;22479:212::-;21411:1;22662:7;:21;;;;22479:212::o;25861:166::-;25932:12;:10;:12::i;:::-;25921:23;;:7;:5;:7::i;:::-;:23;;;25917:103;;25995:12;:10;:12::i;:::-;25968:40;;;;;;;;;;;:::i;:::-;;;;;;;;25917:103;25861:166::o;27009:191::-;27083:16;27102:6;;;;;;;;;;;27083:25;;27128:8;27119:6;;:17;;;;;;;;;;;;;;;;;;27183:8;27152:40;;27173:8;27152:40;;;;;;;;;;;;27072:128;27009:191;:::o;28541:190::-;28666:4;28719;28690:25;28703:5;28710:4;28690:12;:25::i;:::-;:33;28683:40;;28541:190;;;;;:::o;17831:638::-;18255:23;18281:33;18309:4;18289:5;18281:27;;;;:33;;;;:::i;:::-;18255:59;;18350:1;18329:10;:17;:22;;:57;;;;;18367:10;18356:30;;;;;;;;;;;;:::i;:::-;18355:31;18329:57;18325:137;;;18443:5;18410:40;;;;;;;;;;;:::i;:::-;;;;;;;;18325:137;17901:568;17831:638;;:::o;23684:98::-;23737:7;23764:10;23757:17;;23684:98;:::o;29328:321::-;29436:7;29456:20;29479:4;29456:27;;29499:9;29494:118;29518:5;:12;29514:1;:16;29494:118;;;29567:33;29577:12;29591:5;29597:1;29591:8;;;;;;;;:::i;:::-;;;;;;;;29567:9;:33::i;:::-;29552:48;;29532:3;;;;;;;29494:118;;;;29629:12;29622:19;;;29328:321;;;;:::o;9612:178::-;9712:12;9744:38;9766:6;9774:4;9780:1;9744:21;:38::i;:::-;9737:45;;9612:178;;;;:::o;36876:149::-;36939:7;36970:1;36966;:5;:51;;36997:20;37012:1;37015;36997:14;:20::i;:::-;36966:51;;;36974:20;36989:1;36992;36974:14;:20::i;:::-;36966:51;36959:58;;36876:149;;;;:::o;10125:456::-;10258:12;10311:5;10287:21;:29;10283:110;;;10375:4;10340:41;;;;;;;;;;;:::i;:::-;;;;;;;;10283:110;10404:12;10418:23;10445:6;:11;;10464:5;10485:4;10445:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10403:97;;;;10518:55;10545:6;10553:7;10562:10;10518:26;:55::i;:::-;10511:62;;;;10125:456;;;;;:::o;37150:293::-;37243:13;37350:1;37344:4;37337:15;37379:1;37373:4;37366:15;37420:4;37414;37404:21;37395:30;;37150:293;;;;:::o;11709:597::-;11857:12;11887:7;11882:417;;11911:19;11919:10;11911:7;:19::i;:::-;11882:417;;;12160:1;12139:10;:17;:22;:49;;;;;12187:1;12165:6;:18;;;:23;12139:49;12135:121;;;12233:6;12216:24;;;;;;;;;;;:::i;:::-;;;;;;;;12135:121;12277:10;12270:17;;;;11882:417;11709:597;;;;;;:::o;12884:528::-;13037:1;13017:10;:17;:21;13013:392;;;13249:10;13243:17;13306:15;13293:10;13289:2;13285:19;13278:44;13013:392;13376:17;;;;;;;;;;;;;;7:75:1;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:110::-;1967:2;1960:5;1957:13;1947:41;;1984:1;1981;1974:12;1947:41;1884:110;:::o;2000:159::-;2056:5;2094:6;2081:20;2072:29;;2110:43;2147:5;2110:43;:::i;:::-;2000:159;;;;:::o;2165:117::-;2274:1;2271;2264:12;2288:102;2329:6;2380:2;2376:7;2371:2;2364:5;2360:14;2356:28;2346:38;;2288:102;;;:::o;2396:180::-;2444:77;2441:1;2434:88;2541:4;2538:1;2531:15;2565:4;2562:1;2555:15;2582:281;2665:27;2687:4;2665:27;:::i;:::-;2657:6;2653:40;2795:6;2783:10;2780:22;2759:18;2747:10;2744:34;2741:62;2738:88;;;2806:18;;:::i;:::-;2738:88;2846:10;2842:2;2835:22;2625:238;2582:281;;:::o;2869:129::-;2903:6;2930:20;;:::i;:::-;2920:30;;2959:33;2987:4;2979:6;2959:33;:::i;:::-;2869:129;;;:::o;3004:311::-;3081:4;3171:18;3163:6;3160:30;3157:56;;;3193:18;;:::i;:::-;3157:56;3243:4;3235:6;3231:17;3223:25;;3303:4;3297;3293:15;3285:23;;3004:311;;;:::o;3321:117::-;3430:1;3427;3420:12;3444:77;3481:7;3510:5;3499:16;;3444:77;;;:::o;3527:122::-;3600:24;3618:5;3600:24;:::i;:::-;3593:5;3590:35;3580:63;;3639:1;3636;3629:12;3580:63;3527:122;:::o;3655:139::-;3701:5;3739:6;3726:20;3717:29;;3755:33;3782:5;3755:33;:::i;:::-;3655:139;;;;:::o;3817:710::-;3913:5;3938:81;3954:64;4011:6;3954:64;:::i;:::-;3938:81;:::i;:::-;3929:90;;4039:5;4068:6;4061:5;4054:21;4102:4;4095:5;4091:16;4084:23;;4155:4;4147:6;4143:17;4135:6;4131:30;4184:3;4176:6;4173:15;4170:122;;;4203:79;;:::i;:::-;4170:122;4318:6;4301:220;4335:6;4330:3;4327:15;4301:220;;;4410:3;4439:37;4472:3;4460:10;4439:37;:::i;:::-;4434:3;4427:50;4506:4;4501:3;4497:14;4490:21;;4377:144;4361:4;4356:3;4352:14;4345:21;;4301:220;;;4305:21;3919:608;;3817:710;;;;;:::o;4550:370::-;4621:5;4670:3;4663:4;4655:6;4651:17;4647:27;4637:122;;4678:79;;:::i;:::-;4637:122;4795:6;4782:20;4820:94;4910:3;4902:6;4895:4;4887:6;4883:17;4820:94;:::i;:::-;4811:103;;4627:293;4550:370;;;;:::o;4926:849::-;5038:6;5046;5054;5103:2;5091:9;5082:7;5078:23;5074:32;5071:119;;;5109:79;;:::i;:::-;5071:119;5229:1;5254:53;5299:7;5290:6;5279:9;5275:22;5254:53;:::i;:::-;5244:63;;5200:117;5356:2;5382:63;5437:7;5428:6;5417:9;5413:22;5382:63;:::i;:::-;5372:73;;5327:128;5522:2;5511:9;5507:18;5494:32;5553:18;5545:6;5542:30;5539:117;;;5575:79;;:::i;:::-;5539:117;5680:78;5750:7;5741:6;5730:9;5726:22;5680:78;:::i;:::-;5670:88;;5465:303;4926:849;;;;;:::o;5781:86::-;5816:7;5856:4;5849:5;5845:16;5834:27;;5781:86;;;:::o;5873:118::-;5944:22;5960:5;5944:22;:::i;:::-;5937:5;5934:33;5924:61;;5981:1;5978;5971:12;5924:61;5873:118;:::o;5997:135::-;6041:5;6079:6;6066:20;6057:29;;6095:31;6120:5;6095:31;:::i;:::-;5997:135;;;;:::o;6138:325::-;6195:6;6244:2;6232:9;6223:7;6219:23;6215:32;6212:119;;;6250:79;;:::i;:::-;6212:119;6370:1;6395:51;6438:7;6429:6;6418:9;6414:22;6395:51;:::i;:::-;6385:61;;6341:115;6138:325;;;;:::o;6469:90::-;6503:7;6546:5;6539:13;6532:21;6521:32;;6469:90;;;:::o;6565:109::-;6646:21;6661:5;6646:21;:::i;:::-;6641:3;6634:34;6565:109;;:::o;6680:210::-;6767:4;6805:2;6794:9;6790:18;6782:26;;6818:65;6880:1;6869:9;6865:17;6856:6;6818:65;:::i;:::-;6680:210;;;;:::o;6896:494::-;6974:6;6982;7031:2;7019:9;7010:7;7006:23;7002:32;6999:119;;;7037:79;;:::i;:::-;6999:119;7157:1;7182:53;7227:7;7218:6;7207:9;7203:22;7182:53;:::i;:::-;7172:63;;7128:117;7284:2;7310:63;7365:7;7356:6;7345:9;7341:22;7310:63;:::i;:::-;7300:73;;7255:128;6896:494;;;;;:::o;7396:::-;7474:6;7482;7531:2;7519:9;7510:7;7506:23;7502:32;7499:119;;;7537:79;;:::i;:::-;7499:119;7657:1;7682:63;7737:7;7728:6;7717:9;7713:22;7682:63;:::i;:::-;7672:73;;7628:127;7794:2;7820:53;7865:7;7856:6;7845:9;7841:22;7820:53;:::i;:::-;7810:63;;7765:118;7396:494;;;;;:::o;7896:118::-;7983:24;8001:5;7983:24;:::i;:::-;7978:3;7971:37;7896:118;;:::o;8020:222::-;8113:4;8151:2;8140:9;8136:18;8128:26;;8164:71;8232:1;8221:9;8217:17;8208:6;8164:71;:::i;:::-;8020:222;;;;:::o;8248:684::-;8341:6;8349;8398:2;8386:9;8377:7;8373:23;8369:32;8366:119;;;8404:79;;:::i;:::-;8366:119;8552:1;8541:9;8537:17;8524:31;8582:18;8574:6;8571:30;8568:117;;;8604:79;;:::i;:::-;8568:117;8709:78;8779:7;8770:6;8759:9;8755:22;8709:78;:::i;:::-;8699:88;;8495:302;8836:2;8862:53;8907:7;8898:6;8887:9;8883:22;8862:53;:::i;:::-;8852:63;;8807:118;8248:684;;;;;:::o;8938:329::-;8997:6;9046:2;9034:9;9025:7;9021:23;9017:32;9014:119;;;9052:79;;:::i;:::-;9014:119;9172:1;9197:53;9242:7;9233:6;9222:9;9218:22;9197:53;:::i;:::-;9187:63;;9143:117;8938:329;;;;:::o;9273:118::-;9360:24;9378:5;9360:24;:::i;:::-;9355:3;9348:37;9273:118;;:::o;9397:222::-;9490:4;9528:2;9517:9;9513:18;9505:26;;9541:71;9609:1;9598:9;9594:17;9585:6;9541:71;:::i;:::-;9397:222;;;;:::o;9625:180::-;9673:77;9670:1;9663:88;9770:4;9767:1;9760:15;9794:4;9791:1;9784:15;9811:116;9894:2;9887:5;9884:13;9874:47;;9901:18;;:::i;:::-;9874:47;9811:116;:::o;9933:131::-;9980:7;10009:5;9998:16;;10015:43;10052:5;10015:43;:::i;:::-;9933:131;;;:::o;10070:::-;10128:9;10161:34;10189:5;10161:34;:::i;:::-;10148:47;;10070:131;;;:::o;10207:147::-;10302:45;10341:5;10302:45;:::i;:::-;10297:3;10290:58;10207:147;;:::o;10360:238::-;10461:4;10499:2;10488:9;10484:18;10476:26;;10512:79;10588:1;10577:9;10573:17;10564:6;10512:79;:::i;:::-;10360:238;;;;:::o;10604:169::-;10688:11;10722:6;10717:3;10710:19;10762:4;10757:3;10753:14;10738:29;;10604:169;;;;:::o;10779:182::-;10919:34;10915:1;10907:6;10903:14;10896:58;10779:182;:::o;10967:366::-;11109:3;11130:67;11194:2;11189:3;11130:67;:::i;:::-;11123:74;;11206:93;11295:3;11206:93;:::i;:::-;11324:2;11319:3;11315:12;11308:19;;10967:366;;;:::o;11339:419::-;11505:4;11543:2;11532:9;11528:18;11520:26;;11592:9;11586:4;11582:20;11578:1;11567:9;11563:17;11556:47;11620:131;11746:4;11620:131;:::i;:::-;11612:139;;11339:419;;;:::o;11764:177::-;11904:29;11900:1;11892:6;11888:14;11881:53;11764:177;:::o;11947:366::-;12089:3;12110:67;12174:2;12169:3;12110:67;:::i;:::-;12103:74;;12186:93;12275:3;12186:93;:::i;:::-;12304:2;12299:3;12295:12;12288:19;;11947:366;;;:::o;12319:419::-;12485:4;12523:2;12512:9;12508:18;12500:26;;12572:9;12566:4;12562:20;12558:1;12547:9;12543:17;12536:47;12600:131;12726:4;12600:131;:::i;:::-;12592:139;;12319:419;;;:::o;12744:227::-;12884:34;12880:1;12872:6;12868:14;12861:58;12953:10;12948:2;12940:6;12936:15;12929:35;12744:227;:::o;12977:366::-;13119:3;13140:67;13204:2;13199:3;13140:67;:::i;:::-;13133:74;;13216:93;13305:3;13216:93;:::i;:::-;13334:2;13329:3;13325:12;13318:19;;12977:366;;;:::o;13349:419::-;13515:4;13553:2;13542:9;13538:18;13530:26;;13602:9;13596:4;13592:20;13588:1;13577:9;13573:17;13566:47;13630:131;13756:4;13630:131;:::i;:::-;13622:139;;13349:419;;;:::o;13774:165::-;13914:17;13910:1;13902:6;13898:14;13891:41;13774:165;:::o;13945:366::-;14087:3;14108:67;14172:2;14167:3;14108:67;:::i;:::-;14101:74;;14184:93;14273:3;14184:93;:::i;:::-;14302:2;14297:3;14293:12;14286:19;;13945:366;;;:::o;14317:419::-;14483:4;14521:2;14510:9;14506:18;14498:26;;14570:9;14564:4;14560:20;14556:1;14545:9;14541:17;14534:47;14598:131;14724:4;14598:131;:::i;:::-;14590:139;;14317:419;;;:::o;14742:182::-;14882:34;14878:1;14870:6;14866:14;14859:58;14742:182;:::o;14930:366::-;15072:3;15093:67;15157:2;15152:3;15093:67;:::i;:::-;15086:74;;15169:93;15258:3;15169:93;:::i;:::-;15287:2;15282:3;15278:12;15271:19;;14930:366;;;:::o;15302:419::-;15468:4;15506:2;15495:9;15491:18;15483:26;;15555:9;15549:4;15545:20;15541:1;15530:9;15526:17;15519:47;15583:131;15709:4;15583:131;:::i;:::-;15575:139;;15302:419;;;:::o;15727:332::-;15848:4;15886:2;15875:9;15871:18;15863:26;;15899:71;15967:1;15956:9;15952:17;15943:6;15899:71;:::i;:::-;15980:72;16048:2;16037:9;16033:18;16024:6;15980:72;:::i;:::-;15727:332;;;;;:::o;16065:79::-;16104:7;16133:5;16122:16;;16065:79;;;:::o;16150:157::-;16255:45;16275:24;16293:5;16275:24;:::i;:::-;16255:45;:::i;:::-;16250:3;16243:58;16150:157;;:::o;16313:256::-;16425:3;16440:75;16511:3;16502:6;16440:75;:::i;:::-;16540:2;16535:3;16531:12;16524:19;;16560:3;16553:10;;16313:256;;;;:::o;16575:172::-;16715:24;16711:1;16703:6;16699:14;16692:48;16575:172;:::o;16753:366::-;16895:3;16916:67;16980:2;16975:3;16916:67;:::i;:::-;16909:74;;16992:93;17081:3;16992:93;:::i;:::-;17110:2;17105:3;17101:12;17094:19;;16753:366;;;:::o;17125:419::-;17291:4;17329:2;17318:9;17314:18;17306:26;;17378:9;17372:4;17368:20;17364:1;17353:9;17349:17;17342:47;17406:131;17532:4;17406:131;:::i;:::-;17398:139;;17125:419;;;:::o;17550:180::-;17598:77;17595:1;17588:88;17695:4;17692:1;17685:15;17719:4;17716:1;17709:15;17736:191;17776:3;17795:20;17813:1;17795:20;:::i;:::-;17790:25;;17829:20;17847:1;17829:20;:::i;:::-;17824:25;;17872:1;17869;17865:9;17858:16;;17893:3;17890:1;17887:10;17884:36;;;17900:18;;:::i;:::-;17884:36;17736:191;;;;:::o;17933:169::-;18073:21;18069:1;18061:6;18057:14;18050:45;17933:169;:::o;18108:366::-;18250:3;18271:67;18335:2;18330:3;18271:67;:::i;:::-;18264:74;;18347:93;18436:3;18347:93;:::i;:::-;18465:2;18460:3;18456:12;18449:19;;18108:366;;;:::o;18480:419::-;18646:4;18684:2;18673:9;18669:18;18661:26;;18733:9;18727:4;18723:20;18719:1;18708:9;18704:17;18697:47;18761:131;18887:4;18761:131;:::i;:::-;18753:139;;18480:419;;;:::o;18905:171::-;19045:23;19041:1;19033:6;19029:14;19022:47;18905:171;:::o;19082:366::-;19224:3;19245:67;19309:2;19304:3;19245:67;:::i;:::-;19238:74;;19321:93;19410:3;19321:93;:::i;:::-;19439:2;19434:3;19430:12;19423:19;;19082:366;;;:::o;19454:419::-;19620:4;19658:2;19647:9;19643:18;19635:26;;19707:9;19701:4;19697:20;19693:1;19682:9;19678:17;19671:47;19735:131;19861:4;19735:131;:::i;:::-;19727:139;;19454:419;;;:::o;19879:194::-;19919:4;19939:20;19957:1;19939:20;:::i;:::-;19934:25;;19973:20;19991:1;19973:20;:::i;:::-;19968:25;;20017:1;20014;20010:9;20002:17;;20041:1;20035:4;20032:11;20029:37;;;20046:18;;:::i;:::-;20029:37;19879:194;;;;:::o;20079:170::-;20219:22;20215:1;20207:6;20203:14;20196:46;20079:170;:::o;20255:366::-;20397:3;20418:67;20482:2;20477:3;20418:67;:::i;:::-;20411:74;;20494:93;20583:3;20494:93;:::i;:::-;20612:2;20607:3;20603:12;20596:19;;20255:366;;;:::o;20627:419::-;20793:4;20831:2;20820:9;20816:18;20808:26;;20880:9;20874:4;20870:20;20866:1;20855:9;20851:17;20844:47;20908:131;21034:4;20908:131;:::i;:::-;20900:139;;20627:419;;;:::o;21052:167::-;21089:3;21112:22;21128:5;21112:22;:::i;:::-;21103:31;;21156:4;21149:5;21146:15;21143:41;;21164:18;;:::i;:::-;21143:41;21211:1;21204:5;21200:13;21193:20;;21052:167;;;:::o;21225:171::-;21365:23;21361:1;21353:6;21349:14;21342:47;21225:171;:::o;21402:366::-;21544:3;21565:67;21629:2;21624:3;21565:67;:::i;:::-;21558:74;;21641:93;21730:3;21641:93;:::i;:::-;21759:2;21754:3;21750:12;21743:19;;21402:366;;;:::o;21774:419::-;21940:4;21978:2;21967:9;21963:18;21955:26;;22027:9;22021:4;22017:20;22013:1;22002:9;21998:17;21991:47;22055:131;22181:4;22055:131;:::i;:::-;22047:139;;21774:419;;;:::o;22199:442::-;22348:4;22386:2;22375:9;22371:18;22363:26;;22399:71;22467:1;22456:9;22452:17;22443:6;22399:71;:::i;:::-;22480:72;22548:2;22537:9;22533:18;22524:6;22480:72;:::i;:::-;22562;22630:2;22619:9;22615:18;22606:6;22562:72;:::i;:::-;22199:442;;;;;;:::o;22647:116::-;22717:21;22732:5;22717:21;:::i;:::-;22710:5;22707:32;22697:60;;22753:1;22750;22743:12;22697:60;22647:116;:::o;22769:137::-;22823:5;22854:6;22848:13;22839:22;;22870:30;22894:5;22870:30;:::i;:::-;22769:137;;;;:::o;22912:345::-;22979:6;23028:2;23016:9;23007:7;23003:23;22999:32;22996:119;;;23034:79;;:::i;:::-;22996:119;23154:1;23179:61;23232:7;23223:6;23212:9;23208:22;23179:61;:::i;:::-;23169:71;;23125:125;22912:345;;;;:::o;23263:180::-;23311:77;23308:1;23301:88;23408:4;23405:1;23398:15;23432:4;23429:1;23422:15;23449:98;23500:6;23534:5;23528:12;23518:22;;23449:98;;;:::o;23553:147::-;23654:11;23691:3;23676:18;;23553:147;;;;:::o;23706:139::-;23795:6;23790:3;23785;23779:23;23836:1;23827:6;23822:3;23818:16;23811:27;23706:139;;;:::o;23851:386::-;23955:3;23983:38;24015:5;23983:38;:::i;:::-;24037:88;24118:6;24113:3;24037:88;:::i;:::-;24030:95;;24134:65;24192:6;24187:3;24180:4;24173:5;24169:16;24134:65;:::i;:::-;24224:6;24219:3;24215:16;24208:23;;23959:278;23851:386;;;;:::o;24243:271::-;24373:3;24395:93;24484:3;24475:6;24395:93;:::i;:::-;24388:100;;24505:3;24498:10;;24243:271;;;;:::o
Swarm Source
ipfs://d0850bf68115f558f3d10f7eee4d22e467d8d8e182278a4192b78d56fe5adc3e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.