Source Code
Latest 25 from a total of 44,019 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw All | 280912067 | 418 days ago | IN | 0 ETH | 0.00000126 | ||||
| Claim | 280200817 | 420 days ago | IN | 0 ETH | 0.0000029 | ||||
| Claim | 279817472 | 421 days ago | IN | 0 ETH | 0.00000325 | ||||
| Claim | 278142685 | 426 days ago | IN | 0 ETH | 0.00001302 | ||||
| Claim | 277589774 | 427 days ago | IN | 0 ETH | 0.00000956 | ||||
| Claim | 277046973 | 429 days ago | IN | 0 ETH | 0.00000237 | ||||
| Claim | 277046946 | 429 days ago | IN | 0 ETH | 0.00000245 | ||||
| Claim | 277046917 | 429 days ago | IN | 0 ETH | 0.00000245 | ||||
| Claim | 277046883 | 429 days ago | IN | 0 ETH | 0.00000315 | ||||
| Claim | 277046850 | 429 days ago | IN | 0 ETH | 0.00000315 | ||||
| Claim | 277046821 | 429 days ago | IN | 0 ETH | 0.00000305 | ||||
| Claim | 277046792 | 429 days ago | IN | 0 ETH | 0.00000315 | ||||
| Claim | 277046201 | 429 days ago | IN | 0 ETH | 0.00000315 | ||||
| Claim | 275114547 | 434 days ago | IN | 0 ETH | 0.00001197 | ||||
| Claim | 275112734 | 434 days ago | IN | 0 ETH | 0.00000888 | ||||
| Claim | 274808958 | 435 days ago | IN | 0 ETH | 0.00000569 | ||||
| Claim | 274126523 | 437 days ago | IN | 0 ETH | 0.00002868 | ||||
| Claim | 274013319 | 438 days ago | IN | 0 ETH | 0.00000679 | ||||
| Claim | 273858787 | 438 days ago | IN | 0 ETH | 0.00000593 | ||||
| Claim | 273852187 | 438 days ago | IN | 0 ETH | 0.00000683 | ||||
| Claim | 273044280 | 440 days ago | IN | 0 ETH | 0.00001681 | ||||
| Claim | 272776521 | 441 days ago | IN | 0 ETH | 0.00000341 | ||||
| Claim | 271932929 | 444 days ago | IN | 0 ETH | 0.00000908 | ||||
| Claim | 270515872 | 448 days ago | IN | 0 ETH | 0.00000185 | ||||
| Claim | 269413598 | 451 days ago | IN | 0 ETH | 0.00000507 |
Cross-Chain Transactions
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
Loading...
Loading
Net Worth in USD
$6.93
Net Worth in ETH
0.002356
Token Allocations
ETH
92.21%
USD₮0
6.05%
ARB
1.74%
Multichain Portfolio | 35 Chains
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.