More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 44,019 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw All | 280912067 | 140 days ago | IN | 0 ETH | 0.00000126 | ||||
Claim | 280200817 | 143 days ago | IN | 0 ETH | 0.0000029 | ||||
Claim | 279817472 | 144 days ago | IN | 0 ETH | 0.00000325 | ||||
Claim | 278142685 | 149 days ago | IN | 0 ETH | 0.00001302 | ||||
Claim | 277589774 | 150 days ago | IN | 0 ETH | 0.00000956 | ||||
Claim | 277046973 | 152 days ago | IN | 0 ETH | 0.00000237 | ||||
Claim | 277046946 | 152 days ago | IN | 0 ETH | 0.00000245 | ||||
Claim | 277046917 | 152 days ago | IN | 0 ETH | 0.00000245 | ||||
Claim | 277046883 | 152 days ago | IN | 0 ETH | 0.00000315 | ||||
Claim | 277046850 | 152 days ago | IN | 0 ETH | 0.00000315 | ||||
Claim | 277046821 | 152 days ago | IN | 0 ETH | 0.00000305 | ||||
Claim | 277046792 | 152 days ago | IN | 0 ETH | 0.00000315 | ||||
Claim | 277046201 | 152 days ago | IN | 0 ETH | 0.00000315 | ||||
Claim | 275114547 | 157 days ago | IN | 0 ETH | 0.00001197 | ||||
Claim | 275112734 | 157 days ago | IN | 0 ETH | 0.00000888 | ||||
Claim | 274808958 | 158 days ago | IN | 0 ETH | 0.00000569 | ||||
Claim | 274126523 | 160 days ago | IN | 0 ETH | 0.00002868 | ||||
Claim | 274013319 | 161 days ago | IN | 0 ETH | 0.00000679 | ||||
Claim | 273858787 | 161 days ago | IN | 0 ETH | 0.00000593 | ||||
Claim | 273852187 | 161 days ago | IN | 0 ETH | 0.00000683 | ||||
Claim | 273044280 | 163 days ago | IN | 0 ETH | 0.00001681 | ||||
Claim | 272776521 | 164 days ago | IN | 0 ETH | 0.00000341 | ||||
Claim | 271932929 | 167 days ago | IN | 0 ETH | 0.00000908 | ||||
Claim | 270515872 | 171 days ago | IN | 0 ETH | 0.00000185 | ||||
Claim | 269413598 | 174 days ago | IN | 0 ETH | 0.00000507 |
Loading...
Loading
Contract Name:
MerkleDistributor
Compiler Version
v0.8.21+commit.d9974bed
Optimization Enabled:
Yes with 200 runs
Other Settings:
shanghai EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.20; import {MerkleProof} from '@openzeppelin/contracts/utils/cryptography/MerkleProof.sol'; import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; contract MerkleDistributor { IERC20 public immutable token; bytes32 public immutable merkleRoot; address public immutable owner; event Claimed(uint256 indexed index, address indexed account, uint256 amount); event Ended(); // This is a packed array of booleans. mapping(uint256 => uint256) private claimedBitMap; constructor(IERC20 token_, bytes32 merkleRoot_, address owner_) { token = token_; merkleRoot = merkleRoot_; owner = owner_; } function isClaimed(uint256 index) public view returns (bool) { uint256 claimedWordIndex = index / 256; uint256 claimedBitIndex = index % 256; uint256 claimedWord = claimedBitMap[claimedWordIndex]; uint256 mask = (1 << claimedBitIndex); return claimedWord & mask == mask; } function _setClaimed(uint256 index) private { uint256 claimedWordIndex = index / 256; uint256 claimedBitIndex = index % 256; claimedBitMap[claimedWordIndex] = claimedBitMap[claimedWordIndex] | (1 << claimedBitIndex); } function claim(uint256 index, address account, uint256 amount, bytes32[] calldata merkleProof) external { require(!isClaimed(index), 'MerkleDistributor: Drop already claimed.'); // Verify the merkle proof. bytes32 leaf = keccak256(bytes.concat(keccak256(abi.encode(index, account, amount)))); require(MerkleProof.verifyCalldata(merkleProof, merkleRoot, leaf), 'MerkleDistributor: Invalid proof.'); // Mark it claimed and send the token. _setClaimed(index); require(token.transfer(account, amount), 'MerkleDistributor: Transfer failed.'); emit Claimed(index, account, amount); } function withdrawAll() external { require(msg.sender == owner, 'MerkleDistributor: Only owner can withdraw'); require(token.transfer(owner, token.balanceOf(address(this))), 'MerkleDistributor: Transfer failed.'); emit Ended(); } }
// SPDX-License-Identifier: MIT // 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) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ 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); }
{ "remappings": [ "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "openzeppelin-contracts/contracts/=lib/openzeppelin-contracts/contracts/", "@prb/math/=lib/prb-math/", "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", "@prb/test/=lib/prb-math/node_modules/@prb/test/", "ds-test/=lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "prb-math/=lib/prb-math/src/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "shanghai", "viaIR": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC20","name":"token_","type":"address"},{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"},{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[],"name":"Ended","type":"event"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e060405234801561000f575f80fd5b5060405161094838038061094883398101604081905261002e91610062565b6001600160a01b0392831660805260a0919091521660c0526100a2565b6001600160a01b038116811461005f575f80fd5b50565b5f805f60608486031215610074575f80fd5b835161007f8161004b565b6020850151604086015191945092506100978161004b565b809150509250925092565b60805160a05160c05161085b6100ed5f395f818160c00152818161039b015261046101525f8181607e015261021401525f8181610122015281816102be0152610430015261085b5ff3fe608060405234801561000f575f80fd5b5060043610610060575f3560e01c80632e7ba6ef146100645780632eb4a7ab14610079578063853828b6146100b35780638da5cb5b146100bb5780639e34070f146100fa578063fc0c546a1461011d575b5f80fd5b610077610072366004610687565b610144565b005b6100a07f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b610077610390565b6100e27f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100aa565b61010d610108366004610723565b61057d565b60405190151581526020016100aa565b6100e27f000000000000000000000000000000000000000000000000000000000000000081565b61014d8561057d565b156101b05760405162461bcd60e51b815260206004820152602860248201527f4d65726b6c654469737472696275746f723a2044726f7020616c72656164792060448201526731b630b4b6b2b21760c11b60648201526084015b60405180910390fd5b60408051602081018790526001600160a01b03861691810191909152606081018490525f9060800160408051601f198184030181528282528051602091820120908301520160405160208183030381529060405280519060200120905061023983837f0000000000000000000000000000000000000000000000000000000000000000846105bb565b61028f5760405162461bcd60e51b815260206004820152602160248201527f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f666044820152601760f91b60648201526084016101a7565b610298866105d2565b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015610304573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610328919061073a565b6103445760405162461bcd60e51b81526004016101a790610759565b846001600160a01b0316867f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed0268660405161038091815260200190565b60405180910390a3505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461041b5760405162461bcd60e51b815260206004820152602a60248201527f4d65726b6c654469737472696275746f723a204f6e6c79206f776e65722063616044820152696e20776974686472617760b01b60648201526084016101a7565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb907f00000000000000000000000000000000000000000000000000000000000000009083906370a0823190602401602060405180830381865afa1580156104a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104cb919061079c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610513573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610537919061073a565b6105535760405162461bcd60e51b81526004016101a790610759565b6040517f477383f34069ce6129e1b6e0cbbdedb319ee49ef85677e403c26c37405ada46d905f90a1565b5f8061058b610100846107c7565b90505f61059a610100856107da565b5f9283526020839052604090922054600190921b9182169091149392505050565b5f826105c886868561060d565b1495945050505050565b5f6105df610100836107c7565b90505f6105ee610100846107da565b5f928352602083905260409092208054600190931b9092179091555050565b5f81815b8481101561064f5761063b8287878481811061062f5761062f6107ed565b90506020020135610658565b91508061064781610801565b915050610611565b50949350505050565b5f818310610672575f828152602084905260409020610680565b5f8381526020839052604090205b9392505050565b5f805f805f6080868803121561069b575f80fd5b8535945060208601356001600160a01b03811681146106b8575f80fd5b935060408601359250606086013567ffffffffffffffff808211156106db575f80fd5b818801915088601f8301126106ee575f80fd5b8135818111156106fc575f80fd5b8960208260051b8501011115610710575f80fd5b9699959850939650602001949392505050565b5f60208284031215610733575f80fd5b5035919050565b5f6020828403121561074a575f80fd5b81518015158114610680575f80fd5b60208082526023908201527f4d65726b6c654469737472696275746f723a205472616e73666572206661696c60408201526232b21760e91b606082015260800190565b5f602082840312156107ac575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f826107d5576107d56107b3565b500490565b5f826107e8576107e86107b3565b500690565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161081e57634e487b7160e01b5f52601160045260245ffd5b506001019056fea264697066735822122059fa6269215b416ffdf98e511023480404a6fe47849fea3635345c7d56a8ec9a64736f6c634300081500330000000000000000000000001337420ded5adb9980cfc35f8f2b054ea86f8ab197c0195daa3eb1493d3d19e6fe14eafcd1f45984338dae335d7dc78b8ed06e89000000000000000000000000d56fc12b36768aad9d8bd8bdcbf2648518e416dc
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610060575f3560e01c80632e7ba6ef146100645780632eb4a7ab14610079578063853828b6146100b35780638da5cb5b146100bb5780639e34070f146100fa578063fc0c546a1461011d575b5f80fd5b610077610072366004610687565b610144565b005b6100a07f97c0195daa3eb1493d3d19e6fe14eafcd1f45984338dae335d7dc78b8ed06e8981565b6040519081526020015b60405180910390f35b610077610390565b6100e27f000000000000000000000000d56fc12b36768aad9d8bd8bdcbf2648518e416dc81565b6040516001600160a01b0390911681526020016100aa565b61010d610108366004610723565b61057d565b60405190151581526020016100aa565b6100e27f0000000000000000000000001337420ded5adb9980cfc35f8f2b054ea86f8ab181565b61014d8561057d565b156101b05760405162461bcd60e51b815260206004820152602860248201527f4d65726b6c654469737472696275746f723a2044726f7020616c72656164792060448201526731b630b4b6b2b21760c11b60648201526084015b60405180910390fd5b60408051602081018790526001600160a01b03861691810191909152606081018490525f9060800160408051601f198184030181528282528051602091820120908301520160405160208183030381529060405280519060200120905061023983837f97c0195daa3eb1493d3d19e6fe14eafcd1f45984338dae335d7dc78b8ed06e89846105bb565b61028f5760405162461bcd60e51b815260206004820152602160248201527f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f666044820152601760f91b60648201526084016101a7565b610298866105d2565b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018690527f0000000000000000000000001337420ded5adb9980cfc35f8f2b054ea86f8ab1169063a9059cbb906044016020604051808303815f875af1158015610304573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610328919061073a565b6103445760405162461bcd60e51b81526004016101a790610759565b846001600160a01b0316867f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed0268660405161038091815260200190565b60405180910390a3505050505050565b336001600160a01b037f000000000000000000000000d56fc12b36768aad9d8bd8bdcbf2648518e416dc161461041b5760405162461bcd60e51b815260206004820152602a60248201527f4d65726b6c654469737472696275746f723a204f6e6c79206f776e65722063616044820152696e20776974686472617760b01b60648201526084016101a7565b6040516370a0823160e01b81523060048201527f0000000000000000000000001337420ded5adb9980cfc35f8f2b054ea86f8ab16001600160a01b03169063a9059cbb907f000000000000000000000000d56fc12b36768aad9d8bd8bdcbf2648518e416dc9083906370a0823190602401602060405180830381865afa1580156104a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104cb919061079c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610513573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610537919061073a565b6105535760405162461bcd60e51b81526004016101a790610759565b6040517f477383f34069ce6129e1b6e0cbbdedb319ee49ef85677e403c26c37405ada46d905f90a1565b5f8061058b610100846107c7565b90505f61059a610100856107da565b5f9283526020839052604090922054600190921b9182169091149392505050565b5f826105c886868561060d565b1495945050505050565b5f6105df610100836107c7565b90505f6105ee610100846107da565b5f928352602083905260409092208054600190931b9092179091555050565b5f81815b8481101561064f5761063b8287878481811061062f5761062f6107ed565b90506020020135610658565b91508061064781610801565b915050610611565b50949350505050565b5f818310610672575f828152602084905260409020610680565b5f8381526020839052604090205b9392505050565b5f805f805f6080868803121561069b575f80fd5b8535945060208601356001600160a01b03811681146106b8575f80fd5b935060408601359250606086013567ffffffffffffffff808211156106db575f80fd5b818801915088601f8301126106ee575f80fd5b8135818111156106fc575f80fd5b8960208260051b8501011115610710575f80fd5b9699959850939650602001949392505050565b5f60208284031215610733575f80fd5b5035919050565b5f6020828403121561074a575f80fd5b81518015158114610680575f80fd5b60208082526023908201527f4d65726b6c654469737472696275746f723a205472616e73666572206661696c60408201526232b21760e91b606082015260800190565b5f602082840312156107ac575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f826107d5576107d56107b3565b500490565b5f826107e8576107e86107b3565b500690565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161081e57634e487b7160e01b5f52601160045260245ffd5b506001019056fea264697066735822122059fa6269215b416ffdf98e511023480404a6fe47849fea3635345c7d56a8ec9a64736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001337420ded5adb9980cfc35f8f2b054ea86f8ab197c0195daa3eb1493d3d19e6fe14eafcd1f45984338dae335d7dc78b8ed06e89000000000000000000000000d56fc12b36768aad9d8bd8bdcbf2648518e416dc
-----Decoded View---------------
Arg [0] : token_ (address): 0x1337420dED5ADb9980CFc35f8f2B054ea86f8aB1
Arg [1] : merkleRoot_ (bytes32): 0x97c0195daa3eb1493d3d19e6fe14eafcd1f45984338dae335d7dc78b8ed06e89
Arg [2] : owner_ (address): 0xd56fC12B36768aaD9d8bd8BdcBf2648518E416DC
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000001337420ded5adb9980cfc35f8f2b054ea86f8ab1
Arg [1] : 97c0195daa3eb1493d3d19e6fe14eafcd1f45984338dae335d7dc78b8ed06e89
Arg [2] : 000000000000000000000000d56fc12b36768aad9d8bd8bdcbf2648518e416dc
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.