Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 188 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 15548819 | 847 days ago | IN | 0 ETH | 0.00071531 | ||||
Set Claim Bps | 15548773 | 847 days ago | IN | 0 ETH | 0.00028934 | ||||
Set Min Token Bp... | 15548766 | 847 days ago | IN | 0 ETH | 0.00028536 | ||||
Set Max Tokens C... | 15548765 | 847 days ago | IN | 0 ETH | 0.00035102 | ||||
Set Merkle Root | 15548756 | 847 days ago | IN | 0 ETH | 0.00036364 | ||||
Claim | 15548389 | 847 days ago | IN | 0 ETH | 0.00041718 | ||||
Claim | 15548387 | 847 days ago | IN | 0 ETH | 0.00046894 | ||||
Set Min Token Bp... | 15548386 | 847 days ago | IN | 0 ETH | 0.00024963 | ||||
Claim | 15548386 | 847 days ago | IN | 0 ETH | 0.0008687 | ||||
Claim | 15548386 | 847 days ago | IN | 0 ETH | 0.00087919 | ||||
Claim | 15548386 | 847 days ago | IN | 0 ETH | 0.00087943 | ||||
Claim | 15548386 | 847 days ago | IN | 0 ETH | 0.00116159 | ||||
Claim | 15548382 | 847 days ago | IN | 0 ETH | 0.00037305 | ||||
Claim | 15548381 | 847 days ago | IN | 0 ETH | 0.00093185 | ||||
Claim | 15548379 | 847 days ago | IN | 0 ETH | 0.00097101 | ||||
Claim | 15548379 | 847 days ago | IN | 0 ETH | 0.00097084 | ||||
Claim | 15548379 | 847 days ago | IN | 0 ETH | 0.00101991 | ||||
Claim | 15548376 | 847 days ago | IN | 0 ETH | 0.00091284 | ||||
Claim | 15548376 | 847 days ago | IN | 0 ETH | 0.00096274 | ||||
Claim | 15548376 | 847 days ago | IN | 0 ETH | 0.00194568 | ||||
Claim | 15548374 | 847 days ago | IN | 0 ETH | 0.00087621 | ||||
Claim | 15548372 | 847 days ago | IN | 0 ETH | 0.00085723 | ||||
Claim | 15548372 | 847 days ago | IN | 0 ETH | 0.00100436 | ||||
Claim | 15548372 | 847 days ago | IN | 0 ETH | 0.00433065 | ||||
Claim | 15548371 | 847 days ago | IN | 0 ETH | 0.00090518 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MerkleDistributor
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; contract MerkleDistributor is Ownable { uint256 public constant BPS_DENOMINATOR = 10_000; IERC20 public immutable token; bytes32 public merkleRoot; /// @notice A percentage of the amount that is claimable uint256 public claimBps; /// @notice A percentage of the claim amount that must be held by the user to claim uint256 public minBalanceBps; /// @notice The max number of tokens that can be claimed per user uint256 public maxTokensClaimable; // This is a packed array of booleans. mapping(uint256 => uint256) private claimedBitMap; event Claimed( uint256 index, address account, uint256 amount, uint256 actualAmount ); event MerkleRootChanged(bytes32 oldRoot, bytes32 newRoot); event ClaimBpsChanged(uint256 oldBps, uint256 newBps); event MinBalanceBpsChanged(uint256 oldBps, uint256 newBps); event MaxTokensClaimableChanged(uint256 oldMax, uint256 newMax); constructor( IERC20 token_, bytes32 merkleRoot_, uint256 claimBps_, uint256 minBalanceBps_, uint256 maxTokensClaimable_ ) { token = token_; merkleRoot = merkleRoot_; claimBps = claimBps_; minBalanceBps = minBalanceBps_; maxTokensClaimable = maxTokensClaimable_; } /// @notice Returns true if the index has been marked claimed. 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; } /// @notice Marks index as claimed. function _setClaimed(uint256 index) private { uint256 claimedWordIndex = index / 256; uint256 claimedBitIndex = index % 256; claimedBitMap[claimedWordIndex] = claimedBitMap[claimedWordIndex] | (1 << claimedBitIndex); } /// @notice Claims an airdrop function claim( uint256 index, address account, uint256 amount, bytes32[] calldata merkleProof ) external { require(!isClaimed(index), "MerkleDistributor: Drop already claimed."); // Users must have at least minBalanceBps of their claim uint256 actualAmount = amount * claimBps / BPS_DENOMINATOR; if (actualAmount > maxTokensClaimable) { actualAmount = maxTokensClaimable; } uint256 minBalance = (actualAmount * minBalanceBps) / BPS_DENOMINATOR; require( token.balanceOf(account) >= minBalance, "MerkleDistributor: Insufficient balance" ); // Verify the merkle proof. bytes32 node = keccak256(abi.encodePacked(index, account, amount)); require( MerkleProof.verify(merkleProof, merkleRoot, node), "MerkleDistributor: Invalid proof." ); // Mark it claimed and send the token. _setClaimed(index); require( token.transfer(account, actualAmount), "MerkleDistributor: Transfer failed." ); emit Claimed(index, account, amount, actualAmount); } /// @notice Changes the merkle root function setMerkleRoot(bytes32 merkleRoot_) external onlyOwner { emit MerkleRootChanged(merkleRoot, merkleRoot); merkleRoot = merkleRoot_; } /// @notice Changes the claim bps function setClaimBps(uint256 claimBps_) external onlyOwner { emit ClaimBpsChanged(claimBps, claimBps_); claimBps = claimBps_; } /// @notice Changes the min balance bps function setMinTokenBps(uint256 minBalanceBps_) external onlyOwner { emit MinBalanceBpsChanged(minBalanceBps, minBalanceBps_); minBalanceBps = minBalanceBps_; } /// @notice Changes the max tokens claimable function setMaxTokensClaimable(uint256 maxTokensClaimable_) external onlyOwner { emit MaxTokensClaimableChanged(maxTokensClaimable, maxTokensClaimable_); maxTokensClaimable = maxTokensClaimable_; } /// @notice Burns remaining tokens in the contract function end() external onlyOwner { token.transfer(address(0), token.balanceOf(address(this))); } }
// 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.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.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * 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. */ 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 proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _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} * * _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 the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _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} * * _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 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": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"token_","type":"address"},{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"},{"internalType":"uint256","name":"claimBps_","type":"uint256"},{"internalType":"uint256","name":"minBalanceBps_","type":"uint256"},{"internalType":"uint256","name":"maxTokensClaimable_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldBps","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBps","type":"uint256"}],"name":"ClaimBpsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"actualAmount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"MaxTokensClaimableChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"oldRoot","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"newRoot","type":"bytes32"}],"name":"MerkleRootChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldBps","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBps","type":"uint256"}],"name":"MinBalanceBpsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"BPS_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":[],"name":"claimBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"end","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":"maxTokensClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBalanceBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimBps_","type":"uint256"}],"name":"setClaimBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTokensClaimable_","type":"uint256"}],"name":"setMaxTokensClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minBalanceBps_","type":"uint256"}],"name":"setMinTokenBps","outputs":[],"stateMutability":"nonpayable","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
60a060405234801561001057600080fd5b50604051610daf380380610daf83398101604081905261002f916100aa565b6100383361005a565b6001600160a01b039094166080526001929092556002556003556004556100ff565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600080600060a086880312156100c257600080fd5b85516001600160a01b03811681146100d957600080fd5b602087015160408801516060890151608090990151929a91995097965090945092505050565b608051610c8061012f600039600081816102160152818161035c01528181610536015261075a0152610c806000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638da5cb5b11610097578063efbe1c1c11610066578063efbe1c1c146101e3578063f1596bc1146101eb578063f2fde38b146101fe578063fc0c546a1461021157600080fd5b80638da5cb5b146101895780639e34070f146101ae578063a1a12bba146101d1578063e1a45218146101da57600080fd5b806330b8cb24116100d357806330b8cb24146101525780635d98594d14610165578063715018a61461016e5780637cb647591461017657600080fd5b806317b0c92214610105578063184a51391461011a5780632e7ba6ef146101365780632eb4a7ab14610149575b600080fd5b610118610113366004610a86565b610238565b005b61012360045481565b6040519081526020015b60405180910390f35b610118610144366004610abb565b610281565b61012360015481565b610118610160366004610a86565b610655565b61012360035481565b61011861069e565b610118610184366004610a86565b6106b2565b6000546001600160a01b03165b6040516001600160a01b03909116815260200161012d565b6101c16101bc366004610a86565b6106fc565b604051901515815260200161012d565b61012360025481565b61012361271081565b61011861073d565b6101186101f9366004610a86565b61084a565b61011861020c366004610b52565b610893565b6101967f000000000000000000000000000000000000000000000000000000000000000081565b610240610909565b60035460408051918252602082018390527ff90f73916367de99f5d4919daea9739aac4fccf4c79c29a0c106f17c7a20fc88910160405180910390a1600355565b61028a856106fc565b156102ed5760405162461bcd60e51b815260206004820152602860248201527f4d65726b6c654469737472696275746f723a2044726f7020616c72656164792060448201526731b630b4b6b2b21760c11b60648201526084015b60405180910390fd5b6000612710600254856103009190610b83565b61030a9190610bb8565b905060045481111561031b57506004545b60006127106003548361032e9190610b83565b6103389190610bb8565b6040516370a0823160e01b81526001600160a01b03888116600483015291925082917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156103a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c79190610bcc565b10156104255760405162461bcd60e51b815260206004820152602760248201527f4d65726b6c654469737472696275746f723a20496e73756666696369656e742060448201526662616c616e636560c81b60648201526084016102e4565b60408051602081018990526bffffffffffffffffffffffff19606089901b1691810191909152605481018690526000906074016040516020818303038152906040528051906020012090506104b1858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506001549150849050610963565b6105075760405162461bcd60e51b815260206004820152602160248201527f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f666044820152601760f91b60648201526084016102e4565b61051088610979565b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018590527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af115801561057f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a39190610be5565b6105fb5760405162461bcd60e51b815260206004820152602360248201527f4d65726b6c654469737472696275746f723a205472616e73666572206661696c60448201526232b21760e91b60648201526084016102e4565b604080518981526001600160a01b0389166020820152908101879052606081018490527fd9cb1e2714d65a111c0f20f060176ad657496bd47a3de04ec7c3d4ca232112ac9060800160405180910390a15050505050505050565b61065d610909565b60045460408051918252602082018390527fbf90768b1dd0c577f6ce23eb52d12f86f4fcd9f5f2663e82643cb50f33967a21910160405180910390a1600455565b6106a6610909565b6106b060006109b7565b565b6106ba610909565b6001546040805182815260208101929092527f123d88ba82600dfc3f219f8885c691b0ff020caa535666874b3f5174973757fe910160405180910390a1600155565b60008061070b61010084610bb8565b9050600061071b61010085610c07565b60009283526005602052604090922054600190921b9182169091149392505050565b610745610909565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb9060009083906370a0823190602401602060405180830381865afa1580156107b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d89190610bcc565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610823573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108479190610be5565b50565b610852610909565b60025460408051918252602082018390527f1f961cc7d271cf36bd866b3c7d8acaefd624073c4bc9bcd9f15d890ea8e00794910160405180910390a1600255565b61089b610909565b6001600160a01b0381166109005760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102e4565b610847816109b7565b6000546001600160a01b031633146106b05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102e4565b6000826109708584610a07565b14949350505050565b600061098761010083610bb8565b9050600061099761010084610c07565b6000928352600560205260409092208054600190931b9092179091555050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081815b8451811015610a4c57610a3882868381518110610a2b57610a2b610c1b565b6020026020010151610a54565b915080610a4481610c31565b915050610a0c565b509392505050565b6000818310610a70576000828152602084905260409020610a7f565b60008381526020839052604090205b9392505050565b600060208284031215610a9857600080fd5b5035919050565b80356001600160a01b0381168114610ab657600080fd5b919050565b600080600080600060808688031215610ad357600080fd5b85359450610ae360208701610a9f565b935060408601359250606086013567ffffffffffffffff80821115610b0757600080fd5b818801915088601f830112610b1b57600080fd5b813581811115610b2a57600080fd5b8960208260051b8501011115610b3f57600080fd5b9699959850939650602001949392505050565b600060208284031215610b6457600080fd5b610a7f82610a9f565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615610b9d57610b9d610b6d565b500290565b634e487b7160e01b600052601260045260246000fd5b600082610bc757610bc7610ba2565b500490565b600060208284031215610bde57600080fd5b5051919050565b600060208284031215610bf757600080fd5b81518015158114610a7f57600080fd5b600082610c1657610c16610ba2565b500690565b634e487b7160e01b600052603260045260246000fd5b600060018201610c4357610c43610b6d565b506001019056fea264697066735822122065e595895e2c17117fb83ac1c23d21bce85cc807dde8a37a63a485213d70344a64736f6c634300081000330000000000000000000000008eb5bd8c9ab0f8ad28e94693f3c889f490be2ab0fdd51170274d4fc596ac727bba90b75a7ce3c373cf921803361a8b8d15936d9c000000000000000000000000000000000000000000000000000000012a05f20000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000069e10de76676d0800000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c80638da5cb5b11610097578063efbe1c1c11610066578063efbe1c1c146101e3578063f1596bc1146101eb578063f2fde38b146101fe578063fc0c546a1461021157600080fd5b80638da5cb5b146101895780639e34070f146101ae578063a1a12bba146101d1578063e1a45218146101da57600080fd5b806330b8cb24116100d357806330b8cb24146101525780635d98594d14610165578063715018a61461016e5780637cb647591461017657600080fd5b806317b0c92214610105578063184a51391461011a5780632e7ba6ef146101365780632eb4a7ab14610149575b600080fd5b610118610113366004610a86565b610238565b005b61012360045481565b6040519081526020015b60405180910390f35b610118610144366004610abb565b610281565b61012360015481565b610118610160366004610a86565b610655565b61012360035481565b61011861069e565b610118610184366004610a86565b6106b2565b6000546001600160a01b03165b6040516001600160a01b03909116815260200161012d565b6101c16101bc366004610a86565b6106fc565b604051901515815260200161012d565b61012360025481565b61012361271081565b61011861073d565b6101186101f9366004610a86565b61084a565b61011861020c366004610b52565b610893565b6101967f0000000000000000000000008eb5bd8c9ab0f8ad28e94693f3c889f490be2ab081565b610240610909565b60035460408051918252602082018390527ff90f73916367de99f5d4919daea9739aac4fccf4c79c29a0c106f17c7a20fc88910160405180910390a1600355565b61028a856106fc565b156102ed5760405162461bcd60e51b815260206004820152602860248201527f4d65726b6c654469737472696275746f723a2044726f7020616c72656164792060448201526731b630b4b6b2b21760c11b60648201526084015b60405180910390fd5b6000612710600254856103009190610b83565b61030a9190610bb8565b905060045481111561031b57506004545b60006127106003548361032e9190610b83565b6103389190610bb8565b6040516370a0823160e01b81526001600160a01b03888116600483015291925082917f0000000000000000000000008eb5bd8c9ab0f8ad28e94693f3c889f490be2ab016906370a0823190602401602060405180830381865afa1580156103a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c79190610bcc565b10156104255760405162461bcd60e51b815260206004820152602760248201527f4d65726b6c654469737472696275746f723a20496e73756666696369656e742060448201526662616c616e636560c81b60648201526084016102e4565b60408051602081018990526bffffffffffffffffffffffff19606089901b1691810191909152605481018690526000906074016040516020818303038152906040528051906020012090506104b1858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506001549150849050610963565b6105075760405162461bcd60e51b815260206004820152602160248201527f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f666044820152601760f91b60648201526084016102e4565b61051088610979565b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018590527f0000000000000000000000008eb5bd8c9ab0f8ad28e94693f3c889f490be2ab0169063a9059cbb906044016020604051808303816000875af115801561057f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a39190610be5565b6105fb5760405162461bcd60e51b815260206004820152602360248201527f4d65726b6c654469737472696275746f723a205472616e73666572206661696c60448201526232b21760e91b60648201526084016102e4565b604080518981526001600160a01b0389166020820152908101879052606081018490527fd9cb1e2714d65a111c0f20f060176ad657496bd47a3de04ec7c3d4ca232112ac9060800160405180910390a15050505050505050565b61065d610909565b60045460408051918252602082018390527fbf90768b1dd0c577f6ce23eb52d12f86f4fcd9f5f2663e82643cb50f33967a21910160405180910390a1600455565b6106a6610909565b6106b060006109b7565b565b6106ba610909565b6001546040805182815260208101929092527f123d88ba82600dfc3f219f8885c691b0ff020caa535666874b3f5174973757fe910160405180910390a1600155565b60008061070b61010084610bb8565b9050600061071b61010085610c07565b60009283526005602052604090922054600190921b9182169091149392505050565b610745610909565b6040516370a0823160e01b81523060048201527f0000000000000000000000008eb5bd8c9ab0f8ad28e94693f3c889f490be2ab06001600160a01b03169063a9059cbb9060009083906370a0823190602401602060405180830381865afa1580156107b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d89190610bcc565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610823573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108479190610be5565b50565b610852610909565b60025460408051918252602082018390527f1f961cc7d271cf36bd866b3c7d8acaefd624073c4bc9bcd9f15d890ea8e00794910160405180910390a1600255565b61089b610909565b6001600160a01b0381166109005760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102e4565b610847816109b7565b6000546001600160a01b031633146106b05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102e4565b6000826109708584610a07565b14949350505050565b600061098761010083610bb8565b9050600061099761010084610c07565b6000928352600560205260409092208054600190931b9092179091555050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081815b8451811015610a4c57610a3882868381518110610a2b57610a2b610c1b565b6020026020010151610a54565b915080610a4481610c31565b915050610a0c565b509392505050565b6000818310610a70576000828152602084905260409020610a7f565b60008381526020839052604090205b9392505050565b600060208284031215610a9857600080fd5b5035919050565b80356001600160a01b0381168114610ab657600080fd5b919050565b600080600080600060808688031215610ad357600080fd5b85359450610ae360208701610a9f565b935060408601359250606086013567ffffffffffffffff80821115610b0757600080fd5b818801915088601f830112610b1b57600080fd5b813581811115610b2a57600080fd5b8960208260051b8501011115610b3f57600080fd5b9699959850939650602001949392505050565b600060208284031215610b6457600080fd5b610a7f82610a9f565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615610b9d57610b9d610b6d565b500290565b634e487b7160e01b600052601260045260246000fd5b600082610bc757610bc7610ba2565b500490565b600060208284031215610bde57600080fd5b5051919050565b600060208284031215610bf757600080fd5b81518015158114610a7f57600080fd5b600082610c1657610c16610ba2565b500690565b634e487b7160e01b600052603260045260246000fd5b600060018201610c4357610c43610b6d565b506001019056fea264697066735822122065e595895e2c17117fb83ac1c23d21bce85cc807dde8a37a63a485213d70344a64736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008eb5bd8c9ab0f8ad28e94693f3c889f490be2ab0fdd51170274d4fc596ac727bba90b75a7ce3c373cf921803361a8b8d15936d9c000000000000000000000000000000000000000000000000000000012a05f20000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000069e10de76676d0800000
-----Decoded View---------------
Arg [0] : token_ (address): 0x8eb5bD8c9Ab0F8ad28e94693F3c889F490bE2aB0
Arg [1] : merkleRoot_ (bytes32): 0xfdd51170274d4fc596ac727bba90b75a7ce3c373cf921803361a8b8d15936d9c
Arg [2] : claimBps_ (uint256): 5000000000
Arg [3] : minBalanceBps_ (uint256): 10000
Arg [4] : maxTokensClaimable_ (uint256): 500000000000000000000000
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000008eb5bd8c9ab0f8ad28e94693f3c889f490be2ab0
Arg [1] : fdd51170274d4fc596ac727bba90b75a7ce3c373cf921803361a8b8d15936d9c
Arg [2] : 000000000000000000000000000000000000000000000000000000012a05f200
Arg [3] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [4] : 0000000000000000000000000000000000000000000069e10de76676d0800000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.