More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 195 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 17746958 | 617 days ago | IN | 0 ETH | 0.00245004 | ||||
Claim | 17746859 | 617 days ago | IN | 0 ETH | 0.00232471 | ||||
Claim | 17746709 | 617 days ago | IN | 0 ETH | 0.00099468 | ||||
Claim | 17746709 | 617 days ago | IN | 0 ETH | 0.00099468 | ||||
Claim | 17746708 | 617 days ago | IN | 0 ETH | 0.00088488 | ||||
Claim | 17746708 | 617 days ago | IN | 0 ETH | 0.00210378 | ||||
Claim | 17746520 | 617 days ago | IN | 0 ETH | 0.00250157 | ||||
Claim | 17746413 | 617 days ago | IN | 0 ETH | 0.00211814 | ||||
Claim | 17746261 | 617 days ago | IN | 0 ETH | 0.00245922 | ||||
Claim | 17746180 | 617 days ago | IN | 0 ETH | 0.00267887 | ||||
Set Root | 17745597 | 617 days ago | IN | 0 ETH | 0.00139599 | ||||
Claim | 17739656 | 618 days ago | IN | 0 ETH | 0.00354969 | ||||
Claim | 17739646 | 618 days ago | IN | 0 ETH | 0.00303436 | ||||
Claim | 17739630 | 618 days ago | IN | 0 ETH | 0.00241131 | ||||
Claim | 17733273 | 619 days ago | IN | 0 ETH | 0.00271234 | ||||
Claim | 17732988 | 619 days ago | IN | 0 ETH | 0.00367931 | ||||
Claim | 17732968 | 619 days ago | IN | 0 ETH | 0.00294396 | ||||
Claim | 17732816 | 619 days ago | IN | 0 ETH | 0.00264962 | ||||
Claim | 17732804 | 619 days ago | IN | 0 ETH | 0.00276789 | ||||
Claim | 17732777 | 619 days ago | IN | 0 ETH | 0.00261142 | ||||
Set Root | 17732533 | 619 days ago | IN | 0 ETH | 0.00066228 | ||||
Set Claim Durati... | 17732455 | 619 days ago | IN | 0 ETH | 0.00043144 | ||||
Set Root | 17732441 | 619 days ago | IN | 0 ETH | 0.00238695 | ||||
Set Claim Durati... | 17732437 | 619 days ago | IN | 0 ETH | 0.00039834 | ||||
Claim | 17695449 | 624 days ago | IN | 0 ETH | 0.00328826 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
UsdcAirdrop
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; contract UsdcAirdrop is Ownable, Pausable { IERC20 public token; // Airdrop token bytes32 public root; // merkle tree root uint256 public startTime; uint256 public claimDuration = 7 days; // 604800 address[] private whitelistClaimed; constructor(IERC20 _token) onlyOwner { token = _token; startTime = block.timestamp; } function getWhitelistClaimed() public view returns(address[] memory) { return whitelistClaimed; } function remainingDuration() public view returns (uint256) { if(block.timestamp < (startTime + claimDuration)) { uint256 duration; duration = claimDuration - (block.timestamp - startTime); return duration; }else { return 0; } } function canClaim(bytes32[] memory merkleProof, uint256 amount) external view returns (bool) { require(block.timestamp <= (startTime + claimDuration), "Claim is not allowed after claimDuration"); bytes32 result = leaf(amount); require(MerkleProof.verify(merkleProof, root, result), "Proof is not valid"); if(!claimed(merkleProof, amount)) { return true; } else { return false; } } function claimed(bytes32[] memory merkleProof, uint256 amount) public view returns (bool) { bool checkClaimed = false; bytes32 result = leaf(amount); require(MerkleProof.verify(merkleProof, root, result), "Proof is not valid"); if(whitelistClaimed.length > 0) { for(uint i = 0; i < whitelistClaimed.length; i++) { if(whitelistClaimed[i] == msg.sender) { checkClaimed = true; } } } return checkClaimed; } function claim(bytes32[] memory merkleProof, uint256 amount) public whenNotPaused { require(block.timestamp <= (startTime + claimDuration), "Claim is not allowed after claimDuration"); require(token.balanceOf(address(this)) >= amount, "Contract doesnt have enough tokens"); if(whitelistClaimed.length > 0) { for(uint i = 0; i < whitelistClaimed.length; i++) { if(whitelistClaimed[i] == msg.sender) { revert("Already Claimed"); } } } bytes32 result = leaf(amount); require(MerkleProof.verify(merkleProof, root, result), "Proof is not valid"); require(!claimed(merkleProof, amount), "Address has already claimed."); uint claimAmount = amount; token.transfer(msg.sender, claimAmount); whitelistClaimed.push(msg.sender); emit Claim(msg.sender, claimAmount, block.timestamp); } function setClaimDuration(uint256 _newDuration) public onlyOwner { require(claimDuration != _newDuration, "Same duration"); claimDuration = _newDuration; } function setRoot(bytes32 _root) public onlyOwner { require(root != _root, "Same root"); require(block.timestamp > (startTime + claimDuration), "claimDuration must be exceeded in order to update root"); address[] memory reset; root = _root; startTime = block.timestamp; whitelistClaimed = reset; claimDuration = 1 days; } function recoverERC20(address _tokenAddress, uint256 _tokenAmount) external onlyOwner { IERC20(_tokenAddress).transfer(msg.sender, _tokenAmount); emit RecoveredERC20(_tokenAddress, _tokenAmount); } function recoverERC721(address _tokenAddress, uint256 _tokenId) external onlyOwner { IERC721(_tokenAddress).safeTransferFrom(address(this), msg.sender, _tokenId); emit RecoveredERC721(_tokenAddress, _tokenId); } function leaf(uint256 amount) internal view returns(bytes32){ string memory l_amount=Strings.toString(amount); string memory l_acc = Strings.toHexString(msg.sender); string memory result = string(abi.encodePacked(l_acc,',',l_amount)); return(keccak256(abi.encodePacked(result))); } event Claim(address claimer, uint256 claimAmount, uint timestamp); event RecoveredERC20(address token, uint256 amount); event RecoveredERC721(address token, uint256 tokenId); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @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 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} * * _Available since v4.7._ */ 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. * * _Available since v4.4._ */ 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} * * _Available since v4.7._ */ 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. * * _Available since v4.7._ */ 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. * * _Available since v4.7._ */ 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). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild 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 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // 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 for 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) { 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. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild 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 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // 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 for 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) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } 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) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @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. * * By default, the owner account will be the one that deploys the contract. 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; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @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 { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing 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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @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 amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @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; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"claimAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Claim","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RecoveredERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"RecoveredERC721","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"canClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistClaimed","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"recoverERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"remainingDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"_newDuration","type":"uint256"}],"name":"setClaimDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405262093a806004553480156200001857600080fd5b506040516200283a3803806200283a83398181016040528101906200003e9190620002db565b6200005e62000052620000d760201b60201c565b620000df60201b60201c565b60008060146101000a81548160ff02191690831515021790555062000088620001a360201b60201c565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003819055505062000390565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001b3620000d760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620001d96200023460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000229906200036e565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200028f8262000262565b9050919050565b6000620002a38262000282565b9050919050565b620002b58162000296565b8114620002c157600080fd5b50565b600081519050620002d581620002aa565b92915050565b600060208284031215620002f457620002f36200025d565b5b60006200030484828501620002c4565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620003566020836200030d565b915062000363826200031e565b602082019050919050565b60006020820190508181036000830152620003898162000347565b9050919050565b61249a80620003a06000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806396b641d7116100a2578063dab5f34011610071578063dab5f34014610280578063dcb2f92a1461029c578063ebf0c717146102ba578063f2fde38b146102d8578063fc0c546a146102f45761010b565b806396b641d7146101e657806397c8cd9314610216578063ab1a4d9414610232578063b58b5f22146102505761010b565b806378e97925116100de57806378e9792514610172578063819d4cc6146101905780638980f11f146101ac5780638da5cb5b146101c85761010b565b806317529ce4146101105780633b4393511461012e5780635c975abb1461014a578063715018a614610168575b600080fd5b610118610312565b604051610125919061157f565b60405180910390f35b61014860048036038101906101439190611769565b61035b565b005b61015261075f565b60405161015f91906117e0565b60405180910390f35b610170610775565b005b61017a610789565b604051610187919061157f565b60405180910390f35b6101aa60048036038101906101a59190611859565b61078f565b005b6101c660048036038101906101c19190611859565b610843565b005b6101d0610907565b6040516101dd91906118a8565b60405180910390f35b61020060048036038101906101fb9190611769565b610930565b60405161020d91906117e0565b60405180910390f35b610230600480360381019061022b91906118c3565b610a44565b005b61023a610a9a565b604051610247919061157f565b60405180910390f35b61026a60048036038101906102659190611769565b610aa0565b60405161027791906117e0565b60405180910390f35b61029a600480360381019061029591906118f0565b610b71565b005b6102a4610c43565b6040516102b191906119db565b60405180910390f35b6102c2610cd1565b6040516102cf9190611a0c565b60405180910390f35b6102f260048036038101906102ed9190611a27565b610cd7565b005b6102fc610d5a565b6040516103099190611ab3565b60405180910390f35b60006004546003546103249190611afd565b4210156103535760006003544261033b9190611b31565b6004546103489190611b31565b905080915050610358565b600090505b90565b610363610d80565b6004546003546103739190611afd565b4211156103b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ac90611be8565b60405180910390fd5b80600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161041191906118a8565b602060405180830381865afa15801561042e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104529190611c1d565b1015610493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048a90611cbc565b60405180910390fd5b600060058054905011156105725760005b600580549050811015610570573373ffffffffffffffffffffffffffffffffffffffff16600582815481106104dc576104db611cdc565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361055d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055490611d57565b60405180910390fd5b808061056890611d77565b9150506104a4565b505b600061057d82610dca565b905061058c8360025483610e3c565b6105cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c290611e0b565b60405180910390fd5b6105d58383610930565b15610615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060c90611e77565b60405180910390fd5b6000829050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610677929190611e97565b6020604051808303816000875af1158015610696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ba9190611eec565b506005339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf733824260405161075193929190611f19565b60405180910390a150505050565b60008060149054906101000a900460ff16905090565b61077d610e53565b6107876000610ed1565b565b60035481565b610797610e53565b8173ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b81526004016107d493929190611f50565b600060405180830381600087803b1580156107ee57600080fd5b505af1158015610802573d6000803e3d6000fd5b505050507f57519b6a0997d7d44511836bcee0a36871aa79d445816f6c464abb0cd9d3f3e88282604051610837929190611e97565b60405180910390a15050565b61084b610e53565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610886929190611e97565b6020604051808303816000875af11580156108a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c99190611eec565b507f55350610fe57096d8c0ffa30beede987326bccfcb0b4415804164d0dd50ce8b182826040516108fb929190611e97565b60405180910390a15050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009050600061094284610dca565b90506109518560025483610e3c565b610990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098790611e0b565b60405180910390fd5b60006005805490501115610a395760005b600580549050811015610a37573373ffffffffffffffffffffffffffffffffffffffff16600582815481106109d9576109d8611cdc565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610a2457600192505b8080610a2f90611d77565b9150506109a1565b505b819250505092915050565b610a4c610e53565b8060045403610a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8790611fd3565b60405180910390fd5b8060048190555050565b60045481565b6000600454600354610ab29190611afd565b421115610af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aeb90611be8565b60405180910390fd5b6000610aff83610dca565b9050610b0e8460025483610e3c565b610b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4490611e0b565b60405180910390fd5b610b578484610930565b610b65576001915050610b6b565b60009150505b92915050565b610b79610e53565b8060025403610bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb49061203f565b60405180910390fd5b600454600354610bcd9190611afd565b4211610c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c05906120d1565b60405180910390fd5b606081600281905550426003819055508060059080519060200190610c349291906114bf565b50620151806004819055505050565b60606005805480602002602001604051908101604052809291908181526020018280548015610cc757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610c7d575b5050505050905090565b60025481565b610cdf610e53565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4590612163565b60405180910390fd5b610d5781610ed1565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d8861075f565b15610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf906121cf565b60405180910390fd5b565b600080610dd683610f95565b90506000610de333611063565b905060008183604051602001610dfa9291906122ac565b604051602081830303815290604052905080604051602001610e1c91906122db565b604051602081830303815290604052805190602001209350505050919050565b600082610e498584611090565b1490509392505050565b610e5b6110e6565b73ffffffffffffffffffffffffffffffffffffffff16610e79610907565b73ffffffffffffffffffffffffffffffffffffffff1614610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec69061233e565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606060006001610fa4846110ee565b01905060008167ffffffffffffffff811115610fc357610fc26115c4565b5b6040519080825280601f01601f191660200182016040528015610ff55781602001600182028036833780820191505090505b509050600082602001820190505b600115611058578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161104c5761104b61235e565b5b04945060008503611003575b819350505050919050565b60606110898273ffffffffffffffffffffffffffffffffffffffff16601460ff16611241565b9050919050565b60008082905060005b84518110156110db576110c6828683815181106110b9576110b8611cdc565b5b602002602001015161147d565b915080806110d390611d77565b915050611099565b508091505092915050565b600033905090565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061114c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816111425761114161235e565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611189576d04ee2d6d415b85acef8100000000838161117f5761117e61235e565b5b0492506020810190505b662386f26fc1000083106111b857662386f26fc1000083816111ae576111ad61235e565b5b0492506010810190505b6305f5e10083106111e1576305f5e10083816111d7576111d661235e565b5b0492506008810190505b61271083106112065761271083816111fc576111fb61235e565b5b0492506004810190505b60648310611229576064838161121f5761121e61235e565b5b0492506002810190505b600a8310611238576001810190505b80915050919050565b606060006002836002611254919061238d565b61125e9190611afd565b67ffffffffffffffff811115611277576112766115c4565b5b6040519080825280601f01601f1916602001820160405280156112a95781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106112e1576112e0611cdc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061134557611344611cdc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611385919061238d565b61138f9190611afd565b90505b600181111561142f577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106113d1576113d0611cdc565b5b1a60f81b8282815181106113e8576113e7611cdc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611428906123cf565b9050611392565b5060008414611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90612444565b60405180910390fd5b8091505092915050565b60008183106114955761149082846114a8565b6114a0565b61149f83836114a8565b5b905092915050565b600082600052816020526040600020905092915050565b828054828255906000526020600020908101928215611538579160200282015b828111156115375782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906114df565b5b5090506115459190611549565b5090565b5b8082111561156257600081600090555060010161154a565b5090565b6000819050919050565b61157981611566565b82525050565b60006020820190506115946000830184611570565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6115fc826115b3565b810181811067ffffffffffffffff8211171561161b5761161a6115c4565b5b80604052505050565b600061162e61159a565b905061163a82826115f3565b919050565b600067ffffffffffffffff82111561165a576116596115c4565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61168381611670565b811461168e57600080fd5b50565b6000813590506116a08161167a565b92915050565b60006116b96116b48461163f565b611624565b905080838252602082019050602084028301858111156116dc576116db61166b565b5b835b8181101561170557806116f18882611691565b8452602084019350506020810190506116de565b5050509392505050565b600082601f830112611724576117236115ae565b5b81356117348482602086016116a6565b91505092915050565b61174681611566565b811461175157600080fd5b50565b6000813590506117638161173d565b92915050565b600080604083850312156117805761177f6115a4565b5b600083013567ffffffffffffffff81111561179e5761179d6115a9565b5b6117aa8582860161170f565b92505060206117bb85828601611754565b9150509250929050565b60008115159050919050565b6117da816117c5565b82525050565b60006020820190506117f560008301846117d1565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611826826117fb565b9050919050565b6118368161181b565b811461184157600080fd5b50565b6000813590506118538161182d565b92915050565b600080604083850312156118705761186f6115a4565b5b600061187e85828601611844565b925050602061188f85828601611754565b9150509250929050565b6118a28161181b565b82525050565b60006020820190506118bd6000830184611899565b92915050565b6000602082840312156118d9576118d86115a4565b5b60006118e784828501611754565b91505092915050565b600060208284031215611906576119056115a4565b5b600061191484828501611691565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6119528161181b565b82525050565b60006119648383611949565b60208301905092915050565b6000602082019050919050565b60006119888261191d565b6119928185611928565b935061199d83611939565b8060005b838110156119ce5781516119b58882611958565b97506119c083611970565b9250506001810190506119a1565b5085935050505092915050565b600060208201905081810360008301526119f5818461197d565b905092915050565b611a0681611670565b82525050565b6000602082019050611a2160008301846119fd565b92915050565b600060208284031215611a3d57611a3c6115a4565b5b6000611a4b84828501611844565b91505092915050565b6000819050919050565b6000611a79611a74611a6f846117fb565b611a54565b6117fb565b9050919050565b6000611a8b82611a5e565b9050919050565b6000611a9d82611a80565b9050919050565b611aad81611a92565b82525050565b6000602082019050611ac86000830184611aa4565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611b0882611566565b9150611b1383611566565b9250828201905080821115611b2b57611b2a611ace565b5b92915050565b6000611b3c82611566565b9150611b4783611566565b9250828203905081811115611b5f57611b5e611ace565b5b92915050565b600082825260208201905092915050565b7f436c61696d206973206e6f7420616c6c6f77656420616674657220636c61696d60008201527f4475726174696f6e000000000000000000000000000000000000000000000000602082015250565b6000611bd2602883611b65565b9150611bdd82611b76565b604082019050919050565b60006020820190508181036000830152611c0181611bc5565b9050919050565b600081519050611c178161173d565b92915050565b600060208284031215611c3357611c326115a4565b5b6000611c4184828501611c08565b91505092915050565b7f436f6e747261637420646f65736e74206861766520656e6f75676820746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b6000611ca6602283611b65565b9150611cb182611c4a565b604082019050919050565b60006020820190508181036000830152611cd581611c99565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f416c726561647920436c61696d65640000000000000000000000000000000000600082015250565b6000611d41600f83611b65565b9150611d4c82611d0b565b602082019050919050565b60006020820190508181036000830152611d7081611d34565b9050919050565b6000611d8282611566565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611db457611db3611ace565b5b600182019050919050565b7f50726f6f66206973206e6f742076616c69640000000000000000000000000000600082015250565b6000611df5601283611b65565b9150611e0082611dbf565b602082019050919050565b60006020820190508181036000830152611e2481611de8565b9050919050565b7f416464726573732068617320616c726561647920636c61696d65642e00000000600082015250565b6000611e61601c83611b65565b9150611e6c82611e2b565b602082019050919050565b60006020820190508181036000830152611e9081611e54565b9050919050565b6000604082019050611eac6000830185611899565b611eb96020830184611570565b9392505050565b611ec9816117c5565b8114611ed457600080fd5b50565b600081519050611ee681611ec0565b92915050565b600060208284031215611f0257611f016115a4565b5b6000611f1084828501611ed7565b91505092915050565b6000606082019050611f2e6000830186611899565b611f3b6020830185611570565b611f486040830184611570565b949350505050565b6000606082019050611f656000830186611899565b611f726020830185611899565b611f7f6040830184611570565b949350505050565b7f53616d65206475726174696f6e00000000000000000000000000000000000000600082015250565b6000611fbd600d83611b65565b9150611fc882611f87565b602082019050919050565b60006020820190508181036000830152611fec81611fb0565b9050919050565b7f53616d6520726f6f740000000000000000000000000000000000000000000000600082015250565b6000612029600983611b65565b915061203482611ff3565b602082019050919050565b600060208201905081810360008301526120588161201c565b9050919050565b7f636c61696d4475726174696f6e206d757374206265206578636565646564206960008201527f6e206f7264657220746f2075706461746520726f6f7400000000000000000000602082015250565b60006120bb603683611b65565b91506120c68261205f565b604082019050919050565b600060208201905081810360008301526120ea816120ae565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061214d602683611b65565b9150612158826120f1565b604082019050919050565b6000602082019050818103600083015261217c81612140565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006121b9601083611b65565b91506121c482612183565b602082019050919050565b600060208201905081810360008301526121e8816121ac565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015612223578082015181840152602081019050612208565b60008484015250505050565b600061223a826121ef565b61224481856121fa565b9350612254818560208601612205565b80840191505092915050565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b60006122966001836121fa565b91506122a182612260565b600182019050919050565b60006122b8828561222f565b91506122c382612289565b91506122cf828461222f565b91508190509392505050565b60006122e7828461222f565b915081905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612328602083611b65565b9150612333826122f2565b602082019050919050565b600060208201905081810360008301526123578161231b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061239882611566565b91506123a383611566565b92508282026123b181611566565b915082820484148315176123c8576123c7611ace565b5b5092915050565b60006123da82611566565b9150600082036123ed576123ec611ace565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061242e602083611b65565b9150612439826123f8565b602082019050919050565b6000602082019050818103600083015261245d81612421565b905091905056fea26469706673582212202eefff5cba35a627e09734e93f47160f4e3e80b2673e98b45dd6ec47a32889e464736f6c63430008120033000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061010b5760003560e01c806396b641d7116100a2578063dab5f34011610071578063dab5f34014610280578063dcb2f92a1461029c578063ebf0c717146102ba578063f2fde38b146102d8578063fc0c546a146102f45761010b565b806396b641d7146101e657806397c8cd9314610216578063ab1a4d9414610232578063b58b5f22146102505761010b565b806378e97925116100de57806378e9792514610172578063819d4cc6146101905780638980f11f146101ac5780638da5cb5b146101c85761010b565b806317529ce4146101105780633b4393511461012e5780635c975abb1461014a578063715018a614610168575b600080fd5b610118610312565b604051610125919061157f565b60405180910390f35b61014860048036038101906101439190611769565b61035b565b005b61015261075f565b60405161015f91906117e0565b60405180910390f35b610170610775565b005b61017a610789565b604051610187919061157f565b60405180910390f35b6101aa60048036038101906101a59190611859565b61078f565b005b6101c660048036038101906101c19190611859565b610843565b005b6101d0610907565b6040516101dd91906118a8565b60405180910390f35b61020060048036038101906101fb9190611769565b610930565b60405161020d91906117e0565b60405180910390f35b610230600480360381019061022b91906118c3565b610a44565b005b61023a610a9a565b604051610247919061157f565b60405180910390f35b61026a60048036038101906102659190611769565b610aa0565b60405161027791906117e0565b60405180910390f35b61029a600480360381019061029591906118f0565b610b71565b005b6102a4610c43565b6040516102b191906119db565b60405180910390f35b6102c2610cd1565b6040516102cf9190611a0c565b60405180910390f35b6102f260048036038101906102ed9190611a27565b610cd7565b005b6102fc610d5a565b6040516103099190611ab3565b60405180910390f35b60006004546003546103249190611afd565b4210156103535760006003544261033b9190611b31565b6004546103489190611b31565b905080915050610358565b600090505b90565b610363610d80565b6004546003546103739190611afd565b4211156103b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ac90611be8565b60405180910390fd5b80600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161041191906118a8565b602060405180830381865afa15801561042e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104529190611c1d565b1015610493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048a90611cbc565b60405180910390fd5b600060058054905011156105725760005b600580549050811015610570573373ffffffffffffffffffffffffffffffffffffffff16600582815481106104dc576104db611cdc565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361055d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055490611d57565b60405180910390fd5b808061056890611d77565b9150506104a4565b505b600061057d82610dca565b905061058c8360025483610e3c565b6105cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c290611e0b565b60405180910390fd5b6105d58383610930565b15610615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060c90611e77565b60405180910390fd5b6000829050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610677929190611e97565b6020604051808303816000875af1158015610696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ba9190611eec565b506005339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf733824260405161075193929190611f19565b60405180910390a150505050565b60008060149054906101000a900460ff16905090565b61077d610e53565b6107876000610ed1565b565b60035481565b610797610e53565b8173ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b81526004016107d493929190611f50565b600060405180830381600087803b1580156107ee57600080fd5b505af1158015610802573d6000803e3d6000fd5b505050507f57519b6a0997d7d44511836bcee0a36871aa79d445816f6c464abb0cd9d3f3e88282604051610837929190611e97565b60405180910390a15050565b61084b610e53565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610886929190611e97565b6020604051808303816000875af11580156108a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c99190611eec565b507f55350610fe57096d8c0ffa30beede987326bccfcb0b4415804164d0dd50ce8b182826040516108fb929190611e97565b60405180910390a15050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009050600061094284610dca565b90506109518560025483610e3c565b610990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098790611e0b565b60405180910390fd5b60006005805490501115610a395760005b600580549050811015610a37573373ffffffffffffffffffffffffffffffffffffffff16600582815481106109d9576109d8611cdc565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610a2457600192505b8080610a2f90611d77565b9150506109a1565b505b819250505092915050565b610a4c610e53565b8060045403610a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8790611fd3565b60405180910390fd5b8060048190555050565b60045481565b6000600454600354610ab29190611afd565b421115610af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aeb90611be8565b60405180910390fd5b6000610aff83610dca565b9050610b0e8460025483610e3c565b610b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4490611e0b565b60405180910390fd5b610b578484610930565b610b65576001915050610b6b565b60009150505b92915050565b610b79610e53565b8060025403610bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb49061203f565b60405180910390fd5b600454600354610bcd9190611afd565b4211610c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c05906120d1565b60405180910390fd5b606081600281905550426003819055508060059080519060200190610c349291906114bf565b50620151806004819055505050565b60606005805480602002602001604051908101604052809291908181526020018280548015610cc757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610c7d575b5050505050905090565b60025481565b610cdf610e53565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4590612163565b60405180910390fd5b610d5781610ed1565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d8861075f565b15610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf906121cf565b60405180910390fd5b565b600080610dd683610f95565b90506000610de333611063565b905060008183604051602001610dfa9291906122ac565b604051602081830303815290604052905080604051602001610e1c91906122db565b604051602081830303815290604052805190602001209350505050919050565b600082610e498584611090565b1490509392505050565b610e5b6110e6565b73ffffffffffffffffffffffffffffffffffffffff16610e79610907565b73ffffffffffffffffffffffffffffffffffffffff1614610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec69061233e565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606060006001610fa4846110ee565b01905060008167ffffffffffffffff811115610fc357610fc26115c4565b5b6040519080825280601f01601f191660200182016040528015610ff55781602001600182028036833780820191505090505b509050600082602001820190505b600115611058578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161104c5761104b61235e565b5b04945060008503611003575b819350505050919050565b60606110898273ffffffffffffffffffffffffffffffffffffffff16601460ff16611241565b9050919050565b60008082905060005b84518110156110db576110c6828683815181106110b9576110b8611cdc565b5b602002602001015161147d565b915080806110d390611d77565b915050611099565b508091505092915050565b600033905090565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061114c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816111425761114161235e565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611189576d04ee2d6d415b85acef8100000000838161117f5761117e61235e565b5b0492506020810190505b662386f26fc1000083106111b857662386f26fc1000083816111ae576111ad61235e565b5b0492506010810190505b6305f5e10083106111e1576305f5e10083816111d7576111d661235e565b5b0492506008810190505b61271083106112065761271083816111fc576111fb61235e565b5b0492506004810190505b60648310611229576064838161121f5761121e61235e565b5b0492506002810190505b600a8310611238576001810190505b80915050919050565b606060006002836002611254919061238d565b61125e9190611afd565b67ffffffffffffffff811115611277576112766115c4565b5b6040519080825280601f01601f1916602001820160405280156112a95781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106112e1576112e0611cdc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061134557611344611cdc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611385919061238d565b61138f9190611afd565b90505b600181111561142f577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106113d1576113d0611cdc565b5b1a60f81b8282815181106113e8576113e7611cdc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611428906123cf565b9050611392565b5060008414611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90612444565b60405180910390fd5b8091505092915050565b60008183106114955761149082846114a8565b6114a0565b61149f83836114a8565b5b905092915050565b600082600052816020526040600020905092915050565b828054828255906000526020600020908101928215611538579160200282015b828111156115375782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906114df565b5b5090506115459190611549565b5090565b5b8082111561156257600081600090555060010161154a565b5090565b6000819050919050565b61157981611566565b82525050565b60006020820190506115946000830184611570565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6115fc826115b3565b810181811067ffffffffffffffff8211171561161b5761161a6115c4565b5b80604052505050565b600061162e61159a565b905061163a82826115f3565b919050565b600067ffffffffffffffff82111561165a576116596115c4565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61168381611670565b811461168e57600080fd5b50565b6000813590506116a08161167a565b92915050565b60006116b96116b48461163f565b611624565b905080838252602082019050602084028301858111156116dc576116db61166b565b5b835b8181101561170557806116f18882611691565b8452602084019350506020810190506116de565b5050509392505050565b600082601f830112611724576117236115ae565b5b81356117348482602086016116a6565b91505092915050565b61174681611566565b811461175157600080fd5b50565b6000813590506117638161173d565b92915050565b600080604083850312156117805761177f6115a4565b5b600083013567ffffffffffffffff81111561179e5761179d6115a9565b5b6117aa8582860161170f565b92505060206117bb85828601611754565b9150509250929050565b60008115159050919050565b6117da816117c5565b82525050565b60006020820190506117f560008301846117d1565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611826826117fb565b9050919050565b6118368161181b565b811461184157600080fd5b50565b6000813590506118538161182d565b92915050565b600080604083850312156118705761186f6115a4565b5b600061187e85828601611844565b925050602061188f85828601611754565b9150509250929050565b6118a28161181b565b82525050565b60006020820190506118bd6000830184611899565b92915050565b6000602082840312156118d9576118d86115a4565b5b60006118e784828501611754565b91505092915050565b600060208284031215611906576119056115a4565b5b600061191484828501611691565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6119528161181b565b82525050565b60006119648383611949565b60208301905092915050565b6000602082019050919050565b60006119888261191d565b6119928185611928565b935061199d83611939565b8060005b838110156119ce5781516119b58882611958565b97506119c083611970565b9250506001810190506119a1565b5085935050505092915050565b600060208201905081810360008301526119f5818461197d565b905092915050565b611a0681611670565b82525050565b6000602082019050611a2160008301846119fd565b92915050565b600060208284031215611a3d57611a3c6115a4565b5b6000611a4b84828501611844565b91505092915050565b6000819050919050565b6000611a79611a74611a6f846117fb565b611a54565b6117fb565b9050919050565b6000611a8b82611a5e565b9050919050565b6000611a9d82611a80565b9050919050565b611aad81611a92565b82525050565b6000602082019050611ac86000830184611aa4565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611b0882611566565b9150611b1383611566565b9250828201905080821115611b2b57611b2a611ace565b5b92915050565b6000611b3c82611566565b9150611b4783611566565b9250828203905081811115611b5f57611b5e611ace565b5b92915050565b600082825260208201905092915050565b7f436c61696d206973206e6f7420616c6c6f77656420616674657220636c61696d60008201527f4475726174696f6e000000000000000000000000000000000000000000000000602082015250565b6000611bd2602883611b65565b9150611bdd82611b76565b604082019050919050565b60006020820190508181036000830152611c0181611bc5565b9050919050565b600081519050611c178161173d565b92915050565b600060208284031215611c3357611c326115a4565b5b6000611c4184828501611c08565b91505092915050565b7f436f6e747261637420646f65736e74206861766520656e6f75676820746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b6000611ca6602283611b65565b9150611cb182611c4a565b604082019050919050565b60006020820190508181036000830152611cd581611c99565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f416c726561647920436c61696d65640000000000000000000000000000000000600082015250565b6000611d41600f83611b65565b9150611d4c82611d0b565b602082019050919050565b60006020820190508181036000830152611d7081611d34565b9050919050565b6000611d8282611566565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611db457611db3611ace565b5b600182019050919050565b7f50726f6f66206973206e6f742076616c69640000000000000000000000000000600082015250565b6000611df5601283611b65565b9150611e0082611dbf565b602082019050919050565b60006020820190508181036000830152611e2481611de8565b9050919050565b7f416464726573732068617320616c726561647920636c61696d65642e00000000600082015250565b6000611e61601c83611b65565b9150611e6c82611e2b565b602082019050919050565b60006020820190508181036000830152611e9081611e54565b9050919050565b6000604082019050611eac6000830185611899565b611eb96020830184611570565b9392505050565b611ec9816117c5565b8114611ed457600080fd5b50565b600081519050611ee681611ec0565b92915050565b600060208284031215611f0257611f016115a4565b5b6000611f1084828501611ed7565b91505092915050565b6000606082019050611f2e6000830186611899565b611f3b6020830185611570565b611f486040830184611570565b949350505050565b6000606082019050611f656000830186611899565b611f726020830185611899565b611f7f6040830184611570565b949350505050565b7f53616d65206475726174696f6e00000000000000000000000000000000000000600082015250565b6000611fbd600d83611b65565b9150611fc882611f87565b602082019050919050565b60006020820190508181036000830152611fec81611fb0565b9050919050565b7f53616d6520726f6f740000000000000000000000000000000000000000000000600082015250565b6000612029600983611b65565b915061203482611ff3565b602082019050919050565b600060208201905081810360008301526120588161201c565b9050919050565b7f636c61696d4475726174696f6e206d757374206265206578636565646564206960008201527f6e206f7264657220746f2075706461746520726f6f7400000000000000000000602082015250565b60006120bb603683611b65565b91506120c68261205f565b604082019050919050565b600060208201905081810360008301526120ea816120ae565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061214d602683611b65565b9150612158826120f1565b604082019050919050565b6000602082019050818103600083015261217c81612140565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006121b9601083611b65565b91506121c482612183565b602082019050919050565b600060208201905081810360008301526121e8816121ac565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015612223578082015181840152602081019050612208565b60008484015250505050565b600061223a826121ef565b61224481856121fa565b9350612254818560208601612205565b80840191505092915050565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b60006122966001836121fa565b91506122a182612260565b600182019050919050565b60006122b8828561222f565b91506122c382612289565b91506122cf828461222f565b91508190509392505050565b60006122e7828461222f565b915081905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612328602083611b65565b9150612333826122f2565b602082019050919050565b600060208201905081810360008301526123578161231b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061239882611566565b91506123a383611566565b92508282026123b181611566565b915082820484148315176123c8576123c7611ace565b5b5092915050565b60006123da82611566565b9150600082036123ed576123ec611ace565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061242e602083611b65565b9150612439826123f8565b602082019050919050565b6000602082019050818103600083015261245d81612421565b905091905056fea26469706673582212202eefff5cba35a627e09734e93f47160f4e3e80b2673e98b45dd6ec47a32889e464736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000A0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
-----Decoded View---------------
Arg [0] : _token (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000A0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.999899 | 3,034.3689 | $3,034.06 |
Loading...
Loading
Loading...
Loading
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.