Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
870 WCC
Holders
115
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
10 WCCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
WorldcupChampion
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-27 */ // File: WorldcupChampion/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: WorldcupChampion/OperatorFilterer.sol pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: WorldcupChampion/DefaultOperatorFilterer.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [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://diligence.consensys.net/posts/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.5.11/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); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.8.0) (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 rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * 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 rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // 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 IERC165 { /** * @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); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: WorldcupChampion/IERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A is IERC721, IERC721Metadata { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: WorldcupChampion/ERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721A { using Address for address; using Strings for uint256; // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: WorldcupChampion/WorldcupChampion.sol pragma solidity ^0.8.0; contract WorldcupChampion is DefaultOperatorFilterer, ERC2981, ERC721A, Ownable { using Strings for uint256; uint256 public PRESALE_PRICE = 0 ether; uint256 public PUBLIC_PRICE = 0.1 ether; uint256 public MAX_PER_TX = 2000; uint256 public MAX_PER_WALLET = 1; uint256 public constant MAX_SUPPLY = 6790; uint256 public RESERVED = 679; bool public presaleOpen = false; bool public publicSaleOpen = false; string public baseExtension = '.json'; string private _baseTokenURI; bytes32 public merkleRoot; mapping(address => uint256) public _owners; constructor(string memory _initBaseURI) ERC721A("WorldcupChampion", "WCC") { setBaseURI(_initBaseURI); // set royalty of all NFTs to 5% _setDefaultRoyalty(msg.sender, 500); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC2981, ERC721A) returns (bool) { return super.supportsInterface(interfaceId); } function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function whitelistMint(uint256 quantity, bytes32[] memory _merkleProof) external payable { require(presaleOpen, "Pre-sale is not open"); require(quantity > 0, "quantity of tokens cannot be less than or equal to 0"); require(quantity <= MAX_PER_WALLET - _owners[msg.sender], "exceeded max per wallet"); require(totalSupply() + quantity <= MAX_SUPPLY - RESERVED, "exceed max supply of tokens"); require(msg.value >= PRESALE_PRICE * quantity, "insufficient ether value"); bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Incorrect proof"); _owners[msg.sender] += quantity; _safeMint(msg.sender, quantity); } function mint(uint256 quantity) external payable { require(publicSaleOpen, "Public Sale is not open"); require(quantity > 0, "quantity of tokens cannot be less than or equal to 0"); require(quantity <= MAX_PER_TX, "exceed max per transaction"); require(totalSupply() + quantity <= MAX_SUPPLY - RESERVED, "exceed max supply of tokens"); require(msg.value >= PUBLIC_PRICE * quantity, "insufficient ether value"); _owners[msg.sender] += quantity; _safeMint(msg.sender, quantity); } function tokenURI(uint256 tokenID) public view virtual override returns (string memory) { require(_exists(tokenID), "ERC721Metadata: URI query for nonexistent token"); string memory base = _baseURI(); require(bytes(base).length > 0, "baseURI not set"); return string(abi.encodePacked(base, tokenID.toString(), baseExtension)); } function isWhitelist(bytes32[] memory _merkleProof) public view returns (bool) { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); return MerkleProof.verify(_merkleProof, merkleRoot, leaf); } /* ****************** */ /* INTERNAL FUNCTIONS */ /* ****************** */ function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } /* *************** */ /* OWNER FUNCTIONS */ /* *************** */ function giveAway(address to, uint256 quantity) external onlyOwner { require(quantity <= RESERVED); RESERVED -= quantity; _safeMint(to, quantity); } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function setBaseExtension(string memory _newExtension) public onlyOwner { baseExtension = _newExtension; } function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner{ merkleRoot = _merkleRoot; } function updateMaxPerTX(uint256 newLimit) external onlyOwner { MAX_PER_TX = newLimit; } function updateMaxPerWallet(uint256 newLimit) external onlyOwner { MAX_PER_WALLET = newLimit; } function startPresale() external onlyOwner { presaleOpen = true; } function startPublicSale() external onlyOwner { publicSaleOpen = true; } function stopPresale() external onlyOwner { presaleOpen = false; } function stopPublicSale() external onlyOwner { publicSaleOpen = false; } function changePresalePrice(uint256 price) external onlyOwner { PRESALE_PRICE = price; } function changePublicSalePrice(uint256 price) external onlyOwner { PUBLIC_PRICE = price; } function close(address payable _to) public onlyOwner{ selfdestruct(_to); } function withdraw() public onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_owners","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"changePresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"changePublicSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"giveAway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"updateMaxPerTX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"updateMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6000600b5567016345785d8a0000600c556107d0600d556001600e556102a7600f556010805461ffff1916905560c06040526005608090815264173539b7b760d91b60a052601190620000539082620004eb565b503480156200006157600080fd5b5060405162002cf038038062002cf08339810160408190526200008491620005b7565b604080518082018252601081526f2bb7b9363231bab821b430b6b834b7b760811b6020808301919091528251808401909352600383526257434360e81b9083015290733cc6cdda760b79bafa08df41ecfa224f810dceb660016daaeb6d7670e522a718067333cd4e3b15620002225780156200017057604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200015157600080fd5b505af115801562000166573d6000803e3d6000fd5b5050505062000222565b6001600160a01b03821615620001c15760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000136565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200020857600080fd5b505af11580156200021d573d6000803e3d6000fd5b505050505b5060049050620002338382620004eb565b506005620002428282620004eb565b5050600160025550620002553362000275565b6200026081620002c7565b6200026e336101f4620002e3565b506200068c565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620002d1620003e8565b6012620002df8282620004eb565b5050565b6127106001600160601b0382161115620003575760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620003af5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016200034e565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b600a546001600160a01b03163314620004445760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200034e565b565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200047157607f821691505b6020821081036200049257634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004e657600081815260208120601f850160051c81016020861015620004c15750805b601f850160051c820191505b81811015620004e257828155600101620004cd565b5050505b505050565b81516001600160401b0381111562000507576200050762000446565b6200051f816200051884546200045c565b8462000498565b602080601f8311600181146200055757600084156200053e5750858301515b600019600386901b1c1916600185901b178555620004e2565b600085815260208120601f198616915b82811015620005885788860151825594840194600190910190840162000567565b5085821015620005a75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020808385031215620005cb57600080fd5b82516001600160401b0380821115620005e357600080fd5b818501915085601f830112620005f857600080fd5b8151818111156200060d576200060d62000446565b604051601f8201601f19908116603f0116810190838211818310171562000638576200063862000446565b8160405282815288868487010111156200065157600080fd5b600093505b8284101562000675578484018601518185018701529285019262000656565b600086848301015280965050505050505092915050565b612654806200069c6000396000f3fe6080604052600436106102885760003560e01c80637cb647591161015a578063c74073a1116100c1578063e985e9c51161007a578063e985e9c514610761578063ed475f6314610781578063f2fde38b146107a1578063f43a22dc146107c1578063f9e23799146107d7578063fecfda49146107f657600080fd5b8063c74073a1146106b9578063c87b56dd146106d9578063ca800144146106f9578063d2cab05614610719578063da1b91c31461072c578063da3ef23f1461074157600080fd5b8063a3c9583e11610113578063a3c9583e14610607578063aa592f2514610627578063b88d4fde1461063d578063bee6348a1461065d578063bf3a5c0214610677578063c6682862146106a457600080fd5b80637cb64759146105615780638606d938146105815780638da5cb5b146105a157806395d89b41146105bf578063a0712d68146105d4578063a22cb465146105e757600080fd5b80632eb4a7ab116101fe57806355f804b3116101b757806355f804b3146104c0578063611f3f10146104e057806362dc6e21146104f65780636352211e1461050c57806370a082311461052c578063715018a61461054c57600080fd5b80632eb4a7ab1461041d57806332cb6b0c146104335780633ccfd60b1461044957806341f434341461045e57806342842e0e146104805780634fda7285146104a057600080fd5b80630c1c972a116102505780630c1c972a146103535780630f2cdd6c1461036857806318160ddd1461038c5780631ad2ad1a146103a957806323b872dd146103be5780632a55205a146103de57600080fd5b806301ffc9a71461028d57806304c98b2b146102c257806306fdde03146102d9578063081812fc146102fb578063095ea7b314610333575b600080fd5b34801561029957600080fd5b506102ad6102a8366004611e9c565b610816565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d7610827565b005b3480156102e557600080fd5b506102ee61083e565b6040516102b99190611f09565b34801561030757600080fd5b5061031b610316366004611f1c565b6108d0565b6040516001600160a01b0390911681526020016102b9565b34801561033f57600080fd5b506102d761034e366004611f4a565b610914565b34801561035f57600080fd5b506102d761092d565b34801561037457600080fd5b5061037e600e5481565b6040519081526020016102b9565b34801561039857600080fd5b50600354600254036000190161037e565b3480156103b557600080fd5b506102d7610946565b3480156103ca57600080fd5b506102d76103d9366004611f76565b61095a565b3480156103ea57600080fd5b506103fe6103f9366004611fb7565b610985565b604080516001600160a01b0390931683526020830191909152016102b9565b34801561042957600080fd5b5061037e60135481565b34801561043f57600080fd5b5061037e611a8681565b34801561045557600080fd5b506102d7610a31565b34801561046a57600080fd5b5061031b6daaeb6d7670e522a718067333cd4e81565b34801561048c57600080fd5b506102d761049b366004611f76565b610a6c565b3480156104ac57600080fd5b506102d76104bb366004611f1c565b610a91565b3480156104cc57600080fd5b506102d76104db366004612076565b610a9e565b3480156104ec57600080fd5b5061037e600c5481565b34801561050257600080fd5b5061037e600b5481565b34801561051857600080fd5b5061031b610527366004611f1c565b610ab2565b34801561053857600080fd5b5061037e6105473660046120be565b610ac4565b34801561055857600080fd5b506102d7610b12565b34801561056d57600080fd5b506102d761057c366004611f1c565b610b26565b34801561058d57600080fd5b506102d761059c366004611f1c565b610b33565b3480156105ad57600080fd5b50600a546001600160a01b031661031b565b3480156105cb57600080fd5b506102ee610b40565b6102d76105e2366004611f1c565b610b4f565b3480156105f357600080fd5b506102d76106023660046120e9565b610d1c565b34801561061357600080fd5b506102d7610622366004611f1c565b610d30565b34801561063357600080fd5b5061037e600f5481565b34801561064957600080fd5b506102d7610658366004612122565b610d3d565b34801561066957600080fd5b506010546102ad9060ff1681565b34801561068357600080fd5b5061037e6106923660046120be565b60146020526000908152604090205481565b3480156106b057600080fd5b506102ee610d6a565b3480156106c557600080fd5b506102d76106d43660046120be565b610df8565b3480156106e557600080fd5b506102ee6106f4366004611f1c565b610e0c565b34801561070557600080fd5b506102d7610714366004611f4a565b610eff565b6102d7610727366004612220565b610f38565b34801561073857600080fd5b506102d761118d565b34801561074d57600080fd5b506102d761075c366004612076565b6111a2565b34801561076d57600080fd5b506102ad61077c366004612266565b6111b6565b34801561078d57600080fd5b506102ad61079c366004612294565b6111e4565b3480156107ad57600080fd5b506102d76107bc3660046120be565b611233565b3480156107cd57600080fd5b5061037e600d5481565b3480156107e357600080fd5b506010546102ad90610100900460ff1681565b34801561080257600080fd5b506102d7610811366004611f1c565b6112a9565b6000610821826112b6565b92915050565b61082f6112f6565b6010805460ff19166001179055565b60606004805461084d906122c8565b80601f0160208091040260200160405190810160405280929190818152602001828054610879906122c8565b80156108c65780601f1061089b576101008083540402835291602001916108c6565b820191906000526020600020905b8154815290600101906020018083116108a957829003601f168201915b5050505050905090565b60006108db82611350565b6108f8576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b8161091e81611389565b6109288383611442565b505050565b6109356112f6565b6010805461ff001916610100179055565b61094e6112f6565b6010805460ff19169055565b826001600160a01b03811633146109745761097433611389565b61097f8484846114c3565b50505050565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916109fa5750604080518082019091526000546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610a19906001600160601b031687612318565b610a23919061232f565b915196919550909350505050565b610a396112f6565b6040514790339082156108fc029083906000818181858888f19350505050158015610a68573d6000803e3d6000fd5b5050565b826001600160a01b0381163314610a8657610a8633611389565b61097f8484846114ce565b610a996112f6565b600c55565b610aa66112f6565b6012610a68828261239f565b6000610abd826114e9565b5192915050565b60006001600160a01b038216610aed576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b610b1a6112f6565b610b24600061160b565b565b610b2e6112f6565b601355565b610b3b6112f6565b600b55565b60606005805461084d906122c8565b601054610100900460ff16610bab5760405162461bcd60e51b815260206004820152601760248201527f5075626c69632053616c65206973206e6f74206f70656e00000000000000000060448201526064015b60405180910390fd5b60008111610bcb5760405162461bcd60e51b8152600401610ba29061245e565b600d54811115610c1d5760405162461bcd60e51b815260206004820152601a60248201527f657863656564206d617820706572207472616e73616374696f6e0000000000006044820152606401610ba2565b600f54610c2c90611a866124b2565b6003546002548391900360001901610c4491906124c5565b1115610c925760405162461bcd60e51b815260206004820152601b60248201527f657863656564206d617820737570706c79206f6620746f6b656e7300000000006044820152606401610ba2565b80600c54610ca09190612318565b341015610cea5760405162461bcd60e51b8152602060048201526018602482015277696e73756666696369656e742065746865722076616c756560401b6044820152606401610ba2565b3360009081526014602052604081208054839290610d099084906124c5565b90915550610d199050338261165d565b50565b81610d2681611389565b6109288383611677565b610d386112f6565b600d55565b836001600160a01b0381163314610d5757610d5733611389565b610d638585858561170c565b5050505050565b60118054610d77906122c8565b80601f0160208091040260200160405190810160405280929190818152602001828054610da3906122c8565b8015610df05780601f10610dc557610100808354040283529160200191610df0565b820191906000526020600020905b815481529060010190602001808311610dd357829003601f168201915b505050505081565b610e006112f6565b806001600160a01b0316ff5b6060610e1782611350565b610e7b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610ba2565b6000610e85611750565b90506000815111610eca5760405162461bcd60e51b815260206004820152600f60248201526e18985cd9555492481b9bdd081cd95d608a1b6044820152606401610ba2565b80610ed48461175f565b6011604051602001610ee8939291906124d8565b604051602081830303815290604052915050919050565b610f076112f6565b600f54811115610f1657600080fd5b80600f6000828254610f2891906124b2565b90915550610a689050828261165d565b60105460ff16610f815760405162461bcd60e51b815260206004820152601460248201527328393296b9b0b6329034b9903737ba1037b832b760611b6044820152606401610ba2565b60008211610fa15760405162461bcd60e51b8152600401610ba29061245e565b33600090815260146020526040902054600e54610fbe91906124b2565b82111561100d5760405162461bcd60e51b815260206004820152601760248201527f6578636565646564206d6178207065722077616c6c65740000000000000000006044820152606401610ba2565b600f5461101c90611a866124b2565b600354600254849190036000190161103491906124c5565b11156110825760405162461bcd60e51b815260206004820152601b60248201527f657863656564206d617820737570706c79206f6620746f6b656e7300000000006044820152606401610ba2565b81600b546110909190612318565b3410156110da5760405162461bcd60e51b8152602060048201526018602482015277696e73756666696369656e742065746865722076616c756560401b6044820152606401610ba2565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061112082601354836117f1565b61115e5760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba10383937b7b360891b6044820152606401610ba2565b336000908152601460205260408120805485929061117d9084906124c5565b909155506109289050338461165d565b6111956112f6565b6010805461ff0019169055565b6111aa6112f6565b6011610a68828261239f565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b6040516bffffffffffffffffffffffff193360601b166020820152600090819060340160405160208183030381529060405280519060200120905061122c83601354836117f1565b9392505050565b61123b6112f6565b6001600160a01b0381166112a05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba2565b610d198161160b565b6112b16112f6565b600e55565b60006001600160e01b031982166380ac58cd60e01b14806112e757506001600160e01b03198216635b5e139f60e01b145b80610821575061082182611807565b600a546001600160a01b03163314610b245760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ba2565b600081600111158015611364575060025482105b8015610821575050600090815260066020526040902054600160e01b900460ff161590565b6daaeb6d7670e522a718067333cd4e3b15610d1957604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156113f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141a9190612578565b610d1957604051633b79c77360e21b81526001600160a01b0382166004820152602401610ba2565b600061144d82610ab2565b9050806001600160a01b0316836001600160a01b0316036114815760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146114b85761149b81336111b6565b6114b8576040516367d9dca160e11b815260040160405180910390fd5b61092883838361183c565b610928838383611898565b61092883838360405180602001604052806000815250610d3d565b604080516060810182526000808252602082018190529181019190915281806001116115f2576002548110156115f257600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906115f05780516001600160a01b031615611587579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156115eb579392505050565b611587565b505b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610a68828260405180602001604052806000815250611a83565b336001600160a01b038316036116a05760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611717848484611898565b6001600160a01b0383163b1561097f5761173384848484611c49565b61097f576040516368d2bf6b60e11b815260040160405180910390fd5b60606012805461084d906122c8565b6060600061176c83611d35565b60010190506000816001600160401b0381111561178b5761178b611fd9565b6040519080825280601f01601f1916602001820160405280156117b5576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846117bf57509392505050565b6000826117fe8584611e0d565b14949350505050565b60006001600160e01b0319821663152a902d60e11b148061082157506301ffc9a760e01b6001600160e01b0319831614610821565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006118a3826114e9565b9050836001600160a01b031681600001516001600160a01b0316146118da5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806118f857506118f885336111b6565b80611913575033611908846108d0565b6001600160a01b0316145b90508061193357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661195a57604051633a954ecd60e21b815260040160405180910390fd5b6119666000848761183c565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611a3a576002548214611a3a57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610d63565b6002546001600160a01b038416611aac57604051622e076360e81b815260040160405180910390fd5b82600003611acd5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600690925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15611bf5575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611bbe6000878480600101955087611c49565b611bdb576040516368d2bf6b60e11b815260040160405180910390fd5b808210611b73578260025414611bf057600080fd5b611c3a565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611bf6575b5060025561097f600085838684565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611c7e903390899088908890600401612595565b6020604051808303816000875af1925050508015611cb9575060408051601f3d908101601f19168201909252611cb6918101906125d2565b60015b611d17573d808015611ce7576040519150601f19603f3d011682016040523d82523d6000602084013e611cec565b606091505b508051600003611d0f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611d745772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611da0576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611dbe57662386f26fc10000830492506010015b6305f5e1008310611dd6576305f5e100830492506008015b6127108310611dea57612710830492506004015b60648310611dfc576064830492506002015b600a83106108215760010192915050565b600081815b8451811015611e5257611e3e82868381518110611e3157611e316125ef565b6020026020010151611e5a565b915080611e4a81612605565b915050611e12565b509392505050565b6000818310611e7657600082815260208490526040902061122c565b5060009182526020526040902090565b6001600160e01b031981168114610d1957600080fd5b600060208284031215611eae57600080fd5b813561122c81611e86565b60005b83811015611ed4578181015183820152602001611ebc565b50506000910152565b60008151808452611ef5816020860160208601611eb9565b601f01601f19169290920160200192915050565b60208152600061122c6020830184611edd565b600060208284031215611f2e57600080fd5b5035919050565b6001600160a01b0381168114610d1957600080fd5b60008060408385031215611f5d57600080fd5b8235611f6881611f35565b946020939093013593505050565b600080600060608486031215611f8b57600080fd5b8335611f9681611f35565b92506020840135611fa681611f35565b929592945050506040919091013590565b60008060408385031215611fca57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561201757612017611fd9565b604052919050565b60006001600160401b0383111561203857612038611fd9565b61204b601f8401601f1916602001611fef565b905082815283838301111561205f57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561208857600080fd5b81356001600160401b0381111561209e57600080fd5b8201601f810184136120af57600080fd5b611d2d8482356020840161201f565b6000602082840312156120d057600080fd5b813561122c81611f35565b8015158114610d1957600080fd5b600080604083850312156120fc57600080fd5b823561210781611f35565b91506020830135612117816120db565b809150509250929050565b6000806000806080858703121561213857600080fd5b843561214381611f35565b9350602085013561215381611f35565b92506040850135915060608501356001600160401b0381111561217557600080fd5b8501601f8101871361218657600080fd5b6121958782356020840161201f565b91505092959194509250565b600082601f8301126121b257600080fd5b813560206001600160401b038211156121cd576121cd611fd9565b8160051b6121dc828201611fef565b92835284810182019282810190878511156121f657600080fd5b83870192505b84831015612215578235825291830191908301906121fc565b979650505050505050565b6000806040838503121561223357600080fd5b8235915060208301356001600160401b0381111561225057600080fd5b61225c858286016121a1565b9150509250929050565b6000806040838503121561227957600080fd5b823561228481611f35565b9150602083013561211781611f35565b6000602082840312156122a657600080fd5b81356001600160401b038111156122bc57600080fd5b611d2d848285016121a1565b600181811c908216806122dc57607f821691505b6020821081036122fc57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761082157610821612302565b60008261234c57634e487b7160e01b600052601260045260246000fd5b500490565b601f82111561092857600081815260208120601f850160051c810160208610156123785750805b601f850160051c820191505b8181101561239757828155600101612384565b505050505050565b81516001600160401b038111156123b8576123b8611fd9565b6123cc816123c684546122c8565b84612351565b602080601f83116001811461240157600084156123e95750858301515b600019600386901b1c1916600185901b178555612397565b600085815260208120601f198616915b8281101561243057888601518255948401946001909101908401612411565b508582101561244e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526034908201527f7175616e74697479206f6620746f6b656e732063616e6e6f74206265206c6573604082015273073207468616e206f7220657175616c20746f20360641b606082015260800190565b8181038181111561082157610821612302565b8082018082111561082157610821612302565b6000845160206124eb8285838a01611eb9565b8551918401916124fe8184848a01611eb9565b855492019160009061250f816122c8565b60018281168015612527576001811461253c57612568565b60ff1984168752821515830287019450612568565b896000528560002060005b8481101561256057815489820152908301908701612547565b505082870194505b50929a9950505050505050505050565b60006020828403121561258a57600080fd5b815161122c816120db565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906125c890830184611edd565b9695505050505050565b6000602082840312156125e457600080fd5b815161122c81611e86565b634e487b7160e01b600052603260045260246000fd5b60006001820161261757612617612302565b506001019056fea2646970667358221220ee151cd1efb952af6e16650b9825b94f70318a367515532c75d9c6237d89568b64736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696733676977356167346f6a6d633570757a616e7a74676c6468786736663478626a676465326b6a65366d6e626a7276716d3635692f0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102885760003560e01c80637cb647591161015a578063c74073a1116100c1578063e985e9c51161007a578063e985e9c514610761578063ed475f6314610781578063f2fde38b146107a1578063f43a22dc146107c1578063f9e23799146107d7578063fecfda49146107f657600080fd5b8063c74073a1146106b9578063c87b56dd146106d9578063ca800144146106f9578063d2cab05614610719578063da1b91c31461072c578063da3ef23f1461074157600080fd5b8063a3c9583e11610113578063a3c9583e14610607578063aa592f2514610627578063b88d4fde1461063d578063bee6348a1461065d578063bf3a5c0214610677578063c6682862146106a457600080fd5b80637cb64759146105615780638606d938146105815780638da5cb5b146105a157806395d89b41146105bf578063a0712d68146105d4578063a22cb465146105e757600080fd5b80632eb4a7ab116101fe57806355f804b3116101b757806355f804b3146104c0578063611f3f10146104e057806362dc6e21146104f65780636352211e1461050c57806370a082311461052c578063715018a61461054c57600080fd5b80632eb4a7ab1461041d57806332cb6b0c146104335780633ccfd60b1461044957806341f434341461045e57806342842e0e146104805780634fda7285146104a057600080fd5b80630c1c972a116102505780630c1c972a146103535780630f2cdd6c1461036857806318160ddd1461038c5780631ad2ad1a146103a957806323b872dd146103be5780632a55205a146103de57600080fd5b806301ffc9a71461028d57806304c98b2b146102c257806306fdde03146102d9578063081812fc146102fb578063095ea7b314610333575b600080fd5b34801561029957600080fd5b506102ad6102a8366004611e9c565b610816565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d7610827565b005b3480156102e557600080fd5b506102ee61083e565b6040516102b99190611f09565b34801561030757600080fd5b5061031b610316366004611f1c565b6108d0565b6040516001600160a01b0390911681526020016102b9565b34801561033f57600080fd5b506102d761034e366004611f4a565b610914565b34801561035f57600080fd5b506102d761092d565b34801561037457600080fd5b5061037e600e5481565b6040519081526020016102b9565b34801561039857600080fd5b50600354600254036000190161037e565b3480156103b557600080fd5b506102d7610946565b3480156103ca57600080fd5b506102d76103d9366004611f76565b61095a565b3480156103ea57600080fd5b506103fe6103f9366004611fb7565b610985565b604080516001600160a01b0390931683526020830191909152016102b9565b34801561042957600080fd5b5061037e60135481565b34801561043f57600080fd5b5061037e611a8681565b34801561045557600080fd5b506102d7610a31565b34801561046a57600080fd5b5061031b6daaeb6d7670e522a718067333cd4e81565b34801561048c57600080fd5b506102d761049b366004611f76565b610a6c565b3480156104ac57600080fd5b506102d76104bb366004611f1c565b610a91565b3480156104cc57600080fd5b506102d76104db366004612076565b610a9e565b3480156104ec57600080fd5b5061037e600c5481565b34801561050257600080fd5b5061037e600b5481565b34801561051857600080fd5b5061031b610527366004611f1c565b610ab2565b34801561053857600080fd5b5061037e6105473660046120be565b610ac4565b34801561055857600080fd5b506102d7610b12565b34801561056d57600080fd5b506102d761057c366004611f1c565b610b26565b34801561058d57600080fd5b506102d761059c366004611f1c565b610b33565b3480156105ad57600080fd5b50600a546001600160a01b031661031b565b3480156105cb57600080fd5b506102ee610b40565b6102d76105e2366004611f1c565b610b4f565b3480156105f357600080fd5b506102d76106023660046120e9565b610d1c565b34801561061357600080fd5b506102d7610622366004611f1c565b610d30565b34801561063357600080fd5b5061037e600f5481565b34801561064957600080fd5b506102d7610658366004612122565b610d3d565b34801561066957600080fd5b506010546102ad9060ff1681565b34801561068357600080fd5b5061037e6106923660046120be565b60146020526000908152604090205481565b3480156106b057600080fd5b506102ee610d6a565b3480156106c557600080fd5b506102d76106d43660046120be565b610df8565b3480156106e557600080fd5b506102ee6106f4366004611f1c565b610e0c565b34801561070557600080fd5b506102d7610714366004611f4a565b610eff565b6102d7610727366004612220565b610f38565b34801561073857600080fd5b506102d761118d565b34801561074d57600080fd5b506102d761075c366004612076565b6111a2565b34801561076d57600080fd5b506102ad61077c366004612266565b6111b6565b34801561078d57600080fd5b506102ad61079c366004612294565b6111e4565b3480156107ad57600080fd5b506102d76107bc3660046120be565b611233565b3480156107cd57600080fd5b5061037e600d5481565b3480156107e357600080fd5b506010546102ad90610100900460ff1681565b34801561080257600080fd5b506102d7610811366004611f1c565b6112a9565b6000610821826112b6565b92915050565b61082f6112f6565b6010805460ff19166001179055565b60606004805461084d906122c8565b80601f0160208091040260200160405190810160405280929190818152602001828054610879906122c8565b80156108c65780601f1061089b576101008083540402835291602001916108c6565b820191906000526020600020905b8154815290600101906020018083116108a957829003601f168201915b5050505050905090565b60006108db82611350565b6108f8576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b8161091e81611389565b6109288383611442565b505050565b6109356112f6565b6010805461ff001916610100179055565b61094e6112f6565b6010805460ff19169055565b826001600160a01b03811633146109745761097433611389565b61097f8484846114c3565b50505050565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916109fa5750604080518082019091526000546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610a19906001600160601b031687612318565b610a23919061232f565b915196919550909350505050565b610a396112f6565b6040514790339082156108fc029083906000818181858888f19350505050158015610a68573d6000803e3d6000fd5b5050565b826001600160a01b0381163314610a8657610a8633611389565b61097f8484846114ce565b610a996112f6565b600c55565b610aa66112f6565b6012610a68828261239f565b6000610abd826114e9565b5192915050565b60006001600160a01b038216610aed576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b610b1a6112f6565b610b24600061160b565b565b610b2e6112f6565b601355565b610b3b6112f6565b600b55565b60606005805461084d906122c8565b601054610100900460ff16610bab5760405162461bcd60e51b815260206004820152601760248201527f5075626c69632053616c65206973206e6f74206f70656e00000000000000000060448201526064015b60405180910390fd5b60008111610bcb5760405162461bcd60e51b8152600401610ba29061245e565b600d54811115610c1d5760405162461bcd60e51b815260206004820152601a60248201527f657863656564206d617820706572207472616e73616374696f6e0000000000006044820152606401610ba2565b600f54610c2c90611a866124b2565b6003546002548391900360001901610c4491906124c5565b1115610c925760405162461bcd60e51b815260206004820152601b60248201527f657863656564206d617820737570706c79206f6620746f6b656e7300000000006044820152606401610ba2565b80600c54610ca09190612318565b341015610cea5760405162461bcd60e51b8152602060048201526018602482015277696e73756666696369656e742065746865722076616c756560401b6044820152606401610ba2565b3360009081526014602052604081208054839290610d099084906124c5565b90915550610d199050338261165d565b50565b81610d2681611389565b6109288383611677565b610d386112f6565b600d55565b836001600160a01b0381163314610d5757610d5733611389565b610d638585858561170c565b5050505050565b60118054610d77906122c8565b80601f0160208091040260200160405190810160405280929190818152602001828054610da3906122c8565b8015610df05780601f10610dc557610100808354040283529160200191610df0565b820191906000526020600020905b815481529060010190602001808311610dd357829003601f168201915b505050505081565b610e006112f6565b806001600160a01b0316ff5b6060610e1782611350565b610e7b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610ba2565b6000610e85611750565b90506000815111610eca5760405162461bcd60e51b815260206004820152600f60248201526e18985cd9555492481b9bdd081cd95d608a1b6044820152606401610ba2565b80610ed48461175f565b6011604051602001610ee8939291906124d8565b604051602081830303815290604052915050919050565b610f076112f6565b600f54811115610f1657600080fd5b80600f6000828254610f2891906124b2565b90915550610a689050828261165d565b60105460ff16610f815760405162461bcd60e51b815260206004820152601460248201527328393296b9b0b6329034b9903737ba1037b832b760611b6044820152606401610ba2565b60008211610fa15760405162461bcd60e51b8152600401610ba29061245e565b33600090815260146020526040902054600e54610fbe91906124b2565b82111561100d5760405162461bcd60e51b815260206004820152601760248201527f6578636565646564206d6178207065722077616c6c65740000000000000000006044820152606401610ba2565b600f5461101c90611a866124b2565b600354600254849190036000190161103491906124c5565b11156110825760405162461bcd60e51b815260206004820152601b60248201527f657863656564206d617820737570706c79206f6620746f6b656e7300000000006044820152606401610ba2565b81600b546110909190612318565b3410156110da5760405162461bcd60e51b8152602060048201526018602482015277696e73756666696369656e742065746865722076616c756560401b6044820152606401610ba2565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061112082601354836117f1565b61115e5760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba10383937b7b360891b6044820152606401610ba2565b336000908152601460205260408120805485929061117d9084906124c5565b909155506109289050338461165d565b6111956112f6565b6010805461ff0019169055565b6111aa6112f6565b6011610a68828261239f565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b6040516bffffffffffffffffffffffff193360601b166020820152600090819060340160405160208183030381529060405280519060200120905061122c83601354836117f1565b9392505050565b61123b6112f6565b6001600160a01b0381166112a05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba2565b610d198161160b565b6112b16112f6565b600e55565b60006001600160e01b031982166380ac58cd60e01b14806112e757506001600160e01b03198216635b5e139f60e01b145b80610821575061082182611807565b600a546001600160a01b03163314610b245760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ba2565b600081600111158015611364575060025482105b8015610821575050600090815260066020526040902054600160e01b900460ff161590565b6daaeb6d7670e522a718067333cd4e3b15610d1957604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156113f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141a9190612578565b610d1957604051633b79c77360e21b81526001600160a01b0382166004820152602401610ba2565b600061144d82610ab2565b9050806001600160a01b0316836001600160a01b0316036114815760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146114b85761149b81336111b6565b6114b8576040516367d9dca160e11b815260040160405180910390fd5b61092883838361183c565b610928838383611898565b61092883838360405180602001604052806000815250610d3d565b604080516060810182526000808252602082018190529181019190915281806001116115f2576002548110156115f257600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906115f05780516001600160a01b031615611587579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156115eb579392505050565b611587565b505b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610a68828260405180602001604052806000815250611a83565b336001600160a01b038316036116a05760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611717848484611898565b6001600160a01b0383163b1561097f5761173384848484611c49565b61097f576040516368d2bf6b60e11b815260040160405180910390fd5b60606012805461084d906122c8565b6060600061176c83611d35565b60010190506000816001600160401b0381111561178b5761178b611fd9565b6040519080825280601f01601f1916602001820160405280156117b5576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846117bf57509392505050565b6000826117fe8584611e0d565b14949350505050565b60006001600160e01b0319821663152a902d60e11b148061082157506301ffc9a760e01b6001600160e01b0319831614610821565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006118a3826114e9565b9050836001600160a01b031681600001516001600160a01b0316146118da5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806118f857506118f885336111b6565b80611913575033611908846108d0565b6001600160a01b0316145b90508061193357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661195a57604051633a954ecd60e21b815260040160405180910390fd5b6119666000848761183c565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611a3a576002548214611a3a57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610d63565b6002546001600160a01b038416611aac57604051622e076360e81b815260040160405180910390fd5b82600003611acd5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600690925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15611bf5575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611bbe6000878480600101955087611c49565b611bdb576040516368d2bf6b60e11b815260040160405180910390fd5b808210611b73578260025414611bf057600080fd5b611c3a565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611bf6575b5060025561097f600085838684565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611c7e903390899088908890600401612595565b6020604051808303816000875af1925050508015611cb9575060408051601f3d908101601f19168201909252611cb6918101906125d2565b60015b611d17573d808015611ce7576040519150601f19603f3d011682016040523d82523d6000602084013e611cec565b606091505b508051600003611d0f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611d745772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611da0576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611dbe57662386f26fc10000830492506010015b6305f5e1008310611dd6576305f5e100830492506008015b6127108310611dea57612710830492506004015b60648310611dfc576064830492506002015b600a83106108215760010192915050565b600081815b8451811015611e5257611e3e82868381518110611e3157611e316125ef565b6020026020010151611e5a565b915080611e4a81612605565b915050611e12565b509392505050565b6000818310611e7657600082815260208490526040902061122c565b5060009182526020526040902090565b6001600160e01b031981168114610d1957600080fd5b600060208284031215611eae57600080fd5b813561122c81611e86565b60005b83811015611ed4578181015183820152602001611ebc565b50506000910152565b60008151808452611ef5816020860160208601611eb9565b601f01601f19169290920160200192915050565b60208152600061122c6020830184611edd565b600060208284031215611f2e57600080fd5b5035919050565b6001600160a01b0381168114610d1957600080fd5b60008060408385031215611f5d57600080fd5b8235611f6881611f35565b946020939093013593505050565b600080600060608486031215611f8b57600080fd5b8335611f9681611f35565b92506020840135611fa681611f35565b929592945050506040919091013590565b60008060408385031215611fca57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561201757612017611fd9565b604052919050565b60006001600160401b0383111561203857612038611fd9565b61204b601f8401601f1916602001611fef565b905082815283838301111561205f57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561208857600080fd5b81356001600160401b0381111561209e57600080fd5b8201601f810184136120af57600080fd5b611d2d8482356020840161201f565b6000602082840312156120d057600080fd5b813561122c81611f35565b8015158114610d1957600080fd5b600080604083850312156120fc57600080fd5b823561210781611f35565b91506020830135612117816120db565b809150509250929050565b6000806000806080858703121561213857600080fd5b843561214381611f35565b9350602085013561215381611f35565b92506040850135915060608501356001600160401b0381111561217557600080fd5b8501601f8101871361218657600080fd5b6121958782356020840161201f565b91505092959194509250565b600082601f8301126121b257600080fd5b813560206001600160401b038211156121cd576121cd611fd9565b8160051b6121dc828201611fef565b92835284810182019282810190878511156121f657600080fd5b83870192505b84831015612215578235825291830191908301906121fc565b979650505050505050565b6000806040838503121561223357600080fd5b8235915060208301356001600160401b0381111561225057600080fd5b61225c858286016121a1565b9150509250929050565b6000806040838503121561227957600080fd5b823561228481611f35565b9150602083013561211781611f35565b6000602082840312156122a657600080fd5b81356001600160401b038111156122bc57600080fd5b611d2d848285016121a1565b600181811c908216806122dc57607f821691505b6020821081036122fc57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761082157610821612302565b60008261234c57634e487b7160e01b600052601260045260246000fd5b500490565b601f82111561092857600081815260208120601f850160051c810160208610156123785750805b601f850160051c820191505b8181101561239757828155600101612384565b505050505050565b81516001600160401b038111156123b8576123b8611fd9565b6123cc816123c684546122c8565b84612351565b602080601f83116001811461240157600084156123e95750858301515b600019600386901b1c1916600185901b178555612397565b600085815260208120601f198616915b8281101561243057888601518255948401946001909101908401612411565b508582101561244e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526034908201527f7175616e74697479206f6620746f6b656e732063616e6e6f74206265206c6573604082015273073207468616e206f7220657175616c20746f20360641b606082015260800190565b8181038181111561082157610821612302565b8082018082111561082157610821612302565b6000845160206124eb8285838a01611eb9565b8551918401916124fe8184848a01611eb9565b855492019160009061250f816122c8565b60018281168015612527576001811461253c57612568565b60ff1984168752821515830287019450612568565b896000528560002060005b8481101561256057815489820152908301908701612547565b505082870194505b50929a9950505050505050505050565b60006020828403121561258a57600080fd5b815161122c816120db565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906125c890830184611edd565b9695505050505050565b6000602082840312156125e457600080fd5b815161122c81611e86565b634e487b7160e01b600052603260045260246000fd5b60006001820161261757612617612302565b506001019056fea2646970667358221220ee151cd1efb952af6e16650b9825b94f70318a367515532c75d9c6237d89568b64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696733676977356167346f6a6d633570757a616e7a74676c6468786736663478626a676465326b6a65366d6e626a7276716d3635692f0000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://bafybeig3giw5ag4ojmc5puzanztgldhxg6f4xbjgde2kje6mnbjrvqm65i/
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [2] : 697066733a2f2f626166796265696733676977356167346f6a6d633570757a61
Arg [3] : 6e7a74676c6468786736663478626a676465326b6a65366d6e626a7276716d36
Arg [4] : 35692f0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
81854:5940:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82714:177;;;;;;;;;;-1:-1:-1;82714:177:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;82714:177:0;;;;;;;;86962:80;;;;;;;;;;;;;:::i;:::-;;66054:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;67566:204::-;;;;;;;;;;-1:-1:-1;67566:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;67566:204:0;1533:203:1;83083:157:0;;;;;;;;;;-1:-1:-1;83083:157:0;;;;;:::i;:::-;;:::i;87050:86::-;;;;;;;;;;;;;:::i;82119:33::-;;;;;;;;;;;;;;;;;;;2343:25:1;;;2331:2;2316:18;82119:33:0;2197:177:1;62179:312:0;;;;;;;;;;-1:-1:-1;62442:12:0;;62426:13;;:28;-1:-1:-1;;62426:46:0;62179:312;;87144:80;;;;;;;;;;;;;:::i;83248:163::-;;;;;;;;;;-1:-1:-1;83248:163:0;;;;;:::i;:::-;;:::i;38802:442::-;;;;;;;;;;-1:-1:-1;38802:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3285:32:1;;;3267:51;;3349:2;3334:18;;3327:34;;;;3240:18;38802:442:0;3093:274:1;82412:25:0;;;;;;;;;;;;;;;;82159:41;;;;;;;;;;;;82196:4;82159:41;;87648:143;;;;;;;;;;;;;:::i;2903:::-;;;;;;;;;;;;3003:42;2903:143;;83419:171;;;;;;;;;;-1:-1:-1;83419:171:0;;;;;:::i;:::-;;:::i;87434:104::-;;;;;;;;;;-1:-1:-1;87434:104:0;;;;;:::i;:::-;;:::i;86381:102::-;;;;;;;;;;-1:-1:-1;86381:102:0;;;;;:::i;:::-;;:::i;82028:39::-;;;;;;;;;;;;;;;;81983:38;;;;;;;;;;;;;;;;65862:125;;;;;;;;;;-1:-1:-1;65862:125:0;;;;;:::i;:::-;;:::i;63308:206::-;;;;;;;;;;-1:-1:-1;63308:206:0;;;;;:::i;:::-;;:::i;44075:103::-;;;;;;;;;;;;;:::i;86623:105::-;;;;;;;;;;-1:-1:-1;86623:105:0;;;;;:::i;:::-;;:::i;87324:102::-;;;;;;;;;;-1:-1:-1;87324:102:0;;;;;:::i;:::-;;:::i;43427:87::-;;;;;;;;;;-1:-1:-1;43500:6:0;;-1:-1:-1;;;;;43500:6:0;43427:87;;66223:104;;;;;;;;;;;;;:::i;84622:548::-;;;;;;:::i;:::-;;:::i;82899:176::-;;;;;;;;;;-1:-1:-1;82899:176:0;;;;;:::i;:::-;;:::i;86736:101::-;;;;;;;;;;-1:-1:-1;86736:101:0;;;;;:::i;:::-;;:::i;82207:29::-;;;;;;;;;;;;;;;;83598:228;;;;;;;;;;-1:-1:-1;83598:228:0;;;;;:::i;:::-;;:::i;82245:31::-;;;;;;;;;;-1:-1:-1;82245:31:0;;;;;;;;82446:42;;;;;;;;;;-1:-1:-1;82446:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;82330:37;;;;;;;;;;;;;:::i;87547:93::-;;;;;;;;;;-1:-1:-1;87547:93:0;;;;;:::i;:::-;;:::i;85180:369::-;;;;;;;;;;-1:-1:-1;85180:369:0;;;;;:::i;:::-;;:::i;86193:180::-;;;;;;;;;;-1:-1:-1;86193:180:0;;;;;:::i;:::-;;:::i;83834:780::-;;;;;;:::i;:::-;;:::i;87232:86::-;;;;;;;;;;;;;:::i;86495:120::-;;;;;;;;;;-1:-1:-1;86495:120:0;;;;;:::i;:::-;;:::i;68200:164::-;;;;;;;;;;-1:-1:-1;68200:164:0;;;;;:::i;:::-;;:::i;85563:218::-;;;;;;;;;;-1:-1:-1;85563:218:0;;;;;:::i;:::-;;:::i;44333:201::-;;;;;;;;;;-1:-1:-1;44333:201:0;;;;;:::i;:::-;;:::i;82080:32::-;;;;;;;;;;;;;;;;82283:34;;;;;;;;;;-1:-1:-1;82283:34:0;;;;;;;;;;;86845:109;;;;;;;;;;-1:-1:-1;86845:109:0;;;;;:::i;:::-;;:::i;82714:177::-;82827:4;82849:36;82873:11;82849:23;:36::i;:::-;82842:43;82714:177;-1:-1:-1;;82714:177:0:o;86962:80::-;43313:13;:11;:13::i;:::-;87016:11:::1;:18:::0;;-1:-1:-1;;87016:18:0::1;87030:4;87016:18;::::0;;86962:80::o;66054:100::-;66108:13;66141:5;66134:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66054:100;:::o;67566:204::-;67634:7;67659:16;67667:7;67659;:16::i;:::-;67654:64;;67684:34;;-1:-1:-1;;;67684:34:0;;;;;;;;;;;67654:64;-1:-1:-1;67738:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;67738:24:0;;67566:204::o;83083:157::-;83179:8;4424:30;4445:8;4424:20;:30::i;:::-;83200:32:::1;83214:8;83224:7;83200:13;:32::i;:::-;83083:157:::0;;;:::o;87050:86::-;43313:13;:11;:13::i;:::-;87107:14:::1;:21:::0;;-1:-1:-1;;87107:21:0::1;;;::::0;;87050:86::o;87144:80::-;43313:13;:11;:13::i;:::-;87197:11:::1;:19:::0;;-1:-1:-1;;87197:19:0::1;::::0;;87144:80::o;83248:163::-;83349:4;-1:-1:-1;;;;;4244:18:0;;4252:10;4244:18;4240:83;;4279:32;4300:10;4279:20;:32::i;:::-;83366:37:::1;83385:4;83391:2;83395:7;83366:18;:37::i;:::-;83248:163:::0;;;;:::o;38802:442::-;38899:7;38957:27;;;:17;:27;;;;;;;;38928:56;;;;;;;;;-1:-1:-1;;;;;38928:56:0;;;;;-1:-1:-1;;;38928:56:0;;;-1:-1:-1;;;;;38928:56:0;;;;;;;;38899:7;;38997:92;;-1:-1:-1;39048:29:0;;;;;;;;;-1:-1:-1;39048:29:0;-1:-1:-1;;;;;39048:29:0;;;;-1:-1:-1;;;39048:29:0;;-1:-1:-1;;;;;39048:29:0;;;;;38997:92;39139:23;;;;39101:21;;39610:5;;39126:36;;-1:-1:-1;;;;;39126:36:0;:10;:36;:::i;:::-;39125:58;;;;:::i;:::-;39204:16;;;;;-1:-1:-1;38802:442:0;;-1:-1:-1;;;;38802:442:0:o;87648:143::-;43313:13;:11;:13::i;:::-;87746:37:::1;::::0;87714:21:::1;::::0;87754:10:::1;::::0;87746:37;::::1;;;::::0;87714:21;;87696:15:::1;87746:37:::0;87696:15;87746:37;87714:21;87754:10;87746:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;87685:106;87648:143::o:0;83419:171::-;83524:4;-1:-1:-1;;;;;4244:18:0;;4252:10;4244:18;4240:83;;4279:32;4300:10;4279:20;:32::i;:::-;83541:41:::1;83564:4;83570:2;83574:7;83541:22;:41::i;87434:104::-:0;43313:13;:11;:13::i;:::-;87510:12:::1;:20:::0;87434:104::o;86381:102::-;43313:13;:11;:13::i;:::-;86452::::1;:23;86468:7:::0;86452:13;:23:::1;:::i;65862:125::-:0;65926:7;65953:21;65966:7;65953:12;:21::i;:::-;:26;;65862:125;-1:-1:-1;;65862:125:0:o;63308:206::-;63372:7;-1:-1:-1;;;;;63396:19:0;;63392:60;;63424:28;;-1:-1:-1;;;63424:28:0;;;;;;;;;;;63392:60;-1:-1:-1;;;;;;63478:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;63478:27:0;;63308:206::o;44075:103::-;43313:13;:11;:13::i;:::-;44140:30:::1;44167:1;44140:18;:30::i;:::-;44075:103::o:0;86623:105::-;43313:13;:11;:13::i;:::-;86696:10:::1;:24:::0;86623:105::o;87324:102::-;43313:13;:11;:13::i;:::-;87397::::1;:21:::0;87324:102::o;66223:104::-;66279:13;66312:7;66305:14;;;;;:::i;84622:548::-;84690:14;;;;;;;84682:50;;;;-1:-1:-1;;;84682:50:0;;12414:2:1;84682:50:0;;;12396:21:1;12453:2;12433:18;;;12426:30;12492:25;12472:18;;;12465:53;12535:18;;84682:50:0;;;;;;;;;84762:1;84751:8;:12;84743:77;;;;-1:-1:-1;;;84743:77:0;;;;;;;:::i;:::-;84851:10;;84839:8;:22;;84831:61;;;;-1:-1:-1;;;84831:61:0;;13187:2:1;84831:61:0;;;13169:21:1;13226:2;13206:18;;;13199:30;13265:28;13245:18;;;13238:56;13311:18;;84831:61:0;12985:350:1;84831:61:0;84952:8;;84939:21;;82196:4;84939:21;:::i;:::-;62442:12;;62426:13;;84927:8;;62426:28;;-1:-1:-1;;62426:46:0;84911:24;;;;:::i;:::-;:49;;84903:89;;;;-1:-1:-1;;;84903:89:0;;13805:2:1;84903:89:0;;;13787:21:1;13844:2;13824:18;;;13817:30;13883:29;13863:18;;;13856:57;13930:18;;84903:89:0;13603:351:1;84903:89:0;85039:8;85024:12;;:23;;;;:::i;:::-;85011:9;:36;;85003:73;;;;-1:-1:-1;;;85003:73:0;;14161:2:1;85003:73:0;;;14143:21:1;14200:2;14180:18;;;14173:30;-1:-1:-1;;;14219:18:1;;;14212:54;14283:18;;85003:73:0;13959:348:1;85003:73:0;85097:10;85089:19;;;;:7;:19;;;;;:31;;85112:8;;85089:19;:31;;85112:8;;85089:31;:::i;:::-;;;;-1:-1:-1;85131:31:0;;-1:-1:-1;85141:10:0;85153:8;85131:9;:31::i;:::-;84622:548;:::o;82899:176::-;83003:8;4424:30;4445:8;4424:20;:30::i;:::-;83024:43:::1;83048:8;83058;83024:23;:43::i;86736:101::-:0;43313:13;:11;:13::i;:::-;86808:10:::1;:21:::0;86736:101::o;83598:228::-;83749:4;-1:-1:-1;;;;;4244:18:0;;4252:10;4244:18;4240:83;;4279:32;4300:10;4279:20;:32::i;:::-;83771:47:::1;83794:4;83800:2;83804:7;83813:4;83771:22;:47::i;:::-;83598:228:::0;;;;;:::o;82330:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;87547:93::-;43313:13;:11;:13::i;:::-;87625:3:::1;-1:-1:-1::0;;;;;87612:17:0::1;;85180:369:::0;85253:13;85287:16;85295:7;85287;:16::i;:::-;85279:76;;;;-1:-1:-1;;;85279:76:0;;14514:2:1;85279:76:0;;;14496:21:1;14553:2;14533:18;;;14526:30;14592:34;14572:18;;;14565:62;-1:-1:-1;;;14643:18:1;;;14636:45;14698:19;;85279:76:0;14312:411:1;85279:76:0;85366:18;85387:10;:8;:10::i;:::-;85366:31;;85437:1;85422:4;85416:18;:22;85408:50;;;;-1:-1:-1;;;85408:50:0;;14930:2:1;85408:50:0;;;14912:21:1;14969:2;14949:18;;;14942:30;-1:-1:-1;;;14988:18:1;;;14981:45;15043:18;;85408:50:0;14728:339:1;85408:50:0;85500:4;85506:18;:7;:16;:18::i;:::-;85526:13;85483:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;85469:72;;;85180:369;;;:::o;86193:180::-;43313:13;:11;:13::i;:::-;86291:8:::1;;86279;:20;;86271:29;;;::::0;::::1;;86323:8;86311;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;86342:23:0::1;::::0;-1:-1:-1;86352:2:0;86356:8;86342:9:::1;:23::i;83834:780::-:0;83942:11;;;;83934:44;;;;-1:-1:-1;;;83934:44:0;;16535:2:1;83934:44:0;;;16517:21:1;16574:2;16554:18;;;16547:30;-1:-1:-1;;;16593:18:1;;;16586:50;16653:18;;83934:44:0;16333:344:1;83934:44:0;84008:1;83997:8;:12;83989:77;;;;-1:-1:-1;;;83989:77:0;;;;;;;:::i;:::-;84122:10;84114:19;;;;:7;:19;;;;;;84097:14;;:36;;84114:19;84097:36;:::i;:::-;84085:8;:48;;84077:84;;;;-1:-1:-1;;;84077:84:0;;16884:2:1;84077:84:0;;;16866:21:1;16923:2;16903:18;;;16896:30;16962:25;16942:18;;;16935:53;17005:18;;84077:84:0;16682:347:1;84077:84:0;84221:8;;84208:21;;82196:4;84208:21;:::i;:::-;62442:12;;62426:13;;84196:8;;62426:28;;-1:-1:-1;;62426:46:0;84180:24;;;;:::i;:::-;:49;;84172:89;;;;-1:-1:-1;;;84172:89:0;;13805:2:1;84172:89:0;;;13787:21:1;13844:2;13824:18;;;13817:30;13883:29;13863:18;;;13856:57;13930:18;;84172:89:0;13603:351:1;84172:89:0;84309:8;84293:13;;:24;;;;:::i;:::-;84280:9;:37;;84272:74;;;;-1:-1:-1;;;84272:74:0;;14161:2:1;84272:74:0;;;14143:21:1;14200:2;14180:18;;;14173:30;-1:-1:-1;;;14219:18:1;;;14212:54;14283:18;;84272:74:0;13959:348:1;84272:74:0;84392:28;;-1:-1:-1;;84409:10:0;17183:2:1;17179:15;17175:53;84392:28:0;;;17163:66:1;84367:12:0;;17245::1;;84392:28:0;;;;;;;;;;;;84382:39;;;;;;84367:54;;84442:50;84461:12;84475:10;;84487:4;84442:18;:50::i;:::-;84434:78;;;;-1:-1:-1;;;84434:78:0;;17470:2:1;84434:78:0;;;17452:21:1;17509:2;17489:18;;;17482:30;-1:-1:-1;;;17528:18:1;;;17521:45;17583:18;;84434:78:0;17268:339:1;84434:78:0;84541:10;84533:19;;;;:7;:19;;;;;:31;;84556:8;;84533:19;:31;;84556:8;;84533:31;:::i;:::-;;;;-1:-1:-1;84575:31:0;;-1:-1:-1;84585:10:0;84597:8;84575:9;:31::i;87232:86::-;43313:13;:11;:13::i;:::-;87288:14:::1;:22:::0;;-1:-1:-1;;87288:22:0::1;::::0;;87232:86::o;86495:120::-;43313:13;:11;:13::i;:::-;86578::::1;:29;86594:13:::0;86578;:29:::1;:::i;68200:164::-:0;-1:-1:-1;;;;;68321:25:0;;;68297:4;68321:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;68200:164::o;85563:218::-;85677:28;;-1:-1:-1;;85694:10:0;17183:2:1;17179:15;17175:53;85677:28:0;;;17163:66:1;85636:4:0;;;;17245:12:1;;85677:28:0;;;;;;;;;;;;85667:39;;;;;;85652:54;;85723:50;85742:12;85756:10;;85768:4;85723:18;:50::i;:::-;85716:57;85563:218;-1:-1:-1;;;85563:218:0:o;44333:201::-;43313:13;:11;:13::i;:::-;-1:-1:-1;;;;;44422:22:0;::::1;44414:73;;;::::0;-1:-1:-1;;;44414:73:0;;17814:2:1;44414:73:0::1;::::0;::::1;17796:21:1::0;17853:2;17833:18;;;17826:30;17892:34;17872:18;;;17865:62;-1:-1:-1;;;17943:18:1;;;17936:36;17989:19;;44414:73:0::1;17612:402:1::0;44414:73:0::1;44498:28;44517:8;44498:18;:28::i;86845:109::-:0;43313:13;:11;:13::i;:::-;86921:14:::1;:25:::0;86845:109::o;62939:305::-;63041:4;-1:-1:-1;;;;;;63078:40:0;;-1:-1:-1;;;63078:40:0;;:105;;-1:-1:-1;;;;;;;63135:48:0;;-1:-1:-1;;;63135:48:0;63078:105;:158;;;;63200:36;63224:11;63200:23;:36::i;43592:132::-;43500:6;;-1:-1:-1;;;;;43500:6:0;42058:10;43656:23;43648:68;;;;-1:-1:-1;;;43648:68:0;;18221:2:1;43648:68:0;;;18203:21:1;;;18240:18;;;18233:30;18299:34;18279:18;;;18272:62;18351:18;;43648:68:0;18019:356:1;69553:174:0;69610:4;69653:7;86095:1;69634:26;;:53;;;;;69674:13;;69664:7;:23;69634:53;:85;;;;-1:-1:-1;;69692:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;69692:27:0;;;;69691:28;;69553:174::o;4482:419::-;3003:42;4673:45;:49;4669:225;;4744:67;;-1:-1:-1;;;4744:67:0;;4795:4;4744:67;;;18592:34:1;-1:-1:-1;;;;;18662:15:1;;18642:18;;;18635:43;3003:42:0;;4744;;18527:18:1;;4744:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4739:144;;4839:28;;-1:-1:-1;;;4839:28:0;;-1:-1:-1;;;;;1697:32:1;;4839:28:0;;;1679:51:1;1652:18;;4839:28:0;1533:203:1;67120:380:0;67201:13;67217:24;67233:7;67217:15;:24::i;:::-;67201:40;;67262:5;-1:-1:-1;;;;;67256:11:0;:2;-1:-1:-1;;;;;67256:11:0;;67252:48;;67276:24;;-1:-1:-1;;;67276:24:0;;;;;;;;;;;67252:48;42058:10;-1:-1:-1;;;;;67317:21:0;;;67313:139;;67344:37;67361:5;42058:10;68200:164;:::i;67344:37::-;67340:112;;67405:35;;-1:-1:-1;;;67405:35:0;;;;;;;;;;;67340:112;67464:28;67473:2;67477:7;67486:5;67464:8;:28::i;68431:170::-;68565:28;68575:4;68581:2;68585:7;68565:9;:28::i;68672:185::-;68810:39;68827:4;68833:2;68837:7;68810:39;;;;;;;;;;;;:16;:39::i;64689:1111::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;64800:7:0;;86095:1;64849:23;64845:888;;64885:13;;64878:4;:20;64874:859;;;64919:31;64953:17;;;:11;:17;;;;;;;;;64919:51;;;;;;;;;-1:-1:-1;;;;;64919:51:0;;;;-1:-1:-1;;;64919:51:0;;-1:-1:-1;;;;;64919:51:0;;;;;;;;-1:-1:-1;;;64919:51:0;;;;;;;;;;;;;;64989:729;;65039:14;;-1:-1:-1;;;;;65039:28:0;;65035:101;;65103:9;64689:1111;-1:-1:-1;;;64689:1111:0:o;65035:101::-;-1:-1:-1;;;65478:6:0;65523:17;;;;:11;:17;;;;;;;;;65511:29;;;;;;;;;-1:-1:-1;;;;;65511:29:0;;;;;-1:-1:-1;;;65511:29:0;;-1:-1:-1;;;;;65511:29:0;;;;;;;;-1:-1:-1;;;65511:29:0;;;;;;;;;;;;;65571:28;65567:109;;65639:9;64689:1111;-1:-1:-1;;;64689:1111:0:o;65567:109::-;65438:261;;;64900:833;64874:859;65761:31;;-1:-1:-1;;;65761:31:0;;;;;;;;;;;44694:191;44787:6;;;-1:-1:-1;;;;;44804:17:0;;;-1:-1:-1;;;;;;44804:17:0;;;;;;;44837:40;;44787:6;;;44804:17;44787:6;;44837:40;;44768:16;;44837:40;44757:128;44694:191;:::o;69811:104::-;69880:27;69890:2;69894:8;69880:27;;;;;;;;;;;;:9;:27::i;67842:287::-;42058:10;-1:-1:-1;;;;;67941:24:0;;;67937:54;;67974:17;;-1:-1:-1;;;67974:17:0;;;;;;;;;;;67937:54;42058:10;68004:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;68004:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;68004:53:0;;;;;;;;;;68073:48;;540:41:1;;;68004:42:0;;42058:10;68073:48;;513:18:1;68073:48:0;;;;;;;67842:287;;:::o;68928:370::-;69095:28;69105:4;69111:2;69115:7;69095:9;:28::i;:::-;-1:-1:-1;;;;;69138:13:0;;6917:19;:23;69134:157;;69159:56;69190:4;69196:2;69200:7;69209:5;69159:30;:56::i;:::-;69155:136;;69239:40;;-1:-1:-1;;;69239:40:0;;;;;;;;;;;85881:114;85941:13;85974;85967:20;;;;;:::i;58197:716::-;58253:13;58304:14;58321:17;58332:5;58321:10;:17::i;:::-;58341:1;58321:21;58304:38;;58357:20;58391:6;-1:-1:-1;;;;;58380:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58380:18:0;-1:-1:-1;58357:41:0;-1:-1:-1;58522:28:0;;;58538:2;58522:28;58579:288;-1:-1:-1;;58611:5:0;-1:-1:-1;;;58748:2:0;58737:14;;58732:30;58611:5;58719:44;58809:2;58800:11;;;-1:-1:-1;58830:21:0;58579:288;58830:21;-1:-1:-1;58888:6:0;58197:716;-1:-1:-1;;;58197:716:0:o;17093:190::-;17218:4;17271;17242:25;17255:5;17262:4;17242:12;:25::i;:::-;:33;;17093:190;-1:-1:-1;;;;17093:190:0:o;38532:215::-;38634:4;-1:-1:-1;;;;;;38658:41:0;;-1:-1:-1;;;38658:41:0;;:81;;-1:-1:-1;;;;;;;;;;36193:40:0;;;38703:36;36084:157;78775:196;78890:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;78890:29:0;-1:-1:-1;;;;;78890:29:0;;;;;;;;;78935:28;;78890:24;;78935:28;;;;;;;78775:196;;;:::o;73723:2130::-;73838:35;73876:21;73889:7;73876:12;:21::i;:::-;73838:59;;73936:4;-1:-1:-1;;;;;73914:26:0;:13;:18;;;-1:-1:-1;;;;;73914:26:0;;73910:67;;73949:28;;-1:-1:-1;;;73949:28:0;;;;;;;;;;;73910:67;73990:22;42058:10;-1:-1:-1;;;;;74016:20:0;;;;:73;;-1:-1:-1;74053:36:0;74070:4;42058:10;68200:164;:::i;74053:36::-;74016:126;;;-1:-1:-1;42058:10:0;74106:20;74118:7;74106:11;:20::i;:::-;-1:-1:-1;;;;;74106:36:0;;74016:126;73990:153;;74161:17;74156:66;;74187:35;;-1:-1:-1;;;74187:35:0;;;;;;;;;;;74156:66;-1:-1:-1;;;;;74237:16:0;;74233:52;;74262:23;;-1:-1:-1;;;74262:23:0;;;;;;;;;;;74233:52;74406:35;74423:1;74427:7;74436:4;74406:8;:35::i;:::-;-1:-1:-1;;;;;74737:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;74737:31:0;;;-1:-1:-1;;;;;74737:31:0;;;-1:-1:-1;;74737:31:0;;;;;;;74783:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;74783:29:0;;;;;;;;;;;74863:20;;;:11;:20;;;;;;74898:18;;-1:-1:-1;;;;;;74931:49:0;;;;-1:-1:-1;;;74964:15:0;74931:49;;;;;;;;;;75254:11;;75314:24;;;;;75357:13;;74863:20;;75314:24;;75357:13;75353:384;;75567:13;;75552:11;:28;75548:174;;75605:20;;75674:28;;;;-1:-1:-1;;;;;75648:54:0;-1:-1:-1;;;75648:54:0;-1:-1:-1;;;;;;75648:54:0;;;-1:-1:-1;;;;;75605:20:0;;75648:54;;;;75548:174;74712:1036;;;75784:7;75780:2;-1:-1:-1;;;;;75765:27:0;75774:4;-1:-1:-1;;;;;75765:27:0;;;;;;;;;;;75803:42;83248:163;70288:1749;70434:13;;-1:-1:-1;;;;;70462:16:0;;70458:48;;70487:19;;-1:-1:-1;;;70487:19:0;;;;;;;;;;;70458:48;70521:8;70533:1;70521:13;70517:44;;70543:18;;-1:-1:-1;;;70543:18:0;;;;;;;;;;;70517:44;-1:-1:-1;;;;;70912:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;70971:49:0;;-1:-1:-1;;;;;70912:44:0;;;;;;;70971:49;;;;-1:-1:-1;;70912:44:0;;;;;;70971:49;;;;;;;;;;;;;;;;71037:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;71087:66:0;;;-1:-1:-1;;;71137:15:0;71087:66;;;;;;;;;;;;;71037:25;;71234:23;;;;6917:19;:23;71274:631;;71314:313;71345:38;;71370:12;;-1:-1:-1;;;;;71345:38:0;;;71362:1;;71345:38;;71362:1;;71345:38;71411:69;71450:1;71454:2;71458:14;;;;;;71474:5;71411:30;:69::i;:::-;71406:174;;71516:40;;-1:-1:-1;;;71516:40:0;;;;;;;;;;;71406:174;71622:3;71607:12;:18;71314:313;;71708:12;71691:13;;:29;71687:43;;71722:8;;;71687:43;71274:631;;;71771:119;71802:40;;71827:14;;;;;-1:-1:-1;;;;;71802:40:0;;;71819:1;;71802:40;;71819:1;;71802:40;71885:3;71870:12;:18;71771:119;;71274:631;-1:-1:-1;71919:13:0;:28;71969:60;71998:1;72002:2;72006:12;72020:8;71969:60;:::i;79463:667::-;79647:72;;-1:-1:-1;;;79647:72:0;;79626:4;;-1:-1:-1;;;;;79647:36:0;;;;;:72;;42058:10;;79698:4;;79704:7;;79713:5;;79647:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79647:72:0;;;;;;;;-1:-1:-1;;79647:72:0;;;;;;;;;;;;:::i;:::-;;;79643:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79881:6;:13;79898:1;79881:18;79877:235;;79927:40;;-1:-1:-1;;;79927:40:0;;;;;;;;;;;79877:235;80070:6;80064:13;80055:6;80051:2;80047:15;80040:38;79643:480;-1:-1:-1;;;;;;79766:55:0;-1:-1:-1;;;79766:55:0;;-1:-1:-1;79643:480:0;79463:667;;;;;;:::o;55063:922::-;55116:7;;-1:-1:-1;;;55194:15:0;;55190:102;;-1:-1:-1;;;55230:15:0;;;-1:-1:-1;55274:2:0;55264:12;55190:102;55319:6;55310:5;:15;55306:102;;55355:6;55346:15;;;-1:-1:-1;55390:2:0;55380:12;55306:102;55435:6;55426:5;:15;55422:102;;55471:6;55462:15;;;-1:-1:-1;55506:2:0;55496:12;55422:102;55551:5;55542;:14;55538:99;;55586:5;55577:14;;;-1:-1:-1;55620:1:0;55610:11;55538:99;55664:5;55655;:14;55651:99;;55699:5;55690:14;;;-1:-1:-1;55733:1:0;55723:11;55651:99;55777:5;55768;:14;55764:99;;55812:5;55803:14;;;-1:-1:-1;55846:1:0;55836:11;55764:99;55890:5;55881;:14;55877:66;;55926:1;55916:11;55971:6;55063:922;-1:-1:-1;;55063:922:0:o;17960:296::-;18043:7;18086:4;18043:7;18101:118;18125:5;:12;18121:1;:16;18101:118;;;18174:33;18184:12;18198:5;18204:1;18198:8;;;;;;;;:::i;:::-;;;;;;;18174:9;:33::i;:::-;18159:48;-1:-1:-1;18139:3:0;;;;:::i;:::-;;;;18101:118;;;-1:-1:-1;18236:12:0;17960:296;-1:-1:-1;;;17960:296:0:o;25000:149::-;25063:7;25094:1;25090;:5;:51;;25225:13;25319:15;;;25355:4;25348:15;;;25402:4;25386:21;;25090:51;;;-1:-1:-1;25225:13:0;25319:15;;;25355:4;25348:15;25402:4;25386:21;;;25000:149::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:131::-;-1:-1:-1;;;;;1816:31:1;;1806:42;;1796:70;;1862:1;1859;1852:12;1877:315;1945:6;1953;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;2061:9;2048:23;2080:31;2105:5;2080:31;:::i;:::-;2130:5;2182:2;2167:18;;;;2154:32;;-1:-1:-1;;;1877:315:1:o;2379:456::-;2456:6;2464;2472;2525:2;2513:9;2504:7;2500:23;2496:32;2493:52;;;2541:1;2538;2531:12;2493:52;2580:9;2567:23;2599:31;2624:5;2599:31;:::i;:::-;2649:5;-1:-1:-1;2706:2:1;2691:18;;2678:32;2719:33;2678:32;2719:33;:::i;:::-;2379:456;;2771:7;;-1:-1:-1;;;2825:2:1;2810:18;;;;2797:32;;2379:456::o;2840:248::-;2908:6;2916;2969:2;2957:9;2948:7;2944:23;2940:32;2937:52;;;2985:1;2982;2975:12;2937:52;-1:-1:-1;;3008:23:1;;;3078:2;3063:18;;;3050:32;;-1:-1:-1;2840:248:1:o;3793:127::-;3854:10;3849:3;3845:20;3842:1;3835:31;3885:4;3882:1;3875:15;3909:4;3906:1;3899:15;3925:275;3996:2;3990:9;4061:2;4042:13;;-1:-1:-1;;4038:27:1;4026:40;;-1:-1:-1;;;;;4081:34:1;;4117:22;;;4078:62;4075:88;;;4143:18;;:::i;:::-;4179:2;4172:22;3925:275;;-1:-1:-1;3925:275:1:o;4205:407::-;4270:5;-1:-1:-1;;;;;4296:6:1;4293:30;4290:56;;;4326:18;;:::i;:::-;4364:57;4409:2;4388:15;;-1:-1:-1;;4384:29:1;4415:4;4380:40;4364:57;:::i;:::-;4355:66;;4444:6;4437:5;4430:21;4484:3;4475:6;4470:3;4466:16;4463:25;4460:45;;;4501:1;4498;4491:12;4460:45;4550:6;4545:3;4538:4;4531:5;4527:16;4514:43;4604:1;4597:4;4588:6;4581:5;4577:18;4573:29;4566:40;4205:407;;;;;:::o;4617:451::-;4686:6;4739:2;4727:9;4718:7;4714:23;4710:32;4707:52;;;4755:1;4752;4745:12;4707:52;4795:9;4782:23;-1:-1:-1;;;;;4820:6:1;4817:30;4814:50;;;4860:1;4857;4850:12;4814:50;4883:22;;4936:4;4928:13;;4924:27;-1:-1:-1;4914:55:1;;4965:1;4962;4955:12;4914:55;4988:74;5054:7;5049:2;5036:16;5031:2;5027;5023:11;4988:74;:::i;5073:247::-;5132:6;5185:2;5173:9;5164:7;5160:23;5156:32;5153:52;;;5201:1;5198;5191:12;5153:52;5240:9;5227:23;5259:31;5284:5;5259:31;:::i;5510:118::-;5596:5;5589:13;5582:21;5575:5;5572:32;5562:60;;5618:1;5615;5608:12;5633:382;5698:6;5706;5759:2;5747:9;5738:7;5734:23;5730:32;5727:52;;;5775:1;5772;5765:12;5727:52;5814:9;5801:23;5833:31;5858:5;5833:31;:::i;:::-;5883:5;-1:-1:-1;5940:2:1;5925:18;;5912:32;5953:30;5912:32;5953:30;:::i;:::-;6002:7;5992:17;;;5633:382;;;;;:::o;6020:795::-;6115:6;6123;6131;6139;6192:3;6180:9;6171:7;6167:23;6163:33;6160:53;;;6209:1;6206;6199:12;6160:53;6248:9;6235:23;6267:31;6292:5;6267:31;:::i;:::-;6317:5;-1:-1:-1;6374:2:1;6359:18;;6346:32;6387:33;6346:32;6387:33;:::i;:::-;6439:7;-1:-1:-1;6493:2:1;6478:18;;6465:32;;-1:-1:-1;6548:2:1;6533:18;;6520:32;-1:-1:-1;;;;;6564:30:1;;6561:50;;;6607:1;6604;6597:12;6561:50;6630:22;;6683:4;6675:13;;6671:27;-1:-1:-1;6661:55:1;;6712:1;6709;6702:12;6661:55;6735:74;6801:7;6796:2;6783:16;6778:2;6774;6770:11;6735:74;:::i;:::-;6725:84;;;6020:795;;;;;;;:::o;7080:712::-;7134:5;7187:3;7180:4;7172:6;7168:17;7164:27;7154:55;;7205:1;7202;7195:12;7154:55;7241:6;7228:20;7267:4;-1:-1:-1;;;;;7286:2:1;7283:26;7280:52;;;7312:18;;:::i;:::-;7358:2;7355:1;7351:10;7381:28;7405:2;7401;7397:11;7381:28;:::i;:::-;7443:15;;;7513;;;7509:24;;;7474:12;;;;7545:15;;;7542:35;;;7573:1;7570;7563:12;7542:35;7609:2;7601:6;7597:15;7586:26;;7621:142;7637:6;7632:3;7629:15;7621:142;;;7703:17;;7691:30;;7654:12;;;;7741;;;;7621:142;;;7781:5;7080:712;-1:-1:-1;;;;;;;7080:712:1:o;7797:416::-;7890:6;7898;7951:2;7939:9;7930:7;7926:23;7922:32;7919:52;;;7967:1;7964;7957:12;7919:52;8003:9;7990:23;7980:33;;8064:2;8053:9;8049:18;8036:32;-1:-1:-1;;;;;8083:6:1;8080:30;8077:50;;;8123:1;8120;8113:12;8077:50;8146:61;8199:7;8190:6;8179:9;8175:22;8146:61;:::i;:::-;8136:71;;;7797:416;;;;;:::o;8218:388::-;8286:6;8294;8347:2;8335:9;8326:7;8322:23;8318:32;8315:52;;;8363:1;8360;8353:12;8315:52;8402:9;8389:23;8421:31;8446:5;8421:31;:::i;:::-;8471:5;-1:-1:-1;8528:2:1;8513:18;;8500:32;8541:33;8500:32;8541:33;:::i;8611:348::-;8695:6;8748:2;8736:9;8727:7;8723:23;8719:32;8716:52;;;8764:1;8761;8754:12;8716:52;8804:9;8791:23;-1:-1:-1;;;;;8829:6:1;8826:30;8823:50;;;8869:1;8866;8859:12;8823:50;8892:61;8945:7;8936:6;8925:9;8921:22;8892:61;:::i;8964:380::-;9043:1;9039:12;;;;9086;;;9107:61;;9161:4;9153:6;9149:17;9139:27;;9107:61;9214:2;9206:6;9203:14;9183:18;9180:38;9177:161;;9260:10;9255:3;9251:20;9248:1;9241:31;9295:4;9292:1;9285:15;9323:4;9320:1;9313:15;9177:161;;8964:380;;;:::o;9349:127::-;9410:10;9405:3;9401:20;9398:1;9391:31;9441:4;9438:1;9431:15;9465:4;9462:1;9455:15;9481:168;9554:9;;;9585;;9602:15;;;9596:22;;9582:37;9572:71;;9623:18;;:::i;9786:217::-;9826:1;9852;9842:132;;9896:10;9891:3;9887:20;9884:1;9877:31;9931:4;9928:1;9921:15;9959:4;9956:1;9949:15;9842:132;-1:-1:-1;9988:9:1;;9786:217::o;10134:545::-;10236:2;10231:3;10228:11;10225:448;;;10272:1;10297:5;10293:2;10286:17;10342:4;10338:2;10328:19;10412:2;10400:10;10396:19;10393:1;10389:27;10383:4;10379:38;10448:4;10436:10;10433:20;10430:47;;;-1:-1:-1;10471:4:1;10430:47;10526:2;10521:3;10517:12;10514:1;10510:20;10504:4;10500:31;10490:41;;10581:82;10599:2;10592:5;10589:13;10581:82;;;10644:17;;;10625:1;10614:13;10581:82;;;10585:3;;;10134:545;;;:::o;10855:1352::-;10981:3;10975:10;-1:-1:-1;;;;;11000:6:1;10997:30;10994:56;;;11030:18;;:::i;:::-;11059:97;11149:6;11109:38;11141:4;11135:11;11109:38;:::i;:::-;11103:4;11059:97;:::i;:::-;11211:4;;11275:2;11264:14;;11292:1;11287:663;;;;11994:1;12011:6;12008:89;;;-1:-1:-1;12063:19:1;;;12057:26;12008:89;-1:-1:-1;;10812:1:1;10808:11;;;10804:24;10800:29;10790:40;10836:1;10832:11;;;10787:57;12110:81;;11257:944;;11287:663;10081:1;10074:14;;;10118:4;10105:18;;-1:-1:-1;;11323:20:1;;;11441:236;11455:7;11452:1;11449:14;11441:236;;;11544:19;;;11538:26;11523:42;;11636:27;;;;11604:1;11592:14;;;;11471:19;;11441:236;;;11445:3;11705:6;11696:7;11693:19;11690:201;;;11766:19;;;11760:26;-1:-1:-1;;11849:1:1;11845:14;;;11861:3;11841:24;11837:37;11833:42;11818:58;11803:74;;11690:201;-1:-1:-1;;;;;11937:1:1;11921:14;;;11917:22;11904:36;;-1:-1:-1;10855:1352:1:o;12564:416::-;12766:2;12748:21;;;12805:2;12785:18;;;12778:30;12844:34;12839:2;12824:18;;12817:62;-1:-1:-1;;;12910:2:1;12895:18;;12888:50;12970:3;12955:19;;12564:416::o;13340:128::-;13407:9;;;13428:11;;;13425:37;;;13442:18;;:::i;13473:125::-;13538:9;;;13559:10;;;13556:36;;;13572:18;;:::i;15072:1256::-;15296:3;15334:6;15328:13;15360:4;15373:64;15430:6;15425:3;15420:2;15412:6;15408:15;15373:64;:::i;:::-;15500:13;;15459:16;;;;15522:68;15500:13;15459:16;15557:15;;;15522:68;:::i;:::-;15679:13;;15612:20;;;15652:1;;15717:36;15679:13;15717:36;:::i;:::-;15772:1;15789:18;;;15816:141;;;;15971:1;15966:337;;;;15782:521;;15816:141;-1:-1:-1;;15851:24:1;;15837:39;;15928:16;;15921:24;15907:39;;15896:51;;;-1:-1:-1;15816:141:1;;15966:337;15997:6;15994:1;15987:17;16045:2;16042:1;16032:16;16070:1;16084:169;16098:8;16095:1;16092:15;16084:169;;;16180:14;;16165:13;;;16158:37;16223:16;;;;16115:10;;16084:169;;;16088:3;;16284:8;16277:5;16273:20;16266:27;;15782:521;-1:-1:-1;16319:3:1;;15072:1256;-1:-1:-1;;;;;;;;;;15072:1256:1:o;18689:245::-;18756:6;18809:2;18797:9;18788:7;18784:23;18780:32;18777:52;;;18825:1;18822;18815:12;18777:52;18857:9;18851:16;18876:28;18898:5;18876:28;:::i;18939:489::-;-1:-1:-1;;;;;19208:15:1;;;19190:34;;19260:15;;19255:2;19240:18;;19233:43;19307:2;19292:18;;19285:34;;;19355:3;19350:2;19335:18;;19328:31;;;19133:4;;19376:46;;19402:19;;19394:6;19376:46;:::i;:::-;19368:54;18939:489;-1:-1:-1;;;;;;18939:489:1:o;19433:249::-;19502:6;19555:2;19543:9;19534:7;19530:23;19526:32;19523:52;;;19571:1;19568;19561:12;19523:52;19603:9;19597:16;19622:30;19646:5;19622:30;:::i;19687:127::-;19748:10;19743:3;19739:20;19736:1;19729:31;19779:4;19776:1;19769:15;19803:4;19800:1;19793:15;19819:135;19858:3;19879:17;;;19876:43;;19899:18;;:::i;:::-;-1:-1:-1;19946:1:1;19935:13;;19819:135::o
Swarm Source
ipfs://ee151cd1efb952af6e16650b9825b94f70318a367515532c75d9c6237d89568b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.