Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
243369 | 24 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
CreatorMerkleMinterStrategy
Compiler Version
v0.8.25+commit.b61c2a91
ZkSolc Version
v1.5.7
Optimization Enabled:
Yes with Mode 3
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import { MerkleProof } from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import { IMinter1155 } from "../../interfaces/IMinter1155.sol"; import { ICreatorCommands } from "../../interfaces/ICreatorCommands.sol"; import { SaleStrategy } from "../SaleStrategy.sol"; import { ICreatorCommands } from "../../interfaces/ICreatorCommands.sol"; import { SaleCommandHelper } from "../utils/SaleCommandHelper.sol"; import { LimitedMintPerAddress } from "../utils/LimitedMintPerAddress.sol"; /// @title CreatorMerkleMinterStrategy /// @notice Mints tokens based on a merkle tree, for presales for example contract CreatorMerkleMinterStrategy is SaleStrategy, LimitedMintPerAddress { using SaleCommandHelper for ICreatorCommands.CommandSet; /// @notice General merkle sale settings struct MerkleSaleSettings { /// @notice Unix timestamp for the sale start uint64 presaleStart; /// @notice Unix timestamp for the sale end uint64 presaleEnd; /// @notice Funds recipient (0 if no different funds recipient than the contract global) address fundsRecipient; /// @notice Merkle root for bytes32 merkleRoot; } /// @notice Event for sale configuration updated event SaleSet(address indexed mediaContract, uint256 indexed tokenId, MerkleSaleSettings merkleSaleSettings); /// @notice Storage for allowed merkle settings for the sales configuration mapping(address => mapping(uint256 => MerkleSaleSettings)) public allowedMerkles; // target -> tokenId -> settings error SaleEnded(); error SaleHasNotStarted(); error WrongValueSent(); error InvalidMerkleProof(address mintTo, bytes32[] merkleProof, bytes32 merkleRoot); /// @notice The name of the sale strategy function contractName() external pure override returns (string memory) { return "Merkle Tree Sale Strategy"; } /// @notice The version of the sale strategy function contractVersion() external pure override returns (string memory) { return "1"; } error MerkleClaimsExceeded(); /// @notice Compiles and returns the commands needed to mint a token using this sales strategy /// @param tokenId The token ID to mint /// @param quantity The quantity of tokens to mint /// @param ethValueSent The amount of ETH sent with the transaction /// @param minterArguments The arguments passed to the minter, which should be the address to mint to, the max /// quantity, the price per token, and the merkle proof function requestMint( address, uint256 tokenId, uint256 quantity, uint256 ethValueSent, bytes calldata minterArguments ) external returns (ICreatorCommands.CommandSet memory commands) { (address mintTo, uint256 maxQuantity, uint256 pricePerToken, bytes32[] memory merkleProof) = abi.decode(minterArguments, (address, uint256, uint256, bytes32[])); MerkleSaleSettings memory config = allowedMerkles[msg.sender][tokenId]; // Check sale end if (block.timestamp > config.presaleEnd) { revert SaleEnded(); } // Check sale start if (block.timestamp < config.presaleStart) { revert SaleHasNotStarted(); } if ( !MerkleProof.verify( merkleProof, config.merkleRoot, keccak256(bytes.concat(keccak256(abi.encode(mintTo, maxQuantity, pricePerToken)))) ) ) { revert InvalidMerkleProof(mintTo, merkleProof, config.merkleRoot); } if (maxQuantity > 0) { _requireMintNotOverLimitAndUpdate(maxQuantity, quantity, msg.sender, tokenId, mintTo); } if (quantity * pricePerToken != ethValueSent) { revert WrongValueSent(); } // Should transfer funds if funds recipient is set to a non-default address bool shouldTransferFunds = config.fundsRecipient != address(0); // Setup contract commands commands.setSize(shouldTransferFunds ? 2 : 1); // Mint command commands.mint(mintTo, tokenId, quantity); // If we have a non-default funds recipient for this token if (shouldTransferFunds) { commands.transfer(config.fundsRecipient, ethValueSent); } } /// @notice Sets the sale configuration for a token function setSale(uint256 tokenId, MerkleSaleSettings memory merkleSaleSettings) external { allowedMerkles[msg.sender][tokenId] = merkleSaleSettings; // Emit event for new sale emit SaleSet(msg.sender, tokenId, merkleSaleSettings); } /// @notice Resets the sale configuration for a token function resetSale(uint256 tokenId) external override { delete allowedMerkles[msg.sender][tokenId]; // Emit event with empty sale emit SaleSet(msg.sender, tokenId, allowedMerkles[msg.sender][tokenId]); } /// @notice Gets the sale configuration for a token /// @param tokenContract address to look up sale for /// @param tokenId token ID to look up sale for function sale(address tokenContract, uint256 tokenId) external view returns (MerkleSaleSettings memory) { return allowedMerkles[tokenContract][tokenId]; } /// @notice IERC165 interface /// @param interfaceId intrfaceinterface id to match function supportsInterface(bytes4 interfaceId) public pure virtual override(LimitedMintPerAddress, SaleStrategy) returns (bool) { return super.supportsInterface(interfaceId) || LimitedMintPerAddress.supportsInterface(interfaceId) || SaleStrategy.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function 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) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import { IERC165Upgradeable } from "@openzeppelin/contracts-upgradeable/interfaces/IERC165Upgradeable.sol"; import { ICreatorCommands } from "./ICreatorCommands.sol"; /// @notice Minter standard interface /// @dev Minters need to confirm to the ERC165 selector of type(IMinter1155).interfaceId interface IMinter1155 is IERC165Upgradeable { function requestMint( address sender, uint256 tokenId, uint256 quantity, uint256 ethValueSent, bytes calldata minterArguments ) external returns (ICreatorCommands.CommandSet memory commands); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /// @notice Creator Commands used by minter modules passed back to the main modules interface ICreatorCommands { /// @notice This enum is used to define supported creator action types. /// This can change in the future enum CreatorActions // No operation - also the default for mintings that may not return a command { NO_OP, // Send ether SEND_ETH, // Mint operation MINT } /// @notice This command is for struct Command { // Method for operation CreatorActions method; // Arguments used for this operation bytes args; } /// @notice This command set is returned from the minter back to the user struct CommandSet { Command[] commands; uint256 at; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import { IERC165Upgradeable } from "@openzeppelin/contracts-upgradeable/interfaces/IERC165Upgradeable.sol"; import { IMinter1155 } from "../interfaces/IMinter1155.sol"; import { IContractMetadata } from "../interfaces/IContractMetadata.sol"; import { IVersionedContract } from "../interfaces/IVersionedContract.sol"; /// @notice Sales Strategy Helper contract template on top of IMinter1155 abstract contract SaleStrategy is IMinter1155, IVersionedContract, IContractMetadata { /// @notice This function resets the sales configuration for a given tokenId and contract. /// @dev This function is intentioned to be called directly from the affected sales contract function resetSale(uint256 tokenId) external virtual; function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) { return interfaceId == type(IMinter1155).interfaceId || interfaceId == type(IERC165Upgradeable).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import { ICreatorCommands } from "../../interfaces/ICreatorCommands.sol"; /// @title SaleCommandHelper /// @notice Helper library for creating commands for the sale contract library SaleCommandHelper { /// @notice Sets the size of commands and initializes command array. Empty entries are skipped by the resolver. /// @dev Beware: this removes all previous command entries from memory /// @param commandSet command set struct storage. /// @param size size to set for the new struct function setSize(ICreatorCommands.CommandSet memory commandSet, uint256 size) internal pure { commandSet.commands = new ICreatorCommands.Command[](size); } /// @notice Creates a command to mint a token /// @param commandSet The command set to add the command to /// @param to The address to mint to /// @param tokenId The token ID to mint /// @param quantity The quantity of tokens to mint function mint( ICreatorCommands.CommandSet memory commandSet, address to, uint256 tokenId, uint256 quantity ) internal pure { unchecked { commandSet.commands[commandSet.at++] = ICreatorCommands.Command({ method: ICreatorCommands.CreatorActions.MINT, args: abi.encode(to, tokenId, quantity) }); } } /// @notice Creates a command to transfer ETH /// @param commandSet The command set to add the command to /// @param to The address to transfer to /// @param amount The amount of ETH to transfer function transfer(ICreatorCommands.CommandSet memory commandSet, address to, uint256 amount) internal pure { unchecked { commandSet.commands[commandSet.at++] = ICreatorCommands.Command({ method: ICreatorCommands.CreatorActions.SEND_ETH, args: abi.encode(to, amount) }); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import { ILimitedMintPerAddress } from "../../interfaces/ILimitedMintPerAddress.sol"; contract LimitedMintPerAddress is ILimitedMintPerAddress { /// @notice Storage for slot to check user mints /// @notice target contract -> tokenId -> minter user -> numberMinted /// @dev No gap or stroage interface since this is used within non-upgradeable contracts mapping(address => mapping(uint256 => mapping(address => uint256))) internal mintedPerAddress; function getMintedPerWallet( address tokenContract, uint256 tokenId, address wallet ) external view returns (uint256) { return mintedPerAddress[tokenContract][tokenId][wallet]; } function _requireMintNotOverLimitAndUpdate( uint256 limit, uint256 numRequestedMint, address tokenContract, uint256 tokenId, address wallet ) internal { mintedPerAddress[tokenContract][tokenId][wallet] += numRequestedMint; if (mintedPerAddress[tokenContract][tokenId][wallet] > limit) { revert UserExceedsMintLimit(wallet, limit, mintedPerAddress[tokenContract][tokenId][wallet]); } } function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) { return interfaceId == type(ILimitedMintPerAddress).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165Upgradeable.sol";
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; interface IContractMetadata { /// @notice Contract name returns the pretty contract name function contractName() external returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; interface IVersionedContract { function contractVersion() external returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import { IERC165Upgradeable } from "@openzeppelin/contracts-upgradeable/interfaces/IERC165Upgradeable.sol"; interface ILimitedMintPerAddress is IERC165Upgradeable { error UserExceedsMintLimit(address user, uint256 limit, uint256 requestedAmount); function getMintedPerWallet(address token, uint256 tokenId, address wallet) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "viaIR": true, "codegen": "yul", "remappings": [ "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "forge-std/=lib/forge-std/src/", "ds-test/=lib/solmate/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "openzeppelin/=lib/openzeppelin-contracts/contracts/", "solmate/=lib/solmate/src/" ], "evmVersion": "cancun", "outputSelection": { "*": { "*": [ "abi", "metadata" ], "": [ "ast" ] } }, "optimizer": { "enabled": true, "mode": "3", "fallback_to_optimizing_for_size": false, "disable_system_request_memoization": true }, "metadata": {}, "libraries": {}, "detectMissingLibraries": false, "enableEraVMExtensions": false, "forceEVMLA": false }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"mintTo","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"InvalidMerkleProof","type":"error"},{"inputs":[],"name":"MerkleClaimsExceeded","type":"error"},{"inputs":[],"name":"SaleEnded","type":"error"},{"inputs":[],"name":"SaleHasNotStarted","type":"error"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"requestedAmount","type":"uint256"}],"name":"UserExceedsMintLimit","type":"error"},{"inputs":[],"name":"WrongValueSent","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"mediaContract","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint64","name":"presaleStart","type":"uint64"},{"internalType":"uint64","name":"presaleEnd","type":"uint64"},{"internalType":"address","name":"fundsRecipient","type":"address"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"indexed":false,"internalType":"struct CreatorMerkleMinterStrategy.MerkleSaleSettings","name":"merkleSaleSettings","type":"tuple"}],"name":"SaleSet","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"allowedMerkles","outputs":[{"internalType":"uint64","name":"presaleStart","type":"uint64"},{"internalType":"uint64","name":"presaleEnd","type":"uint64"},{"internalType":"address","name":"fundsRecipient","type":"address"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"}],"name":"getMintedPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"ethValueSent","type":"uint256"},{"internalType":"bytes","name":"minterArguments","type":"bytes"}],"name":"requestMint","outputs":[{"components":[{"components":[{"internalType":"enum ICreatorCommands.CreatorActions","name":"method","type":"uint8"},{"internalType":"bytes","name":"args","type":"bytes"}],"internalType":"struct ICreatorCommands.Command[]","name":"commands","type":"tuple[]"},{"internalType":"uint256","name":"at","type":"uint256"}],"internalType":"struct ICreatorCommands.CommandSet","name":"commands","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"resetSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"sale","outputs":[{"components":[{"internalType":"uint64","name":"presaleStart","type":"uint64"},{"internalType":"uint64","name":"presaleEnd","type":"uint64"},{"internalType":"address","name":"fundsRecipient","type":"address"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"internalType":"struct CreatorMerkleMinterStrategy.MerkleSaleSettings","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint64","name":"presaleStart","type":"uint64"},{"internalType":"uint64","name":"presaleEnd","type":"uint64"},{"internalType":"address","name":"fundsRecipient","type":"address"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"internalType":"struct CreatorMerkleMinterStrategy.MerkleSaleSettings","name":"merkleSaleSettings","type":"tuple"}],"name":"setSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
9c4d535b00000000000000000000000000000000000000000000000000000000000000000100016f4b8d38b1903580b7c7fb7387d143abbc31957a98b0ed48b1c7f06fc700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x00010000000000020008000000000002000000000601034f00000000000103550000008001000039000000400010043f0000000100200190000000210000c13d00000060016002700000013c01100197000000040010008c000001d70000413d000000000206043b000000e0022002700000013e0020009c000000290000a13d0000013f0020009c000000d30000a13d000001400020009c000001750000613d000001410020009c000001ca0000613d000001420020009c000001d70000c13d0000000001000416000000000001004b000001d70000c13d000000c001000039000000400010043f0000000101000039000000800010043f0000014a010000410000017d0000013d0000000001000416000000000001004b000001d70000c13d0000002001000039000001000010044300000120000004430000013d01000041000004ec0001042e000001450020009c000000920000213d000001480020009c000000fe0000613d000001490020009c000001d70000c13d000000240010008c000001d70000413d0000000001000416000000000001004b000001d70000c13d0000000401600370000000000101043b000800000001001d0000000001000411000000000010043f0000000101000039000000200010043f00000000010004140000013c0010009c0000013c01008041000000c00110021000000154011001c7000080100200003904eb04e60000040f0000000100200190000001d70000613d000000000101043b0000000802000029000000000020043f000000200010043f00000000010004140000013c0010009c0000013c01008041000000c00110021000000154011001c7000080100200003904eb04e60000040f0000000100200190000001d70000613d000000000101043b000000000001041b0000000102100039000000000002041b0000000201100039000000000001041b0000000001000411000000000010043f0000000101000039000000200010043f00000000010004140000013c0010009c0000013c01008041000000c00110021000000154011001c7000080100200003904eb04e60000040f0000000100200190000001d70000613d000000000101043b0000000802000029000000000020043f000000200010043f00000000010004140000013c0010009c0000013c01008041000000c00110021000000154011001c7000080100200003904eb04e60000040f0000000100200190000001d70000613d000000000101043b000000000201041a00000040032002700000014f03300197000000400400043d000000200540003900000000003504350000014f0220019700000000002404350000000102100039000000000202041a0000014c02200197000000400340003900000000002304350000000201100039000000000101041a000000600240003900000000001204350000013c0040009c0000013c04008041000000400140021000000000020004140000013c0020009c0000013c02008041000000c002200210000000000112019f00000166011001c70000800d020000390000000303000039000001670400004100000000050004110000000806000029000001700000013d000001460020009c0000010b0000613d000001470020009c000001d70000c13d000000440010008c000001d70000413d0000000001000416000000000001004b000001d70000c13d0000000401600370000000000101043b0000014c0010009c000001d70000213d0000010002000039000000400020043f000000800000043f000000a00000043f000000c00000043f000000e00000043f000000000010043f0000000101000039000000200010043f00000040020000390000000001000019000800000006035304eb04cc0000040f000000080200035f0000002402200370000000000202043b000000000020043f000000200010043f0000000001000019000000400200003904eb04cc0000040f000800000001001d000001000100003904eb04750000040f0000000803000029000000000103041a0000014f02100197000001000020043f00000040011002700000014f01100197000001200010043f0000000101300039000000000101041a0000014c01100197000001400010043f0000000201300039000000000101041a000001600010043f000000400100043d000800000001001d000001000200003904eb04800000040f000000080200002900000000012100490000013c0010009c0000013c0100804100000060011002100000013c0020009c0000013c020080410000004002200210000000000121019f000004ec0001042e000001430020009c000001890000613d000001440020009c000001d70000c13d000000440010008c000001d70000413d0000000001000416000000000001004b000001d70000c13d0000000401600370000000000101043b0000014c0010009c000001d70000213d000000000010043f0000000101000039000000200010043f00000040020000390000000001000019000800000006035304eb04cc0000040f000000080200035f0000002402200370000000000202043b000000000020043f000000200010043f0000000001000019000000400200003904eb04cc0000040f0000000202100039000000000202041a0000000103100039000000000303041a000000000101041a0000014f04100197000000800040043f00000040011002700000014f01100197000000a00010043f0000014c01300197000000c00010043f000000e00020043f0000015001000041000004ec0001042e000000240010008c000001d70000413d0000000001000416000000000001004b000001d70000c13d0000000401600370000000000101043b0000016800100198000001d70000c13d000001690010009c000001d90000c13d0000000102000039000001de0000013d000000a40010008c000001d70000413d0000000001000416000000000001004b000001d70000c13d0000000401600370000000000301043b0000010001000039000000400010043f0000002401600370000000000101043b0000014f0010009c000001d70000213d000000800010043f0000004401600370000000000101043b0000014f0010009c000001d70000213d000000a00010043f0000006401600370000000000101043b0000014c0010009c000001d70000213d000000c00010043f0000008401600370000000000101043b000000e00010043f0000000001000411000000000010043f0000000101000039000000200010043f00000000010004140000013c0010009c0000013c01008041000000c00110021000000154011001c70000801002000039000800000003001d04eb04e60000040f00000008030000290000000100200190000001d70000613d000000000101043b000000000030043f000000200010043f00000000010004140000013c0010009c0000013c01008041000000c00110021000000154011001c7000080100200003904eb04e60000040f00000008060000290000000100200190000001d70000613d000000a00200043d00000040022002100000016302200197000000000101043b000000000301041a0000016403300197000000000223019f000000800300043d0000014f03300197000000000232019f000000000021041b000000c00200043d0000014c022001970000000104100039000000000504041a0000016505500197000000000225019f000000000024041b0000000201100039000000e00200043d000000000021041b000000400100043d0000000002310436000000a00300043d0000014f033001970000000000320435000000c00200043d0000014c02200197000000400310003900000000002304350000006002100039000000e00300043d00000000003204350000013c0010009c0000013c01008041000000400110021000000000020004140000013c0020009c0000013c02008041000000c002200210000000000112019f00000166011001c70000800d0200003900000003030000390000016704000041000000000500041104eb04e10000040f0000000100200190000001d70000613d0000000001000019000004ec0001042e0000000001000416000000000001004b000001d70000c13d000000c001000039000000400010043f0000001901000039000000800010043f0000014e01000041000000a00010043f0000002001000039000000c00010043f0000008001000039000000e00200003904eb04910000040f000000c00110008a0000013c0010009c0000013c0100804100000060011002100000014b011001c7000004ec0001042e000000a40010008c000001d70000413d0000000002000416000000000002004b000001d70000c13d0000000402600370000000000202043b0000014c0020009c000001d70000213d0000008402600370000000000502043b0000014f0050009c000001d70000213d0000002302500039000000000012004b000001d70000813d0000000403500039000000000236034f000000000402043b0000014f0040009c000001d70000213d00000000024500190000002402200039000000000012004b000001d70000213d000000c001000039000000400010043f0000006001000039000000800010043f000000a00000043f000000800040008c000001d70000413d0000002001300039000000000316034f000000000403043b0000014c0040009c000001d70000213d0000006007100039000000000176034f000000000101043b0000014f0010009c000001d70000213d00000000015100190000004303100039000000000023004b000001d70000813d000700000007001d000800000004001d000600000005001d0000002403100039000000000336034f000000000403043b000001510040009c000001c40000813d00000005034002100000003f053000390000015205500197000001530050009c000001fb0000a13d0000015c01000041000000000010043f0000004101000039000000040010043f0000015d01000041000004ed00010430000000640010008c000001d70000413d0000000001000416000000000001004b000001d70000c13d0000000401600370000000000101043b0000014c0010009c000001d70000213d0000004402600370000000000302043b0000014c0030009c000001e20000a13d0000000001000019000004ed000104300000016a0010009c000000000200003900000001020060390000016b0010009c00000001022061bf000000010120018f000000800010043f0000014d01000041000004ec0001042e000000000010043f000000200000043f00000040020000390000000001000019000700000003001d000800000006035304eb04cc0000040f000000080200035f0000002402200370000000000202043b000000000020043f000000200010043f0000000001000019000000400200003904eb04cc0000040f0000000702000029000000000020043f000000200010043f0000000001000019000000400200003904eb04cc0000040f000000000101041a000000800010043f0000014d01000041000004ec0001042e000000c005500039000000400050043f000000c00040043f00000044011000390000000003130019000000000023004b000001d70000213d000000000004004b0000020c0000613d000000000506034f000000e002000039000000000415034f000000000404043b00000000024204360000002001100039000000000031004b000002060000413d0000000001000411000000000010043f0000000101000039000000200010043f00000000010004140000013c0010009c0000013c01008041000000c00110021000000154011001c7000080100200003904eb04e60000040f0000000100200190000001d70000613d000000000101043b00000024020000390000000002200367000000000202043b000000000020043f000000200010043f00000000010004140000013c0010009c0000013c01008041000000c00110021000000154011001c7000080100200003904eb04e60000040f0000000100200190000001d70000613d000000400200043d000500000002001d000001550020009c000001c40000213d000000000101043b00000005040000290000008002400039000000400020043f000000000201041a0000014f03200197000000000334043600000040022002700000014f02200197000400000002001d00000000002304350000000102100039000000000202041a0000014c022001970000004003400039000200000003001d000000000023043500000060024000390000000201100039000000000101041a000300000002001d00000000001204350000015601000041000000000010044300000000010004140000013c0010009c0000013c01008041000000c00110021000000157011001c70000800b0200003904eb04e60000040f0000000100200190000002530000613d000000400200043d000000000101043b000000040010006c000002540000a13d00000162010000410000025a0000013d000000000001042f000000050300002900000000030304330000014f03300197000000000031004b000002600000813d000001610100004100000000001204350000013c0020009c0000013c0200804100000040012002100000015f011001c7000004ed000104300000000704000029000000400340008a000400000003001d0000000003300367000000000303043b000000200440008a000100000004001d0000000001400367000000000101043b00000003040000290000000004040433000700000004001d00000060042000390000000000140435000000400120003900000000003104350000006001000039000000000112043600000008030000290000014c03300197000500000003001d0000000000310435000001550020009c000001c40000213d0000008003200039000000400030043f0000013c0010009c0000013c01008041000000400110021000000000020204330000013c0020009c0000013c020080410000006002200210000000000112019f00000000020004140000013c0020009c0000013c02008041000000c002200210000000000112019f00000158011001c7000080100200003904eb04e60000040f0000000100200190000001d70000613d000000000301043b000000400100043d000000200200003900000000022104360000000000320435000001590010009c000001c40000213d0000004003100039000000400030043f0000013c0020009c0000013c02008041000000400220021000000000010104330000013c0010009c0000013c010080410000006001100210000000000121019f00000000020004140000013c0020009c0000013c02008041000000c002200210000000000112019f00000158011001c7000080100200003904eb04e60000040f0000000100200190000001d70000613d000000000101043b000000c00200043d000000000002004b000002c70000613d0000000003000019000800000003001d0000000502300210000000e0022000390000000002020433000000000021004b000002b60000813d000000000010043f000000200020043f0000000001000414000002b90000013d000000000020043f000000200010043f00000000010004140000013c0010009c0000013c01008041000000c00110021000000154011001c7000080100200003904eb04e60000040f0000000100200190000001d70000613d0000000803000029000000000101043b0000000103300039000000c00200043d000000000023004b000002ac0000413d000000070010006c000003410000c13d00000000030003670000000401300360000000000101043b000000000001004b000003640000c13d0000000101300360000000000201043b0000004401300370000000000401043b00000000012400a9000000000004004b000002d80000613d00000000054100d9000000000052004b000003f80000c13d000000400500043d0000006402300370000000000202043b000000000021004b000003f10000c13d000000020200002900000000020204330000014c022001980000000207000039000000010700603900000005067002100000003f08600039000000e00980018f0000000008590019000000000098004b000000000900003900000001090040390000014f0080009c000001c40000213d0000000100900190000001c40000c13d000000400080043f00000000077504360000000008000019000000600b000039000000400900043d000001590090009c000001c40000213d000000400a9000390000004000a0043f000000200a9000390000000000ba04350000000000090435000000000a87001900000000009a04350000002008800039000000000068004b000002f10000413d000000800050043f0000002403300370000000000303043b000000400500043d000000600650003900000000004604350000004004500039000000000034043500000020035000390000000504000029000000000043043500000060030000390000000000350435000001550050009c000001c40000213d0000008003500039000000400030043f000001590030009c000001c40000213d000000c004500039000000400040043f00000002040000390000000000430435000000a0045000390000000000540435000000a00400043d0000000106400039000000800500043d000000a00060043f0000000006050433000000000046004b000004240000a13d00000005064002100000000006650019000000200660003900000000003604350000000003050433000000000043004b000004240000a13d000000000002004b000004000000c13d000000400100043d00000020020000390000000004210436000000800200043d00000040030000390000000000340435000000600510003900000000040204330000000000450435000000800510003900000005064002100000000009560019000000000004004b0000042a0000c13d0000004002100039000000a00300043d000000000032043500000000021900490000013c0020009c0000013c0200804100000060022002100000013c0010009c0000013c010080410000004001100210000000000112019f000004ec0001042e00000003010000290000000002010433000000400100043d0000002403100039000000600400003900000000004304350000015a0300004100000000003104350000000403100039000000050400002900000000004304350000006403100039000000c00400043d00000000004304350000008403100039000000000004004b000003590000613d000000e0050000390000000006000019000000005705043400000000037304360000000106600039000000000046004b000003540000413d0000004404100039000000000024043500000000021300490000013c0020009c0000013c0200804100000060022002100000013c0010009c0000013c010080410000004001100210000000000112019f000004ed000104300000000001000411000000000010043f000000200000043f00000000010004140000013c0010009c0000013c01008041000000c00110021000000154011001c7000080100200003904eb04e60000040f0000000100200190000001d70000613d000000000101043b00000024020000390000000002200367000000000202043b000000000020043f000000200010043f00000000010004140000013c0010009c0000013c01008041000000c00110021000000154011001c7000080100200003904eb04e60000040f0000000100200190000001d70000613d000000000101043b0000000502000029000000000020043f000000200010043f00000000010004140000013c0010009c0000013c01008041000000c00110021000000154011001c7000080100200003904eb04e60000040f0000000100200190000001d70000613d000000000101043b000000000201041a00000044030000390000000003300367000000000303043b000000000023001a000003f80000413d0000000002230019000000000021041b0000000001000411000000000010043f000000200000043f00000000010004140000013c0010009c0000013c01008041000000c00110021000000154011001c7000080100200003904eb04e60000040f0000000100200190000001d70000613d000000000101043b00000024020000390000000002200367000000000202043b000000000020043f000000200010043f00000000010004140000013c0010009c0000013c01008041000000c00110021000000154011001c7000080100200003904eb04e60000040f00000006030000290000000100200190000001d70000613d0000004403300039000000000101043b0000000502000029000000000020043f000000200010043f000700000003001d0000000001300367000000000101043b000800000001001d00000000010004140000013c0010009c0000013c01008041000000c00110021000000154011001c7000080100200003904eb04e60000040f0000000100200190000001d70000613d000000000101043b000000000101041a000000080010006c000003fe0000a13d0000000001000411000000000010043f000000200000043f0000004002000039000000000100001904eb04cc0000040f000000000200036700080000000203530000002402200370000000000202043b000000000020043f000000200010043f0000000001000019000000400200003904eb04cc0000040f0000000502000029000000000020043f000000200010043f0000000001000019000000400200003904eb04cc0000040f000000080300035f0000000702300360000000000401041a0000015b01000041000000400500043d000800000005001d0000000000150435000000000302043b0000000401500039000000050200002904eb04c30000040f000000080200002900000000012100490000013c0020009c0000013c020080410000013c0010009c0000013c0100804100000040022002100000006001100210000000000121019f000004ed000104300000015e0100004100000000001504350000013c0050009c0000013c0500804100000040015002100000015f011001c7000004ed000104300000015c01000041000000000010043f0000001101000039000000040010043f0000015d01000041000004ed000104300000000003000367000002ce0000013d00000002020000290000000003020433000000400200043d000000400420003900000000001404350000014c013001970000002003200039000000000013043500000040010000390000000000120435000001600020009c000001c40000213d0000006001200039000000400010043f000001590010009c000001c40000213d000000a003200039000000400030043f0000000103000039000000000031043500000080032000390000000000230435000000a00200043d0000000104200039000000800300043d000000a00040043f0000000004030433000000000024004b000004240000a13d00000005042002100000000004430019000000200440003900000000001404350000000001030433000000000021004b000003270000213d0000015c01000041000000000010043f0000003201000039000000040010043f0000015d01000041000004ed0001043000000000070000190000043f0000013d000000000aca00190000000303b00210000000000b0d0433000000000b3b01cf000000000b3b022f000000000a0a04330000010003300089000000000a3a022f00000000033a01cf0000000003b3019f00000000003d04350000001f038000390000016c033001970000000008980019000000000008043500000000099300190000000107700039000000000047004b000003350000813d0000000008190049000000800880008a000000000585043600000020022000390000000008020433000000008a0804340000000200a0008c0000046f0000213d000000000aa904360000000008080433000000400300003900000000003a0435000000400b90003900000000a808043400000000008b04350000016c0c8001970000001f0b80018f000000600990003900000000009a004b000004630000813d00000000000c004b0000045f0000613d000000000eba0019000000000db90019000000200dd0008a000000200ee0008a000000000fcd00190000000003ce0019000000000303043300000000003f0435000000200cc0008c000004590000c13d00000000000b004b000004370000613d000000000d0900190000042d0000013d000000000dc9001900000000000c004b0000046c0000613d000000000e0a0019000000000f09001900000000e30e0434000000000f3f04360000000000df004b000004680000c13d00000000000b004b0000042c0000c13d000004370000013d0000015c01000041000000000010043f0000002101000039000000040010043f0000015d01000041000004ed000104300000016d0010009c0000047a0000813d0000008001100039000000400010043f000000000001042d0000015c01000041000000000010043f0000004101000039000000040010043f0000015d01000041000004ed0001043000000000430204340000014f03300197000000000331043600000000040404330000014f044001970000000000430435000000400320003900000000030304330000014c033001970000004004100039000000000034043500000060022000390000000002020433000000600310003900000000002304350000008001100039000000000001042d000000004301043400000000013204360000016c063001970000001f0530018f000000000014004b000004a70000813d000000000006004b000004a30000613d00000000085400190000000007510019000000200770008a000000200880008a0000000009670019000000000a680019000000000a0a04330000000000a90435000000200660008c0000049d0000c13d000000000005004b000004bd0000613d0000000007010019000004b30000013d0000000007610019000000000006004b000004b00000613d00000000080400190000000009010019000000008a0804340000000009a90436000000000079004b000004ac0000c13d000000000005004b000004bd0000613d00000000046400190000000305500210000000000607043300000000065601cf000000000656022f00000000040404330000010005500089000000000454022f00000000045401cf000000000464019f0000000000470435000000000431001900000000000404350000001f033000390000016c023001970000000001210019000000000001042d00000040051000390000000000450435000000200410003900000000003404350000014c0220019700000000002104350000006001100039000000000001042d000000000001042f0000013c0010009c0000013c0100804100000040011002100000013c0020009c0000013c020080410000006002200210000000000112019f00000000020004140000013c0020009c0000013c02008041000000c002200210000000000112019f00000158011001c7000080100200003904eb04e60000040f0000000100200190000004df0000613d000000000101043b000000000001042d0000000001000019000004ed00010430000004e4002104210000000102000039000000000001042d0000000002000019000000000001042d000004e9002104230000000102000039000000000001042d0000000002000019000000000001042d000004eb00000432000004ec0001042e000004ed000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000006890e5b20000000000000000000000000000000000000000000000000000000075d0c0db0000000000000000000000000000000000000000000000000000000075d0c0dc000000000000000000000000000000000000000000000000000000007b49ff2c00000000000000000000000000000000000000000000000000000000a0a8e460000000000000000000000000000000000000000000000000000000006890e5b30000000000000000000000000000000000000000000000000000000070fe2a2600000000000000000000000000000000000000000000000000000000515740a500000000000000000000000000000000000000000000000000000000515740a600000000000000000000000000000000000000000000000000000000611efc090000000000000000000000000000000000000000000000000000000001ffc9a70000000000000000000000000000000000000000000000000000000019b45c4f31000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000200000008000000000000000004d65726b6c6520547265652053616c6520537472617465677900000000000000000000000000000000000000000000000000000000000000ffffffffffffffff000000000000000000000000000000000000008000000080000000000000000000000000000000000000000000000000000000000000000100000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff3f0200000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d9553913202000002000000000000000000000000000000040000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbfedc7572000000000000000000000000000000000000000000000000000000000e2d91564000000000000000000000000000000000000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000002f4613eb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9fe8c4db82000000000000000000000000000000000000000000000000000000000bd8a3eb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000020000000000000000000000000000000000008000000000000000000000000082ae5a22c3160d46d62997cfa6f39886b3126a3701c0e42ff3ce4f0b1b6ad0e300000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b49ff2c0000000000000000000000000000000000000000000000000000000001ffc9a7000000000000000000000000000000000000000000000000000000006890e5b300000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff80fe66b759046c2c2b75c2c780645848ab76f81893672d6db2494a63be3e3134e1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.