Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 729 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 19153394 | 171 days ago | IN | 0 ETH | 0.00196797 | ||||
Claim | 19150042 | 172 days ago | IN | 0 ETH | 0.00190456 | ||||
Claim | 19148749 | 172 days ago | IN | 0 ETH | 0.00394624 | ||||
Claim | 19142496 | 173 days ago | IN | 0 ETH | 0.00335252 | ||||
Claim | 19140147 | 173 days ago | IN | 0 ETH | 0.0029907 | ||||
Claim | 19136441 | 174 days ago | IN | 0 ETH | 0.00420776 | ||||
Claim | 19129699 | 175 days ago | IN | 0 ETH | 0.00461166 | ||||
Claim | 19125023 | 175 days ago | IN | 0 ETH | 0.00254727 | ||||
Claim | 19115518 | 177 days ago | IN | 0 ETH | 0.0022823 | ||||
Claim | 19099934 | 179 days ago | IN | 0 ETH | 0.00188099 | ||||
Claim | 19099814 | 179 days ago | IN | 0 ETH | 0.00233618 | ||||
Claim | 19097897 | 179 days ago | IN | 0 ETH | 0.00206846 | ||||
Claim | 19097544 | 179 days ago | IN | 0 ETH | 0.0018339 | ||||
Claim | 19095084 | 179 days ago | IN | 0 ETH | 0.00188427 | ||||
Claim | 19093541 | 180 days ago | IN | 0 ETH | 0.0021438 | ||||
Claim | 19088277 | 180 days ago | IN | 0 ETH | 0.00255594 | ||||
Claim | 19083825 | 181 days ago | IN | 0 ETH | 0.00736836 | ||||
Claim | 19080769 | 181 days ago | IN | 0 ETH | 0.00179103 | ||||
Claim | 19065182 | 184 days ago | IN | 0 ETH | 0.00184157 | ||||
Claim | 19061814 | 184 days ago | IN | 0 ETH | 0.00291514 | ||||
Claim | 19059363 | 184 days ago | IN | 0 ETH | 0.00162489 | ||||
Claim | 19057379 | 185 days ago | IN | 0 ETH | 0.00337351 | ||||
Claim | 19053664 | 185 days ago | IN | 0 ETH | 0.00153161 | ||||
Claim | 19050111 | 186 days ago | IN | 0 ETH | 0.00227063 | ||||
Claim | 19041811 | 187 days ago | IN | 0 ETH | 0.00673278 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AirdropDistributorProxy
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-11-05 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.21; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } interface IClaimCallback { function claimCallback(address claimant, address receiver, uint256 amount) external returns (bool success); } interface IAirdropDistributor { function isClaimed(uint256 index) external view returns (bool); function claim( address claimant, address receiver, uint256 index, uint256 amount, bytes32[] calldata merkleProof ) external; } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } // OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.sol) /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function 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. require(leavesLen + proofLen - 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 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) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); 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. * * _Available since v4.7._ */ 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. require(leavesLen + proofLen - 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 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) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); unchecked { 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) } } } // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { 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); } } /** @title Prisma Airdrop Claim Proxy @dev Airdropped PRISMA tokens are given as a locked position. Distribution is via a merkle proof. The proof and script used to create are available on Github: https://github.com/prisma-fi/airdrop-proofs */ contract AirdropDistributorProxy is Ownable { using Address for address; bytes32 public merkleRoot; mapping(uint256 => uint256) private claimedBitMap; mapping(address receiver => address callback) public claimCallback; IAirdropDistributor public immutable airdropDistributor; event Claimed(address indexed claimant, address indexed receiver, uint256 index, uint256 amount); event MerkleRootSet(bytes32 root); constructor(IAirdropDistributor _airdrop) { airdropDistributor = _airdrop; } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { require(merkleRoot == bytes32(0), "merkleRoot already set"); merkleRoot = _merkleRoot; emit MerkleRootSet(_merkleRoot); } function isClaimed(uint256 index) public view returns (bool) { return airdropDistributor.isClaimed(index); } /** @dev `amount` is after dividing by `locker.lockToTokenRatio()` */ function claim( address claimant, address receiver, uint256 index, uint256 amount, bytes32[][2] calldata merkleProof ) external { if (msg.sender != claimant) { require(msg.sender == owner(), "onlyOwner"); require(claimant.isContract(), "Claimant must be a contract"); } require(merkleRoot != bytes32(0), "merkleRoot not set"); bytes32 node = keccak256(abi.encodePacked(index, claimant, amount)); require(MerkleProof.verifyCalldata(merkleProof[0], merkleRoot, node), "Invalid proxy proof"); airdropDistributor.claim(address(this), receiver, index, amount, merkleProof[1]); if (claimant != receiver) { address callback = claimCallback[receiver]; if (callback != address(0)) IClaimCallback(callback).claimCallback(claimant, receiver, amount); } emit Claimed(claimant, receiver, index, amount * 1e18); } /** @notice Set a claim callback contract @dev When set, claims directed to the caller trigger a callback to this address */ function setClaimCallback(address _callback) external returns (bool) { claimCallback[msg.sender] = _callback; return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IAirdropDistributor","name":"_airdrop","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"MerkleRootSet","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":"airdropDistributor","outputs":[{"internalType":"contract IAirdropDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"claimant","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[][2]","name":"merkleProof","type":"bytes32[][2]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"claimCallback","outputs":[{"internalType":"address","name":"callback","type":"address"}],"stateMutability":"view","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_callback","type":"address"}],"name":"setClaimCallback","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405234801561001057600080fd5b50604051610b27380380610b2783398101604081905261002f91610099565b61003833610049565b6001600160a01b03166080526100c9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100ab57600080fd5b81516001600160a01b03811681146100c257600080fd5b9392505050565b608051610a356100f2600039600081816101a50152818161036d01526105d20152610a356000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80638f4a7182116100665780638f4a7182146101145780639e34070f1461013d578063a7511f1414610160578063d0a93173146101a0578063f2fde38b146101c757600080fd5b80632564edfc146100a35780632eb4a7ab146100b8578063715018a6146100d45780637cb64759146100dc5780638da5cb5b146100ef575b600080fd5b6100b66100b1366004610820565b6101da565b005b6100c160015481565b6040519081526020015b60405180910390f35b6100b6610519565b6100b66100ea366004610899565b61052d565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016100cb565b6100fc6101223660046108b2565b6003602052600090815260409020546001600160a01b031681565b61015061014b366004610899565b6105b9565b60405190151581526020016100cb565b61015061016e3660046108b2565b33600090815260036020526040902080546001600160a01b0319166001600160a01b0392909216919091179055600190565b6100fc7f000000000000000000000000000000000000000000000000000000000000000081565b6100b66101d53660046108b2565b61064b565b336001600160a01b0386161461028c576000546001600160a01b031633146102355760405162461bcd60e51b815260206004820152600960248201526837b7363ca7bbb732b960b91b60448201526064015b60405180910390fd5b6001600160a01b0385163b61028c5760405162461bcd60e51b815260206004820152601b60248201527f436c61696d616e74206d757374206265206120636f6e74726163740000000000604482015260640161022c565b6001546102d05760405162461bcd60e51b81526020600482015260126024820152711b595c9adb19549bdbdd081b9bdd081cd95d60721b604482015260640161022c565b604080516020808201869052606088901b6bffffffffffffffffffffffff1916828401526054808301869052835180840390910181526074909201909252805191012061032961032083806108e3565b600154846106c4565b61036b5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b210383937bc3c90383937b7b360691b604482015260640161022c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fa46d7ac308787876103ab60208901896108e3565b6040518763ffffffff1660e01b81526004016103cc96959493929190610934565b600060405180830381600087803b1580156103e657600080fd5b505af11580156103fa573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316146104b7576001600160a01b038086166000908152600360205260409020541680156104b55760405163b398e22760e01b81526001600160a01b03888116600483015287811660248301526044820186905282169063b398e227906064016020604051808303816000875af115801561048f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b39190610997565b505b505b6001600160a01b038086169087167f2f6639d24651730c7bf57c95ddbf96d66d11477e4ec626876f92c22e5f365e68866104f987670de0b6b3a76400006109cf565b6040805192835260208301919091520160405180910390a3505050505050565b6105216106dc565b61052b6000610736565b565b6105356106dc565b6001541561057e5760405162461bcd60e51b81526020600482015260166024820152751b595c9adb19549bdbdd08185b1c9958591e481cd95d60521b604482015260640161022c565b60018190556040518181527f42cbc405e4dbf1b691e85b9a34b08ecfcf7a9ad9078bf4d645ccfa1fac11c10b9060200160405180910390a150565b604051639e34070f60e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639e34070f90602401602060405180830381865afa158015610621573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106459190610997565b92915050565b6106536106dc565b6001600160a01b0381166106b85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161022c565b6106c181610736565b50565b6000826106d2868685610786565b1495945050505050565b6000546001600160a01b0316331461052b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161022c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081815b848110156107c9576107b5828787848181106107a9576107a96108cd565b905060200201356107d2565b9150806107c1816109e6565b91505061078b565b50949350505050565b60008183106107ee5760008281526020849052604090206107fd565b60008381526020839052604090205b9392505050565b80356001600160a01b038116811461081b57600080fd5b919050565b600080600080600060a0868803121561083857600080fd5b61084186610804565b945061084f60208701610804565b93506040860135925060608601359150608086013567ffffffffffffffff81111561087957600080fd5b86016040810188101561088b57600080fd5b809150509295509295909350565b6000602082840312156108ab57600080fd5b5035919050565b6000602082840312156108c457600080fd5b6107fd82610804565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126108fa57600080fd5b83018035915067ffffffffffffffff82111561091557600080fd5b6020019150600581901b360382131561092d57600080fd5b9250929050565b6001600160a01b03878116825286166020820152604081018590526060810184905260a060808201819052810182905260006001600160fb1b0383111561097a57600080fd5b8260051b808560c08501379190910160c001979650505050505050565b6000602082840312156109a957600080fd5b815180151581146107fd57600080fd5b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610645576106456109b9565b6000600182016109f8576109f86109b9565b506001019056fea2646970667358221220b4a665e33f80b2223d721d1322ecbcbd5018c138d6de11de8500aea58e896f7964736f6c63430008150033000000000000000000000000d49d86b001fe35bc745bc6e467b3cc18cb14b817
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061009e5760003560e01c80638f4a7182116100665780638f4a7182146101145780639e34070f1461013d578063a7511f1414610160578063d0a93173146101a0578063f2fde38b146101c757600080fd5b80632564edfc146100a35780632eb4a7ab146100b8578063715018a6146100d45780637cb64759146100dc5780638da5cb5b146100ef575b600080fd5b6100b66100b1366004610820565b6101da565b005b6100c160015481565b6040519081526020015b60405180910390f35b6100b6610519565b6100b66100ea366004610899565b61052d565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016100cb565b6100fc6101223660046108b2565b6003602052600090815260409020546001600160a01b031681565b61015061014b366004610899565b6105b9565b60405190151581526020016100cb565b61015061016e3660046108b2565b33600090815260036020526040902080546001600160a01b0319166001600160a01b0392909216919091179055600190565b6100fc7f000000000000000000000000d49d86b001fe35bc745bc6e467b3cc18cb14b81781565b6100b66101d53660046108b2565b61064b565b336001600160a01b0386161461028c576000546001600160a01b031633146102355760405162461bcd60e51b815260206004820152600960248201526837b7363ca7bbb732b960b91b60448201526064015b60405180910390fd5b6001600160a01b0385163b61028c5760405162461bcd60e51b815260206004820152601b60248201527f436c61696d616e74206d757374206265206120636f6e74726163740000000000604482015260640161022c565b6001546102d05760405162461bcd60e51b81526020600482015260126024820152711b595c9adb19549bdbdd081b9bdd081cd95d60721b604482015260640161022c565b604080516020808201869052606088901b6bffffffffffffffffffffffff1916828401526054808301869052835180840390910181526074909201909252805191012061032961032083806108e3565b600154846106c4565b61036b5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b210383937bc3c90383937b7b360691b604482015260640161022c565b7f000000000000000000000000d49d86b001fe35bc745bc6e467b3cc18cb14b8176001600160a01b031663fa46d7ac308787876103ab60208901896108e3565b6040518763ffffffff1660e01b81526004016103cc96959493929190610934565b600060405180830381600087803b1580156103e657600080fd5b505af11580156103fa573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316146104b7576001600160a01b038086166000908152600360205260409020541680156104b55760405163b398e22760e01b81526001600160a01b03888116600483015287811660248301526044820186905282169063b398e227906064016020604051808303816000875af115801561048f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b39190610997565b505b505b6001600160a01b038086169087167f2f6639d24651730c7bf57c95ddbf96d66d11477e4ec626876f92c22e5f365e68866104f987670de0b6b3a76400006109cf565b6040805192835260208301919091520160405180910390a3505050505050565b6105216106dc565b61052b6000610736565b565b6105356106dc565b6001541561057e5760405162461bcd60e51b81526020600482015260166024820152751b595c9adb19549bdbdd08185b1c9958591e481cd95d60521b604482015260640161022c565b60018190556040518181527f42cbc405e4dbf1b691e85b9a34b08ecfcf7a9ad9078bf4d645ccfa1fac11c10b9060200160405180910390a150565b604051639e34070f60e01b8152600481018290526000907f000000000000000000000000d49d86b001fe35bc745bc6e467b3cc18cb14b8176001600160a01b031690639e34070f90602401602060405180830381865afa158015610621573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106459190610997565b92915050565b6106536106dc565b6001600160a01b0381166106b85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161022c565b6106c181610736565b50565b6000826106d2868685610786565b1495945050505050565b6000546001600160a01b0316331461052b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161022c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081815b848110156107c9576107b5828787848181106107a9576107a96108cd565b905060200201356107d2565b9150806107c1816109e6565b91505061078b565b50949350505050565b60008183106107ee5760008281526020849052604090206107fd565b60008381526020839052604090205b9392505050565b80356001600160a01b038116811461081b57600080fd5b919050565b600080600080600060a0868803121561083857600080fd5b61084186610804565b945061084f60208701610804565b93506040860135925060608601359150608086013567ffffffffffffffff81111561087957600080fd5b86016040810188101561088b57600080fd5b809150509295509295909350565b6000602082840312156108ab57600080fd5b5035919050565b6000602082840312156108c457600080fd5b6107fd82610804565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126108fa57600080fd5b83018035915067ffffffffffffffff82111561091557600080fd5b6020019150600581901b360382131561092d57600080fd5b9250929050565b6001600160a01b03878116825286166020820152604081018590526060810184905260a060808201819052810182905260006001600160fb1b0383111561097a57600080fd5b8260051b808560c08501379190910160c001979650505050505050565b6000602082840312156109a957600080fd5b815180151581146107fd57600080fd5b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610645576106456109b9565b6000600182016109f8576109f86109b9565b506001019056fea2646970667358221220b4a665e33f80b2223d721d1322ecbcbd5018c138d6de11de8500aea58e896f7964736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d49d86b001fe35bc745bc6e467b3cc18cb14b817
-----Decoded View---------------
Arg [0] : _airdrop (address): 0xd49d86B001Fe35bc745Bc6E467B3cc18Cb14b817
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d49d86b001fe35bc745bc6e467b3cc18cb14b817
Deployed Bytecode Sourcemap
23464:2312:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24465:997;;;;;;:::i;:::-;;:::i;:::-;;23549:25;;;;;;;;;1039::1;;;1027:2;1012:18;23549:25:0;;;;;;;;22370:103;;;:::i;24021:216::-;;;;;;:::i;:::-;;:::i;21729:87::-;21775:7;21802:6;-1:-1:-1;;;;;21802:6:0;21729:87;;;-1:-1:-1;;;;;1424:32:1;;;1406:51;;1394:2;1379:18;21729:87:0;1260:203:1;23639:66:0;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;23639:66:0;;;24245:122;;;;;;:::i;:::-;;:::i;:::-;;;2009:14:1;;2002:22;1984:41;;1972:2;1957:18;24245:122:0;1844:187:1;25624:149:0;;;;;;:::i;:::-;25718:10;25687:4;25704:25;;;:13;:25;;;;;:37;;-1:-1:-1;;;;;;25704:37:0;-1:-1:-1;;;;;25704:37:0;;;;;;;;;;-1:-1:-1;;25624:149:0;23714:55;;;;;22628:201;;;;;;:::i;:::-;;:::i;24465:997::-;24658:10;-1:-1:-1;;;;;24658:22:0;;;24654:174;;21775:7;21802:6;-1:-1:-1;;;;;21802:6:0;24705:10;:21;24697:43;;;;-1:-1:-1;;;24697:43:0;;2473:2:1;24697:43:0;;;2455:21:1;2512:1;2492:18;;;2485:29;-1:-1:-1;;;2530:18:1;;;2523:39;2579:18;;24697:43:0;;;;;;;;;-1:-1:-1;;;;;24763:19:0;;1677;24755:61;;;;-1:-1:-1;;;24755:61:0;;2810:2:1;24755:61:0;;;2792:21:1;2849:2;2829:18;;;2822:30;2888:29;2868:18;;;2861:57;2935:18;;24755:61:0;2608:351:1;24755:61:0;24848:10;;24840:55;;;;-1:-1:-1;;;24840:55:0;;3166:2:1;24840:55:0;;;3148:21:1;3205:2;3185:18;;;3178:30;-1:-1:-1;;;3224:18:1;;;3217:48;3282:18;;24840:55:0;2964:342:1;24840:55:0;24933:41;;;;;;;3496:19:1;;;3553:2;3549:15;;;-1:-1:-1;;3545:53:1;3531:12;;;3524:75;3615:12;;;;3608:28;;;24933:41:0;;;;;;;;;;3652:12:1;;;;24933:41:0;;;24923:52;;;;;24994:60;25021:14;:11;;:14;:::i;:::-;25037:10;;25049:4;24994:26;:60::i;:::-;24986:92;;;;-1:-1:-1;;;24986:92:0;;4559:2:1;24986:92:0;;;4541:21:1;4598:2;4578:18;;;4571:30;-1:-1:-1;;;4617:18:1;;;4610:49;4676:18;;24986:92:0;4357:343:1;24986:92:0;25091:18;-1:-1:-1;;;;;25091:24:0;;25124:4;25131:8;25141:5;25148:6;25156:14;;;;:11;:14;:::i;:::-;25091:80;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25200:8;-1:-1:-1;;;;;25188:20:0;:8;-1:-1:-1;;;;;25188:20:0;;25184:204;;-1:-1:-1;;;;;25244:23:0;;;25225:16;25244:23;;;:13;:23;;;;;;;25286:22;;25282:94;;25310:66;;-1:-1:-1;;;25310:66:0;;-1:-1:-1;;;;;5756:15:1;;;25310:66:0;;;5738:34:1;5808:15;;;5788:18;;;5781:43;5840:18;;;5833:34;;;25310:38:0;;;;;5673:18:1;;25310:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25282:94;25210:178;25184:204;-1:-1:-1;;;;;25405:49:0;;;;;;;25433:5;25440:13;:6;25449:4;25440:13;:::i;:::-;25405:49;;;6639:25:1;;;6695:2;6680:18;;6673:34;;;;6612:18;25405:49:0;;;;;;;24643:819;24465:997;;;;;:::o;22370:103::-;21615:13;:11;:13::i;:::-;22435:30:::1;22462:1;22435:18;:30::i;:::-;22370:103::o:0;24021:216::-;21615:13;:11;:13::i;:::-;24101:10:::1;::::0;:24;24093:59:::1;;;::::0;-1:-1:-1;;;24093:59:0;;6920:2:1;24093:59:0::1;::::0;::::1;6902:21:1::0;6959:2;6939:18;;;6932:30;-1:-1:-1;;;6978:18:1;;;6971:52;7040:18;;24093:59:0::1;6718:346:1::0;24093:59:0::1;24163:10;:24:::0;;;24203:26:::1;::::0;1039:25:1;;;24203:26:0::1;::::0;1027:2:1;1012:18;24203:26:0::1;;;;;;;24021:216:::0;:::o;24245:122::-;24324:35;;-1:-1:-1;;;24324:35:0;;;;;1039:25:1;;;24300:4:0;;24324:18;-1:-1:-1;;;;;24324:28:0;;;;1012:18:1;;24324:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24317:42;24245:122;-1:-1:-1;;24245:122:0:o;22628:201::-;21615:13;:11;:13::i;:::-;-1:-1:-1;;;;;22717:22:0;::::1;22709:73;;;::::0;-1:-1:-1;;;22709:73:0;;7453:2:1;22709:73:0::1;::::0;::::1;7435:21:1::0;7492:2;7472:18;;;7465:30;7531:34;7511:18;;;7504:62;-1:-1:-1;;;7582:18:1;;;7575:36;7628:19;;22709:73:0::1;7251:402:1::0;22709:73:0::1;22793:28;22812:8;22793:18;:28::i;:::-;22628:201:::0;:::o;12175:174::-;12276:4;12337;12300:33;12321:5;;12328:4;12300:20;:33::i;:::-;:41;;12175:174;-1:-1:-1;;;;;12175:174:0:o;21894:132::-;21775:7;21802:6;-1:-1:-1;;;;;21802:6:0;10655:10;21958:23;21950:68;;;;-1:-1:-1;;;21950:68:0;;7860:2:1;21950:68:0;;;7842:21:1;;;7879:18;;;7872:30;7938:34;7918:18;;;7911:62;7990:18;;21950:68:0;7658:356:1;22989:191:0;23063:16;23082:6;;-1:-1:-1;;;;;23099:17:0;;;-1:-1:-1;;;;;;23099:17:0;;;;;;23132:40;;23082:6;;;;;;;23132:40;;23063:16;23132:40;23052:128;22989:191;:::o;13120:306::-;13213:7;13256:4;13213:7;13271:118;13291:16;;;13271:118;;;13344:33;13354:12;13368:5;;13374:1;13368:8;;;;;;;:::i;:::-;;;;;;;13344:9;:33::i;:::-;13329:48;-1:-1:-1;13309:3:0;;;;:::i;:::-;;;;13271:118;;;-1:-1:-1;13406:12:0;13120:306;-1:-1:-1;;;;13120:306:0:o;20148:149::-;20211:7;20242:1;20238;:5;:51;;20373:13;20467:15;;;20503:4;20496:15;;;20550:4;20534:21;;20238:51;;;20373:13;20467:15;;;20503:4;20496:15;;;20550:4;20534:21;;20246:20;20231:58;20148:149;-1:-1:-1;;;20148:149:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:696::-;339:6;347;355;363;371;424:3;412:9;403:7;399:23;395:33;392:53;;;441:1;438;431:12;392:53;464:29;483:9;464:29;:::i;:::-;454:39;;512:38;546:2;535:9;531:18;512:38;:::i;:::-;502:48;;597:2;586:9;582:18;569:32;559:42;;648:2;637:9;633:18;620:32;610:42;;703:3;692:9;688:19;675:33;731:18;723:6;720:30;717:50;;;763:1;760;753:12;717:50;786:22;;831:2;823:11;;820:24;-1:-1:-1;817:44:1;;;857:1;854;847:12;817:44;880:2;870:12;;;192:696;;;;;;;;:::o;1075:180::-;1134:6;1187:2;1175:9;1166:7;1162:23;1158:32;1155:52;;;1203:1;1200;1193:12;1155:52;-1:-1:-1;1226:23:1;;1075:180;-1:-1:-1;1075:180:1:o;1468:186::-;1527:6;1580:2;1568:9;1559:7;1555:23;1551:32;1548:52;;;1596:1;1593;1586:12;1548:52;1619:29;1638:9;1619:29;:::i;3675:127::-;3736:10;3731:3;3727:20;3724:1;3717:31;3767:4;3764:1;3757:15;3791:4;3788:1;3781:15;3807:545;3900:4;3906:6;3966:11;3953:25;4060:2;4056:7;4045:8;4029:14;4025:29;4021:43;4001:18;3997:68;3987:96;;4079:1;4076;4069:12;3987:96;4106:33;;4158:20;;;-1:-1:-1;4201:18:1;4190:30;;4187:50;;;4233:1;4230;4223:12;4187:50;4266:4;4254:17;;-1:-1:-1;4317:1:1;4313:14;;;4297;4293:35;4283:46;;4280:66;;;4342:1;4339;4332:12;4280:66;3807:545;;;;;:::o;4705:788::-;-1:-1:-1;;;;;5044:15:1;;;5026:34;;5096:15;;5091:2;5076:18;;5069:43;5143:2;5128:18;;5121:34;;;5186:2;5171:18;;5164:34;;;5006:3;5229;5214:19;;5207:32;;;5255:19;;5248:35;;;4969:4;-1:-1:-1;;;;;5295:31:1;;5292:51;;;5339:1;5336;5329:12;5292:51;5373:6;5370:1;5366:14;5431:6;5423;5417:3;5406:9;5402:19;5389:49;5459:22;;;;5483:3;5455:32;;4705:788;-1:-1:-1;;;;;;;4705:788:1:o;5878:277::-;5945:6;5998:2;5986:9;5977:7;5973:23;5969:32;5966:52;;;6014:1;6011;6004:12;5966:52;6046:9;6040:16;6099:5;6092:13;6085:21;6078:5;6075:32;6065:60;;6121:1;6118;6111:12;6160:127;6221:10;6216:3;6212:20;6209:1;6202:31;6252:4;6249:1;6242:15;6276:4;6273:1;6266:15;6292:168;6365:9;;;6396;;6413:15;;;6407:22;;6393:37;6383:71;;6434:18;;:::i;8019:135::-;8058:3;8079:17;;;8076:43;;8099:18;;:::i;:::-;-1:-1:-1;8146:1:1;8135:13;;8019:135::o
Swarm Source
ipfs://b4a665e33f80b2223d721d1322ecbcbd5018c138d6de11de8500aea58e896f79
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 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.