ETH Price: $3,151.97 (+1.64%)

Token

Void Cell (VC)
 

Overview

Max Total Supply

888 VC

Holders

145

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 VC
0x34eeab4837a5870762c8d1d985b4c01f75a87aab
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
VoidCell

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-28
*/

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: 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;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @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/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @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.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: contracts/demoncel.sol


pragma solidity ^0.8.0;







contract VoidCell is Ownable, ERC721Enumerable, Pausable {
    using Strings for uint256;
    using SafeMath for uint256;

    string private baseURL = 'https://metadata.idamura.xyz/demoncell';
    uint256 private totalDemoncell;
    uint256 public totalClaim;
    uint256 public maxForClaim;
    address public iramuraNFT;

    mapping(address => bool) public whitelistedVoid;
    
    modifier iramuraBurn() {
        require(msg.sender == iramuraNFT,"Only Iramura NFT Can Burn");
        _;
    }

    modifier onlyWhitelisted() {
        require(whitelistedVoid[msg.sender], "You aren't in the whitelist");
        _;
    }

    constructor(address _iramuraNFT) ERC721("Void Cell","VC") {
        iramuraNFT = _iramuraNFT;
        maxForClaim = 600;
    }

    function mint() external onlyWhitelisted {
        require(totalClaim < maxForClaim,"Full slot");
        require(ERC721(iramuraNFT).balanceOf(msg.sender) >0, "You must have waifu.");
        totalClaim++;
        totalDemoncell++;
        _safeMint(msg.sender, totalDemoncell);
        whitelistedVoid[msg.sender] = false;
    }

    function airdrop(address[] calldata users, uint256[] calldata amounts) external onlyOwner {
        require(users.length == amounts.length,"Wrong Input");
        uint256 temp = totalDemoncell;
        for(uint i=0; i< users.length; i++) {
            for(uint256 j=1; j <= amounts[i]; j++ ) {
                temp++;
                if(temp <= 2222){
                    _safeMint(users[i], temp);
                }
            }
        }
        totalDemoncell = temp;
    }

    function mintTreasury(uint256 amount) external onlyOwner {
        uint256 temp = totalDemoncell;
        for(uint256 i=1; i <= amount; i++ ) {
            temp++;
            if(temp <= 2222){
                _safeMint(msg.sender, temp);
            }
        }
        totalDemoncell = temp;
    }

    function _baseURI() internal view override returns (string memory) {
        return baseURL;
    }

    function burn(uint256 tokenId) external iramuraBurn {
        _burn(tokenId);
    }

    function setBaseURI(string memory _uri) external onlyOwner {
        baseURL = _uri;
    }

    function tokenURI(uint256 tokenId)
    public
    view
    override
    returns (string memory)
    {
        return string(abi.encodePacked(_baseURI(), tokenId.toString()));
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from,to,tokenId);
    }

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._afterTokenTransfer(from,to,tokenId);
    }

    function pause() external onlyOwner whenNotPaused {
        _pause();
    }

    function unpause() external onlyOwner whenPaused {
        _unpause();
    }

    function addWhitelisteVoid(address[] calldata list) external onlyOwner {
        for(uint i =0; i < list.length ; i ++) {
            whitelistedVoid[list[i]] = true;
        }
    }

    fallback() external {}

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_iramuraNFT","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[{"internalType":"address[]","name":"list","type":"address[]"}],"name":"addWhitelisteVoid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"iramuraNFT","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":[],"name":"maxForClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaim","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedVoid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60e060405260266080818152906200244860a03980516200002991600c9160209091019062000169565b503480156200003757600080fd5b506040516200246e3803806200246e8339810160408190526200005a916200020f565b60405180604001604052806009815260200168159bda590810d95b1b60ba1b81525060405180604001604052806002815260200161564360f01b815250620000b1620000ab6200011560201b60201c565b62000119565b8151620000c690600190602085019062000169565b508051620000dc90600290602084019062000169565b5050600b805460ff1916905550601080546001600160a01b0319166001600160a01b0392909216919091179055610258600f556200027e565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620001779062000241565b90600052602060002090601f0160209004810192826200019b5760008555620001e6565b82601f10620001b657805160ff1916838001178555620001e6565b82800160010185558215620001e6579182015b82811115620001e6578251825591602001919060010190620001c9565b50620001f4929150620001f8565b5090565b5b80821115620001f45760008155600101620001f9565b6000602082840312156200022257600080fd5b81516001600160a01b03811681146200023a57600080fd5b9392505050565b600181811c908216806200025657607f821691505b602082108114156200027857634e487b7160e01b600052602260045260246000fd5b50919050565b6121ba806200028e6000396000f3fe608060405234801561001057600080fd5b50600436106101db5760003560e01c80636724348211610103578063b439ac741161009c578063cf6ffb5b1161006e578063cf6ffb5b146103e4578063e1d15c9b146103f7578063e985e9c514610400578063f2fde38b1461043c57005b8063b439ac7414610398578063b88d4fde146103ab578063bc64f38a146103be578063c87b56dd146103d157005b80638da5cb5b116100d55780638da5cb5b1461034957806395d89b411461035a5780639b1eee0a14610362578063a22cb4651461038557005b8063672434821461031357806370a0823114610326578063715018a6146103395780638456cb591461034157005b80633f4ba83a11610175578063547d186411610147578063547d1864146102d957806355f804b3146102e25780635c975abb146102f55780636352211e1461030057005b80633f4ba83a1461029857806342842e0e146102a057806342966c68146102b35780634f6ccce7146102c657005b80631249c58b116101ae5780631249c58b1461025857806318160ddd1461026057806323b872dd146102725780632f745c591461028557005b806301ffc9a7146101dd57806306fdde0314610205578063081812fc1461021a578063095ea7b314610245575b005b6101f06101eb366004611e27565b61044f565b60405190151581526020015b60405180910390f35b61020d61047a565b6040516101fc9190611f74565b61022d610228366004611eaa565b61050c565b6040516001600160a01b0390911681526020016101fc565b6101db610253366004611d4f565b610533565b6101db61064e565b6009545b6040519081526020016101fc565b6101db610280366004611c5b565b6107fb565b610264610293366004611d4f565b61082c565b6101db6108c2565b6101db6102ae366004611c5b565b6108dc565b6101db6102c1366004611eaa565b6108f7565b6102646102d4366004611eaa565b61095d565b610264600e5481565b6101db6102f0366004611e61565b6109f0565b600b5460ff166101f0565b61022d61030e366004611eaa565b610a0f565b6101db610321366004611dbb565b610a6f565b610264610334366004611c06565b610b59565b6101db610bdf565b6101db610bf1565b6000546001600160a01b031661022d565b61020d610c09565b6101f0610370366004611c06565b60116020526000908152604090205460ff1681565b6101db610393366004611d13565b610c18565b6101db6103a6366004611eaa565b610c23565b6101db6103b9366004611c97565b610c71565b6101db6103cc366004611d79565b610ca9565b61020d6103df366004611eaa565b610d23565b60105461022d906001600160a01b031681565b610264600f5481565b6101f061040e366004611c28565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6101db61044a366004611c06565b610d5d565b60006001600160e01b0319821663780e9d6360e01b1480610474575061047482610dd3565b92915050565b60606001805461048990612096565b80601f01602080910402602001604051908101604052809291908181526020018280546104b590612096565b80156105025780601f106104d757610100808354040283529160200191610502565b820191906000526020600020905b8154815290600101906020018083116104e557829003601f168201915b5050505050905090565b600061051782610e23565b506000908152600560205260409020546001600160a01b031690565b600061053e82610a0f565b9050806001600160a01b0316836001600160a01b031614156105b15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806105cd57506105cd813361040e565b61063f5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016105a8565b6106498383610e82565b505050565b3360009081526011602052604090205460ff166106ad5760405162461bcd60e51b815260206004820152601b60248201527f596f75206172656e277420696e207468652077686974656c697374000000000060448201526064016105a8565b600f54600e54106106ec5760405162461bcd60e51b8152602060048201526009602482015268119d5b1b081cdb1bdd60ba1b60448201526064016105a8565b6010546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190611ec3565b116107ac5760405162461bcd60e51b81526020600482015260146024820152732cb7ba9036bab9ba103430bb32903bb0b4b33a9760611b60448201526064016105a8565b600e80549060006107bc836120d1565b9091555050600d80549060006107d1836120d1565b91905055506107e233600d54610ef0565b336000908152601160205260409020805460ff19169055565b6108053382610f0a565b6108215760405162461bcd60e51b81526004016105a890611fd9565b610649838383610f89565b600061083783610b59565b82106108995760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105a8565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6108ca611130565b6108d261118a565b6108da6111d3565b565b61064983838360405180602001604052806000815250610c71565b6010546001600160a01b031633146109515760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79204972616d757261204e46542043616e204275726e0000000000000060448201526064016105a8565b61095a81611225565b50565b600061096860095490565b82106109cb5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105a8565b600982815481106109de576109de612142565b90600052602060002001549050919050565b6109f8611130565b8051610a0b90600c906020840190611a8f565b5050565b6000818152600360205260408120546001600160a01b0316806104745760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105a8565b610a77611130565b828114610ab45760405162461bcd60e51b815260206004820152600b60248201526a15dc9bdb99c8125b9c1d5d60aa1b60448201526064016105a8565b600d5460005b84811015610b4f5760015b848483818110610ad757610ad7612142565b905060200201358111610b3c5782610aee816120d1565b9350506108ae8311610b2a57610b2a878784818110610b0f57610b0f612142565b9050602002016020810190610b249190611c06565b84610ef0565b80610b34816120d1565b915050610ac5565b5080610b47816120d1565b915050610aba565b50600d5550505050565b60006001600160a01b038216610bc35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016105a8565b506001600160a01b031660009081526004602052604090205490565b610be7611130565b6108da60006112cc565b610bf9611130565b610c0161131c565b6108da611362565b60606002805461048990612096565b610a0b33838361139f565b610c2b611130565b600d5460015b828111610c6a5781610c42816120d1565b9250506108ae8211610c5857610c583383610ef0565b80610c62816120d1565b915050610c31565b50600d5550565b610c7b3383610f0a565b610c975760405162461bcd60e51b81526004016105a890611fd9565b610ca38484848461146e565b50505050565b610cb1611130565b60005b8181101561064957600160116000858585818110610cd457610cd4612142565b9050602002016020810190610ce99190611c06565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d1b816120d1565b915050610cb4565b6060610d2d6114a1565b610d36836114b0565b604051602001610d47929190611f08565b6040516020818303038152906040529050919050565b610d65611130565b6001600160a01b038116610dca5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105a8565b61095a816112cc565b60006001600160e01b031982166380ac58cd60e01b1480610e0457506001600160e01b03198216635b5e139f60e01b145b8061047457506301ffc9a760e01b6001600160e01b0319831614610474565b6000818152600360205260409020546001600160a01b031661095a5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105a8565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610eb782610a0f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610a0b8282604051806020016040528060008152506115ae565b600080610f1683610a0f565b9050806001600160a01b0316846001600160a01b03161480610f5d57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80610f815750836001600160a01b0316610f768461050c565b6001600160a01b0316145b949350505050565b826001600160a01b0316610f9c82610a0f565b6001600160a01b0316146110005760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105a8565b6001600160a01b0382166110625760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105a8565b61106d8383836115e1565b611078600082610e82565b6001600160a01b03831660009081526004602052604081208054600192906110a1908490612053565b90915550506001600160a01b03821660009081526004602052604081208054600192906110cf908490612027565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000546001600160a01b031633146108da5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a8565b600b5460ff166108da5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105a8565b6111db61118a565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600061123082610a0f565b905061123e816000846115e1565b611249600083610e82565b6001600160a01b0381166000908152600460205260408120805460019290611272908490612053565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600b5460ff16156108da5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105a8565b61136a61131c565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112083390565b816001600160a01b0316836001600160a01b031614156114015760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105a8565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611479848484610f89565b611485848484846115ec565b610ca35760405162461bcd60e51b81526004016105a890611f87565b6060600c805461048990612096565b6060816114d45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156114fe57806114e8816120d1565b91506114f79050600a8361203f565b91506114d8565b60008167ffffffffffffffff81111561151957611519612158565b6040519080825280601f01601f191660200182016040528015611543576020820181803683370190505b5090505b8415610f8157611558600183612053565b9150611565600a866120ec565b611570906030612027565b60f81b81838151811061158557611585612142565b60200101906001600160f81b031916908160001a9053506115a7600a8661203f565b9450611547565b6115b883836116f9565b6115c560008484846115ec565b6106495760405162461bcd60e51b81526004016105a890611f87565b610649838383611847565b60006001600160a01b0384163b156116ee57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611630903390899088908890600401611f37565b602060405180830381600087803b15801561164a57600080fd5b505af192505050801561167a575060408051601f3d908101601f1916820190925261167791810190611e44565b60015b6116d4573d8080156116a8576040519150601f19603f3d011682016040523d82523d6000602084013e6116ad565b606091505b5080516116cc5760405162461bcd60e51b81526004016105a890611f87565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f81565b506001949350505050565b6001600160a01b03821661174f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105a8565b6000818152600360205260409020546001600160a01b0316156117b45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105a8565b6117c0600083836115e1565b6001600160a01b03821660009081526004602052604081208054600192906117e9908490612027565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0383166118a25761189d81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b6118c5565b816001600160a01b0316836001600160a01b0316146118c5576118c583826118ff565b6001600160a01b0382166118dc576106498161199c565b826001600160a01b0316826001600160a01b031614610649576106498282611a4b565b6000600161190c84610b59565b6119169190612053565b600083815260086020526040902054909150808214611969576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b6009546000906119ae90600190612053565b6000838152600a6020526040812054600980549394509092849081106119d6576119d6612142565b9060005260206000200154905080600983815481106119f7576119f7612142565b6000918252602080832090910192909255828152600a90915260408082208490558582528120556009805480611a2f57611a2f61212c565b6001900381819060005260206000200160009055905550505050565b6000611a5683610b59565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b828054611a9b90612096565b90600052602060002090601f016020900481019282611abd5760008555611b03565b82601f10611ad657805160ff1916838001178555611b03565b82800160010185558215611b03579182015b82811115611b03578251825591602001919060010190611ae8565b50611b0f929150611b13565b5090565b5b80821115611b0f5760008155600101611b14565b600067ffffffffffffffff80841115611b4357611b43612158565b604051601f8501601f19908116603f01168101908282118183101715611b6b57611b6b612158565b81604052809350858152868686011115611b8457600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611bb557600080fd5b919050565b60008083601f840112611bcc57600080fd5b50813567ffffffffffffffff811115611be457600080fd5b6020830191508360208260051b8501011115611bff57600080fd5b9250929050565b600060208284031215611c1857600080fd5b611c2182611b9e565b9392505050565b60008060408385031215611c3b57600080fd5b611c4483611b9e565b9150611c5260208401611b9e565b90509250929050565b600080600060608486031215611c7057600080fd5b611c7984611b9e565b9250611c8760208501611b9e565b9150604084013590509250925092565b60008060008060808587031215611cad57600080fd5b611cb685611b9e565b9350611cc460208601611b9e565b925060408501359150606085013567ffffffffffffffff811115611ce757600080fd5b8501601f81018713611cf857600080fd5b611d0787823560208401611b28565b91505092959194509250565b60008060408385031215611d2657600080fd5b611d2f83611b9e565b915060208301358015158114611d4457600080fd5b809150509250929050565b60008060408385031215611d6257600080fd5b611d6b83611b9e565b946020939093013593505050565b60008060208385031215611d8c57600080fd5b823567ffffffffffffffff811115611da357600080fd5b611daf85828601611bba565b90969095509350505050565b60008060008060408587031215611dd157600080fd5b843567ffffffffffffffff80821115611de957600080fd5b611df588838901611bba565b90965094506020870135915080821115611e0e57600080fd5b50611e1b87828801611bba565b95989497509550505050565b600060208284031215611e3957600080fd5b8135611c218161216e565b600060208284031215611e5657600080fd5b8151611c218161216e565b600060208284031215611e7357600080fd5b813567ffffffffffffffff811115611e8a57600080fd5b8201601f81018413611e9b57600080fd5b610f8184823560208401611b28565b600060208284031215611ebc57600080fd5b5035919050565b600060208284031215611ed557600080fd5b5051919050565b60008151808452611ef481602086016020860161206a565b601f01601f19169290920160200192915050565b60008351611f1a81846020880161206a565b835190830190611f2e81836020880161206a565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611f6a90830184611edc565b9695505050505050565b602081526000611c216020830184611edc565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6000821982111561203a5761203a612100565b500190565b60008261204e5761204e612116565b500490565b60008282101561206557612065612100565b500390565b60005b8381101561208557818101518382015260200161206d565b83811115610ca35750506000910152565b600181811c908216806120aa57607f821691505b602082108114156120cb57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156120e5576120e5612100565b5060010190565b6000826120fb576120fb612116565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461095a57600080fdfea2646970667358221220443fdb5da83b5ec047aefb65d71bcb16fa7277892bd9bf51265533e3f0f920f764736f6c6343000807003368747470733a2f2f6d657461646174612e6964616d7572612e78797a2f64656d6f6e63656c6c000000000000000000000000a91cc74cd5a42a29919e476afc569d1612ef6e99

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101db5760003560e01c80636724348211610103578063b439ac741161009c578063cf6ffb5b1161006e578063cf6ffb5b146103e4578063e1d15c9b146103f7578063e985e9c514610400578063f2fde38b1461043c57005b8063b439ac7414610398578063b88d4fde146103ab578063bc64f38a146103be578063c87b56dd146103d157005b80638da5cb5b116100d55780638da5cb5b1461034957806395d89b411461035a5780639b1eee0a14610362578063a22cb4651461038557005b8063672434821461031357806370a0823114610326578063715018a6146103395780638456cb591461034157005b80633f4ba83a11610175578063547d186411610147578063547d1864146102d957806355f804b3146102e25780635c975abb146102f55780636352211e1461030057005b80633f4ba83a1461029857806342842e0e146102a057806342966c68146102b35780634f6ccce7146102c657005b80631249c58b116101ae5780631249c58b1461025857806318160ddd1461026057806323b872dd146102725780632f745c591461028557005b806301ffc9a7146101dd57806306fdde0314610205578063081812fc1461021a578063095ea7b314610245575b005b6101f06101eb366004611e27565b61044f565b60405190151581526020015b60405180910390f35b61020d61047a565b6040516101fc9190611f74565b61022d610228366004611eaa565b61050c565b6040516001600160a01b0390911681526020016101fc565b6101db610253366004611d4f565b610533565b6101db61064e565b6009545b6040519081526020016101fc565b6101db610280366004611c5b565b6107fb565b610264610293366004611d4f565b61082c565b6101db6108c2565b6101db6102ae366004611c5b565b6108dc565b6101db6102c1366004611eaa565b6108f7565b6102646102d4366004611eaa565b61095d565b610264600e5481565b6101db6102f0366004611e61565b6109f0565b600b5460ff166101f0565b61022d61030e366004611eaa565b610a0f565b6101db610321366004611dbb565b610a6f565b610264610334366004611c06565b610b59565b6101db610bdf565b6101db610bf1565b6000546001600160a01b031661022d565b61020d610c09565b6101f0610370366004611c06565b60116020526000908152604090205460ff1681565b6101db610393366004611d13565b610c18565b6101db6103a6366004611eaa565b610c23565b6101db6103b9366004611c97565b610c71565b6101db6103cc366004611d79565b610ca9565b61020d6103df366004611eaa565b610d23565b60105461022d906001600160a01b031681565b610264600f5481565b6101f061040e366004611c28565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6101db61044a366004611c06565b610d5d565b60006001600160e01b0319821663780e9d6360e01b1480610474575061047482610dd3565b92915050565b60606001805461048990612096565b80601f01602080910402602001604051908101604052809291908181526020018280546104b590612096565b80156105025780601f106104d757610100808354040283529160200191610502565b820191906000526020600020905b8154815290600101906020018083116104e557829003601f168201915b5050505050905090565b600061051782610e23565b506000908152600560205260409020546001600160a01b031690565b600061053e82610a0f565b9050806001600160a01b0316836001600160a01b031614156105b15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806105cd57506105cd813361040e565b61063f5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016105a8565b6106498383610e82565b505050565b3360009081526011602052604090205460ff166106ad5760405162461bcd60e51b815260206004820152601b60248201527f596f75206172656e277420696e207468652077686974656c697374000000000060448201526064016105a8565b600f54600e54106106ec5760405162461bcd60e51b8152602060048201526009602482015268119d5b1b081cdb1bdd60ba1b60448201526064016105a8565b6010546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561073057600080fd5b505afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190611ec3565b116107ac5760405162461bcd60e51b81526020600482015260146024820152732cb7ba9036bab9ba103430bb32903bb0b4b33a9760611b60448201526064016105a8565b600e80549060006107bc836120d1565b9091555050600d80549060006107d1836120d1565b91905055506107e233600d54610ef0565b336000908152601160205260409020805460ff19169055565b6108053382610f0a565b6108215760405162461bcd60e51b81526004016105a890611fd9565b610649838383610f89565b600061083783610b59565b82106108995760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105a8565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6108ca611130565b6108d261118a565b6108da6111d3565b565b61064983838360405180602001604052806000815250610c71565b6010546001600160a01b031633146109515760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79204972616d757261204e46542043616e204275726e0000000000000060448201526064016105a8565b61095a81611225565b50565b600061096860095490565b82106109cb5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105a8565b600982815481106109de576109de612142565b90600052602060002001549050919050565b6109f8611130565b8051610a0b90600c906020840190611a8f565b5050565b6000818152600360205260408120546001600160a01b0316806104745760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105a8565b610a77611130565b828114610ab45760405162461bcd60e51b815260206004820152600b60248201526a15dc9bdb99c8125b9c1d5d60aa1b60448201526064016105a8565b600d5460005b84811015610b4f5760015b848483818110610ad757610ad7612142565b905060200201358111610b3c5782610aee816120d1565b9350506108ae8311610b2a57610b2a878784818110610b0f57610b0f612142565b9050602002016020810190610b249190611c06565b84610ef0565b80610b34816120d1565b915050610ac5565b5080610b47816120d1565b915050610aba565b50600d5550505050565b60006001600160a01b038216610bc35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016105a8565b506001600160a01b031660009081526004602052604090205490565b610be7611130565b6108da60006112cc565b610bf9611130565b610c0161131c565b6108da611362565b60606002805461048990612096565b610a0b33838361139f565b610c2b611130565b600d5460015b828111610c6a5781610c42816120d1565b9250506108ae8211610c5857610c583383610ef0565b80610c62816120d1565b915050610c31565b50600d5550565b610c7b3383610f0a565b610c975760405162461bcd60e51b81526004016105a890611fd9565b610ca38484848461146e565b50505050565b610cb1611130565b60005b8181101561064957600160116000858585818110610cd457610cd4612142565b9050602002016020810190610ce99190611c06565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d1b816120d1565b915050610cb4565b6060610d2d6114a1565b610d36836114b0565b604051602001610d47929190611f08565b6040516020818303038152906040529050919050565b610d65611130565b6001600160a01b038116610dca5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105a8565b61095a816112cc565b60006001600160e01b031982166380ac58cd60e01b1480610e0457506001600160e01b03198216635b5e139f60e01b145b8061047457506301ffc9a760e01b6001600160e01b0319831614610474565b6000818152600360205260409020546001600160a01b031661095a5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105a8565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610eb782610a0f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610a0b8282604051806020016040528060008152506115ae565b600080610f1683610a0f565b9050806001600160a01b0316846001600160a01b03161480610f5d57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80610f815750836001600160a01b0316610f768461050c565b6001600160a01b0316145b949350505050565b826001600160a01b0316610f9c82610a0f565b6001600160a01b0316146110005760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105a8565b6001600160a01b0382166110625760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105a8565b61106d8383836115e1565b611078600082610e82565b6001600160a01b03831660009081526004602052604081208054600192906110a1908490612053565b90915550506001600160a01b03821660009081526004602052604081208054600192906110cf908490612027565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000546001600160a01b031633146108da5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a8565b600b5460ff166108da5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105a8565b6111db61118a565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600061123082610a0f565b905061123e816000846115e1565b611249600083610e82565b6001600160a01b0381166000908152600460205260408120805460019290611272908490612053565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600b5460ff16156108da5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105a8565b61136a61131c565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112083390565b816001600160a01b0316836001600160a01b031614156114015760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105a8565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611479848484610f89565b611485848484846115ec565b610ca35760405162461bcd60e51b81526004016105a890611f87565b6060600c805461048990612096565b6060816114d45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156114fe57806114e8816120d1565b91506114f79050600a8361203f565b91506114d8565b60008167ffffffffffffffff81111561151957611519612158565b6040519080825280601f01601f191660200182016040528015611543576020820181803683370190505b5090505b8415610f8157611558600183612053565b9150611565600a866120ec565b611570906030612027565b60f81b81838151811061158557611585612142565b60200101906001600160f81b031916908160001a9053506115a7600a8661203f565b9450611547565b6115b883836116f9565b6115c560008484846115ec565b6106495760405162461bcd60e51b81526004016105a890611f87565b610649838383611847565b60006001600160a01b0384163b156116ee57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611630903390899088908890600401611f37565b602060405180830381600087803b15801561164a57600080fd5b505af192505050801561167a575060408051601f3d908101601f1916820190925261167791810190611e44565b60015b6116d4573d8080156116a8576040519150601f19603f3d011682016040523d82523d6000602084013e6116ad565b606091505b5080516116cc5760405162461bcd60e51b81526004016105a890611f87565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f81565b506001949350505050565b6001600160a01b03821661174f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105a8565b6000818152600360205260409020546001600160a01b0316156117b45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105a8565b6117c0600083836115e1565b6001600160a01b03821660009081526004602052604081208054600192906117e9908490612027565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0383166118a25761189d81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b6118c5565b816001600160a01b0316836001600160a01b0316146118c5576118c583826118ff565b6001600160a01b0382166118dc576106498161199c565b826001600160a01b0316826001600160a01b031614610649576106498282611a4b565b6000600161190c84610b59565b6119169190612053565b600083815260086020526040902054909150808214611969576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b6009546000906119ae90600190612053565b6000838152600a6020526040812054600980549394509092849081106119d6576119d6612142565b9060005260206000200154905080600983815481106119f7576119f7612142565b6000918252602080832090910192909255828152600a90915260408082208490558582528120556009805480611a2f57611a2f61212c565b6001900381819060005260206000200160009055905550505050565b6000611a5683610b59565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b828054611a9b90612096565b90600052602060002090601f016020900481019282611abd5760008555611b03565b82601f10611ad657805160ff1916838001178555611b03565b82800160010185558215611b03579182015b82811115611b03578251825591602001919060010190611ae8565b50611b0f929150611b13565b5090565b5b80821115611b0f5760008155600101611b14565b600067ffffffffffffffff80841115611b4357611b43612158565b604051601f8501601f19908116603f01168101908282118183101715611b6b57611b6b612158565b81604052809350858152868686011115611b8457600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611bb557600080fd5b919050565b60008083601f840112611bcc57600080fd5b50813567ffffffffffffffff811115611be457600080fd5b6020830191508360208260051b8501011115611bff57600080fd5b9250929050565b600060208284031215611c1857600080fd5b611c2182611b9e565b9392505050565b60008060408385031215611c3b57600080fd5b611c4483611b9e565b9150611c5260208401611b9e565b90509250929050565b600080600060608486031215611c7057600080fd5b611c7984611b9e565b9250611c8760208501611b9e565b9150604084013590509250925092565b60008060008060808587031215611cad57600080fd5b611cb685611b9e565b9350611cc460208601611b9e565b925060408501359150606085013567ffffffffffffffff811115611ce757600080fd5b8501601f81018713611cf857600080fd5b611d0787823560208401611b28565b91505092959194509250565b60008060408385031215611d2657600080fd5b611d2f83611b9e565b915060208301358015158114611d4457600080fd5b809150509250929050565b60008060408385031215611d6257600080fd5b611d6b83611b9e565b946020939093013593505050565b60008060208385031215611d8c57600080fd5b823567ffffffffffffffff811115611da357600080fd5b611daf85828601611bba565b90969095509350505050565b60008060008060408587031215611dd157600080fd5b843567ffffffffffffffff80821115611de957600080fd5b611df588838901611bba565b90965094506020870135915080821115611e0e57600080fd5b50611e1b87828801611bba565b95989497509550505050565b600060208284031215611e3957600080fd5b8135611c218161216e565b600060208284031215611e5657600080fd5b8151611c218161216e565b600060208284031215611e7357600080fd5b813567ffffffffffffffff811115611e8a57600080fd5b8201601f81018413611e9b57600080fd5b610f8184823560208401611b28565b600060208284031215611ebc57600080fd5b5035919050565b600060208284031215611ed557600080fd5b5051919050565b60008151808452611ef481602086016020860161206a565b601f01601f19169290920160200192915050565b60008351611f1a81846020880161206a565b835190830190611f2e81836020880161206a565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611f6a90830184611edc565b9695505050505050565b602081526000611c216020830184611edc565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6000821982111561203a5761203a612100565b500190565b60008261204e5761204e612116565b500490565b60008282101561206557612065612100565b500390565b60005b8381101561208557818101518382015260200161206d565b83811115610ca35750506000910152565b600181811c908216806120aa57607f821691505b602082108114156120cb57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156120e5576120e5612100565b5060010190565b6000826120fb576120fb612116565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461095a57600080fdfea2646970667358221220443fdb5da83b5ec047aefb65d71bcb16fa7277892bd9bf51265533e3f0f920f764736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000a91cc74cd5a42a29919e476afc569d1612ef6e99

-----Decoded View---------------
Arg [0] : _iramuraNFT (address): 0xa91cc74CD5a42a29919E476AFc569d1612Ef6e99

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a91cc74cd5a42a29919e476afc569d1612ef6e99


Deployed Bytecode Sourcemap

55930:3241:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37310:224;;;;;;:::i;:::-;;:::i;:::-;;;7427:14:1;;7420:22;7402:41;;7390:2;7375:18;37310:224:0;;;;;;;;24044:100;;;:::i;:::-;;;;;;;:::i;25557:171::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6725:32:1;;;6707:51;;6695:2;6680:18;25557:171:0;6561:203:1;25074:417:0;;;;;;:::i;:::-;;:::i;56722:336::-;;;:::i;37950:113::-;38038:10;:17;37950:113;;;16160:25:1;;;16148:2;16133:18;37950:113:0;16014:177:1;26257:336:0;;;;;;:::i;:::-;;:::i;37618:256::-;;;;;;:::i;:::-;;:::i;58864:78::-;;;:::i;26664:185::-;;;;;;:::i;:::-;;:::i;57987:85::-;;;;;;:::i;:::-;;:::i;38140:233::-;;;;;;:::i;:::-;;:::i;56170:25::-;;;;;;58080:92;;;;;;:::i;:::-;;:::i;47831:86::-;47902:7;;;;47831:86;;23755:222;;;;;;:::i;:::-;;:::i;57066:489::-;;;;;;:::i;:::-;;:::i;23486:207::-;;;;;;:::i;:::-;;:::i;45341:103::-;;;:::i;58779:77::-;;;:::i;44693:87::-;44739:7;44766:6;-1:-1:-1;;;;;44766:6:0;44693:87;;24213:104;;;:::i;56269:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;25800:155;;;;;;:::i;:::-;;:::i;57563:308::-;;;;;;:::i;:::-;;:::i;26920:323::-;;;;;;:::i;:::-;;:::i;58950:186::-;;;;;;:::i;:::-;;:::i;58180:187::-;;;;;;:::i;:::-;;:::i;56235:25::-;;;;;-1:-1:-1;;;;;56235:25:0;;;56202:26;;;;;;26026:164;;;;;;:::i;:::-;-1:-1:-1;;;;;26147:25:0;;;26123:4;26147:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26026:164;45599:201;;;;;;:::i;:::-;;:::i;37310:224::-;37412:4;-1:-1:-1;;;;;;37436:50:0;;-1:-1:-1;;;37436:50:0;;:90;;;37490:36;37514:11;37490:23;:36::i;:::-;37429:97;37310:224;-1:-1:-1;;37310:224:0:o;24044:100::-;24098:13;24131:5;24124:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24044:100;:::o;25557:171::-;25633:7;25653:23;25668:7;25653:14;:23::i;:::-;-1:-1:-1;25696:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25696:24:0;;25557:171::o;25074:417::-;25155:13;25171:23;25186:7;25171:14;:23::i;:::-;25155:39;;25219:5;-1:-1:-1;;;;;25213:11:0;:2;-1:-1:-1;;;;;25213:11:0;;;25205:57;;;;-1:-1:-1;;;25205:57:0;;14276:2:1;25205:57:0;;;14258:21:1;14315:2;14295:18;;;14288:30;14354:34;14334:18;;;14327:62;-1:-1:-1;;;14405:18:1;;;14398:31;14446:19;;25205:57:0;;;;;;;;;21576:10;-1:-1:-1;;;;;25297:21:0;;;;:62;;-1:-1:-1;25322:37:0;25339:5;21576:10;26026:164;:::i;25322:37::-;25275:174;;;;-1:-1:-1;;;25275:174:0;;12770:2:1;25275:174:0;;;12752:21:1;12809:2;12789:18;;;12782:30;12848:34;12828:18;;;12821:62;12919:32;12899:18;;;12892:60;12969:19;;25275:174:0;12568:426:1;25275:174:0;25462:21;25471:2;25475:7;25462:8;:21::i;:::-;25144:347;25074:417;;:::o;56722:336::-;56514:10;56498:27;;;;:15;:27;;;;;;;;56490:67;;;;-1:-1:-1;;;56490:67:0;;14678:2:1;56490:67:0;;;14660:21:1;14717:2;14697:18;;;14690:30;14756:29;14736:18;;;14729:57;14803:18;;56490:67:0;14476:351:1;56490:67:0;56795:11:::1;;56782:10;;:24;56774:45;;;::::0;-1:-1:-1;;;56774:45:0;;8229:2:1;56774:45:0::1;::::0;::::1;8211:21:1::0;8268:1;8248:18;;;8241:29;-1:-1:-1;;;8286:18:1;;;8279:39;8335:18;;56774:45:0::1;8027:332:1::0;56774:45:0::1;56845:10;::::0;56838:40:::1;::::0;-1:-1:-1;;;56838:40:0;;56867:10:::1;56838:40;::::0;::::1;6707:51:1::0;56880:1:0::1;::::0;-1:-1:-1;;;;;56845:10:0::1;::::0;56838:28:::1;::::0;6680:18:1;;56838:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;56830:76;;;::::0;-1:-1:-1;;;56830:76:0;;11326:2:1;56830:76:0::1;::::0;::::1;11308:21:1::0;11365:2;11345:18;;;11338:30;-1:-1:-1;;;11384:18:1;;;11377:50;11444:18;;56830:76:0::1;11124:344:1::0;56830:76:0::1;56917:10;:12:::0;;;:10:::1;:12;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;56940:14:0::1;:16:::0;;;:14:::1;:16;::::0;::::1;:::i;:::-;;;;;;56967:37;56977:10;56989:14;;56967:9;:37::i;:::-;57031:10;57045:5;57015:27:::0;;;:15:::1;:27;::::0;;;;:35;;-1:-1:-1;;57015:35:0::1;::::0;;56722:336::o;26257:::-;26452:41;21576:10;26485:7;26452:18;:41::i;:::-;26444:100;;;;-1:-1:-1;;;26444:100:0;;;;;;;:::i;:::-;26557:28;26567:4;26573:2;26577:7;26557:9;:28::i;37618:256::-;37715:7;37751:23;37768:5;37751:16;:23::i;:::-;37743:5;:31;37735:87;;;;-1:-1:-1;;;37735:87:0;;8566:2:1;37735:87:0;;;8548:21:1;8605:2;8585:18;;;8578:30;8644:34;8624:18;;;8617:62;-1:-1:-1;;;8695:18:1;;;8688:41;8746:19;;37735:87:0;8364:407:1;37735:87:0;-1:-1:-1;;;;;;37840:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37618:256::o;58864:78::-;44579:13;:11;:13::i;:::-;47695:16:::1;:14;:16::i;:::-;58924:10:::2;:8;:10::i;:::-;58864:78::o:0;26664:185::-;26802:39;26819:4;26825:2;26829:7;26802:39;;;;;;;;;;;;:16;:39::i;57987:85::-;56385:10;;-1:-1:-1;;;;;56385:10:0;56371;:24;56363:61;;;;-1:-1:-1;;;56363:61:0;;15034:2:1;56363:61:0;;;15016:21:1;15073:2;15053:18;;;15046:30;15112:27;15092:18;;;15085:55;15157:18;;56363:61:0;14832:349:1;56363:61:0;58050:14:::1;58056:7;58050:5;:14::i;:::-;57987:85:::0;:::o;38140:233::-;38215:7;38251:30;38038:10;:17;;37950:113;38251:30;38243:5;:38;38235:95;;;;-1:-1:-1;;;38235:95:0;;15388:2:1;38235:95:0;;;15370:21:1;15427:2;15407:18;;;15400:30;15466:34;15446:18;;;15439:62;-1:-1:-1;;;15517:18:1;;;15510:42;15569:19;;38235:95:0;15186:408:1;38235:95:0;38348:10;38359:5;38348:17;;;;;;;;:::i;:::-;;;;;;;;;38341:24;;38140:233;;;:::o;58080:92::-;44579:13;:11;:13::i;:::-;58150:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;;58080:92:::0;:::o;23755:222::-;23827:7;23863:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23863:16:0;23898:19;23890:56;;;;-1:-1:-1;;;23890:56:0;;13923:2:1;23890:56:0;;;13905:21:1;13962:2;13942:18;;;13935:30;-1:-1:-1;;;13981:18:1;;;13974:54;14045:18;;23890:56:0;13721:348:1;57066:489:0;44579:13;:11;:13::i;:::-;57175:30;;::::1;57167:53;;;::::0;-1:-1:-1;;;57167:53:0;;12430:2:1;57167:53:0::1;::::0;::::1;12412:21:1::0;12469:2;12449:18;;;12442:30;-1:-1:-1;;;12488:18:1;;;12481:41;12539:18;;57167:53:0::1;12228:335:1::0;57167:53:0::1;57246:14;::::0;57231:12:::1;57271:245;57285:15:::0;;::::1;57271:245;;;57336:1;57322:183;57344:7;;57352:1;57344:10;;;;;;;:::i;:::-;;;;;;;57339:1;:15;57322:183;;57381:6:::0;::::1;::::0;::::1;:::i;:::-;;;;57417:4;57409;:12;57406:84;;57445:25;57455:5;;57461:1;57455:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;57465:4;57445:9;:25::i;:::-;57356:3:::0;::::1;::::0;::::1;:::i;:::-;;;;57322:183;;;-1:-1:-1::0;57302:3:0;::::1;::::0;::::1;:::i;:::-;;;;57271:245;;;-1:-1:-1::0;57526:14:0::1;:21:::0;-1:-1:-1;;;;57066:489:0:o;23486:207::-;23558:7;-1:-1:-1;;;;;23586:19:0;;23578:73;;;;-1:-1:-1;;;23578:73:0;;12020:2:1;23578:73:0;;;12002:21:1;12059:2;12039:18;;;12032:30;12098:34;12078:18;;;12071:62;-1:-1:-1;;;12149:18:1;;;12142:39;12198:19;;23578:73:0;11818:405:1;23578:73:0;-1:-1:-1;;;;;;23669:16:0;;;;;:9;:16;;;;;;;23486:207::o;45341:103::-;44579:13;:11;:13::i;:::-;45406:30:::1;45433:1;45406:18;:30::i;58779:77::-:0;44579:13;:11;:13::i;:::-;47436:19:::1;:17;:19::i;:::-;58840:8:::2;:6;:8::i;24213:104::-:0;24269:13;24302:7;24295:14;;;;;:::i;25800:155::-;25895:52;21576:10;25928:8;25938;25895:18;:52::i;57563:308::-;44579:13;:11;:13::i;:::-;57646:14:::1;::::0;57685:1:::1;57671:161;57693:6;57688:1;:11;57671:161;;57722:6:::0;::::1;::::0;::::1;:::i;:::-;;;;57754:4;57746;:12;57743:78;;57778:27;57788:10;57800:4;57778:9;:27::i;:::-;57701:3:::0;::::1;::::0;::::1;:::i;:::-;;;;57671:161;;;-1:-1:-1::0;57842:14:0::1;:21:::0;-1:-1:-1;57563:308:0:o;26920:323::-;27094:41;21576:10;27127:7;27094:18;:41::i;:::-;27086:100;;;;-1:-1:-1;;;27086:100:0;;;;;;;:::i;:::-;27197:38;27211:4;27217:2;27221:7;27230:4;27197:13;:38::i;:::-;26920:323;;;;:::o;58950:186::-;44579:13;:11;:13::i;:::-;59036:6:::1;59032:97;59047:15:::0;;::::1;59032:97;;;59113:4;59086:15;:24;59102:4;;59107:1;59102:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;59086:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;59086:24:0;:31;;-1:-1:-1;;59086:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59065:4;::::1;::::0;::::1;:::i;:::-;;;;59032:97;;58180:187:::0;58265:13;58327:10;:8;:10::i;:::-;58339:18;:7;:16;:18::i;:::-;58310:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58296:63;;58180:187;;;:::o;45599:201::-;44579:13;:11;:13::i;:::-;-1:-1:-1;;;;;45688:22:0;::::1;45680:73;;;::::0;-1:-1:-1;;;45680:73:0;;9397:2:1;45680:73:0::1;::::0;::::1;9379:21:1::0;9436:2;9416:18;;;9409:30;9475:34;9455:18;;;9448:62;-1:-1:-1;;;9526:18:1;;;9519:36;9572:19;;45680:73:0::1;9195:402:1::0;45680:73:0::1;45764:28;45783:8;45764:18;:28::i;23117:305::-:0;23219:4;-1:-1:-1;;;;;;23256:40:0;;-1:-1:-1;;;23256:40:0;;:105;;-1:-1:-1;;;;;;;23313:48:0;;-1:-1:-1;;;23313:48:0;23256:105;:158;;;-1:-1:-1;;;;;;;;;;13995:40:0;;;23378:36;13886:157;33532:135;28815:4;28839:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28839:16:0;33606:53;;;;-1:-1:-1;;;33606:53:0;;13923:2:1;33606:53:0;;;13905:21:1;13962:2;13942:18;;;13935:30;-1:-1:-1;;;13981:18:1;;;13974:54;14045:18;;33606:53:0;13721:348:1;32811:174:0;32886:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32886:29:0;-1:-1:-1;;;;;32886:29:0;;;;;;;;:24;;32940:23;32886:24;32940:14;:23::i;:::-;-1:-1:-1;;;;;32931:46:0;;;;;;;;;;;32811:174;;:::o;29650:110::-;29726:26;29736:2;29740:7;29726:26;;;;;;;;;;;;:9;:26::i;29044:264::-;29137:4;29154:13;29170:23;29185:7;29170:14;:23::i;:::-;29154:39;;29223:5;-1:-1:-1;;;;;29212:16:0;:7;-1:-1:-1;;;;;29212:16:0;;:52;;;-1:-1:-1;;;;;;26147:25:0;;;26123:4;26147:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29232:32;29212:87;;;;29292:7;-1:-1:-1;;;;;29268:31:0;:20;29280:7;29268:11;:20::i;:::-;-1:-1:-1;;;;;29268:31:0;;29212:87;29204:96;29044:264;-1:-1:-1;;;;29044:264:0:o;32067:625::-;32226:4;-1:-1:-1;;;;;32199:31:0;:23;32214:7;32199:14;:23::i;:::-;-1:-1:-1;;;;;32199:31:0;;32191:81;;;;-1:-1:-1;;;32191:81:0;;9804:2:1;32191:81:0;;;9786:21:1;9843:2;9823:18;;;9816:30;9882:34;9862:18;;;9855:62;-1:-1:-1;;;9933:18:1;;;9926:35;9978:19;;32191:81:0;9602:401:1;32191:81:0;-1:-1:-1;;;;;32291:16:0;;32283:65;;;;-1:-1:-1;;;32283:65:0;;10567:2:1;32283:65:0;;;10549:21:1;10606:2;10586:18;;;10579:30;10645:34;10625:18;;;10618:62;-1:-1:-1;;;10696:18:1;;;10689:34;10740:19;;32283:65:0;10365:400:1;32283:65:0;32361:39;32382:4;32388:2;32392:7;32361:20;:39::i;:::-;32465:29;32482:1;32486:7;32465:8;:29::i;:::-;-1:-1:-1;;;;;32507:15:0;;;;;;:9;:15;;;;;:20;;32526:1;;32507:15;:20;;32526:1;;32507:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32538:13:0;;;;;;:9;:13;;;;;:18;;32555:1;;32538:13;:18;;32555:1;;32538:18;:::i;:::-;;;;-1:-1:-1;;32567:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32567:21:0;-1:-1:-1;;;;;32567:21:0;;;;;;;;;32606:27;;32567:16;;32606:27;;;;;;;25144:347;25074:417;;:::o;44858:132::-;44739:7;44766:6;-1:-1:-1;;;;;44766:6:0;21576:10;44922:23;44914:68;;;;-1:-1:-1;;;44914:68:0;;13562:2:1;44914:68:0;;;13544:21:1;;;13581:18;;;13574:30;13640:34;13620:18;;;13613:62;13692:18;;44914:68:0;13360:356:1;48175:108:0;47902:7;;;;48234:41;;;;-1:-1:-1;;;48234:41:0;;7880:2:1;48234:41:0;;;7862:21:1;7919:2;7899:18;;;7892:30;-1:-1:-1;;;7938:18:1;;;7931:50;7998:18;;48234:41:0;7678:344:1;48686:120:0;47695:16;:14;:16::i;:::-;48745:7:::1;:15:::0;;-1:-1:-1;;48745:15:0::1;::::0;;48776:22:::1;21576:10:::0;48785:12:::1;48776:22;::::0;-1:-1:-1;;;;;6725:32:1;;;6707:51;;6695:2;6680:18;48776:22:0::1;;;;;;;48686:120::o:0;31310:420::-;31370:13;31386:23;31401:7;31386:14;:23::i;:::-;31370:39;;31422:48;31443:5;31458:1;31462:7;31422:20;:48::i;:::-;31511:29;31528:1;31532:7;31511:8;:29::i;:::-;-1:-1:-1;;;;;31553:16:0;;;;;;:9;:16;;;;;:21;;31573:1;;31553:16;:21;;31573:1;;31553:21;:::i;:::-;;;;-1:-1:-1;;31592:16:0;;;;:7;:16;;;;;;31585:23;;-1:-1:-1;;;;;;31585:23:0;;;31626:36;31600:7;;31592:16;-1:-1:-1;;;;;31626:36:0;;;;;31592:16;;31626:36;58150:14:::1;58080:92:::0;:::o;45960:191::-;46034:16;46053:6;;-1:-1:-1;;;;;46070:17:0;;;-1:-1:-1;;;;;;46070:17:0;;;;;;46103:40;;46053:6;;;;;;;46103:40;;46034:16;46103:40;46023:128;45960:191;:::o;47990:108::-;47902:7;;;;48060:9;48052:38;;;;-1:-1:-1;;;48052:38:0;;11675:2:1;48052:38:0;;;11657:21:1;11714:2;11694:18;;;11687:30;-1:-1:-1;;;11733:18:1;;;11726:46;11789:18;;48052:38:0;11473:340:1;48427:118:0;47436:19;:17;:19::i;:::-;48487:7:::1;:14:::0;;-1:-1:-1;;48487:14:0::1;48497:4;48487:14;::::0;;48517:20:::1;48524:12;21576:10:::0;;21496:98;33128:315;33283:8;-1:-1:-1;;;;;33274:17:0;:5;-1:-1:-1;;;;;33274:17:0;;;33266:55;;;;-1:-1:-1;;;33266:55:0;;10972:2:1;33266:55:0;;;10954:21:1;11011:2;10991:18;;;10984:30;11050:27;11030:18;;;11023:55;11095:18;;33266:55:0;10770:349:1;33266:55:0;-1:-1:-1;;;;;33332:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33332:46:0;;;;;;;;;;33394:41;;7402::1;;;33394::0;;7375:18:1;33394:41:0;;;;;;;33128:315;;;:::o;28124:313::-;28280:28;28290:4;28296:2;28300:7;28280:9;:28::i;:::-;28327:47;28350:4;28356:2;28360:7;28369:4;28327:22;:47::i;:::-;28319:110;;;;-1:-1:-1;;;28319:110:0;;;;;;;:::i;57879:100::-;57931:13;57964:7;57957:14;;;;;:::i;430:723::-;486:13;707:10;703:53;;-1:-1:-1;;734:10:0;;;;;;;;;;;;-1:-1:-1;;;734:10:0;;;;;430:723::o;703:53::-;781:5;766:12;822:78;829:9;;822:78;;855:8;;;;:::i;:::-;;-1:-1:-1;878:10:0;;-1:-1:-1;886:2:0;878:10;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;932:17:0;;910:39;;960:154;967:10;;960:154;;994:11;1004:1;994:11;;:::i;:::-;;-1:-1:-1;1063:10:0;1071:2;1063:5;:10;:::i;:::-;1050:24;;:2;:24;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1020:56:0;;;;;;;;-1:-1:-1;1091:11:0;1100:2;1091:11;;:::i;:::-;;;960:154;;29987:319;30116:18;30122:2;30126:7;30116:5;:18::i;:::-;30167:53;30198:1;30202:2;30206:7;30215:4;30167:22;:53::i;:::-;30145:153;;;;-1:-1:-1;;;30145:153:0;;;;;;;:::i;58375:195::-;58519:43;58546:4;58551:2;58554:7;58519:26;:43::i;34231:853::-;34385:4;-1:-1:-1;;;;;34406:13:0;;4025:19;:23;34402:675;;34442:71;;-1:-1:-1;;;34442:71:0;;-1:-1:-1;;;;;34442:36:0;;;;;:71;;21576:10;;34493:4;;34499:7;;34508:4;;34442:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34442:71:0;;;;;;;;-1:-1:-1;;34442:71:0;;;;;;;;;;;;:::i;:::-;;;34438:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34683:13:0;;34679:328;;34726:60;;-1:-1:-1;;;34726:60:0;;;;;;;:::i;34679:328::-;34957:6;34951:13;34942:6;34938:2;34934:15;34927:38;34438:584;-1:-1:-1;;;;;;34564:51:0;-1:-1:-1;;;34564:51:0;;-1:-1:-1;34557:58:0;;34402:675;-1:-1:-1;35061:4:0;34231:853;;;;;;:::o;30642:439::-;-1:-1:-1;;;;;30722:16:0;;30714:61;;;;-1:-1:-1;;;30714:61:0;;13201:2:1;30714:61:0;;;13183:21:1;;;13220:18;;;13213:30;13279:34;13259:18;;;13252:62;13331:18;;30714:61:0;12999:356:1;30714:61:0;28815:4;28839:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28839:16:0;:30;30786:58;;;;-1:-1:-1;;;30786:58:0;;10210:2:1;30786:58:0;;;10192:21:1;10249:2;10229:18;;;10222:30;10288;10268:18;;;10261:58;10336:18;;30786:58:0;10008:352:1;30786:58:0;30857:45;30886:1;30890:2;30894:7;30857:20;:45::i;:::-;-1:-1:-1;;;;;30915:13:0;;;;;;:9;:13;;;;;:18;;30932:1;;30915:13;:18;;30932:1;;30915:18;:::i;:::-;;;;-1:-1:-1;;30944:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30944:21:0;-1:-1:-1;;;;;30944:21:0;;;;;;;;30983:33;;30944:16;;;30983:33;;30944:16;;30983:33;58150:14:::1;58080:92:::0;:::o;38986:589::-;-1:-1:-1;;;;;39192:18:0;;39188:187;;39227:40;39259:7;40402:10;:17;;40375:24;;;;:15;:24;;;;;:44;;;40430:24;;;;;;;;;;;;40298:164;39227:40;39188:187;;;39297:2;-1:-1:-1;;;;;39289:10:0;:4;-1:-1:-1;;;;;39289:10:0;;39285:90;;39316:47;39349:4;39355:7;39316:32;:47::i;:::-;-1:-1:-1;;;;;39389:16:0;;39385:183;;39422:45;39459:7;39422:36;:45::i;39385:183::-;39495:4;-1:-1:-1;;;;;39489:10:0;:2;-1:-1:-1;;;;;39489:10:0;;39485:83;;39516:40;39544:2;39548:7;39516:27;:40::i;41089:988::-;41355:22;41405:1;41380:22;41397:4;41380:16;:22::i;:::-;:26;;;;:::i;:::-;41417:18;41438:26;;;:17;:26;;;;;;41355:51;;-1:-1:-1;41571:28:0;;;41567:328;;-1:-1:-1;;;;;41638:18:0;;41616:19;41638:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41689:30;;;;;;:44;;;41806:30;;:17;:30;;;;;:43;;;41567:328;-1:-1:-1;41991:26:0;;;;:17;:26;;;;;;;;41984:33;;;-1:-1:-1;;;;;42035:18:0;;;;;:12;:18;;;;;:34;;;;;;;42028:41;41089:988::o;42372:1079::-;42650:10;:17;42625:22;;42650:21;;42670:1;;42650:21;:::i;:::-;42682:18;42703:24;;;:15;:24;;;;;;43076:10;:26;;42625:46;;-1:-1:-1;42703:24:0;;42625:46;;43076:26;;;;;;:::i;:::-;;;;;;;;;43054:48;;43140:11;43115:10;43126;43115:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;43220:28;;;:15;:28;;;;;;;:41;;;43392:24;;;;;43385:31;43427:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42443:1008;;;42372:1079;:::o;39876:221::-;39961:14;39978:20;39995:2;39978:16;:20::i;:::-;-1:-1:-1;;;;;40009:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;40054:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39876:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:367::-;891:8;901:6;955:3;948:4;940:6;936:17;932:27;922:55;;973:1;970;963:12;922:55;-1:-1:-1;996:20:1;;1039:18;1028:30;;1025:50;;;1071:1;1068;1061:12;1025:50;1108:4;1100:6;1096:17;1084:29;;1168:3;1161:4;1151:6;1148:1;1144:14;1136:6;1132:27;1128:38;1125:47;1122:67;;;1185:1;1182;1175:12;1122:67;828:367;;;;;:::o;1200:186::-;1259:6;1312:2;1300:9;1291:7;1287:23;1283:32;1280:52;;;1328:1;1325;1318:12;1280:52;1351:29;1370:9;1351:29;:::i;:::-;1341:39;1200:186;-1:-1:-1;;;1200:186:1:o;1391:260::-;1459:6;1467;1520:2;1508:9;1499:7;1495:23;1491:32;1488:52;;;1536:1;1533;1526:12;1488:52;1559:29;1578:9;1559:29;:::i;:::-;1549:39;;1607:38;1641:2;1630:9;1626:18;1607:38;:::i;:::-;1597:48;;1391:260;;;;;:::o;1656:328::-;1733:6;1741;1749;1802:2;1790:9;1781:7;1777:23;1773:32;1770:52;;;1818:1;1815;1808:12;1770:52;1841:29;1860:9;1841:29;:::i;:::-;1831:39;;1889:38;1923:2;1912:9;1908:18;1889:38;:::i;:::-;1879:48;;1974:2;1963:9;1959:18;1946:32;1936:42;;1656:328;;;;;:::o;1989:666::-;2084:6;2092;2100;2108;2161:3;2149:9;2140:7;2136:23;2132:33;2129:53;;;2178:1;2175;2168:12;2129:53;2201:29;2220:9;2201:29;:::i;:::-;2191:39;;2249:38;2283:2;2272:9;2268:18;2249:38;:::i;:::-;2239:48;;2334:2;2323:9;2319:18;2306:32;2296:42;;2389:2;2378:9;2374:18;2361:32;2416:18;2408:6;2405:30;2402:50;;;2448:1;2445;2438:12;2402:50;2471:22;;2524:4;2516:13;;2512:27;-1:-1:-1;2502:55:1;;2553:1;2550;2543:12;2502:55;2576:73;2641:7;2636:2;2623:16;2618:2;2614;2610:11;2576:73;:::i;:::-;2566:83;;;1989:666;;;;;;;:::o;2660:347::-;2725:6;2733;2786:2;2774:9;2765:7;2761:23;2757:32;2754:52;;;2802:1;2799;2792:12;2754:52;2825:29;2844:9;2825:29;:::i;:::-;2815:39;;2904:2;2893:9;2889:18;2876:32;2951:5;2944:13;2937:21;2930:5;2927:32;2917:60;;2973:1;2970;2963:12;2917:60;2996:5;2986:15;;;2660:347;;;;;:::o;3012:254::-;3080:6;3088;3141:2;3129:9;3120:7;3116:23;3112:32;3109:52;;;3157:1;3154;3147:12;3109:52;3180:29;3199:9;3180:29;:::i;:::-;3170:39;3256:2;3241:18;;;;3228:32;;-1:-1:-1;;;3012:254:1:o;3271:437::-;3357:6;3365;3418:2;3406:9;3397:7;3393:23;3389:32;3386:52;;;3434:1;3431;3424:12;3386:52;3474:9;3461:23;3507:18;3499:6;3496:30;3493:50;;;3539:1;3536;3529:12;3493:50;3578:70;3640:7;3631:6;3620:9;3616:22;3578:70;:::i;:::-;3667:8;;3552:96;;-1:-1:-1;3271:437:1;-1:-1:-1;;;;3271:437:1:o;3713:773::-;3835:6;3843;3851;3859;3912:2;3900:9;3891:7;3887:23;3883:32;3880:52;;;3928:1;3925;3918:12;3880:52;3968:9;3955:23;3997:18;4038:2;4030:6;4027:14;4024:34;;;4054:1;4051;4044:12;4024:34;4093:70;4155:7;4146:6;4135:9;4131:22;4093:70;:::i;:::-;4182:8;;-1:-1:-1;4067:96:1;-1:-1:-1;4270:2:1;4255:18;;4242:32;;-1:-1:-1;4286:16:1;;;4283:36;;;4315:1;4312;4305:12;4283:36;;4354:72;4418:7;4407:8;4396:9;4392:24;4354:72;:::i;:::-;3713:773;;;;-1:-1:-1;4445:8:1;-1:-1:-1;;;;3713:773:1:o;4491:245::-;4549:6;4602:2;4590:9;4581:7;4577:23;4573:32;4570:52;;;4618:1;4615;4608:12;4570:52;4657:9;4644:23;4676:30;4700:5;4676:30;:::i;4741:249::-;4810:6;4863:2;4851:9;4842:7;4838:23;4834:32;4831:52;;;4879:1;4876;4869:12;4831:52;4911:9;4905:16;4930:30;4954:5;4930:30;:::i;4995:450::-;5064:6;5117:2;5105:9;5096:7;5092:23;5088:32;5085:52;;;5133:1;5130;5123:12;5085:52;5173:9;5160:23;5206:18;5198:6;5195:30;5192:50;;;5238:1;5235;5228:12;5192:50;5261:22;;5314:4;5306:13;;5302:27;-1:-1:-1;5292:55:1;;5343:1;5340;5333:12;5292:55;5366:73;5431:7;5426:2;5413:16;5408:2;5404;5400:11;5366:73;:::i;5450:180::-;5509:6;5562:2;5550:9;5541:7;5537:23;5533:32;5530:52;;;5578:1;5575;5568:12;5530:52;-1:-1:-1;5601:23:1;;5450:180;-1:-1:-1;5450:180:1:o;5635:184::-;5705:6;5758:2;5746:9;5737:7;5733:23;5729:32;5726:52;;;5774:1;5771;5764:12;5726:52;-1:-1:-1;5797:16:1;;5635:184;-1:-1:-1;5635:184:1:o;5824:257::-;5865:3;5903:5;5897:12;5930:6;5925:3;5918:19;5946:63;6002:6;5995:4;5990:3;5986:14;5979:4;5972:5;5968:16;5946:63;:::i;:::-;6063:2;6042:15;-1:-1:-1;;6038:29:1;6029:39;;;;6070:4;6025:50;;5824:257;-1:-1:-1;;5824:257:1:o;6086:470::-;6265:3;6303:6;6297:13;6319:53;6365:6;6360:3;6353:4;6345:6;6341:17;6319:53;:::i;:::-;6435:13;;6394:16;;;;6457:57;6435:13;6394:16;6491:4;6479:17;;6457:57;:::i;:::-;6530:20;;6086:470;-1:-1:-1;;;;6086:470:1:o;6769:488::-;-1:-1:-1;;;;;7038:15:1;;;7020:34;;7090:15;;7085:2;7070:18;;7063:43;7137:2;7122:18;;7115:34;;;7185:3;7180:2;7165:18;;7158:31;;;6963:4;;7206:45;;7231:19;;7223:6;7206:45;:::i;:::-;7198:53;6769:488;-1:-1:-1;;;;;;6769:488:1:o;7454:219::-;7603:2;7592:9;7585:21;7566:4;7623:44;7663:2;7652:9;7648:18;7640:6;7623:44;:::i;8776:414::-;8978:2;8960:21;;;9017:2;8997:18;;;8990:30;9056:34;9051:2;9036:18;;9029:62;-1:-1:-1;;;9122:2:1;9107:18;;9100:48;9180:3;9165:19;;8776:414::o;15599:410::-;15801:2;15783:21;;;15840:2;15820:18;;;15813:30;15879:34;15874:2;15859:18;;15852:62;-1:-1:-1;;;15945:2:1;15930:18;;15923:44;15999:3;15984:19;;15599:410::o;16196:128::-;16236:3;16267:1;16263:6;16260:1;16257:13;16254:39;;;16273:18;;:::i;:::-;-1:-1:-1;16309:9:1;;16196:128::o;16329:120::-;16369:1;16395;16385:35;;16400:18;;:::i;:::-;-1:-1:-1;16434:9:1;;16329:120::o;16454:125::-;16494:4;16522:1;16519;16516:8;16513:34;;;16527:18;;:::i;:::-;-1:-1:-1;16564:9:1;;16454:125::o;16584:258::-;16656:1;16666:113;16680:6;16677:1;16674:13;16666:113;;;16756:11;;;16750:18;16737:11;;;16730:39;16702:2;16695:10;16666:113;;;16797:6;16794:1;16791:13;16788:48;;;-1:-1:-1;;16832:1:1;16814:16;;16807:27;16584:258::o;16847:380::-;16926:1;16922:12;;;;16969;;;16990:61;;17044:4;17036:6;17032:17;17022:27;;16990:61;17097:2;17089:6;17086:14;17066:18;17063:38;17060:161;;;17143:10;17138:3;17134:20;17131:1;17124:31;17178:4;17175:1;17168:15;17206:4;17203:1;17196:15;17060:161;;16847:380;;;:::o;17232:135::-;17271:3;-1:-1:-1;;17292:17:1;;17289:43;;;17312:18;;:::i;:::-;-1:-1:-1;17359:1:1;17348:13;;17232:135::o;17372:112::-;17404:1;17430;17420:35;;17435:18;;:::i;:::-;-1:-1:-1;17469:9:1;;17372:112::o;17489:127::-;17550:10;17545:3;17541:20;17538:1;17531:31;17581:4;17578:1;17571:15;17605:4;17602:1;17595:15;17621:127;17682:10;17677:3;17673:20;17670:1;17663:31;17713:4;17710:1;17703:15;17737:4;17734:1;17727:15;17753:127;17814:10;17809:3;17805:20;17802:1;17795:31;17845:4;17842:1;17835:15;17869:4;17866:1;17859:15;17885:127;17946:10;17941:3;17937:20;17934:1;17927:31;17977:4;17974:1;17967:15;18001:4;17998:1;17991:15;18017:127;18078:10;18073:3;18069:20;18066:1;18059:31;18109:4;18106:1;18099:15;18133:4;18130:1;18123:15;18149:131;-1:-1:-1;;;;;;18223:32:1;;18213:43;;18203:71;;18270:1;18267;18260:12

Swarm Source

ipfs://443fdb5da83b5ec047aefb65d71bcb16fa7277892bd9bf51265533e3f0f920f7
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.