ERC-721
Overview
Max Total Supply
892 ANARC
Holders
489
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 ANARCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Anarchist
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-28 */ // SPDX-License-Identifier: GPL-3.0 // 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/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: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * 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(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @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`, * 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 be 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, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * 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 payable; /** * @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 payable; /** * @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); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _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 {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary 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 virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ 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, _toString(tokenId))) : ''; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // 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 { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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 {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @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 for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, 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. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @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 { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // 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 { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * 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 _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: anarchist.sol pragma solidity ^0.8.4 .0; // ▄▄▄ ███▄ █ ▄▄▄ ██▀███ ▄████▄ ██░ ██ ██▓ ██████ ▄▄▄█████▓ // ▒████▄ ██ ▀█ █ ▒████▄ ▓██ ▒ ██▒▒██▀ ▀█ ▓██░ ██▒▓██▒▒██ ▒ ▓ ██▒ ▓▒ // ▒██ ▀█▄ ▓██ ▀█ ██▒▒██ ▀█▄ ▓██ ░▄█ ▒▒▓█ ▄ ▒██▀▀██░▒██▒░ ▓██▄ ▒ ▓██░ ▒░ // ░██▄▄▄▄██ ▓██▒ ▐▌██▒░██▄▄▄▄██ ▒██▀▀█▄ ▒▓▓▄ ▄██▒░▓█ ░██ ░██░ ▒ ██▒░ ▓██▓ ░ // ▓█ ▓██▒▒██░ ▓██░ ▓█ ▓██▒░██▓ ▒██▒▒ ▓███▀ ░░▓█▒░██▓░██░▒██████▒▒ ▒██▒ ░ // ▒▒ ▓▒█░░ ▒░ ▒ ▒ ▒▒ ▓▒█░░ ▒▓ ░▒▓░░ ░▒ ▒ ░ ▒ ░░▒░▒░▓ ▒ ▒▓▒ ▒ ░ ▒ ░░ // ▒ ▒▒ ░░ ░░ ░ ▒░ ▒ ▒▒ ░ ░▒ ░ ▒░ ░ ▒ ▒ ░▒░ ░ ▒ ░░ ░▒ ░ ░ ░ // ░ ▒ ░ ░ ░ ░ ▒ ░░ ░ ░ ░ ░░ ░ ▒ ░░ ░ ░ ░ // ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ // ░ /// @title ERC721A contract for the Anarchist NFT collection /// @author Syahmi Rafsan contract Anarchist is ERC721A, ERC721AQueryable, Ownable { uint256 public constant MAX_SUPPLY = 3333; uint256 public price = 0.0069 ether; string private _startTokenURI; string private _endTokenURI; bool public mintPaused = false; bool public whitelistMinting = true; bytes32 public merkleRoot; uint public maxFreeMint; mapping(address => uint) public userHasMinted; constructor( string memory startTokenURI, string memory endTokenURI, bytes32 _merkleRoot, uint _maxFreeMint ) ERC721A("Anarchist", "ANARC") { _startTokenURI = startTokenURI; _endTokenURI = endTokenURI; merkleRoot = _merkleRoot; maxFreeMint = _maxFreeMint; } /// @notice The NFT minting function for public /// @param quantity The number of NFT to be minted function mintPublic(uint256 quantity) external payable { require(msg.sender == tx.origin, "Minter is a contract"); require(!mintPaused, "Mint is paused"); require(!whitelistMinting, "Mint is only for whitelist"); require( _totalMinted() + quantity <= MAX_SUPPLY, "Maximum supply exceeded" ); uint cost; uint free; int balance = int(maxFreeMint) - int(userHasMinted[msg.sender]); if (balance < 0) { free = 0; } else { int freeCalc = int(maxFreeMint) - int(userHasMinted[msg.sender]); free = uint(freeCalc); } if (quantity >= free) { cost = (price) * (quantity - free); userHasMinted[msg.sender] = userHasMinted[msg.sender] + free; } else { cost = 0; userHasMinted[msg.sender] = userHasMinted[msg.sender] + quantity; } require(msg.value >= cost, "Must send enough eth"); if (msg.value > cost) { payable(msg.sender).transfer(msg.value - cost); } _mint(msg.sender, quantity); } /// @notice The NFT minting function for whitelisted addresses /// @param quantity The number of NFT to be minted /// @param proof The Merkle proof to validate with the Merkle root function mintWhitelist( uint quantity, bytes32[] memory proof ) external payable { require( isValid(proof, keccak256(abi.encodePacked(msg.sender))), "Sorry but you are not eligible to mint" ); require(msg.sender == tx.origin, "Minter is a contract"); require(!mintPaused, "Mint is paused"); require(whitelistMinting, "Mint is open to public"); require( _totalMinted() + quantity <= MAX_SUPPLY, "Maximum supply exceeded" ); uint cost; uint free; int balance = int(maxFreeMint) - int(userHasMinted[msg.sender]); if (balance < 0) { free = 0; } else { int freeCalc = int(maxFreeMint) - int(userHasMinted[msg.sender]); free = uint(freeCalc); } if (quantity >= free) { cost = (price) * (quantity - free); userHasMinted[msg.sender] = userHasMinted[msg.sender] + free; } else { cost = 0; userHasMinted[msg.sender] = userHasMinted[msg.sender] + quantity; } require(msg.value >= cost, "Must send enough eth"); if (msg.value > cost) { payable(msg.sender).transfer(msg.value - cost); } _mint(msg.sender, quantity); } /// @notice The NFT minting function for owner. Callable only by the contract owner. /// @param receiver The address receiving the minted NFT /// @param quantity The number of NFT to be minted function mintOwner( address receiver, uint256 quantity ) external onlyOwner { require( _totalMinted() + quantity <= MAX_SUPPLY, "Maximum supply exceeded" ); _mint(receiver, quantity); } /// @notice The function to change mint configuration. Callable only by the contract owner. /// @param _merkleRoot The Merkle root of the whitelisted addresses /// @param _maxFreeMint The maximum number of free mints per wallet function setMintConfig( bytes32 _merkleRoot, uint _maxFreeMint ) external onlyOwner { merkleRoot = _merkleRoot; maxFreeMint = _maxFreeMint; } /// @notice The function to validate the Merkle proof with the Merkle root via leaf /// @param proof The Merkle proof to be validated /// @param leaf The mint price in wei function isValid( bytes32[] memory proof, bytes32 leaf ) public view returns (bool) { return MerkleProof.verify(proof, merkleRoot, leaf); } /// @notice The function to check the free mint balance of the sender /// @param sender The address of sender function freeMintBalance(address sender) public view returns (int) { int balance = int(maxFreeMint) - int(userHasMinted[sender]); if (balance < 0) { return 0; } else { int free = int(maxFreeMint) - int(userHasMinted[sender]); return free; } } /// @notice The function to check the cost of minting by sender /// @param quantity The mint quantity /// @param sender The address of sender function senderCost( uint256 quantity, address sender ) public view returns (uint256) { uint256 cost; uint free; int balance = int(maxFreeMint) - int(userHasMinted[sender]); if (balance < 0) { free = 0; } else { int freeCalc = int(maxFreeMint) - int(userHasMinted[sender]); free = uint(freeCalc); } if (quantity >= free) { cost = (price) * (quantity - free); } else { cost = 0; } return cost; } /// @notice The function to withdraw the contract balance to the contract owner. Callable only by the contract owner. function withdraw() external onlyOwner { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed"); } /// @notice The function to pause the mint. Callable only by the contract owner. function pauseMint(bool _paused) external onlyOwner { mintPaused = _paused; } /// @notice The function to change the mint price. Callable only by the contract owner. /// @param _price The mint price in wei function setPrice(uint256 _price) external onlyOwner { price = _price; } /// @notice The function to change the max free mint per wallet. Callable only by the contract owner. /// @param _maxFreeMint The maximum number of free mints per wallet function setMaxFreeMint(uint _maxFreeMint) external onlyOwner { maxFreeMint = _maxFreeMint; } /// @notice The function to set the whitelist minting variable. Callable only by the contract owner. function setWhitelistMinting(bool _state) external onlyOwner { whitelistMinting = _state; } /// @notice The function to change the prefix and suffix of the tokenURI. Callable only by the contract owner. function setURI( string calldata startTokenURI, string calldata endTokenURI ) external onlyOwner { _startTokenURI = startTokenURI; _endTokenURI = endTokenURI; } /// @notice Overiddes the ERC721A function to show the tokenURI. function tokenURI( uint256 tokenId ) public view virtual override(ERC721A, IERC721A) returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); return bytes(_startTokenURI).length != 0 ? string( abi.encodePacked( _startTokenURI, _toString(tokenId), _endTokenURI ) ) : ""; } /// @notice Overiddes the ERC721A function to start tokenId at 1. function _startTokenId() internal view virtual override returns (uint256) { return 1; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"startTokenURI","type":"string"},{"internalType":"string","name":"endTokenURI","type":"string"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"_maxFreeMint","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"freeMintBalance","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","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":"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":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintWhitelist","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":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"pauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"sender","type":"address"}],"name":"senderCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFreeMint","type":"uint256"}],"name":"setMaxFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"_maxFreeMint","type":"uint256"}],"name":"setMintConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"startTokenURI","type":"string"},{"internalType":"string","name":"endTokenURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMinting","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userHasMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526618838370f34000600955600c805461ffff19166101001790553480156200002b57600080fd5b5060405162002b5d38038062002b5d8339810160408190526200004e9162000208565b60405180604001604052806009815260200168105b985c98da1a5cdd60ba1b81525060405180604001604052806005815260200164414e41524360d81b81525081600290816200009f919062000311565b506003620000ae828262000311565b5050600160005550620000c133620000f1565b600a620000cf858262000311565b50600b620000de848262000311565b50600d91909155600e5550620003dd9050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200016b57600080fd5b81516001600160401b038082111562000188576200018862000143565b604051601f8301601f19908116603f01168101908282118183101715620001b357620001b362000143565b81604052838152602092508683858801011115620001d057600080fd5b600091505b83821015620001f45785820183015181830184015290820190620001d5565b600093810190920192909252949350505050565b600080600080608085870312156200021f57600080fd5b84516001600160401b03808211156200023757600080fd5b620002458883890162000159565b955060208701519150808211156200025c57600080fd5b506200026b8782880162000159565b604087015160609097015195989097509350505050565b600181811c908216806200029757607f821691505b602082108103620002b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200030c57600081815260208120601f850160051c81016020861015620002e75750805b601f850160051c820191505b818110156200030857828155600101620002f3565b5050505b505050565b81516001600160401b038111156200032d576200032d62000143565b62000345816200033e845462000282565b84620002be565b602080601f8311600181146200037d5760008415620003645750858301515b600019600386901b1c1916600185901b17855562000308565b600085815260208120601f198616915b82811015620003ae578886015182559484019460019091019084016200038d565b5085821015620003cd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61277080620003ed6000396000f3fe6080604052600436106102465760003560e01c80638462151c11610139578063b8af7ac3116100b6578063d1d18f501161007a578063d1d18f5014610684578063e985e9c5146106a4578063eba2c6c4146106ed578063efd0cbf91461070d578063f2fde38b14610720578063f30e6e771461074057600080fd5b8063b8af7ac3146105d7578063bf2db4c8146105f7578063c23dc68f14610617578063c40542ec14610644578063c87b56dd1461066457600080fd5b8063a035b1fe116100fd578063a035b1fe14610558578063a22cb4651461056e578063a591252d1461058e578063b88d4fde146105a4578063b8a20ed0146105b757600080fd5b80638462151c146104b85780638da5cb5b146104e557806391b7f5ed1461050357806395d89b411461052357806399a2557a1461053857600080fd5b80633ccfd60b116101c75780636992d2291161018b5780636992d2291461042a57806370a0823114610449578063715018a614610469578063742a4c9b1461047e5780637e4831d31461049e57600080fd5b80633ccfd60b14610395578063408cbf94146103aa57806342842e0e146103ca5780635bbb2177146103dd5780636352211e1461040a57600080fd5b806318160ddd1161020e57806318160ddd146103025780631d9857781461032957806323b872dd146103565780632eb4a7ab1461036957806332cb6b0c1461037f57600080fd5b806301ffc9a71461024b578063061431a81461028057806306fdde0314610295578063081812fc146102b7578063095ea7b3146102ef575b600080fd5b34801561025757600080fd5b5061026b610266366004611dfd565b610760565b60405190151581526020015b60405180910390f35b61029361028e366004611edf565b6107b2565b005b3480156102a157600080fd5b506102aa610ad2565b6040516102779190611f75565b3480156102c357600080fd5b506102d76102d2366004611f88565b610b64565b6040516001600160a01b039091168152602001610277565b6102936102fd366004611fbd565b610ba8565b34801561030e57600080fd5b5060015460005403600019015b604051908152602001610277565b34801561033557600080fd5b5061031b610344366004611fe7565b600f6020526000908152604090205481565b610293610364366004612002565b610c48565b34801561037557600080fd5b5061031b600d5481565b34801561038b57600080fd5b5061031b610d0581565b3480156103a157600080fd5b50610293610de1565b3480156103b657600080fd5b506102936103c5366004611fbd565b610e76565b6102936103d8366004612002565b610ec5565b3480156103e957600080fd5b506103fd6103f836600461203e565b610ee5565b60405161027791906120ee565b34801561041657600080fd5b506102d7610425366004611f88565b610fb0565b34801561043657600080fd5b50600c5461026b90610100900460ff1681565b34801561045557600080fd5b5061031b610464366004611fe7565b610fbb565b34801561047557600080fd5b50610293611009565b34801561048a57600080fd5b50610293610499366004611f88565b61101d565b3480156104aa57600080fd5b50600c5461026b9060ff1681565b3480156104c457600080fd5b506104d86104d3366004611fe7565b61102a565b6040516102779190612130565b3480156104f157600080fd5b506008546001600160a01b03166102d7565b34801561050f57600080fd5b5061029361051e366004611f88565b611132565b34801561052f57600080fd5b506102aa61113f565b34801561054457600080fd5b506104d8610553366004612168565b61114e565b34801561056457600080fd5b5061031b60095481565b34801561057a57600080fd5b506102936105893660046121ab565b6112d5565b34801561059a57600080fd5b5061031b600e5481565b6102936105b23660046121de565b611341565b3480156105c357600080fd5b5061026b6105d236600461229d565b61138b565b3480156105e357600080fd5b5061031b6105f23660046122e1565b61139a565b34801561060357600080fd5b5061029361061236600461234c565b611437565b34801561062357600080fd5b50610637610632366004611f88565b61145a565b60405161027791906123b7565b34801561065057600080fd5b5061029361065f3660046123c5565b6114e2565b34801561067057600080fd5b506102aa61067f366004611f88565b611504565b34801561069057600080fd5b5061031b61069f366004611fe7565b61158b565b3480156106b057600080fd5b5061026b6106bf3660046123e0565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156106f957600080fd5b5061029361070836600461240a565b6115fa565b61029361071b366004611f88565b61160d565b34801561072c57600080fd5b5061029361073b366004611fe7565b61188f565b34801561074c57600080fd5b5061029361075b3660046123c5565b611905565b60006301ffc9a760e01b6001600160e01b03198316148061079157506380ac58cd60e01b6001600160e01b03198316145b806107ac5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6040516bffffffffffffffffffffffff193360601b1660208201526107f19082906034016040516020818303038152906040528051906020012061138b565b6108515760405162461bcd60e51b815260206004820152602660248201527f536f7272792062757420796f7520617265206e6f7420656c696769626c6520746044820152651bc81b5a5b9d60d21b60648201526084015b60405180910390fd5b3332146108975760405162461bcd60e51b8152602060048201526014602482015273135a5b9d195c881a5cc8184818dbdb9d1c9858dd60621b6044820152606401610848565b600c5460ff16156108db5760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d081a5cc81c185d5cd95960921b6044820152606401610848565b600c54610100900460ff1661092b5760405162461bcd60e51b81526020600482015260166024820152754d696e74206973206f70656e20746f207075626c696360501b6044820152606401610848565b610d058261093c6000546000190190565b6109469190612442565b11156109645760405162461bcd60e51b815260040161084890612455565b336000908152600f6020526040812054600e5482918291610985919061248c565b9050600081121561099957600091506109ba565b336000908152600f6020526040812054600e546109b6919061248c565b9250505b818510610a0b576109cb82866124b3565b6009546109d891906124c6565b336000908152600f60205260409020549093506109f6908390612442565b336000908152600f6020526040902055610a3a565b336000908152600f6020526040812054909350610a29908690612442565b336000908152600f60205260409020555b82341015610a815760405162461bcd60e51b815260206004820152601460248201527309aeae6e840e6cadcc840cadcdeeaced040cae8d60631b6044820152606401610848565b82341115610ac157336108fc610a9785346124b3565b6040518115909202916000818181858888f19350505050158015610abf573d6000803e3d6000fd5b505b610acb3386611920565b5050505050565b606060028054610ae1906124dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0d906124dd565b8015610b5a5780601f10610b2f57610100808354040283529160200191610b5a565b820191906000526020600020905b815481529060010190602001808311610b3d57829003601f168201915b5050505050905090565b6000610b6f82611a1e565b610b8c576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610bb382610fb0565b9050336001600160a01b03821614610bec57610bcf81336106bf565b610bec576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000610c5382611a53565b9050836001600160a01b0316816001600160a01b031614610c865760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610cd357610cb686336106bf565b610cd357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610cfa57604051633a954ecd60e21b815260040160405180910390fd5b8015610d0557600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610d9757600184016000818152600460205260408120549003610d95576000548114610d955760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610de9611ac2565b604051600090339047908381818185875af1925050503d8060008114610e2b576040519150601f19603f3d011682016040523d82523d6000602084013e610e30565b606091505b5050905080610e735760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610848565b50565b610e7e611ac2565b610d0581610e8f6000546000190190565b610e999190612442565b1115610eb75760405162461bcd60e51b815260040161084890612455565b610ec18282611920565b5050565b610ee083838360405180602001604052806000815250611341565b505050565b6060816000816001600160401b03811115610f0257610f02611e1a565b604051908082528060200260200182016040528015610f5457816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610f205790505b50905060005b828114610fa757610f82868683818110610f7657610f76612511565b9050602002013561145a565b828281518110610f9457610f94612511565b6020908102919091010152600101610f5a565b50949350505050565b60006107ac82611a53565b60006001600160a01b038216610fe4576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b611011611ac2565b61101b6000611b1c565b565b611025611ac2565b600e55565b6060600080600061103a85610fbb565b90506000816001600160401b0381111561105657611056611e1a565b60405190808252806020026020018201604052801561107f578160200160208202803683370190505b5090506110ac60408051608081018252600080825260208201819052918101829052606081019190915290565b60015b838614611126576110bf81611b6e565b9150816040015161111e5781516001600160a01b0316156110df57815194505b876001600160a01b0316856001600160a01b03160361111e578083878060010198508151811061111157611111612511565b6020026020010181815250505b6001016110af565b50909695505050505050565b61113a611ac2565b600955565b606060038054610ae1906124dd565b606081831061117057604051631960ccad60e11b815260040160405180910390fd5b60008061117c60005490565b9050600185101561118c57600194505b80841115611198578093505b60006111a387610fbb565b9050848610156111c257858503818110156111bc578091505b506111c6565b5060005b6000816001600160401b038111156111e0576111e0611e1a565b604051908082528060200260200182016040528015611209578160200160208202803683370190505b5090508160000361121f5793506112ce92505050565b600061122a8861145a565b90506000816040015161123b575080515b885b88811415801561124d5750848714155b156112c25761125b81611b6e565b925082604001516112ba5782516001600160a01b03161561127b57825191505b8a6001600160a01b0316826001600160a01b0316036112ba57808488806001019950815181106112ad576112ad612511565b6020026020010181815250505b60010161123d565b50505092835250909150505b9392505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61134c848484610c48565b6001600160a01b0383163b156113855761136884848484611baa565b611385576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60006112ce83600d5484611c95565b6001600160a01b0381166000908152600f6020526040812054600e548291829182916113c59161248c565b905060008112156113d95760009150611403565b6001600160a01b0385166000908152600f6020526040812054600e546113ff919061248c565b9250505b8186106114285761141482876124b3565b60095461142191906124c6565b925061142d565b600092505b5090949350505050565b61143f611ac2565b600a61144c84868361256d565b50600b610acb82848361256d565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260018310806114b357506000548310155b156114be5792915050565b6114c783611b6e565b90508060400151156114d95792915050565b6112ce83611cab565b6114ea611ac2565b600c80549115156101000261ff0019909216919091179055565b606061150f82611a1e565b61152c57604051630a14c4b560e41b815260040160405180910390fd5b600a8054611539906124dd565b905060000361155757604051806020016040528060008152506107ac565b600a61156283611ce0565b600b6040516020016115769392919061269f565b60405160208183030381529060405292915050565b6001600160a01b0381166000908152600f6020526040812054600e5482916115b29161248c565b905060008112156115c65750600092915050565b6001600160a01b0383166000908152600f6020526040812054600e546115ec919061248c565b949350505050565b50919050565b611602611ac2565b600d91909155600e55565b3332146116535760405162461bcd60e51b8152602060048201526014602482015273135a5b9d195c881a5cc8184818dbdb9d1c9858dd60621b6044820152606401610848565b600c5460ff16156116975760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d081a5cc81c185d5cd95960921b6044820152606401610848565b600c54610100900460ff16156116ef5760405162461bcd60e51b815260206004820152601a60248201527f4d696e74206973206f6e6c7920666f722077686974656c6973740000000000006044820152606401610848565b610d05816117006000546000190190565b61170a9190612442565b11156117285760405162461bcd60e51b815260040161084890612455565b336000908152600f6020526040812054600e5482918291611749919061248c565b9050600081121561175d576000915061177e565b336000908152600f6020526040812054600e5461177a919061248c565b9250505b8184106117cf5761178f82856124b3565b60095461179c91906124c6565b336000908152600f60205260409020549093506117ba908390612442565b336000908152600f60205260409020556117fe565b336000908152600f60205260408120549093506117ed908590612442565b336000908152600f60205260409020555b823410156118455760405162461bcd60e51b815260206004820152601460248201527309aeae6e840e6cadcc840cadcdeeaced040cae8d60631b6044820152606401610848565b8234111561188557336108fc61185b85346124b3565b6040518115909202916000818181858888f19350505050158015611883573d6000803e3d6000fd5b505b6113853385611920565b611897611ac2565b6001600160a01b0381166118fc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610848565b610e7381611b1c565b61190d611ac2565b600c805460ff1916911515919091179055565b60008054908290036119455760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146119f457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016119bc565b5081600003611a1557604051622e076360e81b815260040160405180910390fd5b60005550505050565b600081600111158015611a32575060005482105b80156107ac575050600090815260046020526040902054600160e01b161590565b60008180600111611aa957600054811015611aa95760008181526004602052604081205490600160e01b82169003611aa7575b806000036112ce575060001901600081815260046020526040902054611a86565b505b604051636f96cda160e11b815260040160405180910390fd5b6008546001600160a01b0316331461101b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610848565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600460205260409020546107ac90611d24565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611bdf9033908990889088906004016126c7565b6020604051808303816000875af1925050508015611c1a575060408051601f3d908101601f19168201909252611c1791810190612704565b60015b611c78573d808015611c48576040519150601f19603f3d011682016040523d82523d6000602084013e611c4d565b606091505b508051600003611c70576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b600082611ca28584611d6b565b14949350505050565b6040805160808101825260008082526020820181905291810182905260608101919091526107ac611cdb83611a53565b611d24565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611cfa5750819003601f19909101908152919050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b600081815b8451811015611db057611d9c82868381518110611d8f57611d8f612511565b6020026020010151611db8565b915080611da881612721565b915050611d70565b509392505050565b6000818310611dd45760008281526020849052604090206112ce565b60008381526020839052604090206112ce565b6001600160e01b031981168114610e7357600080fd5b600060208284031215611e0f57600080fd5b81356112ce81611de7565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611e5857611e58611e1a565b604052919050565b600082601f830112611e7157600080fd5b813560206001600160401b03821115611e8c57611e8c611e1a565b8160051b611e9b828201611e30565b9283528481018201928281019087851115611eb557600080fd5b83870192505b84831015611ed457823582529183019190830190611ebb565b979650505050505050565b60008060408385031215611ef257600080fd5b8235915060208301356001600160401b03811115611f0f57600080fd5b611f1b85828601611e60565b9150509250929050565b60005b83811015611f40578181015183820152602001611f28565b50506000910152565b60008151808452611f61816020860160208601611f25565b601f01601f19169290920160200192915050565b6020815260006112ce6020830184611f49565b600060208284031215611f9a57600080fd5b5035919050565b80356001600160a01b0381168114611fb857600080fd5b919050565b60008060408385031215611fd057600080fd5b611fd983611fa1565b946020939093013593505050565b600060208284031215611ff957600080fd5b6112ce82611fa1565b60008060006060848603121561201757600080fd5b61202084611fa1565b925061202e60208501611fa1565b9150604084013590509250925092565b6000806020838503121561205157600080fd5b82356001600160401b038082111561206857600080fd5b818501915085601f83011261207c57600080fd5b81358181111561208b57600080fd5b8660208260051b85010111156120a057600080fd5b60209290920196919550909350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b818110156111265761211d8385516120b2565b928401926080929092019160010161210a565b6020808252825182820181905260009190848201906040850190845b818110156111265783518352928401929184019160010161214c565b60008060006060848603121561217d57600080fd5b61218684611fa1565b95602085013595506040909401359392505050565b80358015158114611fb857600080fd5b600080604083850312156121be57600080fd5b6121c783611fa1565b91506121d56020840161219b565b90509250929050565b600080600080608085870312156121f457600080fd5b6121fd85611fa1565b9350602061220c818701611fa1565b93506040860135925060608601356001600160401b038082111561222f57600080fd5b818801915088601f83011261224357600080fd5b81358181111561225557612255611e1a565b612267601f8201601f19168501611e30565b9150808252898482850101111561227d57600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080604083850312156122b057600080fd5b82356001600160401b038111156122c657600080fd5b6122d285828601611e60565b95602094909401359450505050565b600080604083850312156122f457600080fd5b823591506121d560208401611fa1565b60008083601f84011261231657600080fd5b5081356001600160401b0381111561232d57600080fd5b60208301915083602082850101111561234557600080fd5b9250929050565b6000806000806040858703121561236257600080fd5b84356001600160401b038082111561237957600080fd5b61238588838901612304565b9096509450602087013591508082111561239e57600080fd5b506123ab87828801612304565b95989497509550505050565b608081016107ac82846120b2565b6000602082840312156123d757600080fd5b6112ce8261219b565b600080604083850312156123f357600080fd5b6123fc83611fa1565b91506121d560208401611fa1565b6000806040838503121561241d57600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b808201808211156107ac576107ac61242c565b60208082526017908201527f4d6178696d756d20737570706c79206578636565646564000000000000000000604082015260600190565b81810360008312801583831316838312821617156124ac576124ac61242c565b5092915050565b818103818111156107ac576107ac61242c565b80820281158282048414176107ac576107ac61242c565b600181811c908216806124f157607f821691505b6020821081036115f457634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b601f821115610ee057600081815260208120601f850160051c8101602086101561254e5750805b601f850160051c820191505b81811015610dd95782815560010161255a565b6001600160401b0383111561258457612584611e1a565b6125988361259283546124dd565b83612527565b6000601f8411600181146125cc57600085156125b45750838201355b600019600387901b1c1916600186901b178355610acb565b600083815260209020601f19861690835b828110156125fd57868501358255602094850194600190920191016125dd565b508682101561261a5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008154612639816124dd565b60018281168015612651576001811461266657612695565b60ff1984168752821515830287019450612695565b8560005260208060002060005b8581101561268c5781548a820152908401908201612673565b50505082870194505b5050505092915050565b60006126ab828661262c565b84516126bb818360208901611f25565b611ed48183018661262c565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126fa90830184611f49565b9695505050505050565b60006020828403121561271657600080fd5b81516112ce81611de7565b6000600182016127335761273361242c565b506001019056fea264697066735822122041b1702c5df631ac3ba84f8f77048fe976851c53c40a607e05796fdc0f5ce38864736f6c634300081200330000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010057ff5b81ab0b224013be394efc3cca92f1a84910fc258cdc8dbf0ea30afe6faf00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569616b37766f7934697a7a6278616f3470616c3464643670706664676564717a61326132617561757469687a6b686a6c78346561612f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102465760003560e01c80638462151c11610139578063b8af7ac3116100b6578063d1d18f501161007a578063d1d18f5014610684578063e985e9c5146106a4578063eba2c6c4146106ed578063efd0cbf91461070d578063f2fde38b14610720578063f30e6e771461074057600080fd5b8063b8af7ac3146105d7578063bf2db4c8146105f7578063c23dc68f14610617578063c40542ec14610644578063c87b56dd1461066457600080fd5b8063a035b1fe116100fd578063a035b1fe14610558578063a22cb4651461056e578063a591252d1461058e578063b88d4fde146105a4578063b8a20ed0146105b757600080fd5b80638462151c146104b85780638da5cb5b146104e557806391b7f5ed1461050357806395d89b411461052357806399a2557a1461053857600080fd5b80633ccfd60b116101c75780636992d2291161018b5780636992d2291461042a57806370a0823114610449578063715018a614610469578063742a4c9b1461047e5780637e4831d31461049e57600080fd5b80633ccfd60b14610395578063408cbf94146103aa57806342842e0e146103ca5780635bbb2177146103dd5780636352211e1461040a57600080fd5b806318160ddd1161020e57806318160ddd146103025780631d9857781461032957806323b872dd146103565780632eb4a7ab1461036957806332cb6b0c1461037f57600080fd5b806301ffc9a71461024b578063061431a81461028057806306fdde0314610295578063081812fc146102b7578063095ea7b3146102ef575b600080fd5b34801561025757600080fd5b5061026b610266366004611dfd565b610760565b60405190151581526020015b60405180910390f35b61029361028e366004611edf565b6107b2565b005b3480156102a157600080fd5b506102aa610ad2565b6040516102779190611f75565b3480156102c357600080fd5b506102d76102d2366004611f88565b610b64565b6040516001600160a01b039091168152602001610277565b6102936102fd366004611fbd565b610ba8565b34801561030e57600080fd5b5060015460005403600019015b604051908152602001610277565b34801561033557600080fd5b5061031b610344366004611fe7565b600f6020526000908152604090205481565b610293610364366004612002565b610c48565b34801561037557600080fd5b5061031b600d5481565b34801561038b57600080fd5b5061031b610d0581565b3480156103a157600080fd5b50610293610de1565b3480156103b657600080fd5b506102936103c5366004611fbd565b610e76565b6102936103d8366004612002565b610ec5565b3480156103e957600080fd5b506103fd6103f836600461203e565b610ee5565b60405161027791906120ee565b34801561041657600080fd5b506102d7610425366004611f88565b610fb0565b34801561043657600080fd5b50600c5461026b90610100900460ff1681565b34801561045557600080fd5b5061031b610464366004611fe7565b610fbb565b34801561047557600080fd5b50610293611009565b34801561048a57600080fd5b50610293610499366004611f88565b61101d565b3480156104aa57600080fd5b50600c5461026b9060ff1681565b3480156104c457600080fd5b506104d86104d3366004611fe7565b61102a565b6040516102779190612130565b3480156104f157600080fd5b506008546001600160a01b03166102d7565b34801561050f57600080fd5b5061029361051e366004611f88565b611132565b34801561052f57600080fd5b506102aa61113f565b34801561054457600080fd5b506104d8610553366004612168565b61114e565b34801561056457600080fd5b5061031b60095481565b34801561057a57600080fd5b506102936105893660046121ab565b6112d5565b34801561059a57600080fd5b5061031b600e5481565b6102936105b23660046121de565b611341565b3480156105c357600080fd5b5061026b6105d236600461229d565b61138b565b3480156105e357600080fd5b5061031b6105f23660046122e1565b61139a565b34801561060357600080fd5b5061029361061236600461234c565b611437565b34801561062357600080fd5b50610637610632366004611f88565b61145a565b60405161027791906123b7565b34801561065057600080fd5b5061029361065f3660046123c5565b6114e2565b34801561067057600080fd5b506102aa61067f366004611f88565b611504565b34801561069057600080fd5b5061031b61069f366004611fe7565b61158b565b3480156106b057600080fd5b5061026b6106bf3660046123e0565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156106f957600080fd5b5061029361070836600461240a565b6115fa565b61029361071b366004611f88565b61160d565b34801561072c57600080fd5b5061029361073b366004611fe7565b61188f565b34801561074c57600080fd5b5061029361075b3660046123c5565b611905565b60006301ffc9a760e01b6001600160e01b03198316148061079157506380ac58cd60e01b6001600160e01b03198316145b806107ac5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6040516bffffffffffffffffffffffff193360601b1660208201526107f19082906034016040516020818303038152906040528051906020012061138b565b6108515760405162461bcd60e51b815260206004820152602660248201527f536f7272792062757420796f7520617265206e6f7420656c696769626c6520746044820152651bc81b5a5b9d60d21b60648201526084015b60405180910390fd5b3332146108975760405162461bcd60e51b8152602060048201526014602482015273135a5b9d195c881a5cc8184818dbdb9d1c9858dd60621b6044820152606401610848565b600c5460ff16156108db5760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d081a5cc81c185d5cd95960921b6044820152606401610848565b600c54610100900460ff1661092b5760405162461bcd60e51b81526020600482015260166024820152754d696e74206973206f70656e20746f207075626c696360501b6044820152606401610848565b610d058261093c6000546000190190565b6109469190612442565b11156109645760405162461bcd60e51b815260040161084890612455565b336000908152600f6020526040812054600e5482918291610985919061248c565b9050600081121561099957600091506109ba565b336000908152600f6020526040812054600e546109b6919061248c565b9250505b818510610a0b576109cb82866124b3565b6009546109d891906124c6565b336000908152600f60205260409020549093506109f6908390612442565b336000908152600f6020526040902055610a3a565b336000908152600f6020526040812054909350610a29908690612442565b336000908152600f60205260409020555b82341015610a815760405162461bcd60e51b815260206004820152601460248201527309aeae6e840e6cadcc840cadcdeeaced040cae8d60631b6044820152606401610848565b82341115610ac157336108fc610a9785346124b3565b6040518115909202916000818181858888f19350505050158015610abf573d6000803e3d6000fd5b505b610acb3386611920565b5050505050565b606060028054610ae1906124dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0d906124dd565b8015610b5a5780601f10610b2f57610100808354040283529160200191610b5a565b820191906000526020600020905b815481529060010190602001808311610b3d57829003601f168201915b5050505050905090565b6000610b6f82611a1e565b610b8c576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610bb382610fb0565b9050336001600160a01b03821614610bec57610bcf81336106bf565b610bec576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000610c5382611a53565b9050836001600160a01b0316816001600160a01b031614610c865760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610cd357610cb686336106bf565b610cd357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610cfa57604051633a954ecd60e21b815260040160405180910390fd5b8015610d0557600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610d9757600184016000818152600460205260408120549003610d95576000548114610d955760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610de9611ac2565b604051600090339047908381818185875af1925050503d8060008114610e2b576040519150601f19603f3d011682016040523d82523d6000602084013e610e30565b606091505b5050905080610e735760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610848565b50565b610e7e611ac2565b610d0581610e8f6000546000190190565b610e999190612442565b1115610eb75760405162461bcd60e51b815260040161084890612455565b610ec18282611920565b5050565b610ee083838360405180602001604052806000815250611341565b505050565b6060816000816001600160401b03811115610f0257610f02611e1a565b604051908082528060200260200182016040528015610f5457816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610f205790505b50905060005b828114610fa757610f82868683818110610f7657610f76612511565b9050602002013561145a565b828281518110610f9457610f94612511565b6020908102919091010152600101610f5a565b50949350505050565b60006107ac82611a53565b60006001600160a01b038216610fe4576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b611011611ac2565b61101b6000611b1c565b565b611025611ac2565b600e55565b6060600080600061103a85610fbb565b90506000816001600160401b0381111561105657611056611e1a565b60405190808252806020026020018201604052801561107f578160200160208202803683370190505b5090506110ac60408051608081018252600080825260208201819052918101829052606081019190915290565b60015b838614611126576110bf81611b6e565b9150816040015161111e5781516001600160a01b0316156110df57815194505b876001600160a01b0316856001600160a01b03160361111e578083878060010198508151811061111157611111612511565b6020026020010181815250505b6001016110af565b50909695505050505050565b61113a611ac2565b600955565b606060038054610ae1906124dd565b606081831061117057604051631960ccad60e11b815260040160405180910390fd5b60008061117c60005490565b9050600185101561118c57600194505b80841115611198578093505b60006111a387610fbb565b9050848610156111c257858503818110156111bc578091505b506111c6565b5060005b6000816001600160401b038111156111e0576111e0611e1a565b604051908082528060200260200182016040528015611209578160200160208202803683370190505b5090508160000361121f5793506112ce92505050565b600061122a8861145a565b90506000816040015161123b575080515b885b88811415801561124d5750848714155b156112c25761125b81611b6e565b925082604001516112ba5782516001600160a01b03161561127b57825191505b8a6001600160a01b0316826001600160a01b0316036112ba57808488806001019950815181106112ad576112ad612511565b6020026020010181815250505b60010161123d565b50505092835250909150505b9392505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61134c848484610c48565b6001600160a01b0383163b156113855761136884848484611baa565b611385576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60006112ce83600d5484611c95565b6001600160a01b0381166000908152600f6020526040812054600e548291829182916113c59161248c565b905060008112156113d95760009150611403565b6001600160a01b0385166000908152600f6020526040812054600e546113ff919061248c565b9250505b8186106114285761141482876124b3565b60095461142191906124c6565b925061142d565b600092505b5090949350505050565b61143f611ac2565b600a61144c84868361256d565b50600b610acb82848361256d565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260018310806114b357506000548310155b156114be5792915050565b6114c783611b6e565b90508060400151156114d95792915050565b6112ce83611cab565b6114ea611ac2565b600c80549115156101000261ff0019909216919091179055565b606061150f82611a1e565b61152c57604051630a14c4b560e41b815260040160405180910390fd5b600a8054611539906124dd565b905060000361155757604051806020016040528060008152506107ac565b600a61156283611ce0565b600b6040516020016115769392919061269f565b60405160208183030381529060405292915050565b6001600160a01b0381166000908152600f6020526040812054600e5482916115b29161248c565b905060008112156115c65750600092915050565b6001600160a01b0383166000908152600f6020526040812054600e546115ec919061248c565b949350505050565b50919050565b611602611ac2565b600d91909155600e55565b3332146116535760405162461bcd60e51b8152602060048201526014602482015273135a5b9d195c881a5cc8184818dbdb9d1c9858dd60621b6044820152606401610848565b600c5460ff16156116975760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d081a5cc81c185d5cd95960921b6044820152606401610848565b600c54610100900460ff16156116ef5760405162461bcd60e51b815260206004820152601a60248201527f4d696e74206973206f6e6c7920666f722077686974656c6973740000000000006044820152606401610848565b610d05816117006000546000190190565b61170a9190612442565b11156117285760405162461bcd60e51b815260040161084890612455565b336000908152600f6020526040812054600e5482918291611749919061248c565b9050600081121561175d576000915061177e565b336000908152600f6020526040812054600e5461177a919061248c565b9250505b8184106117cf5761178f82856124b3565b60095461179c91906124c6565b336000908152600f60205260409020549093506117ba908390612442565b336000908152600f60205260409020556117fe565b336000908152600f60205260408120549093506117ed908590612442565b336000908152600f60205260409020555b823410156118455760405162461bcd60e51b815260206004820152601460248201527309aeae6e840e6cadcc840cadcdeeaced040cae8d60631b6044820152606401610848565b8234111561188557336108fc61185b85346124b3565b6040518115909202916000818181858888f19350505050158015611883573d6000803e3d6000fd5b505b6113853385611920565b611897611ac2565b6001600160a01b0381166118fc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610848565b610e7381611b1c565b61190d611ac2565b600c805460ff1916911515919091179055565b60008054908290036119455760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146119f457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016119bc565b5081600003611a1557604051622e076360e81b815260040160405180910390fd5b60005550505050565b600081600111158015611a32575060005482105b80156107ac575050600090815260046020526040902054600160e01b161590565b60008180600111611aa957600054811015611aa95760008181526004602052604081205490600160e01b82169003611aa7575b806000036112ce575060001901600081815260046020526040902054611a86565b505b604051636f96cda160e11b815260040160405180910390fd5b6008546001600160a01b0316331461101b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610848565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600460205260409020546107ac90611d24565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611bdf9033908990889088906004016126c7565b6020604051808303816000875af1925050508015611c1a575060408051601f3d908101601f19168201909252611c1791810190612704565b60015b611c78573d808015611c48576040519150601f19603f3d011682016040523d82523d6000602084013e611c4d565b606091505b508051600003611c70576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b600082611ca28584611d6b565b14949350505050565b6040805160808101825260008082526020820181905291810182905260608101919091526107ac611cdb83611a53565b611d24565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611cfa5750819003601f19909101908152919050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b600081815b8451811015611db057611d9c82868381518110611d8f57611d8f612511565b6020026020010151611db8565b915080611da881612721565b915050611d70565b509392505050565b6000818310611dd45760008281526020849052604090206112ce565b60008381526020839052604090206112ce565b6001600160e01b031981168114610e7357600080fd5b600060208284031215611e0f57600080fd5b81356112ce81611de7565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611e5857611e58611e1a565b604052919050565b600082601f830112611e7157600080fd5b813560206001600160401b03821115611e8c57611e8c611e1a565b8160051b611e9b828201611e30565b9283528481018201928281019087851115611eb557600080fd5b83870192505b84831015611ed457823582529183019190830190611ebb565b979650505050505050565b60008060408385031215611ef257600080fd5b8235915060208301356001600160401b03811115611f0f57600080fd5b611f1b85828601611e60565b9150509250929050565b60005b83811015611f40578181015183820152602001611f28565b50506000910152565b60008151808452611f61816020860160208601611f25565b601f01601f19169290920160200192915050565b6020815260006112ce6020830184611f49565b600060208284031215611f9a57600080fd5b5035919050565b80356001600160a01b0381168114611fb857600080fd5b919050565b60008060408385031215611fd057600080fd5b611fd983611fa1565b946020939093013593505050565b600060208284031215611ff957600080fd5b6112ce82611fa1565b60008060006060848603121561201757600080fd5b61202084611fa1565b925061202e60208501611fa1565b9150604084013590509250925092565b6000806020838503121561205157600080fd5b82356001600160401b038082111561206857600080fd5b818501915085601f83011261207c57600080fd5b81358181111561208b57600080fd5b8660208260051b85010111156120a057600080fd5b60209290920196919550909350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b818110156111265761211d8385516120b2565b928401926080929092019160010161210a565b6020808252825182820181905260009190848201906040850190845b818110156111265783518352928401929184019160010161214c565b60008060006060848603121561217d57600080fd5b61218684611fa1565b95602085013595506040909401359392505050565b80358015158114611fb857600080fd5b600080604083850312156121be57600080fd5b6121c783611fa1565b91506121d56020840161219b565b90509250929050565b600080600080608085870312156121f457600080fd5b6121fd85611fa1565b9350602061220c818701611fa1565b93506040860135925060608601356001600160401b038082111561222f57600080fd5b818801915088601f83011261224357600080fd5b81358181111561225557612255611e1a565b612267601f8201601f19168501611e30565b9150808252898482850101111561227d57600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080604083850312156122b057600080fd5b82356001600160401b038111156122c657600080fd5b6122d285828601611e60565b95602094909401359450505050565b600080604083850312156122f457600080fd5b823591506121d560208401611fa1565b60008083601f84011261231657600080fd5b5081356001600160401b0381111561232d57600080fd5b60208301915083602082850101111561234557600080fd5b9250929050565b6000806000806040858703121561236257600080fd5b84356001600160401b038082111561237957600080fd5b61238588838901612304565b9096509450602087013591508082111561239e57600080fd5b506123ab87828801612304565b95989497509550505050565b608081016107ac82846120b2565b6000602082840312156123d757600080fd5b6112ce8261219b565b600080604083850312156123f357600080fd5b6123fc83611fa1565b91506121d560208401611fa1565b6000806040838503121561241d57600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b808201808211156107ac576107ac61242c565b60208082526017908201527f4d6178696d756d20737570706c79206578636565646564000000000000000000604082015260600190565b81810360008312801583831316838312821617156124ac576124ac61242c565b5092915050565b818103818111156107ac576107ac61242c565b80820281158282048414176107ac576107ac61242c565b600181811c908216806124f157607f821691505b6020821081036115f457634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b601f821115610ee057600081815260208120601f850160051c8101602086101561254e5750805b601f850160051c820191505b81811015610dd95782815560010161255a565b6001600160401b0383111561258457612584611e1a565b6125988361259283546124dd565b83612527565b6000601f8411600181146125cc57600085156125b45750838201355b600019600387901b1c1916600186901b178355610acb565b600083815260209020601f19861690835b828110156125fd57868501358255602094850194600190920191016125dd565b508682101561261a5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008154612639816124dd565b60018281168015612651576001811461266657612695565b60ff1984168752821515830287019450612695565b8560005260208060002060005b8581101561268c5781548a820152908401908201612673565b50505082870194505b5050505092915050565b60006126ab828661262c565b84516126bb818360208901611f25565b611ed48183018661262c565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126fa90830184611f49565b9695505050505050565b60006020828403121561271657600080fd5b81516112ce81611de7565b6000600182016127335761273361242c565b506001019056fea264697066735822122041b1702c5df631ac3ba84f8f77048fe976851c53c40a607e05796fdc0f5ce38864736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010057ff5b81ab0b224013be394efc3cca92f1a84910fc258cdc8dbf0ea30afe6faf00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569616b37766f7934697a7a6278616f3470616c3464643670706664676564717a61326132617561757469687a6b686a6c78346561612f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : startTokenURI (string): ipfs://bafybeiak7voy4izzbxao4pal4dd6ppfdgedqza2a2auautihzkhjlx4eaa/
Arg [1] : endTokenURI (string): .json
Arg [2] : _merkleRoot (bytes32): 0x57ff5b81ab0b224013be394efc3cca92f1a84910fc258cdc8dbf0ea30afe6faf
Arg [3] : _maxFreeMint (uint256): 3
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 57ff5b81ab0b224013be394efc3cca92f1a84910fc258cdc8dbf0ea30afe6faf
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [5] : 697066733a2f2f62616679626569616b37766f7934697a7a6278616f3470616c
Arg [6] : 3464643670706664676564717a61326132617561757469687a6b686a6c783465
Arg [7] : 61612f0000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [9] : 2e6a736f6e000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
75316:8466:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34119:639;;;;;;;;;;-1:-1:-1;34119:639:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;34119:639:0;;;;;;;;77573:1376;;;;;;:::i;:::-;;:::i;:::-;;35021:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41512:218::-;;;;;;;;;;-1:-1:-1;41512:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3247:32:1;;;3229:51;;3217:2;3202:18;41512:218:0;3083:203:1;40945:408:0;;;;;;:::i;:::-;;:::i;30772:323::-;;;;;;;;;;-1:-1:-1;83770:1:0;31046:12;30833:7;31030:13;:28;-1:-1:-1;;31030:46:0;30772:323;;;3874:25:1;;;3862:2;3847:18;30772:323:0;3728:177:1;75681:45:0;;;;;;;;;;-1:-1:-1;75681:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;45151:2825;;;;;;:::i;:::-;;:::i;75619:25::-;;;;;;;;;;;;;;;;75380:41;;;;;;;;;;;;75417:4;75380:41;;81569:172;;;;;;;;;;;;;:::i;79165:268::-;;;;;;;;;;-1:-1:-1;79165:268:0;;;;;:::i;:::-;;:::i;48072:193::-;;;;;;:::i;:::-;;:::i;68818:528::-;;;;;;;;;;-1:-1:-1;68818:528:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36414:152::-;;;;;;;;;;-1:-1:-1;36414:152:0;;;;;:::i;:::-;;:::i;75577:35::-;;;;;;;;;;-1:-1:-1;75577:35:0;;;;;;;;;;;31956:233;;;;;;;;;;-1:-1:-1;31956:233:0;;;;;:::i;:::-;;:::i;12374:103::-;;;;;;;;;;;;;:::i;82346:107::-;;;;;;;;;;-1:-1:-1;82346:107:0;;;;;:::i;:::-;;:::i;75540:30::-;;;;;;;;;;-1:-1:-1;75540:30:0;;;;;;;;72694:900;;;;;;;;;;-1:-1:-1;72694:900:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11726:87::-;;;;;;;;;;-1:-1:-1;11799:6:0;;-1:-1:-1;;;;;11799:6:0;11726:87;;82072:86;;;;;;;;;;-1:-1:-1;82072:86:0;;;;;:::i;:::-;;:::i;35197:104::-;;;;;;;;;;;;;:::i;69734:2513::-;;;;;;;;;;-1:-1:-1;69734:2513:0;;;;;:::i;:::-;;:::i;75428:35::-;;;;;;;;;;;;;;;;42070:234;;;;;;;;;;-1:-1:-1;42070:234:0;;;;;:::i;:::-;;:::i;75651:23::-;;;;;;;;;;;;;;;;48863:407;;;;;;:::i;:::-;;:::i;80066:176::-;;;;;;;;;;-1:-1:-1;80066:176:0;;;;;:::i;:::-;;:::i;80857:581::-;;;;;;;;;;-1:-1:-1;80857:581:0;;;;;:::i;:::-;;:::i;82796:206::-;;;;;;;;;;-1:-1:-1;82796:206:0;;;;;:::i;:::-;;:::i;68231:428::-;;;;;;;;;;-1:-1:-1;68231:428:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;82567:105::-;;;;;;;;;;-1:-1:-1;82567:105:0;;;;;:::i;:::-;;:::i;83080:519::-;;;;;;;;;;-1:-1:-1;83080:519:0;;;;;:::i;:::-;;:::i;80370:322::-;;;;;;;;;;-1:-1:-1;80370:322:0;;;;;:::i;:::-;;:::i;42461:164::-;;;;;;;;;;-1:-1:-1;42461:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;42582:25:0;;;42558:4;42582:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;42461:164;79684:187;;;;;;;;;;-1:-1:-1;79684:187:0;;;;;:::i;:::-;;:::i;76191:1178::-;;;;;;:::i;:::-;;:::i;12632:201::-;;;;;;;;;;-1:-1:-1;12632:201:0;;;;;:::i;:::-;;:::i;81835:91::-;;;;;;;;;;-1:-1:-1;81835:91:0;;;;;:::i;:::-;;:::i;34119:639::-;34204:4;-1:-1:-1;;;;;;;;;34528:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;34605:25:0;;;34528:102;:179;;;-1:-1:-1;;;;;;;;;;34682:25:0;;;34528:179;34508:199;34119:639;-1:-1:-1;;34119:639:0:o;77573:1376::-;77735:28;;-1:-1:-1;;77752:10:0;11752:2:1;11748:15;11744:53;77735:28:0;;;11732:66:1;77710:55:0;;77718:5;;11814:12:1;;77735:28:0;;;;;;;;;;;;77725:39;;;;;;77710:7;:55::i;:::-;77688:143;;;;-1:-1:-1;;;77688:143:0;;12039:2:1;77688:143:0;;;12021:21:1;12078:2;12058:18;;;12051:30;12117:34;12097:18;;;12090:62;-1:-1:-1;;;12168:18:1;;;12161:36;12214:19;;77688:143:0;;;;;;;;;77850:10;77864:9;77850:23;77842:56;;;;-1:-1:-1;;;77842:56:0;;12446:2:1;77842:56:0;;;12428:21:1;12485:2;12465:18;;;12458:30;-1:-1:-1;;;12504:18:1;;;12497:50;12564:18;;77842:56:0;12244:344:1;77842:56:0;77918:10;;;;77917:11;77909:38;;;;-1:-1:-1;;;77909:38:0;;12795:2:1;77909:38:0;;;12777:21:1;12834:2;12814:18;;;12807:30;-1:-1:-1;;;12853:18:1;;;12846:44;12907:18;;77909:38:0;12593:338:1;77909:38:0;77966:16;;;;;;;77958:51;;;;-1:-1:-1;;;77958:51:0;;13138:2:1;77958:51:0;;;13120:21:1;13177:2;13157:18;;;13150:30;-1:-1:-1;;;13196:18:1;;;13189:52;13258:18;;77958:51:0;12936:346:1;77958:51:0;75417:4;78059:8;78042:14;31248:7;31439:13;-1:-1:-1;;31439:31:0;;31193:296;78042:14;:25;;;;:::i;:::-;:39;;78020:112;;;;-1:-1:-1;;;78020:112:0;;;;;;;:::i;:::-;78236:10;78145:9;78222:25;;;:13;:25;;;;;;78203:11;;78145:9;;;;78199:49;;78222:25;78199:49;:::i;:::-;78185:63;;78273:1;78263:7;:11;78259:185;;;78298:1;78291:8;;78259:185;;;78384:10;78332:12;78370:25;;;:13;:25;;;;;;78351:11;;78347:49;;78370:25;78347:49;:::i;:::-;78332:64;-1:-1:-1;;78259:185:0;78472:4;78460:8;:16;78456:278;;78511:15;78522:4;78511:8;:15;:::i;:::-;78501:5;;78500:27;;;;:::i;:::-;78584:10;78570:25;;;;:13;:25;;;;;;78493:34;;-1:-1:-1;78570:32:0;;78598:4;;78570:32;:::i;:::-;78556:10;78542:25;;;;:13;:25;;;;;:60;78456:278;;;78700:10;78642:1;78686:25;;;:13;:25;;;;;;78642:1;;-1:-1:-1;78686:36:0;;78714:8;;78686:36;:::i;:::-;78672:10;78658:25;;;;:13;:25;;;;;:64;78456:278;78767:4;78754:9;:17;;78746:50;;;;-1:-1:-1;;;78746:50:0;;14614:2:1;78746:50:0;;;14596:21:1;14653:2;14633:18;;;14626:30;-1:-1:-1;;;14672:18:1;;;14665:50;14732:18;;78746:50:0;14412:344:1;78746:50:0;78823:4;78811:9;:16;78807:95;;;78852:10;78844:46;78873:16;78885:4;78873:9;:16;:::i;:::-;78844:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78807:95;78914:27;78920:10;78932:8;78914:5;:27::i;:::-;77677:1272;;;77573:1376;;:::o;35021:100::-;35075:13;35108:5;35101:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35021:100;:::o;41512:218::-;41588:7;41613:16;41621:7;41613;:16::i;:::-;41608:64;;41638:34;;-1:-1:-1;;;41638:34:0;;;;;;;;;;;41608:64;-1:-1:-1;41692:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;41692:30:0;;41512:218::o;40945:408::-;41034:13;41050:16;41058:7;41050;:16::i;:::-;41034:32;-1:-1:-1;65278:10:0;-1:-1:-1;;;;;41083:28:0;;;41079:175;;41131:44;41148:5;65278:10;42461:164;:::i;41131:44::-;41126:128;;41203:35;;-1:-1:-1;;;41203:35:0;;;;;;;;;;;41126:128;41266:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;41266:35:0;-1:-1:-1;;;;;41266:35:0;;;;;;;;;41317:28;;41266:24;;41317:28;;;;;;;41023:330;40945:408;;:::o;45151:2825::-;45293:27;45323;45342:7;45323:18;:27::i;:::-;45293:57;;45408:4;-1:-1:-1;;;;;45367:45:0;45383:19;-1:-1:-1;;;;;45367:45:0;;45363:86;;45421:28;;-1:-1:-1;;;45421:28:0;;;;;;;;;;;45363:86;45463:27;44259:24;;;:15;:24;;;;;44487:26;;65278:10;43884:30;;;-1:-1:-1;;;;;43577:28:0;;43862:20;;;43859:56;45649:180;;45742:43;45759:4;65278:10;42461:164;:::i;45742:43::-;45737:92;;45794:35;;-1:-1:-1;;;45794:35:0;;;;;;;;;;;45737:92;-1:-1:-1;;;;;45846:16:0;;45842:52;;45871:23;;-1:-1:-1;;;45871:23:0;;;;;;;;;;;45842:52;46043:15;46040:160;;;46183:1;46162:19;46155:30;46040:160;-1:-1:-1;;;;;46580:24:0;;;;;;;:18;:24;;;;;;46578:26;;-1:-1:-1;;46578:26:0;;;46649:22;;;;;;;;;46647:24;;-1:-1:-1;46647:24:0;;;39803:11;39778:23;39774:41;39761:63;-1:-1:-1;;;39761:63:0;46942:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;47237:47:0;;:52;;47233:627;;47342:1;47332:11;;47310:19;47465:30;;;:17;:30;;;;;;:35;;47461:384;;47603:13;;47588:11;:28;47584:242;;47750:30;;;;:17;:30;;;;;:52;;;47584:242;47291:569;47233:627;47907:7;47903:2;-1:-1:-1;;;;;47888:27:0;47897:4;-1:-1:-1;;;;;47888:27:0;;;;;;;;;;;47926:42;45282:2694;;;45151:2825;;;:::o;81569:172::-;11612:13;:11;:13::i;:::-;81638:49:::1;::::0;81620:12:::1;::::0;81638:10:::1;::::0;81661:21:::1;::::0;81620:12;81638:49;81620:12;81638:49;81661:21;81638:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81619:68;;;81706:7;81698:35;;;::::0;-1:-1:-1;;;81698:35:0;;15558:2:1;81698:35:0::1;::::0;::::1;15540:21:1::0;15597:2;15577:18;;;15570:30;-1:-1:-1;;;15616:18:1;;;15609:45;15671:18;;81698:35:0::1;15356:339:1::0;81698:35:0::1;81608:133;81569:172::o:0;79165:268::-;11612:13;:11;:13::i;:::-;75417:4:::1;79314:8;79297:14;31248:7:::0;31439:13;-1:-1:-1;;31439:31:0;;31193:296;79297:14:::1;:25;;;;:::i;:::-;:39;;79275:112;;;;-1:-1:-1::0;;;79275:112:0::1;;;;;;;:::i;:::-;79400:25;79406:8;79416;79400:5;:25::i;:::-;79165:268:::0;;:::o;48072:193::-;48218:39;48235:4;48241:2;48245:7;48218:39;;;;;;;;;;;;:16;:39::i;:::-;48072:193;;;:::o;68818:528::-;68962:23;69053:8;69028:22;69053:8;-1:-1:-1;;;;;69120:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69120:36:0;;-1:-1:-1;;69120:36:0;;;;;;;;;;;;69083:73;;69176:9;69171:125;69192:14;69187:1;:19;69171:125;;69248:32;69268:8;;69277:1;69268:11;;;;;;;:::i;:::-;;;;;;;69248:19;:32::i;:::-;69232:10;69243:1;69232:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;69208:3;;69171:125;;;-1:-1:-1;69317:10:0;68818:528;-1:-1:-1;;;;68818:528:0:o;36414:152::-;36486:7;36529:27;36548:7;36529:18;:27::i;31956:233::-;32028:7;-1:-1:-1;;;;;32052:19:0;;32048:60;;32080:28;;-1:-1:-1;;;32080:28:0;;;;;;;;;;;32048:60;-1:-1:-1;;;;;;32126:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;32126:55:0;;31956:233::o;12374:103::-;11612:13;:11;:13::i;:::-;12439:30:::1;12466:1;12439:18;:30::i;:::-;12374:103::o:0;82346:107::-;11612:13;:11;:13::i;:::-;82419:11:::1;:26:::0;82346:107::o;72694:900::-;72772:16;72826:19;72860:25;72900:22;72925:16;72935:5;72925:9;:16::i;:::-;72900:41;;72956:25;72998:14;-1:-1:-1;;;;;72984:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72984:29:0;;72956:57;;73028:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73028:31:0;83770:1;73074:472;73123:14;73108:11;:29;73074:472;;73175:15;73188:1;73175:12;:15::i;:::-;73163:27;;73213:9;:16;;;73254:8;73209:73;73304:14;;-1:-1:-1;;;;;73304:28:0;;73300:111;;73377:14;;;-1:-1:-1;73300:111:0;73454:5;-1:-1:-1;;;;;73433:26:0;:17;-1:-1:-1;;;;;73433:26:0;;73429:102;;73510:1;73484:8;73493:13;;;;;;73484:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;73429:102;73139:3;;73074:472;;;-1:-1:-1;73567:8:0;;72694:900;-1:-1:-1;;;;;;72694:900:0:o;82072:86::-;11612:13;:11;:13::i;:::-;82136:5:::1;:14:::0;82072:86::o;35197:104::-;35253:13;35286:7;35279:14;;;;;:::i;69734:2513::-;69877:16;69944:4;69935:5;:13;69931:45;;69957:19;;-1:-1:-1;;;69957:19:0;;;;;;;;;;;69931:45;69991:19;70025:17;70045:14;30514:7;30541:13;;30459:103;70045:14;70025:34;-1:-1:-1;83770:1:0;70137:5;:23;70133:87;;;83770:1;70181:23;;70133:87;70296:9;70289:4;:16;70285:73;;;70333:9;70326:16;;70285:73;70372:25;70400:16;70410:5;70400:9;:16::i;:::-;70372:44;;70594:4;70586:5;:12;70582:278;;;70641:12;;;70676:31;;;70672:111;;;70752:11;70732:31;;70672:111;70600:198;70582:278;;;-1:-1:-1;70843:1:0;70582:278;70874:25;70916:17;-1:-1:-1;;;;;70902:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70902:32:0;;70874:60;;70953:17;70974:1;70953:22;70949:78;;71003:8;-1:-1:-1;70996:15:0;;-1:-1:-1;;;70996:15:0;70949:78;71171:31;71205:26;71225:5;71205:19;:26::i;:::-;71171:60;;71246:25;71491:9;:16;;;71486:92;;-1:-1:-1;71548:14:0;;71486:92;71609:5;71592:478;71621:4;71616:1;:9;;:45;;;;;71644:17;71629:11;:32;;71616:45;71592:478;;;71699:15;71712:1;71699:12;:15::i;:::-;71687:27;;71737:9;:16;;;71778:8;71733:73;71828:14;;-1:-1:-1;;;;;71828:28:0;;71824:111;;71901:14;;;-1:-1:-1;71824:111:0;71978:5;-1:-1:-1;;;;;71957:26:0;:17;-1:-1:-1;;;;;71957:26:0;;71953:102;;72034:1;72008:8;72017:13;;;;;;72008:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;71953:102;71663:3;;71592:478;;;-1:-1:-1;;;72155:29:0;;;-1:-1:-1;72162:8:0;;-1:-1:-1;;69734:2513:0;;;;;;:::o;42070:234::-;65278:10;42165:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;42165:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;42165:60:0;;;;;;;;;;42241:55;;540:41:1;;;42165:49:0;;65278:10;42241:55;;513:18:1;42241:55:0;;;;;;;42070:234;;:::o;48863:407::-;49038:31;49051:4;49057:2;49061:7;49038:12;:31::i;:::-;-1:-1:-1;;;;;49084:14:0;;;:19;49080:183;;49123:56;49154:4;49160:2;49164:7;49173:5;49123:30;:56::i;:::-;49118:145;;49207:40;;-1:-1:-1;;;49207:40:0;;;;;;;;;;;49118:145;48863:407;;;;:::o;80066:176::-;80167:4;80191:43;80210:5;80217:10;;80229:4;80191:18;:43::i;80857:581::-;-1:-1:-1;;;;;81057:21:0;;80957:7;81057:21;;;:13;:21;;;;;;81038:11;;80957:7;;;;;;81034:45;;;:::i;:::-;81020:59;;81104:1;81094:7;:11;81090:181;;;81129:1;81122:8;;81090:181;;;-1:-1:-1;;;;;81201:21:0;;81163:12;81201:21;;;:13;:21;;;;;;81182:11;;81178:45;;81201:21;81178:45;:::i;:::-;81163:60;-1:-1:-1;;81090:181:0;81299:4;81287:8;:16;81283:124;;81338:15;81349:4;81338:8;:15;:::i;:::-;81328:5;;81327:27;;;;:::i;:::-;81320:34;;81283:124;;;81394:1;81387:8;;81283:124;-1:-1:-1;81426:4:0;;80857:581;-1:-1:-1;;;;80857:581:0:o;82796:206::-;11612:13;:11;:13::i;:::-;82927:14:::1;:30;82944:13:::0;;82927:14;:30:::1;:::i;:::-;-1:-1:-1::0;82968:12:0::1;:26;82983:11:::0;;82968:12;:26:::1;:::i;68231:428::-:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83770:1:0;68395:7;:25;:54;;;-1:-1:-1;30514:7:0;30541:13;68424:7;:25;;68395:54;68391:103;;;68473:9;68231:428;-1:-1:-1;;68231:428:0:o;68391:103::-;68516:21;68529:7;68516:12;:21::i;:::-;68504:33;;68552:9;:16;;;68548:65;;;68592:9;68231:428;-1:-1:-1;;68231:428:0:o;68548:65::-;68630:21;68643:7;68630:12;:21::i;82567:105::-;11612:13;:11;:13::i;:::-;82639:16:::1;:25:::0;;;::::1;;;;-1:-1:-1::0;;82639:25:0;;::::1;::::0;;;::::1;::::0;;82567:105::o;83080:519::-;83188:13;83219:16;83227:7;83219;:16::i;:::-;83214:59;;83244:29;;-1:-1:-1;;;83244:29:0;;;;;;;;;;;83214:59;83310:14;83304:28;;;;;:::i;:::-;;;83336:1;83304:33;:287;;;;;;;;;;;;;;;;;83429:14;83470:18;83480:7;83470:9;:18::i;:::-;83515:12;83386:164;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83284:307;83080:519;-1:-1:-1;;83080:519:0:o;80370:322::-;-1:-1:-1;;;;;80485:21:0;;80432:3;80485:21;;;:13;:21;;;;;;80466:11;;80432:3;;80462:45;;;:::i;:::-;80448:59;;80532:1;80522:7;:11;80518:167;;;-1:-1:-1;80557:1:0;;80370:322;-1:-1:-1;;80370:322:0:o;80518:167::-;-1:-1:-1;;;;;80625:21:0;;80591:8;80625:21;;;:13;:21;;;;;;80606:11;;80602:45;;80625:21;80602:45;:::i;:::-;80591:56;80370:322;-1:-1:-1;;;;80370:322:0:o;80518:167::-;80437:255;80370:322;;;:::o;79684:187::-;11612:13;:11;:13::i;:::-;79802:10:::1;:24:::0;;;;79837:11:::1;:26:::0;79684:187::o;76191:1178::-;76265:10;76279:9;76265:23;76257:56;;;;-1:-1:-1;;;76257:56:0;;12446:2:1;76257:56:0;;;12428:21:1;12485:2;12465:18;;;12458:30;-1:-1:-1;;;12504:18:1;;;12497:50;12564:18;;76257:56:0;12244:344:1;76257:56:0;76333:10;;;;76332:11;76324:38;;;;-1:-1:-1;;;76324:38:0;;12795:2:1;76324:38:0;;;12777:21:1;12834:2;12814:18;;;12807:30;-1:-1:-1;;;12853:18:1;;;12846:44;12907:18;;76324:38:0;12593:338:1;76324:38:0;76382:16;;;;;;;76381:17;76373:56;;;;-1:-1:-1;;;76373:56:0;;19293:2:1;76373:56:0;;;19275:21:1;19332:2;19312:18;;;19305:30;19371:28;19351:18;;;19344:56;19417:18;;76373:56:0;19091:350:1;76373:56:0;75417:4;76479:8;76462:14;31248:7;31439:13;-1:-1:-1;;31439:31:0;;31193:296;76462:14;:25;;;;:::i;:::-;:39;;76440:112;;;;-1:-1:-1;;;76440:112:0;;;;;;;:::i;:::-;76656:10;76565:9;76642:25;;;:13;:25;;;;;;76623:11;;76565:9;;;;76619:49;;76642:25;76619:49;:::i;:::-;76605:63;;76693:1;76683:7;:11;76679:185;;;76718:1;76711:8;;76679:185;;;76804:10;76752:12;76790:25;;;:13;:25;;;;;;76771:11;;76767:49;;76790:25;76767:49;:::i;:::-;76752:64;-1:-1:-1;;76679:185:0;76892:4;76880:8;:16;76876:278;;76931:15;76942:4;76931:8;:15;:::i;:::-;76921:5;;76920:27;;;;:::i;:::-;77004:10;76990:25;;;;:13;:25;;;;;;76913:34;;-1:-1:-1;76990:32:0;;77018:4;;76990:32;:::i;:::-;76976:10;76962:25;;;;:13;:25;;;;;:60;76876:278;;;77120:10;77062:1;77106:25;;;:13;:25;;;;;;77062:1;;-1:-1:-1;77106:36:0;;77134:8;;77106:36;:::i;:::-;77092:10;77078:25;;;;:13;:25;;;;;:64;76876:278;77187:4;77174:9;:17;;77166:50;;;;-1:-1:-1;;;77166:50:0;;14614:2:1;77166:50:0;;;14596:21:1;14653:2;14633:18;;;14626:30;-1:-1:-1;;;14672:18:1;;;14665:50;14732:18;;77166:50:0;14412:344:1;77166:50:0;77243:4;77231:9;:16;77227:95;;;77272:10;77264:46;77293:16;77305:4;77293:9;:16;:::i;:::-;77264:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77227:95;77334:27;77340:10;77352:8;77334:5;:27::i;12632:201::-;11612:13;:11;:13::i;:::-;-1:-1:-1;;;;;12721:22:0;::::1;12713:73;;;::::0;-1:-1:-1;;;12713:73:0;;19648:2:1;12713:73:0::1;::::0;::::1;19630:21:1::0;19687:2;19667:18;;;19660:30;19726:34;19706:18;;;19699:62;-1:-1:-1;;;19777:18:1;;;19770:36;19823:19;;12713:73:0::1;19446:402:1::0;12713:73:0::1;12797:28;12816:8;12797:18;:28::i;81835:91::-:0;11612:13;:11;:13::i;:::-;81898:10:::1;:20:::0;;-1:-1:-1;;81898:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;81835:91::o;52532:2966::-;52605:20;52628:13;;;52656;;;52652:44;;52678:18;;-1:-1:-1;;;52678:18:0;;;;;;;;;;;52652:44;-1:-1:-1;;;;;53184:22:0;;;;;;:18;:22;;;;26253:2;53184:22;;;:71;;53222:32;53210:45;;53184:71;;;53498:31;;;:17;:31;;;;;-1:-1:-1;40234:15:0;;40208:24;40204:46;39803:11;39778:23;39774:41;39771:52;39761:63;;53498:173;;53733:23;;;;53498:31;;53184:22;;54498:25;53184:22;;54351:335;55012:1;54998:12;54994:20;54952:346;55053:3;55044:7;55041:16;54952:346;;55271:7;55261:8;55258:1;55231:25;55228:1;55225;55220:59;55106:1;55093:15;54952:346;;;54956:77;55331:8;55343:1;55331:13;55327:45;;55353:19;;-1:-1:-1;;;55353:19:0;;;;;;;;;;;55327:45;55389:13;:19;-1:-1:-1;48072:193:0;;;:::o;42883:282::-;42948:4;43004:7;83770:1;42985:26;;:66;;;;;43038:13;;43028:7;:23;42985:66;:153;;;;-1:-1:-1;;43089:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;43089:44:0;:49;;42883:282::o;37569:1275::-;37636:7;37671;;83770:1;37720:23;37716:1061;;37773:13;;37766:4;:20;37762:1015;;;37811:14;37828:23;;;:17;:23;;;;;;;-1:-1:-1;;;37917:24:0;;:29;;37913:845;;38582:113;38589:6;38599:1;38589:11;38582:113;;-1:-1:-1;;;38660:6:0;38642:25;;;;:17;:25;;;;;;38582:113;;37913:845;37788:989;37762:1015;38805:31;;-1:-1:-1;;;38805:31:0;;;;;;;;;;;11891:132;11799:6;;-1:-1:-1;;;;;11799:6:0;65278:10;11955:23;11947:68;;;;-1:-1:-1;;;11947:68:0;;20055:2:1;11947:68:0;;;20037:21:1;;;20074:18;;;20067:30;20133:34;20113:18;;;20106:62;20185:18;;11947:68:0;19853:356:1;12993:191:0;13086:6;;;-1:-1:-1;;;;;13103:17:0;;;-1:-1:-1;;;;;;13103:17:0;;;;;;;13136:40;;13086:6;;;13103:17;13086:6;;13136:40;;13067:16;;13136:40;13056:128;12993:191;:::o;37017:161::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37145:24:0;;;;:17;:24;;;;;;37126:44;;:18;:44::i;51354:716::-;51538:88;;-1:-1:-1;;;51538:88:0;;51517:4;;-1:-1:-1;;;;;51538:45:0;;;;;:88;;65278:10;;51605:4;;51611:7;;51620:5;;51538:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51538:88:0;;;;;;;;-1:-1:-1;;51538:88:0;;;;;;;;;;;;:::i;:::-;;;51534:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51821:6;:13;51838:1;51821:18;51817:235;;51867:40;;-1:-1:-1;;;51867:40:0;;;;;;;;;;;51817:235;52010:6;52004:13;51995:6;51991:2;51987:15;51980:38;51534:529;-1:-1:-1;;;;;;51697:64:0;-1:-1:-1;;;51697:64:0;;-1:-1:-1;51354:716:0;;;;;;:::o;1259:190::-;1384:4;1437;1408:25;1421:5;1428:4;1408:12;:25::i;:::-;:33;;1259:190;-1:-1:-1;;;;1259:190:0:o;36755:166::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36866:47:0;36885:27;36904:7;36885:18;:27::i;:::-;36866:18;:47::i;65398:1745::-;65463:17;65897:4;65890;65884:11;65880:22;65989:1;65983:4;65976:15;66064:4;66061:1;66057:12;66050:19;;;66146:1;66141:3;66134:14;66250:3;66489:5;66471:428;66537:1;66532:3;66528:11;66521:18;;66708:2;66702:4;66698:13;66694:2;66690:22;66685:3;66677:36;66802:2;66792:13;;66859:25;66471:428;66859:25;-1:-1:-1;66929:13:0;;;-1:-1:-1;;67044:14:0;;;67106:19;;;67044:14;65398:1745;-1:-1:-1;65398:1745:0:o;38943:366::-;-1:-1:-1;;;;;;;;;;;;;39053:41:0;;;;26774:3;39139:33;;;-1:-1:-1;;;;;39105:68:0;-1:-1:-1;;;39105:68:0;-1:-1:-1;;;39203:24:0;;:29;;-1:-1:-1;;;39184:48:0;;;;27295:3;39272:28;;;;-1:-1:-1;;;39243:58:0;-1:-1:-1;38943:366:0:o;2126:296::-;2209:7;2252:4;2209:7;2267:118;2291:5;:12;2287:1;:16;2267:118;;;2340:33;2350:12;2364:5;2370:1;2364:8;;;;;;;;:::i;:::-;;;;;;;2340:9;:33::i;:::-;2325:48;-1:-1:-1;2305:3:0;;;;:::i;:::-;;;;2267:118;;;-1:-1:-1;2402:12:0;2126:296;-1:-1:-1;;;2126:296:0:o;9166:149::-;9229:7;9260:1;9256;:5;:51;;9391:13;9485:15;;;9521:4;9514:15;;;9568:4;9552:21;;9256:51;;;9391:13;9485:15;;;9521:4;9514:15;;;9568:4;9552:21;;9264:20;9323:268;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:127::-;653:10;648:3;644:20;641:1;634:31;684:4;681:1;674:15;708:4;705:1;698:15;724:275;795:2;789:9;860:2;841:13;;-1:-1:-1;;837:27:1;825:40;;-1:-1:-1;;;;;880:34:1;;916:22;;;877:62;874:88;;;942:18;;:::i;:::-;978:2;971:22;724:275;;-1:-1:-1;724:275:1:o;1004:712::-;1058:5;1111:3;1104:4;1096:6;1092:17;1088:27;1078:55;;1129:1;1126;1119:12;1078:55;1165:6;1152:20;1191:4;-1:-1:-1;;;;;1210:2:1;1207:26;1204:52;;;1236:18;;:::i;:::-;1282:2;1279:1;1275:10;1305:28;1329:2;1325;1321:11;1305:28;:::i;:::-;1367:15;;;1437;;;1433:24;;;1398:12;;;;1469:15;;;1466:35;;;1497:1;1494;1487:12;1466:35;1533:2;1525:6;1521:15;1510:26;;1545:142;1561:6;1556:3;1553:15;1545:142;;;1627:17;;1615:30;;1578:12;;;;1665;;;;1545:142;;;1705:5;1004:712;-1:-1:-1;;;;;;;1004:712:1:o;1721:416::-;1814:6;1822;1875:2;1863:9;1854:7;1850:23;1846:32;1843:52;;;1891:1;1888;1881:12;1843:52;1927:9;1914:23;1904:33;;1988:2;1977:9;1973:18;1960:32;-1:-1:-1;;;;;2007:6:1;2004:30;2001:50;;;2047:1;2044;2037:12;2001:50;2070:61;2123:7;2114:6;2103:9;2099:22;2070:61;:::i;:::-;2060:71;;;1721:416;;;;;:::o;2142:250::-;2227:1;2237:113;2251:6;2248:1;2245:13;2237:113;;;2327:11;;;2321:18;2308:11;;;2301:39;2273:2;2266:10;2237:113;;;-1:-1:-1;;2384:1:1;2366:16;;2359:27;2142:250::o;2397:271::-;2439:3;2477:5;2471:12;2504:6;2499:3;2492:19;2520:76;2589:6;2582:4;2577:3;2573:14;2566:4;2559:5;2555:16;2520:76;:::i;:::-;2650:2;2629:15;-1:-1:-1;;2625:29:1;2616:39;;;;2657:4;2612:50;;2397:271;-1:-1:-1;;2397:271:1:o;2673:220::-;2822:2;2811:9;2804:21;2785:4;2842:45;2883:2;2872:9;2868:18;2860:6;2842:45;:::i;2898:180::-;2957:6;3010:2;2998:9;2989:7;2985:23;2981:32;2978:52;;;3026:1;3023;3016:12;2978:52;-1:-1:-1;3049:23:1;;2898:180;-1:-1:-1;2898:180:1:o;3291:173::-;3359:20;;-1:-1:-1;;;;;3408:31:1;;3398:42;;3388:70;;3454:1;3451;3444:12;3388:70;3291:173;;;:::o;3469:254::-;3537:6;3545;3598:2;3586:9;3577:7;3573:23;3569:32;3566:52;;;3614:1;3611;3604:12;3566:52;3637:29;3656:9;3637:29;:::i;:::-;3627:39;3713:2;3698:18;;;;3685:32;;-1:-1:-1;;;3469:254:1:o;3910:186::-;3969:6;4022:2;4010:9;4001:7;3997:23;3993:32;3990:52;;;4038:1;4035;4028:12;3990:52;4061:29;4080:9;4061:29;:::i;4101:328::-;4178:6;4186;4194;4247:2;4235:9;4226:7;4222:23;4218:32;4215:52;;;4263:1;4260;4253:12;4215:52;4286:29;4305:9;4286:29;:::i;:::-;4276:39;;4334:38;4368:2;4357:9;4353:18;4334:38;:::i;:::-;4324:48;;4419:2;4408:9;4404:18;4391:32;4381:42;;4101:328;;;;;:::o;4616:615::-;4702:6;4710;4763:2;4751:9;4742:7;4738:23;4734:32;4731:52;;;4779:1;4776;4769:12;4731:52;4819:9;4806:23;-1:-1:-1;;;;;4889:2:1;4881:6;4878:14;4875:34;;;4905:1;4902;4895:12;4875:34;4943:6;4932:9;4928:22;4918:32;;4988:7;4981:4;4977:2;4973:13;4969:27;4959:55;;5010:1;5007;5000:12;4959:55;5050:2;5037:16;5076:2;5068:6;5065:14;5062:34;;;5092:1;5089;5082:12;5062:34;5145:7;5140:2;5130:6;5127:1;5123:14;5119:2;5115:23;5111:32;5108:45;5105:65;;;5166:1;5163;5156:12;5105:65;5197:2;5189:11;;;;;5219:6;;-1:-1:-1;4616:615:1;;-1:-1:-1;;;;4616:615:1:o;5236:349::-;5320:12;;-1:-1:-1;;;;;5316:38:1;5304:51;;5408:4;5397:16;;;5391:23;-1:-1:-1;;;;;5387:48:1;5371:14;;;5364:72;5499:4;5488:16;;;5482:23;5475:31;5468:39;5452:14;;;5445:63;5561:4;5550:16;;;5544:23;5569:8;5540:38;5524:14;;5517:62;5236:349::o;5590:722::-;5823:2;5875:21;;;5945:13;;5848:18;;;5967:22;;;5794:4;;5823:2;6046:15;;;;6020:2;6005:18;;;5794:4;6089:197;6103:6;6100:1;6097:13;6089:197;;;6152:52;6200:3;6191:6;6185:13;6152:52;:::i;:::-;6261:15;;;;6233:4;6224:14;;;;;6125:1;6118:9;6089:197;;6317:632;6488:2;6540:21;;;6610:13;;6513:18;;;6632:22;;;6459:4;;6488:2;6711:15;;;;6685:2;6670:18;;;6459:4;6754:169;6768:6;6765:1;6762:13;6754:169;;;6829:13;;6817:26;;6898:15;;;;6863:12;;;;6790:1;6783:9;6754:169;;6954:322;7031:6;7039;7047;7100:2;7088:9;7079:7;7075:23;7071:32;7068:52;;;7116:1;7113;7106:12;7068:52;7139:29;7158:9;7139:29;:::i;:::-;7129:39;7215:2;7200:18;;7187:32;;-1:-1:-1;7266:2:1;7251:18;;;7238:32;;6954:322;-1:-1:-1;;;6954:322:1:o;7281:160::-;7346:20;;7402:13;;7395:21;7385:32;;7375:60;;7431:1;7428;7421:12;7446:254;7511:6;7519;7572:2;7560:9;7551:7;7547:23;7543:32;7540:52;;;7588:1;7585;7578:12;7540:52;7611:29;7630:9;7611:29;:::i;:::-;7601:39;;7659:35;7690:2;7679:9;7675:18;7659:35;:::i;:::-;7649:45;;7446:254;;;;;:::o;7705:980::-;7800:6;7808;7816;7824;7877:3;7865:9;7856:7;7852:23;7848:33;7845:53;;;7894:1;7891;7884:12;7845:53;7917:29;7936:9;7917:29;:::i;:::-;7907:39;;7965:2;7986:38;8020:2;8009:9;8005:18;7986:38;:::i;:::-;7976:48;;8071:2;8060:9;8056:18;8043:32;8033:42;;8126:2;8115:9;8111:18;8098:32;-1:-1:-1;;;;;8190:2:1;8182:6;8179:14;8176:34;;;8206:1;8203;8196:12;8176:34;8244:6;8233:9;8229:22;8219:32;;8289:7;8282:4;8278:2;8274:13;8270:27;8260:55;;8311:1;8308;8301:12;8260:55;8347:2;8334:16;8369:2;8365;8362:10;8359:36;;;8375:18;;:::i;:::-;8417:53;8460:2;8441:13;;-1:-1:-1;;8437:27:1;8433:36;;8417:53;:::i;:::-;8404:66;;8493:2;8486:5;8479:17;8533:7;8528:2;8523;8519;8515:11;8511:20;8508:33;8505:53;;;8554:1;8551;8544:12;8505:53;8609:2;8604;8600;8596:11;8591:2;8584:5;8580:14;8567:45;8653:1;8648:2;8643;8636:5;8632:14;8628:23;8621:34;;8674:5;8664:15;;;;;7705:980;;;;;;;:::o;8690:416::-;8783:6;8791;8844:2;8832:9;8823:7;8819:23;8815:32;8812:52;;;8860:1;8857;8850:12;8812:52;8900:9;8887:23;-1:-1:-1;;;;;8925:6:1;8922:30;8919:50;;;8965:1;8962;8955:12;8919:50;8988:61;9041:7;9032:6;9021:9;9017:22;8988:61;:::i;:::-;8978:71;9096:2;9081:18;;;;9068:32;;-1:-1:-1;;;;8690:416:1:o;9111:254::-;9179:6;9187;9240:2;9228:9;9219:7;9215:23;9211:32;9208:52;;;9256:1;9253;9246:12;9208:52;9292:9;9279:23;9269:33;;9321:38;9355:2;9344:9;9340:18;9321:38;:::i;9370:348::-;9422:8;9432:6;9486:3;9479:4;9471:6;9467:17;9463:27;9453:55;;9504:1;9501;9494:12;9453:55;-1:-1:-1;9527:20:1;;-1:-1:-1;;;;;9559:30:1;;9556:50;;;9602:1;9599;9592:12;9556:50;9639:4;9631:6;9627:17;9615:29;;9691:3;9684:4;9675:6;9667;9663:19;9659:30;9656:39;9653:59;;;9708:1;9705;9698:12;9653:59;9370:348;;;;;:::o;9723:721::-;9815:6;9823;9831;9839;9892:2;9880:9;9871:7;9867:23;9863:32;9860:52;;;9908:1;9905;9898:12;9860:52;9948:9;9935:23;-1:-1:-1;;;;;10018:2:1;10010:6;10007:14;10004:34;;;10034:1;10031;10024:12;10004:34;10073:59;10124:7;10115:6;10104:9;10100:22;10073:59;:::i;:::-;10151:8;;-1:-1:-1;10047:85:1;-1:-1:-1;10239:2:1;10224:18;;10211:32;;-1:-1:-1;10255:16:1;;;10252:36;;;10284:1;10281;10274:12;10252:36;;10323:61;10376:7;10365:8;10354:9;10350:24;10323:61;:::i;:::-;9723:721;;;;-1:-1:-1;10403:8:1;-1:-1:-1;;;;9723:721:1:o;10449:266::-;10645:3;10630:19;;10658:51;10634:9;10691:6;10658:51;:::i;10720:180::-;10776:6;10829:2;10817:9;10808:7;10804:23;10800:32;10797:52;;;10845:1;10842;10835:12;10797:52;10868:26;10884:9;10868:26;:::i;11085:260::-;11153:6;11161;11214:2;11202:9;11193:7;11189:23;11185:32;11182:52;;;11230:1;11227;11220:12;11182:52;11253:29;11272:9;11253:29;:::i;:::-;11243:39;;11301:38;11335:2;11324:9;11320:18;11301:38;:::i;11350:248::-;11418:6;11426;11479:2;11467:9;11458:7;11454:23;11450:32;11447:52;;;11495:1;11492;11485:12;11447:52;-1:-1:-1;;11518:23:1;;;11588:2;11573:18;;;11560:32;;-1:-1:-1;11350:248:1:o;13287:127::-;13348:10;13343:3;13339:20;13336:1;13329:31;13379:4;13376:1;13369:15;13403:4;13400:1;13393:15;13419:125;13484:9;;;13505:10;;;13502:36;;;13518:18;;:::i;13549:347::-;13751:2;13733:21;;;13790:2;13770:18;;;13763:30;13829:25;13824:2;13809:18;;13802:53;13887:2;13872:18;;13549:347::o;13901:200::-;13967:9;;;13940:4;13995:9;;14023:10;;14035:12;;;14019:29;14058:12;;;14050:21;;14016:56;14013:82;;;14075:18;;:::i;:::-;14013:82;13901:200;;;;:::o;14106:128::-;14173:9;;;14194:11;;;14191:37;;;14208:18;;:::i;14239:168::-;14312:9;;;14343;;14360:15;;;14354:22;;14340:37;14330:71;;14381:18;;:::i;14761:380::-;14840:1;14836:12;;;;14883;;;14904:61;;14958:4;14950:6;14946:17;14936:27;;14904:61;15011:2;15003:6;15000:14;14980:18;14977:38;14974:161;;15057:10;15052:3;15048:20;15045:1;15038:31;15092:4;15089:1;15082:15;15120:4;15117:1;15110:15;15700:127;15761:10;15756:3;15752:20;15749:1;15742:31;15792:4;15789:1;15782:15;15816:4;15813:1;15806:15;15958:545;16060:2;16055:3;16052:11;16049:448;;;16096:1;16121:5;16117:2;16110:17;16166:4;16162:2;16152:19;16236:2;16224:10;16220:19;16217:1;16213:27;16207:4;16203:38;16272:4;16260:10;16257:20;16254:47;;;-1:-1:-1;16295:4:1;16254:47;16350:2;16345:3;16341:12;16338:1;16334:20;16328:4;16324:31;16314:41;;16405:82;16423:2;16416:5;16413:13;16405:82;;;16468:17;;;16449:1;16438:13;16405:82;;16679:1206;-1:-1:-1;;;;;16798:3:1;16795:27;16792:53;;;16825:18;;:::i;:::-;16854:94;16944:3;16904:38;16936:4;16930:11;16904:38;:::i;:::-;16898:4;16854:94;:::i;:::-;16974:1;16999:2;16994:3;16991:11;17016:1;17011:616;;;;17671:1;17688:3;17685:93;;;-1:-1:-1;17744:19:1;;;17731:33;17685:93;-1:-1:-1;;16636:1:1;16632:11;;;16628:24;16624:29;16614:40;16660:1;16656:11;;;16611:57;17791:78;;16984:895;;17011:616;15905:1;15898:14;;;15942:4;15929:18;;-1:-1:-1;;17047:17:1;;;17148:9;17170:229;17184:7;17181:1;17178:14;17170:229;;;17273:19;;;17260:33;17245:49;;17380:4;17365:20;;;;17333:1;17321:14;;;;17200:12;17170:229;;;17174:3;17427;17418:7;17415:16;17412:159;;;17551:1;17547:6;17541:3;17535;17532:1;17528:11;17524:21;17520:34;17516:39;17503:9;17498:3;17494:19;17481:33;17477:79;17469:6;17462:95;17412:159;;;17614:1;17608:3;17605:1;17601:11;17597:19;17591:4;17584:33;16984:895;;16679:1206;;;:::o;17890:722::-;17940:3;17981:5;17975:12;18010:36;18036:9;18010:36;:::i;:::-;18065:1;18082:18;;;18109:133;;;;18256:1;18251:355;;;;18075:531;;18109:133;-1:-1:-1;;18142:24:1;;18130:37;;18215:14;;18208:22;18196:35;;18187:45;;;-1:-1:-1;18109:133:1;;18251:355;18282:5;18279:1;18272:16;18311:4;18356:2;18353:1;18343:16;18381:1;18395:165;18409:6;18406:1;18403:13;18395:165;;;18487:14;;18474:11;;;18467:35;18530:16;;;;18424:10;;18395:165;;;18399:3;;;18589:6;18584:3;18580:16;18573:23;;18075:531;;;;;17890:722;;;;:::o;18617:469::-;18838:3;18866:38;18900:3;18892:6;18866:38;:::i;:::-;18933:6;18927:13;18949:65;19007:6;19003:2;18996:4;18988:6;18984:17;18949:65;:::i;:::-;19030:50;19072:6;19068:2;19064:15;19056:6;19030:50;:::i;20214:489::-;-1:-1:-1;;;;;20483:15:1;;;20465:34;;20535:15;;20530:2;20515:18;;20508:43;20582:2;20567:18;;20560:34;;;20630:3;20625:2;20610:18;;20603:31;;;20408:4;;20651:46;;20677:19;;20669:6;20651:46;:::i;:::-;20643:54;20214:489;-1:-1:-1;;;;;;20214:489:1:o;20708:249::-;20777:6;20830:2;20818:9;20809:7;20805:23;20801:32;20798:52;;;20846:1;20843;20836:12;20798:52;20878:9;20872:16;20897:30;20921:5;20897:30;:::i;20962:135::-;21001:3;21022:17;;;21019:43;;21042:18;;:::i;:::-;-1:-1:-1;21089:1:1;21078:13;;20962:135::o
Swarm Source
ipfs://41b1702c5df631ac3ba84f8f77048fe976851c53c40a607e05796fdc0f5ce388
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.