ETH Price: $3,190.98 (-2.27%)

Token

The Moggie Rescue Club (TMRC)
 

Overview

Max Total Supply

500 TMRC

Holders

44

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
29 TMRC
0xc81f4ef4fbb4fb8e7b92c99bb20e8afd5d32d50f
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:
TheMoggieRescueClub

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-08-30
*/

// SPDX-License-Identifier: MIT

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

    /**
     * @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);
    }
}

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


// OpenZeppelin Contracts (last updated v4.5.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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (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 `IERC721.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 v4.4.1 (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`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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 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);

    /**
     * @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;
}

// 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: contracts/erc721a.sol



// Creator: Chiru Labs



pragma solidity ^0.8.4;










error ApprovalCallerNotOwnerNorApproved();

error ApprovalQueryForNonexistentToken();

error ApproveToCaller();

error ApprovalToCurrentOwner();

error BalanceQueryForZeroAddress();

error MintToZeroAddress();

error MintZeroQuantity();

error OwnerQueryForNonexistentToken();

error TransferCallerNotOwnerNorApproved();

error TransferFromIncorrectOwner();

error TransferToNonERC721ReceiverImplementer();

error TransferToZeroAddress();

error URIQueryForNonexistentToken();



/**

 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including

 * the Metadata extension. Built to optimize for lower gas during batch mints.

 *

 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).

 *

 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.

 *

 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).

 */

contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {

    using Address for address;

    using Strings for uint256;



    // Compiler will pack this into a single 256bit word.

    struct TokenOwnership {

        // The address of the owner.

        address addr;

        // Keeps track of the start time of ownership with minimal overhead for tokenomics.

        uint64 startTimestamp;

        // Whether the token has been burned.

        bool burned;

    }



    // Compiler will pack this into a single 256bit word.

    struct AddressData {

        // Realistically, 2**64-1 is more than enough.

        uint64 balance;

        // Keeps track of mint count with minimal overhead for tokenomics.

        uint64 numberMinted;

        // Keeps track of burn count with minimal overhead for tokenomics.

        uint64 numberBurned;

        // For miscellaneous variable(s) pertaining to the address

        // (e.g. number of whitelist mint slots used).

        // If there are multiple variables, please pack them into a uint64.

        uint64 aux;

    }



    // The tokenId of the next token to be minted.

    uint256 internal _currentIndex;



    // The number of tokens burned.

    uint256 internal _burnCounter;



    // Token name

    string private _name;



    // Token symbol

    string private _symbol;



    // Mapping from token ID to ownership details

    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.

    mapping(uint256 => TokenOwnership) internal _ownerships;



    // Mapping owner address to address data

    mapping(address => AddressData) private _addressData;



    // Mapping from token ID to approved address

    mapping(uint256 => address) private _tokenApprovals;



    // Mapping from owner to operator approvals

    mapping(address => mapping(address => bool)) private _operatorApprovals;



    constructor(string memory name_, string memory symbol_) {

        _name = name_;

        _symbol = symbol_;

        _currentIndex = _startTokenId();

    }



    /**

     * To change the starting tokenId, please override this function.

     */

    function _startTokenId() internal view virtual returns (uint256) {

        return 1;

    }



    /**

     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.

     */

    function totalSupply() public view returns (uint256) {

        // Counter underflow is impossible as _burnCounter cannot be incremented

        // more than _currentIndex - _startTokenId() times

        unchecked {

            return _currentIndex - _burnCounter - _startTokenId();

        }

    }



    /**

     * Returns the total amount of tokens minted in the contract.

     */

    function _totalMinted() internal view returns (uint256) {

        // Counter underflow is impossible as _currentIndex does not decrement,

        // and it is initialized to _startTokenId()

        unchecked {

            return _currentIndex - _startTokenId();

        }

    }



    /**

     * @dev See {IERC165-supportsInterface}.

     */

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {

        return

            interfaceId == type(IERC721).interfaceId ||

            interfaceId == type(IERC721Metadata).interfaceId ||

            super.supportsInterface(interfaceId);

    }



    /**

     * @dev See {IERC721-balanceOf}.

     */

    function balanceOf(address owner) public view override returns (uint256) {

        if (owner == address(0)) revert BalanceQueryForZeroAddress();

        return uint256(_addressData[owner].balance);

    }



    /**

     * Returns the number of tokens minted by `owner`.

     */

    function _numberMinted(address owner) internal view returns (uint256) {

        return uint256(_addressData[owner].numberMinted);

    }



    /**

     * Returns the number of tokens burned by or on behalf of `owner`.

     */

    function _numberBurned(address owner) internal view returns (uint256) {

        return uint256(_addressData[owner].numberBurned);

    }



    /**

     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).

     */

    function _getAux(address owner) internal view returns (uint64) {

        return _addressData[owner].aux;

    }



    /**

     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).

     * If there are multiple variables, please pack them into a uint64.

     */

    function _setAux(address owner, uint64 aux) internal {

        _addressData[owner].aux = aux;

    }



    /**

     * Gas spent here starts off proportional to the maximum mint batch size.

     * It gradually moves to O(1) as tokens get transferred around in the collection over time.

     */

    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {

        uint256 curr = tokenId;



        unchecked {

            if (_startTokenId() <= curr && curr < _currentIndex) {

                TokenOwnership memory ownership = _ownerships[curr];

                if (!ownership.burned) {

                    if (ownership.addr != address(0)) {

                        return ownership;

                    }

                    // Invariant:

                    // There will always be an ownership that has an address and is not burned

                    // before an ownership that does not have an address and is not burned.

                    // Hence, curr will not underflow.

                    while (true) {

                        curr--;

                        ownership = _ownerships[curr];

                        if (ownership.addr != address(0)) {

                            return ownership;

                        }

                    }

                }

            }

        }

        revert OwnerQueryForNonexistentToken();

    }



    /**

     * @dev See {IERC721-ownerOf}.

     */

    function ownerOf(uint256 tokenId) public view override returns (address) {

        return _ownershipOf(tokenId).addr;

    }



    /**

     * @dev See {IERC721Metadata-name}.

     */

    function name() public view virtual override returns (string memory) {

        return _name;

    }



    /**

     * @dev See {IERC721Metadata-symbol}.

     */

    function symbol() public view virtual override returns (string memory) {

        return _symbol;

    }



    /**

     * @dev See {IERC721Metadata-tokenURI}.

     */

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {

        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();



        string memory baseURI = _baseURI();

        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';

    }



    /**

     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each

     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty

     * by default, can be overriden in child contracts.

     */

    function _baseURI() internal view virtual returns (string memory) {

        return '';

    }



    /**

     * @dev See {IERC721-approve}.

     */

    function approve(address to, uint256 tokenId) public override {

        address owner = ERC721A.ownerOf(tokenId);

        if (to == owner) revert ApprovalToCurrentOwner();



        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {

            revert ApprovalCallerNotOwnerNorApproved();

        }



        _approve(to, tokenId, owner);

    }



    /**

     * @dev See {IERC721-getApproved}.

     */

    function getApproved(uint256 tokenId) public view override returns (address) {

        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();



        return _tokenApprovals[tokenId];

    }



    /**

     * @dev See {IERC721-setApprovalForAll}.

     */

    function setApprovalForAll(address operator, bool approved) public virtual override {

        if (operator == _msgSender()) revert ApproveToCaller();



        _operatorApprovals[_msgSender()][operator] = approved;

        emit ApprovalForAll(_msgSender(), operator, approved);

    }



    /**

     * @dev See {IERC721-isApprovedForAll}.

     */

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {

        return _operatorApprovals[owner][operator];

    }



    /**

     * @dev See {IERC721-transferFrom}.

     */

    function transferFrom(

        address from,

        address to,

        uint256 tokenId

    ) public virtual override {

        _transfer(from, to, tokenId);

    }



    /**

     * @dev See {IERC721-safeTransferFrom}.

     */

    function safeTransferFrom(

        address from,

        address to,

        uint256 tokenId

    ) public virtual override {

        safeTransferFrom(from, to, tokenId, '');

    }



    /**

     * @dev See {IERC721-safeTransferFrom}.

     */

    function safeTransferFrom(

        address from,

        address to,

        uint256 tokenId,

        bytes memory _data

    ) public virtual override {

        _transfer(from, to, tokenId);

        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {

            revert TransferToNonERC721ReceiverImplementer();

        }

    }



    /**

     * @dev Returns whether `tokenId` exists.

     *

     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.

     *

     * Tokens start existing when they are minted (`_mint`),

     */

    function _exists(uint256 tokenId) internal view returns (bool) {

        return _startTokenId() <= tokenId && tokenId < _currentIndex &&

            !_ownerships[tokenId].burned;

    }



    function _safeMint(address to, uint256 quantity) internal {

        _safeMint(to, quantity, '');

    }



    /**

     * @dev Safely mints `quantity` tokens and transfers them to `to`.

     *

     * Requirements:

     *

     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.

     * - `quantity` must be greater than 0.

     *

     * Emits a {Transfer} event.

     */

    function _safeMint(

        address to,

        uint256 quantity,

        bytes memory _data

    ) internal {

        _mint(to, quantity, _data, true);

    }



    /**

     * @dev Mints `quantity` tokens and transfers them to `to`.

     *

     * Requirements:

     *

     * - `to` cannot be the zero address.

     * - `quantity` must be greater than 0.

     *

     * Emits a {Transfer} event.

     */

    function _mint(

        address to,

        uint256 quantity,

        bytes memory _data,

        bool safe

    ) internal {

        uint256 startTokenId = _currentIndex;

        if (to == address(0)) revert MintToZeroAddress();

        if (quantity == 0) revert MintZeroQuantity();



        _beforeTokenTransfers(address(0), to, startTokenId, quantity);



        // Overflows are incredibly unrealistic.

        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1

        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1

        unchecked {

            _addressData[to].balance += uint64(quantity);

            _addressData[to].numberMinted += uint64(quantity);



            _ownerships[startTokenId].addr = to;

            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);



            uint256 updatedIndex = startTokenId;

            uint256 end = updatedIndex + quantity;



            if (safe && to.isContract()) {

                do {

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

                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {

                        revert TransferToNonERC721ReceiverImplementer();

                    }

                } while (updatedIndex != end);

                // Reentrancy protection

                if (_currentIndex != startTokenId) revert();

            } else {

                do {

                    emit Transfer(address(0), to, updatedIndex++);

                } while (updatedIndex != end);

            }

            _currentIndex = updatedIndex;

        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);

    }



    /**

     * @dev Transfers `tokenId` from `from` to `to`.

     *

     * Requirements:

     *

     * - `to` cannot be the zero address.

     * - `tokenId` token must be owned by `from`.

     *

     * Emits a {Transfer} event.

     */

    function _transfer(

        address from,

        address to,

        uint256 tokenId

    ) private {

        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);



        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();



        bool isApprovedOrOwner = (_msgSender() == from ||

            isApprovedForAll(from, _msgSender()) ||

            getApproved(tokenId) == _msgSender());



        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();



        _beforeTokenTransfers(from, to, tokenId, 1);



        // Clear approvals from the previous owner

        _approve(address(0), tokenId, from);



        // Underflow of the sender's balance is impossible because we check for

        // ownership above and the recipient's balance can't realistically overflow.

        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.

        unchecked {

            _addressData[from].balance -= 1;

            _addressData[to].balance += 1;



            TokenOwnership storage currSlot = _ownerships[tokenId];

            currSlot.addr = to;

            currSlot.startTimestamp = uint64(block.timestamp);



            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.

            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.

            uint256 nextTokenId = tokenId + 1;

            TokenOwnership storage nextSlot = _ownerships[nextTokenId];

            if (nextSlot.addr == address(0)) {

                // This will suffice for checking _exists(nextTokenId),

                // as a burned slot cannot contain the zero address.

                if (nextTokenId != _currentIndex) {

                    nextSlot.addr = from;

                    nextSlot.startTimestamp = prevOwnership.startTimestamp;

                }

            }

        }



        emit Transfer(from, to, tokenId);

        _afterTokenTransfers(from, to, tokenId, 1);

    }



    /**

     * @dev This is equivalent to _burn(tokenId, false)

     */

    function _burn(uint256 tokenId) internal virtual {

        _burn(tokenId, false);

    }



    /**

     * @dev Destroys `tokenId`.

     * The approval is cleared when the token is burned.

     *

     * Requirements:

     *

     * - `tokenId` must exist.

     *

     * Emits a {Transfer} event.

     */

    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {

        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);



        address from = prevOwnership.addr;



        if (approvalCheck) {

            bool isApprovedOrOwner = (_msgSender() == from ||

                isApprovedForAll(from, _msgSender()) ||

                getApproved(tokenId) == _msgSender());



            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();

        }



        _beforeTokenTransfers(from, address(0), tokenId, 1);



        // Clear approvals from the previous owner

        _approve(address(0), tokenId, from);



        // Underflow of the sender's balance is impossible because we check for

        // ownership above and the recipient's balance can't realistically overflow.

        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.

        unchecked {

            AddressData storage addressData = _addressData[from];

            addressData.balance -= 1;

            addressData.numberBurned += 1;



            // Keep track of who burned the token, and the timestamp of burning.

            TokenOwnership storage currSlot = _ownerships[tokenId];

            currSlot.addr = from;

            currSlot.startTimestamp = uint64(block.timestamp);

            currSlot.burned = true;



            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.

            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.

            uint256 nextTokenId = tokenId + 1;

            TokenOwnership storage nextSlot = _ownerships[nextTokenId];

            if (nextSlot.addr == address(0)) {

                // This will suffice for checking _exists(nextTokenId),

                // as a burned slot cannot contain the zero address.

                if (nextTokenId != _currentIndex) {

                    nextSlot.addr = from;

                    nextSlot.startTimestamp = prevOwnership.startTimestamp;

                }

            }

        }



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

        _afterTokenTransfers(from, address(0), tokenId, 1);



        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.

        unchecked {

            _burnCounter++;

        }

    }



    /**

     * @dev Approve `to` to operate on `tokenId`

     *

     * Emits a {Approval} event.

     */

    function _approve(

        address to,

        uint256 tokenId,

        address owner

    ) private {

        _tokenApprovals[tokenId] = to;

        emit Approval(owner, to, tokenId);

    }



    /**

     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.

     *

     * @param from address representing the previous owner of the given token ID

     * @param to target address that will receive the tokens

     * @param tokenId uint256 ID of the token to be transferred

     * @param _data bytes optional data to send along with the call

     * @return bool whether the call correctly returned the expected magic value

     */

    function _checkContractOnERC721Received(

        address from,

        address to,

        uint256 tokenId,

        bytes memory _data

    ) private returns (bool) {

        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {

            return retval == IERC721Receiver(to).onERC721Received.selector;

        } catch (bytes memory reason) {

            if (reason.length == 0) {

                revert TransferToNonERC721ReceiverImplementer();

            } else {

                assembly {

                    revert(add(32, reason), mload(reason))

                }

            }

        }

    }



    /**

     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.

     * And also called before burning one token.

     *

     * startTokenId - the first token id to be transferred

     * quantity - the amount to be transferred

     *

     * Calling conditions:

     *

     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be

     * transferred to `to`.

     * - When `from` is zero, `tokenId` will be minted for `to`.

     * - When `to` is zero, `tokenId` will be burned by `from`.

     * - `from` and `to` are never both zero.

     */

    function _beforeTokenTransfers(

        address from,

        address to,

        uint256 startTokenId,

        uint256 quantity

    ) internal virtual {}



    /**

     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes

     * minting.

     * And also called after one token has been burned.

     *

     * startTokenId - the first token id to be transferred

     * quantity - the amount to be transferred

     *

     * Calling conditions:

     *

     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been

     * transferred to `to`.

     * - When `from` is zero, `tokenId` has been minted for `to`.

     * - When `to` is zero, `tokenId` has been burned by `from`.

     * - `from` and `to` are never both zero.

     */

    function _afterTokenTransfers(

        address from,

        address to,

        uint256 startTokenId,

        uint256 quantity

    ) internal virtual {}

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


// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @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: contracts/contract.sol


pragma solidity ^0.8.4;


contract TheMoggieRescueClub is Ownable, ERC721A  {

    using Strings for uint256;

    string private baseTokenURI;
   
    uint256 public cost = 0.08 ether;

    uint128 public maxSupply = 10000;

    bool public saleActive = false;

    constructor() ERC721A("The Moggie Rescue Club", "TMRC") {}

    modifier mintCompliance(uint256 _mintAmount) {
        require(_mintAmount > 0 , "Invalid mint amount!");
        require(totalMinted() + _mintAmount <= maxSupply, "Max supply exceeded!");
        _;
    }

    ///Allows any address to mint when the public sale is open
    function mint(uint64 _mintAmount) public payable mintCompliance(_mintAmount) {
        require(saleActive, "Sale is not Active");
        require(msg.value == cost * _mintAmount, "Insufficient funds!");
        _safeMint(msg.sender, _mintAmount);
    }

    ///Allows owner of the collection to airdrop a token to any address
    function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
        _safeMint(_receiver, _mintAmount);
    }

    //@return token ids owned by an address in the collection
    function walletOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 1;
        uint256 ownedTokenIndex = 0;

        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
            if(exists(currentTokenId) == true) {
                address currentTokenOwner = ownerOf(currentTokenId);

                if (currentTokenOwner == _owner) {
                    ownedTokenIds[ownedTokenIndex] = currentTokenId;
                    ownedTokenIndex++;
                }
            }
            currentTokenId++;
        }

        return ownedTokenIds;
    }

    //@return full url for passed in token id 
    function tokenURI(uint256 _tokenId)

        public
        view
        virtual
        override
        returns (string memory)

    {

        require(
        _exists(_tokenId),
        "ERC721Metadata: URI query for nonexistent token"
        );

        string memory currentBaseURI = _baseURI();

        return bytes(currentBaseURI).length > 0

            ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), ".json"))

            : "";
    }

    //@return amount an address has minted during all sales
    function numberMinted(address _owner) public view returns (uint256) {
        return _numberMinted(_owner);
    }

    //@return all NFT's minted including burned tokens
    function totalMinted() public view returns (uint256) {
        return _totalMinted();
    }

    function exists(uint256 _tokenId) public view returns (bool) {
        return _exists(_tokenId);
    }

    //@return url for the nft metadata
    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURI;
    }

    function setBaseURI(string calldata _URI) external onlyOwner {
        baseTokenURI = _URI;
    }

    function setCost(uint256 _cost) public onlyOwner {
        cost = _cost;
    }
  
    function setSaleActive(bool _saleActive) public onlyOwner {
        saleActive = _saleActive;
    }

    function setMaxSupply(uint128 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
    }

    function withdraw() public onlyOwner {
        uint256 initialBalance = address(this).balance;

        (bool t1, ) = payable(0x1c4291025b08B27dC67DA947334857fF543f8Ce4).call{value: initialBalance * 50 / 100}("");
        require(t1);
        
        (bool t2, ) = payable(0x952A5C17c2246C8463A29D1d772031c54C988870).call{value: initialBalance * 50 / 100}("");
        require(t2);
    }

    /// Fallbacks 
    receive() external payable { }
    fallback() external payable { }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"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":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_mintAmount","type":"uint64"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_maxSupply","type":"uint128"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_saleActive","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405267011c37937e080000600a55600b80546001600160881b0319166127101790553480156200003157600080fd5b506040518060400160405280601681526020017f546865204d6f676769652052657363756520436c75620000000000000000000081525060405180604001604052806004815260200163544d524360e01b8152506200009f62000099620000d760201b60201c565b620000db565b8151620000b49060039060208501906200012b565b508051620000ca9060049060208401906200012b565b505060018055506200020e565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200013990620001d1565b90600052602060002090601f0160209004810192826200015d5760008555620001a8565b82601f106200017857805160ff1916838001178555620001a8565b82800160010185558215620001a8579182015b82811115620001a85782518255916020019190600101906200018b565b50620001b6929150620001ba565b5090565b5b80821115620001b65760008155600101620001bb565b600181811c90821680620001e657607f821691505b602082108114156200020857634e487b7160e01b600052602260045260246000fd5b50919050565b611eb2806200021e6000396000f3fe6080604052600436106101b95760003560e01c806370a08231116100eb578063b88d4fde1161008f578063e985e9c511610061578063e985e9c514610535578063efbd73f41461057e578063f2fde38b1461059e578063fb9d09c8146105be57005b8063b88d4fde1461049d578063c87b56dd146104bd578063d5abeb01146104dd578063dc33e6811461051557005b80638da5cb5b116100c85780638da5cb5b1461043557806395d89b4114610453578063a22cb46514610468578063a2309ff81461048857005b806370a08231146103d5578063841718a6146103f55780638ac068a21461041557005b80633ccfd60b1161015d5780634f558e791161012f5780634f558e791461035457806355f804b3146103745780636352211e1461039457806368428a1b146103b457005b80633ccfd60b146102d257806342842e0e146102e7578063438b63001461030757806344a0d68a1461033457005b8063095ea7b311610196578063095ea7b31461025157806313faede61461027157806318160ddd1461029557806323b872dd146102b257005b806301ffc9a7146101c257806306fdde03146101f7578063081812fc1461021957005b366101c057005b005b3480156101ce57600080fd5b506101e26101dd366004611aa9565b6105d1565b60405190151581526020015b60405180910390f35b34801561020357600080fd5b5061020c610623565b6040516101ee9190611cce565b34801561022557600080fd5b50610239610234366004611b7d565b6106b5565b6040516001600160a01b0390911681526020016101ee565b34801561025d57600080fd5b506101c061026c366004611a64565b6106f9565b34801561027d57600080fd5b50610287600a5481565b6040519081526020016101ee565b3480156102a157600080fd5b506002546001540360001901610287565b3480156102be57600080fd5b506101c06102cd366004611923565b610787565b3480156102de57600080fd5b506101c0610792565b3480156102f357600080fd5b506101c0610302366004611923565b6108c0565b34801561031357600080fd5b506103276103223660046118d5565b6108db565b6040516101ee9190611c8a565b34801561034057600080fd5b506101c061034f366004611b7d565b6109d8565b34801561036057600080fd5b506101e261036f366004611b7d565b610a07565b34801561038057600080fd5b506101c061038f366004611ae3565b610a12565b3480156103a057600080fd5b506102396103af366004611b7d565b610a48565b3480156103c057600080fd5b50600b546101e290600160801b900460ff1681565b3480156103e157600080fd5b506102876103f03660046118d5565b610a5a565b34801561040157600080fd5b506101c0610410366004611a8e565b610aa8565b34801561042157600080fd5b506101c0610430366004611b54565b610af0565b34801561044157600080fd5b506000546001600160a01b0316610239565b34801561045f57600080fd5b5061020c610b3c565b34801561047457600080fd5b506101c0610483366004611a3a565b610b4b565b34801561049457600080fd5b50610287610be1565b3480156104a957600080fd5b506101c06104b836600461195f565b610bf5565b3480156104c957600080fd5b5061020c6104d8366004611b7d565b610c46565b3480156104e957600080fd5b50600b546104fd906001600160801b031681565b6040516001600160801b0390911681526020016101ee565b34801561052157600080fd5b506102876105303660046118d5565b610d11565b34801561054157600080fd5b506101e26105503660046118f0565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561058a57600080fd5b506101c0610599366004611b96565b610d3f565b3480156105aa57600080fd5b506101c06105b93660046118d5565b610e1f565b6101c06105cc366004611bb9565b610eba565b60006001600160e01b031982166380ac58cd60e01b148061060257506001600160e01b03198216635b5e139f60e01b145b8061061d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461063290611da4565b80601f016020809104026020016040519081016040528092919081815260200182805461065e90611da4565b80156106ab5780601f10610680576101008083540402835291602001916106ab565b820191906000526020600020905b81548152906001019060200180831161068e57829003601f168201915b5050505050905090565b60006106c08261102f565b6106dd576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061070482610a48565b9050806001600160a01b0316836001600160a01b031614156107395760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061075957506107578133610550565b155b15610777576040516367d9dca160e11b815260040160405180910390fd5b610782838383611068565b505050565b6107828383836110c4565b6000546001600160a01b031633146107c55760405162461bcd60e51b81526004016107bc90611ce1565b60405180910390fd5b476000731c4291025b08b27dc67da947334857ff543f8ce460646107ea846032611d42565b6107f49190611d2e565b604051600081818185875af1925050503d8060008114610830576040519150601f19603f3d011682016040523d82523d6000602084013e610835565b606091505b505090508061084357600080fd5b600073952a5c17c2246c8463a29d1d772031c54c9888706064610867856032611d42565b6108719190611d2e565b604051600081818185875af1925050503d80600081146108ad576040519150601f19603f3d011682016040523d82523d6000602084013e6108b2565b606091505b505090508061078257600080fd5b61078283838360405180602001604052806000815250610bf5565b606060006108e883610a5a565b90506000816001600160401b0381111561090457610904611e50565b60405190808252806020026020018201604052801561092d578160200160208202803683370190505b509050600160005b838110801561094f5750600b546001600160801b03168211155b156109ce5761095d82610a07565b1515600114156109bc57600061097283610a48565b9050866001600160a01b0316816001600160a01b031614156109ba57828483815181106109a1576109a1611e3a565b6020908102919091010152816109b681611ddf565b9250505b505b816109c681611ddf565b925050610935565b5090949350505050565b6000546001600160a01b03163314610a025760405162461bcd60e51b81526004016107bc90611ce1565b600a55565b600061061d8261102f565b6000546001600160a01b03163314610a3c5760405162461bcd60e51b81526004016107bc90611ce1565b61078260098383611810565b6000610a53826112b2565b5192915050565b60006001600160a01b038216610a83576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6000546001600160a01b03163314610ad25760405162461bcd60e51b81526004016107bc90611ce1565b600b8054911515600160801b0260ff60801b19909216919091179055565b6000546001600160a01b03163314610b1a5760405162461bcd60e51b81526004016107bc90611ce1565b600b80546001600160801b0319166001600160801b0392909216919091179055565b60606004805461063290611da4565b6001600160a01b038216331415610b755760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000610bf06001546000190190565b905090565b610c008484846110c4565b6001600160a01b0383163b15158015610c225750610c20848484846113d9565b155b15610c40576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610c518261102f565b610cb55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107bc565b6000610cbf6114d1565b90506000815111610cdf5760405180602001604052806000815250610d0a565b80610ce9846114e0565b604051602001610cfa929190611c0e565b6040516020818303038152906040525b9392505050565b6001600160a01b038116600090815260066020526040812054600160401b90046001600160401b031661061d565b8160008111610d875760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b60448201526064016107bc565b600b546001600160801b031681610d9c610be1565b610da69190611d16565b1115610deb5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016107bc565b6000546001600160a01b03163314610e155760405162461bcd60e51b81526004016107bc90611ce1565b61078282846115dd565b6000546001600160a01b03163314610e495760405162461bcd60e51b81526004016107bc90611ce1565b6001600160a01b038116610eae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107bc565b610eb7816115f7565b50565b806001600160401b031660008111610f0b5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b60448201526064016107bc565b600b546001600160801b031681610f20610be1565b610f2a9190611d16565b1115610f6f5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016107bc565b600b54600160801b900460ff16610fbd5760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742041637469766560701b60448201526064016107bc565b816001600160401b0316600a54610fd49190611d42565b34146110185760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016107bc565b61102b33836001600160401b03166115dd565b5050565b600081600111158015611043575060015482105b801561061d575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006110cf826112b2565b9050836001600160a01b031681600001516001600160a01b0316146111065760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061112457506111248533610550565b8061113f575033611134846106b5565b6001600160a01b0316145b90508061115f57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661118657604051633a954ecd60e21b815260040160405180910390fd5b61119260008487611068565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661126657600154821461126657805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b604080516060810182526000808252602082018190529181019190915281806001111580156112e2575060015481105b156113c057600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906113be5780516001600160a01b031615611355579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156113b9579392505050565b611355565b505b604051636f96cda160e11b815260040160405180910390fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061140e903390899088908890600401611c4d565b602060405180830381600087803b15801561142857600080fd5b505af1925050508015611458575060408051601f3d908101601f1916820190925261145591810190611ac6565b60015b6114b3573d808015611486576040519150601f19603f3d011682016040523d82523d6000602084013e61148b565b606091505b5080516114ab576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606009805461063290611da4565b6060816115045750506040805180820190915260018152600360fc1b602082015290565b8160005b811561152e578061151881611ddf565b91506115279050600a83611d2e565b9150611508565b6000816001600160401b0381111561154857611548611e50565b6040519080825280601f01601f191660200182016040528015611572576020820181803683370190505b5090505b84156114c957611587600183611d61565b9150611594600a86611dfa565b61159f906030611d16565b60f81b8183815181106115b4576115b4611e3a565b60200101906001600160f81b031916908160001a9053506115d6600a86611d2e565b9450611576565b61102b828260405180602001604052806000815250611647565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610782838383600180546001600160a01b03851661167757604051622e076360e81b815260040160405180910390fd5b836116955760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080546001600160801b031981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561173857506001600160a01b0387163b15155b156117c1575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461178960008884806001019550886113d9565b6117a6576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561173e5782600154146117bc57600080fd5b611807565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156117c2575b506001556112ab565b82805461181c90611da4565b90600052602060002090601f01602090048101928261183e5760008555611884565b82601f106118575782800160ff19823516178555611884565b82800160010185558215611884579182015b82811115611884578235825591602001919060010190611869565b50611890929150611894565b5090565b5b808211156118905760008155600101611895565b80356001600160a01b03811681146118c057600080fd5b919050565b803580151581146118c057600080fd5b6000602082840312156118e757600080fd5b610d0a826118a9565b6000806040838503121561190357600080fd5b61190c836118a9565b915061191a602084016118a9565b90509250929050565b60008060006060848603121561193857600080fd5b611941846118a9565b925061194f602085016118a9565b9150604084013590509250925092565b6000806000806080858703121561197557600080fd5b61197e856118a9565b935061198c602086016118a9565b92506040850135915060608501356001600160401b03808211156119af57600080fd5b818701915087601f8301126119c357600080fd5b8135818111156119d5576119d5611e50565b604051601f8201601f19908116603f011681019083821181831017156119fd576119fd611e50565b816040528281528a6020848701011115611a1657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611a4d57600080fd5b611a56836118a9565b915061191a602084016118c5565b60008060408385031215611a7757600080fd5b611a80836118a9565b946020939093013593505050565b600060208284031215611aa057600080fd5b610d0a826118c5565b600060208284031215611abb57600080fd5b8135610d0a81611e66565b600060208284031215611ad857600080fd5b8151610d0a81611e66565b60008060208385031215611af657600080fd5b82356001600160401b0380821115611b0d57600080fd5b818501915085601f830112611b2157600080fd5b813581811115611b3057600080fd5b866020828501011115611b4257600080fd5b60209290920196919550909350505050565b600060208284031215611b6657600080fd5b81356001600160801b0381168114610d0a57600080fd5b600060208284031215611b8f57600080fd5b5035919050565b60008060408385031215611ba957600080fd5b8235915061191a602084016118a9565b600060208284031215611bcb57600080fd5b81356001600160401b0381168114610d0a57600080fd5b60008151808452611bfa816020860160208601611d78565b601f01601f19169290920160200192915050565b60008351611c20818460208801611d78565b835190830190611c34818360208801611d78565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611c8090830184611be2565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611cc257835183529284019291840191600101611ca6565b50909695505050505050565b602081526000610d0a6020830184611be2565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611d2957611d29611e0e565b500190565b600082611d3d57611d3d611e24565b500490565b6000816000190483118215151615611d5c57611d5c611e0e565b500290565b600082821015611d7357611d73611e0e565b500390565b60005b83811015611d93578181015183820152602001611d7b565b83811115610c405750506000910152565b600181811c90821680611db857607f821691505b60208210811415611dd957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611df357611df3611e0e565b5060010190565b600082611e0957611e09611e24565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610eb757600080fdfea2646970667358221220aafc7b2dc0e335daa9295448ce5df05acf5fbc063748cb42c0fc70f747a4913a64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101b95760003560e01c806370a08231116100eb578063b88d4fde1161008f578063e985e9c511610061578063e985e9c514610535578063efbd73f41461057e578063f2fde38b1461059e578063fb9d09c8146105be57005b8063b88d4fde1461049d578063c87b56dd146104bd578063d5abeb01146104dd578063dc33e6811461051557005b80638da5cb5b116100c85780638da5cb5b1461043557806395d89b4114610453578063a22cb46514610468578063a2309ff81461048857005b806370a08231146103d5578063841718a6146103f55780638ac068a21461041557005b80633ccfd60b1161015d5780634f558e791161012f5780634f558e791461035457806355f804b3146103745780636352211e1461039457806368428a1b146103b457005b80633ccfd60b146102d257806342842e0e146102e7578063438b63001461030757806344a0d68a1461033457005b8063095ea7b311610196578063095ea7b31461025157806313faede61461027157806318160ddd1461029557806323b872dd146102b257005b806301ffc9a7146101c257806306fdde03146101f7578063081812fc1461021957005b366101c057005b005b3480156101ce57600080fd5b506101e26101dd366004611aa9565b6105d1565b60405190151581526020015b60405180910390f35b34801561020357600080fd5b5061020c610623565b6040516101ee9190611cce565b34801561022557600080fd5b50610239610234366004611b7d565b6106b5565b6040516001600160a01b0390911681526020016101ee565b34801561025d57600080fd5b506101c061026c366004611a64565b6106f9565b34801561027d57600080fd5b50610287600a5481565b6040519081526020016101ee565b3480156102a157600080fd5b506002546001540360001901610287565b3480156102be57600080fd5b506101c06102cd366004611923565b610787565b3480156102de57600080fd5b506101c0610792565b3480156102f357600080fd5b506101c0610302366004611923565b6108c0565b34801561031357600080fd5b506103276103223660046118d5565b6108db565b6040516101ee9190611c8a565b34801561034057600080fd5b506101c061034f366004611b7d565b6109d8565b34801561036057600080fd5b506101e261036f366004611b7d565b610a07565b34801561038057600080fd5b506101c061038f366004611ae3565b610a12565b3480156103a057600080fd5b506102396103af366004611b7d565b610a48565b3480156103c057600080fd5b50600b546101e290600160801b900460ff1681565b3480156103e157600080fd5b506102876103f03660046118d5565b610a5a565b34801561040157600080fd5b506101c0610410366004611a8e565b610aa8565b34801561042157600080fd5b506101c0610430366004611b54565b610af0565b34801561044157600080fd5b506000546001600160a01b0316610239565b34801561045f57600080fd5b5061020c610b3c565b34801561047457600080fd5b506101c0610483366004611a3a565b610b4b565b34801561049457600080fd5b50610287610be1565b3480156104a957600080fd5b506101c06104b836600461195f565b610bf5565b3480156104c957600080fd5b5061020c6104d8366004611b7d565b610c46565b3480156104e957600080fd5b50600b546104fd906001600160801b031681565b6040516001600160801b0390911681526020016101ee565b34801561052157600080fd5b506102876105303660046118d5565b610d11565b34801561054157600080fd5b506101e26105503660046118f0565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561058a57600080fd5b506101c0610599366004611b96565b610d3f565b3480156105aa57600080fd5b506101c06105b93660046118d5565b610e1f565b6101c06105cc366004611bb9565b610eba565b60006001600160e01b031982166380ac58cd60e01b148061060257506001600160e01b03198216635b5e139f60e01b145b8061061d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461063290611da4565b80601f016020809104026020016040519081016040528092919081815260200182805461065e90611da4565b80156106ab5780601f10610680576101008083540402835291602001916106ab565b820191906000526020600020905b81548152906001019060200180831161068e57829003601f168201915b5050505050905090565b60006106c08261102f565b6106dd576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061070482610a48565b9050806001600160a01b0316836001600160a01b031614156107395760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061075957506107578133610550565b155b15610777576040516367d9dca160e11b815260040160405180910390fd5b610782838383611068565b505050565b6107828383836110c4565b6000546001600160a01b031633146107c55760405162461bcd60e51b81526004016107bc90611ce1565b60405180910390fd5b476000731c4291025b08b27dc67da947334857ff543f8ce460646107ea846032611d42565b6107f49190611d2e565b604051600081818185875af1925050503d8060008114610830576040519150601f19603f3d011682016040523d82523d6000602084013e610835565b606091505b505090508061084357600080fd5b600073952a5c17c2246c8463a29d1d772031c54c9888706064610867856032611d42565b6108719190611d2e565b604051600081818185875af1925050503d80600081146108ad576040519150601f19603f3d011682016040523d82523d6000602084013e6108b2565b606091505b505090508061078257600080fd5b61078283838360405180602001604052806000815250610bf5565b606060006108e883610a5a565b90506000816001600160401b0381111561090457610904611e50565b60405190808252806020026020018201604052801561092d578160200160208202803683370190505b509050600160005b838110801561094f5750600b546001600160801b03168211155b156109ce5761095d82610a07565b1515600114156109bc57600061097283610a48565b9050866001600160a01b0316816001600160a01b031614156109ba57828483815181106109a1576109a1611e3a565b6020908102919091010152816109b681611ddf565b9250505b505b816109c681611ddf565b925050610935565b5090949350505050565b6000546001600160a01b03163314610a025760405162461bcd60e51b81526004016107bc90611ce1565b600a55565b600061061d8261102f565b6000546001600160a01b03163314610a3c5760405162461bcd60e51b81526004016107bc90611ce1565b61078260098383611810565b6000610a53826112b2565b5192915050565b60006001600160a01b038216610a83576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6000546001600160a01b03163314610ad25760405162461bcd60e51b81526004016107bc90611ce1565b600b8054911515600160801b0260ff60801b19909216919091179055565b6000546001600160a01b03163314610b1a5760405162461bcd60e51b81526004016107bc90611ce1565b600b80546001600160801b0319166001600160801b0392909216919091179055565b60606004805461063290611da4565b6001600160a01b038216331415610b755760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000610bf06001546000190190565b905090565b610c008484846110c4565b6001600160a01b0383163b15158015610c225750610c20848484846113d9565b155b15610c40576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610c518261102f565b610cb55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107bc565b6000610cbf6114d1565b90506000815111610cdf5760405180602001604052806000815250610d0a565b80610ce9846114e0565b604051602001610cfa929190611c0e565b6040516020818303038152906040525b9392505050565b6001600160a01b038116600090815260066020526040812054600160401b90046001600160401b031661061d565b8160008111610d875760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b60448201526064016107bc565b600b546001600160801b031681610d9c610be1565b610da69190611d16565b1115610deb5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016107bc565b6000546001600160a01b03163314610e155760405162461bcd60e51b81526004016107bc90611ce1565b61078282846115dd565b6000546001600160a01b03163314610e495760405162461bcd60e51b81526004016107bc90611ce1565b6001600160a01b038116610eae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107bc565b610eb7816115f7565b50565b806001600160401b031660008111610f0b5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b60448201526064016107bc565b600b546001600160801b031681610f20610be1565b610f2a9190611d16565b1115610f6f5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016107bc565b600b54600160801b900460ff16610fbd5760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742041637469766560701b60448201526064016107bc565b816001600160401b0316600a54610fd49190611d42565b34146110185760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016107bc565b61102b33836001600160401b03166115dd565b5050565b600081600111158015611043575060015482105b801561061d575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006110cf826112b2565b9050836001600160a01b031681600001516001600160a01b0316146111065760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061112457506111248533610550565b8061113f575033611134846106b5565b6001600160a01b0316145b90508061115f57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661118657604051633a954ecd60e21b815260040160405180910390fd5b61119260008487611068565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661126657600154821461126657805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b604080516060810182526000808252602082018190529181019190915281806001111580156112e2575060015481105b156113c057600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906113be5780516001600160a01b031615611355579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156113b9579392505050565b611355565b505b604051636f96cda160e11b815260040160405180910390fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061140e903390899088908890600401611c4d565b602060405180830381600087803b15801561142857600080fd5b505af1925050508015611458575060408051601f3d908101601f1916820190925261145591810190611ac6565b60015b6114b3573d808015611486576040519150601f19603f3d011682016040523d82523d6000602084013e61148b565b606091505b5080516114ab576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606009805461063290611da4565b6060816115045750506040805180820190915260018152600360fc1b602082015290565b8160005b811561152e578061151881611ddf565b91506115279050600a83611d2e565b9150611508565b6000816001600160401b0381111561154857611548611e50565b6040519080825280601f01601f191660200182016040528015611572576020820181803683370190505b5090505b84156114c957611587600183611d61565b9150611594600a86611dfa565b61159f906030611d16565b60f81b8183815181106115b4576115b4611e3a565b60200101906001600160f81b031916908160001a9053506115d6600a86611d2e565b9450611576565b61102b828260405180602001604052806000815250611647565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610782838383600180546001600160a01b03851661167757604051622e076360e81b815260040160405180910390fd5b836116955760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080546001600160801b031981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561173857506001600160a01b0387163b15155b156117c1575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461178960008884806001019550886113d9565b6117a6576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561173e5782600154146117bc57600080fd5b611807565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156117c2575b506001556112ab565b82805461181c90611da4565b90600052602060002090601f01602090048101928261183e5760008555611884565b82601f106118575782800160ff19823516178555611884565b82800160010185558215611884579182015b82811115611884578235825591602001919060010190611869565b50611890929150611894565b5090565b5b808211156118905760008155600101611895565b80356001600160a01b03811681146118c057600080fd5b919050565b803580151581146118c057600080fd5b6000602082840312156118e757600080fd5b610d0a826118a9565b6000806040838503121561190357600080fd5b61190c836118a9565b915061191a602084016118a9565b90509250929050565b60008060006060848603121561193857600080fd5b611941846118a9565b925061194f602085016118a9565b9150604084013590509250925092565b6000806000806080858703121561197557600080fd5b61197e856118a9565b935061198c602086016118a9565b92506040850135915060608501356001600160401b03808211156119af57600080fd5b818701915087601f8301126119c357600080fd5b8135818111156119d5576119d5611e50565b604051601f8201601f19908116603f011681019083821181831017156119fd576119fd611e50565b816040528281528a6020848701011115611a1657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611a4d57600080fd5b611a56836118a9565b915061191a602084016118c5565b60008060408385031215611a7757600080fd5b611a80836118a9565b946020939093013593505050565b600060208284031215611aa057600080fd5b610d0a826118c5565b600060208284031215611abb57600080fd5b8135610d0a81611e66565b600060208284031215611ad857600080fd5b8151610d0a81611e66565b60008060208385031215611af657600080fd5b82356001600160401b0380821115611b0d57600080fd5b818501915085601f830112611b2157600080fd5b813581811115611b3057600080fd5b866020828501011115611b4257600080fd5b60209290920196919550909350505050565b600060208284031215611b6657600080fd5b81356001600160801b0381168114610d0a57600080fd5b600060208284031215611b8f57600080fd5b5035919050565b60008060408385031215611ba957600080fd5b8235915061191a602084016118a9565b600060208284031215611bcb57600080fd5b81356001600160401b0381168114610d0a57600080fd5b60008151808452611bfa816020860160208601611d78565b601f01601f19169290920160200192915050565b60008351611c20818460208801611d78565b835190830190611c34818360208801611d78565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611c8090830184611be2565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611cc257835183529284019291840191600101611ca6565b50909695505050505050565b602081526000610d0a6020830184611be2565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611d2957611d29611e0e565b500190565b600082611d3d57611d3d611e24565b500490565b6000816000190483118215151615611d5c57611d5c611e0e565b500290565b600082821015611d7357611d73611e0e565b500390565b60005b83811015611d93578181015183820152602001611d7b565b83811115610c405750506000910152565b600181811c90821680611db857607f821691505b60208210811415611dd957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611df357611df3611e0e565b5060010190565b600082611e0957611e09611e24565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610eb757600080fdfea2646970667358221220aafc7b2dc0e335daa9295448ce5df05acf5fbc063748cb42c0fc70f747a4913a64736f6c63430008070033

Deployed Bytecode Sourcemap

45603:4041:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24709:315;;;;;;;;;;-1:-1:-1;24709:315:0;;;;;:::i;:::-;;:::i;:::-;;;7749:14:1;;7742:22;7724:41;;7712:2;7697:18;24709:315:0;;;;;;;;27992:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29589:212::-;;;;;;;;;;-1:-1:-1;29589:212:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6410:32:1;;;6392:51;;6380:2;6365:18;29589:212:0;6246:203:1;29124:389:0;;;;;;;;;;-1:-1:-1;29124:389:0;;;;;:::i;:::-;;:::i;45735:32::-;;;;;;;;;;;;;;;;;;;10946:25:1;;;10934:2;10919:18;45735:32:0;10800:177:1;23914:315:0;;;;;;;;;;-1:-1:-1;24176:12:0;;23759:1;24160:13;:28;-1:-1:-1;;24160:46:0;23914:315;;30506:182;;;;;;;;;;-1:-1:-1;30506:182:0;;;;;:::i;:::-;;:::i;49150:396::-;;;;;;;;;;;;;:::i;30769:197::-;;;;;;;;;;-1:-1:-1;30769:197:0;;;;;:::i;:::-;;:::i;46772:802::-;;;;;;;;;;-1:-1:-1;46772:802:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48843:80::-;;;;;;;;;;-1:-1:-1;48843:80:0;;;;;:::i;:::-;;:::i;48463:104::-;;;;;;;;;;-1:-1:-1;48463:104:0;;;;;:::i;:::-;;:::i;48736:99::-;;;;;;;;;;-1:-1:-1;48736:99:0;;;;;:::i;:::-;;:::i;27786:129::-;;;;;;;;;;-1:-1:-1;27786:129:0;;;;;:::i;:::-;;:::i;45817:30::-;;;;;;;;;;-1:-1:-1;45817:30:0;;;;-1:-1:-1;;;45817:30:0;;;;;;25098:212;;;;;;;;;;-1:-1:-1;25098:212:0;;;;;:::i;:::-;;:::i;48933:101::-;;;;;;;;;;-1:-1:-1;48933:101:0;;;;;:::i;:::-;;:::i;49042:100::-;;;;;;;;;;-1:-1:-1;49042:100:0;;;;;:::i;:::-;;:::i;44523:87::-;;;;;;;;;;-1:-1:-1;44569:7:0;44596:6;-1:-1:-1;;;;;44596:6:0;44523:87;;28175:108;;;;;;;;;;;;;:::i;29883:297::-;;;;;;;;;;-1:-1:-1;29883:297:0;;;;;:::i;:::-;;:::i;48362:93::-;;;;;;;;;;;;;:::i;31047:389::-;;;;;;;;;;-1:-1:-1;31047:389:0;;;;;:::i;:::-;;:::i;47630:484::-;;;;;;;;;;-1:-1:-1;47630:484:0;;;;;:::i;:::-;;:::i;45776:32::-;;;;;;;;;;-1:-1:-1;45776:32:0;;;;-1:-1:-1;;;;;45776:32:0;;;;;;-1:-1:-1;;;;;10741:47:1;;;10723:66;;10711:2;10696:18;45776:32:0;10577:218:1;48183:115:0;;;;;;;;;;-1:-1:-1;48183:115:0;;;;;:::i;:::-;;:::i;30261:168::-;;;;;;;;;;-1:-1:-1;30261:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;30384:25:0;;;30358:4;30384:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30261:168;46540:161;;;;;;;;;;-1:-1:-1;46540:161:0;;;;;:::i;:::-;;:::i;44978:201::-;;;;;;;;;;-1:-1:-1;44978:201:0;;;;;:::i;:::-;;:::i;46203:256::-;;;;;;:::i;:::-;;:::i;24709:315::-;24811:4;-1:-1:-1;;;;;;24852:40:0;;-1:-1:-1;;;24852:40:0;;:107;;-1:-1:-1;;;;;;;24911:48:0;;-1:-1:-1;;;24911:48:0;24852:107;:162;;;-1:-1:-1;;;;;;;;;;13584:40:0;;;24978:36;24830:184;24709:315;-1:-1:-1;;24709:315:0:o;27992:104::-;28046:13;28081:5;28074:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27992:104;:::o;29589:212::-;29657:7;29684:16;29692:7;29684;:16::i;:::-;29679:64;;29709:34;;-1:-1:-1;;;29709:34:0;;;;;;;;;;;29679:64;-1:-1:-1;29767:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29767:24:0;;29589:212::o;29124:389::-;29199:13;29215:24;29231:7;29215:15;:24::i;:::-;29199:40;;29262:5;-1:-1:-1;;;;;29256:11:0;:2;-1:-1:-1;;;;;29256:11:0;;29252:48;;;29276:24;;-1:-1:-1;;;29276:24:0;;;;;;;;;;;29252:48;20073:10;-1:-1:-1;;;;;29321:21:0;;;;;;:63;;-1:-1:-1;29347:37:0;29364:5;20073:10;30261:168;:::i;29347:37::-;29346:38;29321:63;29317:142;;;29410:35;;-1:-1:-1;;;29410:35:0;;;;;;;;;;;29317:142;29475:28;29484:2;29488:7;29497:5;29475:8;:28::i;:::-;29186:327;29124:389;;:::o;30506:182::-;30650:28;30660:4;30666:2;30670:7;30650:9;:28::i;49150:396::-;44569:7;44596:6;-1:-1:-1;;;;;44596:6:0;20073:10;44743:23;44735:68;;;;-1:-1:-1;;;44735:68:0;;;;;;;:::i;:::-;;;;;;;;;49223:21:::1;49198:22;49279:42;49357:3;49335:19;49223:21:::0;49352:2:::1;49335:19;:::i;:::-;:25;;;;:::i;:::-;49271:94;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49257:108;;;49384:2;49376:11;;;::::0;::::1;;49409:7;49430:42;49508:3;49486:19;:14:::0;49503:2:::1;49486:19;:::i;:::-;:25;;;;:::i;:::-;49422:94;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49408:108;;;49535:2;49527:11;;;::::0;::::1;30769:197:::0;30917:39;30934:4;30940:2;30944:7;30917:39;;;;;;;;;;;;:16;:39::i;46772:802::-;46861:16;46895:23;46921:17;46931:6;46921:9;:17::i;:::-;46895:43;;46949:30;46996:15;-1:-1:-1;;;;;46982:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46982:30:0;-1:-1:-1;46949:63:0;-1:-1:-1;47048:1:0;47023:22;47100:434;47125:15;47107;:33;:64;;;;-1:-1:-1;47162:9:0;;-1:-1:-1;;;;;47162:9:0;47144:27;;;47107:64;47100:434;;;47191:22;47198:14;47191:6;:22::i;:::-;:30;;47217:4;47191:30;47188:304;;;47242:25;47270:23;47278:14;47270:7;:23::i;:::-;47242:51;;47339:6;-1:-1:-1;;;;;47318:27:0;:17;-1:-1:-1;;;;;47318:27:0;;47314:163;;;47403:14;47370:13;47384:15;47370:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;47440:17;;;;:::i;:::-;;;;47314:163;47223:269;47188:304;47506:16;;;;:::i;:::-;;;;47100:434;;;-1:-1:-1;47553:13:0;;46772:802;-1:-1:-1;;;;46772:802:0:o;48843:80::-;44569:7;44596:6;-1:-1:-1;;;;;44596:6:0;20073:10;44743:23;44735:68;;;;-1:-1:-1;;;44735:68:0;;;;;;;:::i;:::-;48903:4:::1;:12:::0;48843:80::o;48463:104::-;48518:4;48542:17;48550:8;48542:7;:17::i;48736:99::-;44569:7;44596:6;-1:-1:-1;;;;;44596:6:0;20073:10;44743:23;44735:68;;;;-1:-1:-1;;;44735:68:0;;;;;;;:::i;:::-;48808:19:::1;:12;48823:4:::0;;48808:19:::1;:::i;27786:129::-:0;27850:7;27879:21;27892:7;27879:12;:21::i;:::-;:26;;27786:129;-1:-1:-1;;27786:129:0:o;25098:212::-;25162:7;-1:-1:-1;;;;;25188:19:0;;25184:60;;25216:28;;-1:-1:-1;;;25216:28:0;;;;;;;;;;;25184:60;-1:-1:-1;;;;;;25272:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;25272:27:0;;25098:212::o;48933:101::-;44569:7;44596:6;-1:-1:-1;;;;;44596:6:0;20073:10;44743:23;44735:68;;;;-1:-1:-1;;;44735:68:0;;;;;;;:::i;:::-;49002:10:::1;:24:::0;;;::::1;;-1:-1:-1::0;;;49002:24:0::1;-1:-1:-1::0;;;;49002:24:0;;::::1;::::0;;;::::1;::::0;;48933:101::o;49042:100::-;44569:7;44596:6;-1:-1:-1;;;;;44596:6:0;20073:10;44743:23;44735:68;;;;-1:-1:-1;;;44735:68:0;;;;;;;:::i;:::-;49112:9:::1;:22:::0;;-1:-1:-1;;;;;;49112:22:0::1;-1:-1:-1::0;;;;;49112:22:0;;;::::1;::::0;;;::::1;::::0;;49042:100::o;28175:108::-;28231:13;28266:7;28259:14;;;;;:::i;29883:297::-;-1:-1:-1;;;;;29984:24:0;;20073:10;29984:24;29980:54;;;30017:17;;-1:-1:-1;;;30017:17:0;;;;;;;;;;;29980:54;20073:10;30051:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;30051:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;30051:53:0;;;;;;;;;;30122:48;;7724:41:1;;;30051:42:0;;20073:10;30122:48;;7697:18:1;30122:48:0;;;;;;;29883:297;;:::o;48362:93::-;48406:7;48433:14;23759:1;24573:13;-1:-1:-1;;24573:31:0;;24332:295;48433:14;48426:21;;48362:93;:::o;31047:389::-;31226:28;31236:4;31242:2;31246:7;31226:9;:28::i;:::-;-1:-1:-1;;;;;31271:13:0;;3687:19;:23;;31271:76;;;;;31291:56;31322:4;31328:2;31332:7;31341:5;31291:30;:56::i;:::-;31290:57;31271:76;31267:160;;;31373:40;;-1:-1:-1;;;31373:40:0;;;;;;;;;;;31267:160;31047:389;;;;:::o;47630:484::-;47751:13;47804:17;47812:8;47804:7;:17::i;:::-;47786:106;;;;-1:-1:-1;;;47786:106:0;;9666:2:1;47786:106:0;;;9648:21:1;9705:2;9685:18;;;9678:30;9744:34;9724:18;;;9717:62;-1:-1:-1;;;9795:18:1;;;9788:45;9850:19;;47786:106:0;9464:411:1;47786:106:0;47905:28;47936:10;:8;:10::i;:::-;47905:41;;47997:1;47972:14;47966:28;:32;:140;;;;;;;;;;;;;;;;;48040:14;48056:19;:8;:17;:19::i;:::-;48023:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47966:140;47959:147;47630:484;-1:-1:-1;;;47630:484:0:o;48183:115::-;-1:-1:-1;;;;;25500:19:0;;48242:7;25500:19;;;:12;:19;;;;;:32;-1:-1:-1;;;25500:32:0;;-1:-1:-1;;;;;25500:32:0;48269:21;25402:141;46540:161;46626:11;46000:1;45986:11;:15;45978:49;;;;-1:-1:-1;;;45978:49:0;;8609:2:1;45978:49:0;;;8591:21:1;8648:2;8628:18;;;8621:30;-1:-1:-1;;;8667:18:1;;;8660:50;8727:18;;45978:49:0;8407:344:1;45978:49:0;46077:9;;-1:-1:-1;;;;;46077:9:0;46062:11;46046:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;46038:73;;;;-1:-1:-1;;;46038:73:0;;10082:2:1;46038:73:0;;;10064:21:1;10121:2;10101:18;;;10094:30;-1:-1:-1;;;10140:18:1;;;10133:50;10200:18;;46038:73:0;9880:344:1;46038:73:0;44569:7;44596:6;-1:-1:-1;;;;;44596:6:0;20073:10;44743:23:::1;44735:68;;;;-1:-1:-1::0;;;44735:68:0::1;;;;;;;:::i;:::-;46660:33:::2;46670:9;46681:11;46660:9;:33::i;44978:201::-:0;44569:7;44596:6;-1:-1:-1;;;;;44596:6:0;20073:10;44743:23;44735:68;;;;-1:-1:-1;;;44735:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45067:22:0;::::1;45059:73;;;::::0;-1:-1:-1;;;45059:73:0;;8202:2:1;45059:73:0::1;::::0;::::1;8184:21:1::0;8241:2;8221:18;;;8214:30;8280:34;8260:18;;;8253:62;-1:-1:-1;;;8331:18:1;;;8324:36;8377:19;;45059:73:0::1;8000:402:1::0;45059:73:0::1;45143:28;45162:8;45143:18;:28::i;:::-;44978:201:::0;:::o;46203:256::-;46267:11;-1:-1:-1;;;;;45922:209:0;46000:1;45986:11;:15;45978:49;;;;-1:-1:-1;;;45978:49:0;;8609:2:1;45978:49:0;;;8591:21:1;8648:2;8628:18;;;8621:30;-1:-1:-1;;;8667:18:1;;;8660:50;8727:18;;45978:49:0;8407:344:1;45978:49:0;46077:9;;-1:-1:-1;;;;;46077:9:0;46062:11;46046:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;46038:73;;;;-1:-1:-1;;;46038:73:0;;10082:2:1;46038:73:0;;;10064:21:1;10121:2;10101:18;;;10094:30;-1:-1:-1;;;10140:18:1;;;10133:50;10200:18;;46038:73:0;9880:344:1;46038:73:0;46299:10:::1;::::0;-1:-1:-1;;;46299:10:0;::::1;;;46291:41;;;::::0;-1:-1:-1;;;46291:41:0;;8958:2:1;46291:41:0::1;::::0;::::1;8940:21:1::0;8997:2;8977:18;;;8970:30;-1:-1:-1;;;9016:18:1;;;9009:48;9074:18;;46291:41:0::1;8756:342:1::0;46291:41:0::1;46371:11;-1:-1:-1::0;;;;;46364:18:0::1;:4;;:18;;;;:::i;:::-;46351:9;:31;46343:63;;;::::0;-1:-1:-1;;;46343:63:0;;10431:2:1;46343:63:0::1;::::0;::::1;10413:21:1::0;10470:2;10450:18;;;10443:30;-1:-1:-1;;;10489:18:1;;;10482:49;10548:18;;46343:63:0::1;10229:343:1::0;46343:63:0::1;46417:34;46427:10;46439:11;-1:-1:-1::0;;;;;46417:34:0::1;:9;:34::i;:::-;46203:256:::0;;:::o;31709:193::-;31766:4;31811:7;23759:1;31792:26;;:53;;;;;31832:13;;31822:7;:23;31792:53;:100;;;;-1:-1:-1;;31865:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;31865:27:0;;;;31864:28;;31709:193::o;40315:210::-;40440:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;40440:29:0;-1:-1:-1;;;;;40440:29:0;;;;;;;;;40487:28;;40440:24;;40487:28;;;;;;;40315:210;;;:::o;35004:2226::-;35129:35;35167:21;35180:7;35167:12;:21::i;:::-;35129:59;;35231:4;-1:-1:-1;;;;;35209:26:0;:13;:18;;;-1:-1:-1;;;;;35209:26:0;;35205:67;;35244:28;;-1:-1:-1;;;35244:28:0;;;;;;;;;;;35205:67;35289:22;20073:10;-1:-1:-1;;;;;35315:20:0;;;;:75;;-1:-1:-1;35354:36:0;35371:4;20073:10;30261:168;:::i;35354:36::-;35315:130;;;-1:-1:-1;20073:10:0;35409:20;35421:7;35409:11;:20::i;:::-;-1:-1:-1;;;;;35409:36:0;;35315:130;35289:157;;35468:17;35463:66;;35494:35;;-1:-1:-1;;;35494:35:0;;;;;;;;;;;35463:66;-1:-1:-1;;;;;35546:16:0;;35542:52;;35571:23;;-1:-1:-1;;;35571:23:0;;;;;;;;;;;35542:52;35725:35;35742:1;35746:7;35755:4;35725:8;:35::i;:::-;-1:-1:-1;;;;;36068:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;36068:31:0;;;-1:-1:-1;;;;;36068:31:0;;;-1:-1:-1;;36068:31:0;;;;;;;36116:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;36116:29:0;;;;;;;;;;;36200:20;;;:11;:20;;;;;;36237:18;;-1:-1:-1;;;;;;36272:49:0;;;;-1:-1:-1;;;36305:15:0;36272:49;;;;;;;;;;36603:11;;36665:24;;;;;36710:13;;36200:20;;36665:24;;36710:13;36706:398;;36926:13;;36911:11;:28;36907:180;;36966:20;;37037:28;;;;-1:-1:-1;;;;;37011:54:0;-1:-1:-1;;;37011:54:0;-1:-1:-1;;;;;;37011:54:0;;;-1:-1:-1;;;;;36966:20:0;;37011:54;;;;36907:180;36041:1076;;;37157:7;37153:2;-1:-1:-1;;;;;37138:27:0;37147:4;-1:-1:-1;;;;;37138:27:0;;;;;;;;;;;37178:42;35116:2114;;35004:2226;;;:::o;26555:1159::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;26668:7:0;;23759:1;26723:23;;:47;;;;;26757:13;;26750:4;:20;26723:47;26719:922;;;26793:31;26827:17;;;:11;:17;;;;;;;;;26793:51;;;;;;;;;-1:-1:-1;;;;;26793:51:0;;;;-1:-1:-1;;;26793:51:0;;-1:-1:-1;;;;;26793:51:0;;;;;;;;-1:-1:-1;;;26793:51:0;;;;;;;;;;;;;;26865:759;;26917:14;;-1:-1:-1;;;;;26917:28:0;;26913:105;;26983:9;26555:1159;-1:-1:-1;;;26555:1159:0:o;26913:105::-;-1:-1:-1;;;27372:6:0;27419:17;;;;:11;:17;;;;;;;;;27407:29;;;;;;;;;-1:-1:-1;;;;;27407:29:0;;;;;-1:-1:-1;;;27407:29:0;;-1:-1:-1;;;;;27407:29:0;;;;;;;;-1:-1:-1;;;27407:29:0;;;;;;;;;;;;;27469:28;27465:113;;27539:9;26555:1159;-1:-1:-1;;;26555:1159:0:o;27465:113::-;27330:273;;;26772:869;26719:922;27673:31;;-1:-1:-1;;;27673:31:0;;;;;;;;;;;41039:701;41235:72;;-1:-1:-1;;;41235:72:0;;41212:4;;-1:-1:-1;;;;;41235:36:0;;;;;:72;;20073:10;;41286:4;;41292:7;;41301:5;;41235:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41235:72:0;;;;;;;;-1:-1:-1;;41235:72:0;;;;;;;;;;;;:::i;:::-;;;41231:500;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41475:13:0;;41471:247;;41523:40;;-1:-1:-1;;;41523:40:0;;;;;;;;;;;41471:247;41672:6;41666:13;41657:6;41653:2;41649:15;41642:38;41231:500;-1:-1:-1;;;;;;41356:55:0;-1:-1:-1;;;41356:55:0;;-1:-1:-1;41231:500:0;41039:701;;;;;;:::o;48615:113::-;48675:13;48708:12;48701:19;;;;;:::i;400:723::-;456:13;677:10;673:53;;-1:-1:-1;;704:10:0;;;;;;;;;;;;-1:-1:-1;;;704:10:0;;;;;400:723::o;673:53::-;751:5;736:12;792:78;799:9;;792:78;;825:8;;;;:::i;:::-;;-1:-1:-1;848:10:0;;-1:-1:-1;856:2:0;848:10;;:::i;:::-;;;792:78;;;880:19;912:6;-1:-1:-1;;;;;902:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;902:17:0;;880:39;;930:154;937:10;;930:154;;964:11;974:1;964:11;;:::i;:::-;;-1:-1:-1;1033:10:0;1041:2;1033:5;:10;:::i;:::-;1020:24;;:2;:24;:::i;:::-;1007:39;;990:6;997;990:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;990:56:0;;;;;;;;-1:-1:-1;1061:11:0;1070:2;1061:11;;:::i;:::-;;;930:154;;31914:108;31985:27;31995:2;31999:8;31985:27;;;;;;;;;;;;:9;:27::i;45339:191::-;45413:16;45432:6;;-1:-1:-1;;;;;45449:17:0;;;-1:-1:-1;;;;;;45449:17:0;;;;;;45482:40;;45432:6;;;;;;;45482:40;;45413:16;45482:40;45402:128;45339:191;:::o;32409:175::-;32542:32;32548:2;32552:8;32562:5;32569:4;33041:13;;-1:-1:-1;;;;;33071:16:0;;33067:48;;33096:19;;-1:-1:-1;;;33096:19:0;;;;;;;;;;;33067:48;33132:13;33128:44;;33154:18;;-1:-1:-1;;;33154:18:0;;;;;;;;;;;33128:44;-1:-1:-1;;;;;33539:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;;;;;33600:49:0;;-1:-1:-1;;;;;33539:44:0;;;;;;;33600:49;;;-1:-1:-1;;;;;33539:44:0;;;;;;33600:49;;;;;;;;;;;;;;;;33670:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;33722:66:0;;;;-1:-1:-1;;;33772:15:0;33722:66;;;;;;;;;;33670:25;33875:23;;;33923:4;:23;;;;-1:-1:-1;;;;;;33931:13:0;;3687:19;:23;;33931:15;33919:667;;;33969:324;34002:38;;34027:12;;-1:-1:-1;;;;;34002:38:0;;;34019:1;;34002:38;;34019:1;;34002:38;34070:69;34109:1;34113:2;34117:14;;;;;;34133:5;34070:30;:69::i;:::-;34065:178;;34177:40;;-1:-1:-1;;;34177:40:0;;;;;;;;;;;34065:178;34288:3;34272:12;:19;;33969:324;;34378:12;34361:13;;:29;34357:43;;34392:8;;;34357:43;33919:667;;;34445:124;34478:40;;34503:14;;;;;-1:-1:-1;;;;;34478:40:0;;;34495:1;;34478:40;;34495:1;;34478:40;34564:3;34548:12;:19;;34445:124;;33919:667;-1:-1:-1;34602:13:0;:28;34656:60;31047:389;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:160::-;257:20;;313:13;;306:21;296:32;;286:60;;342:1;339;332:12;357:186;416:6;469:2;457:9;448:7;444:23;440:32;437:52;;;485:1;482;475:12;437:52;508:29;527:9;508:29;:::i;548:260::-;616:6;624;677:2;665:9;656:7;652:23;648:32;645:52;;;693:1;690;683:12;645:52;716:29;735:9;716:29;:::i;:::-;706:39;;764:38;798:2;787:9;783:18;764:38;:::i;:::-;754:48;;548:260;;;;;:::o;813:328::-;890:6;898;906;959:2;947:9;938:7;934:23;930:32;927:52;;;975:1;972;965:12;927:52;998:29;1017:9;998:29;:::i;:::-;988:39;;1046:38;1080:2;1069:9;1065:18;1046:38;:::i;:::-;1036:48;;1131:2;1120:9;1116:18;1103:32;1093:42;;813:328;;;;;:::o;1146:1138::-;1241:6;1249;1257;1265;1318:3;1306:9;1297:7;1293:23;1289:33;1286:53;;;1335:1;1332;1325:12;1286:53;1358:29;1377:9;1358:29;:::i;:::-;1348:39;;1406:38;1440:2;1429:9;1425:18;1406:38;:::i;:::-;1396:48;;1491:2;1480:9;1476:18;1463:32;1453:42;;1546:2;1535:9;1531:18;1518:32;-1:-1:-1;;;;;1610:2:1;1602:6;1599:14;1596:34;;;1626:1;1623;1616:12;1596:34;1664:6;1653:9;1649:22;1639:32;;1709:7;1702:4;1698:2;1694:13;1690:27;1680:55;;1731:1;1728;1721:12;1680:55;1767:2;1754:16;1789:2;1785;1782:10;1779:36;;;1795:18;;:::i;:::-;1870:2;1864:9;1838:2;1924:13;;-1:-1:-1;;1920:22:1;;;1944:2;1916:31;1912:40;1900:53;;;1968:18;;;1988:22;;;1965:46;1962:72;;;2014:18;;:::i;:::-;2054:10;2050:2;2043:22;2089:2;2081:6;2074:18;2129:7;2124:2;2119;2115;2111:11;2107:20;2104:33;2101:53;;;2150:1;2147;2140:12;2101:53;2206:2;2201;2197;2193:11;2188:2;2180:6;2176:15;2163:46;2251:1;2246:2;2241;2233:6;2229:15;2225:24;2218:35;2272:6;2262:16;;;;;;;1146:1138;;;;;;;:::o;2289:254::-;2354:6;2362;2415:2;2403:9;2394:7;2390:23;2386:32;2383:52;;;2431:1;2428;2421:12;2383:52;2454:29;2473:9;2454:29;:::i;:::-;2444:39;;2502:35;2533:2;2522:9;2518:18;2502:35;:::i;2548:254::-;2616:6;2624;2677:2;2665:9;2656:7;2652:23;2648:32;2645:52;;;2693:1;2690;2683:12;2645:52;2716:29;2735:9;2716:29;:::i;:::-;2706:39;2792:2;2777:18;;;;2764:32;;-1:-1:-1;;;2548:254:1:o;2807:180::-;2863:6;2916:2;2904:9;2895:7;2891:23;2887:32;2884:52;;;2932:1;2929;2922:12;2884:52;2955:26;2971:9;2955:26;:::i;2992:245::-;3050:6;3103:2;3091:9;3082:7;3078:23;3074:32;3071:52;;;3119:1;3116;3109:12;3071:52;3158:9;3145:23;3177:30;3201:5;3177:30;:::i;3242:249::-;3311:6;3364:2;3352:9;3343:7;3339:23;3335:32;3332:52;;;3380:1;3377;3370:12;3332:52;3412:9;3406:16;3431:30;3455:5;3431:30;:::i;3496:592::-;3567:6;3575;3628:2;3616:9;3607:7;3603:23;3599:32;3596:52;;;3644:1;3641;3634:12;3596:52;3684:9;3671:23;-1:-1:-1;;;;;3754:2:1;3746:6;3743:14;3740:34;;;3770:1;3767;3760:12;3740:34;3808:6;3797:9;3793:22;3783:32;;3853:7;3846:4;3842:2;3838:13;3834:27;3824:55;;3875:1;3872;3865:12;3824:55;3915:2;3902:16;3941:2;3933:6;3930:14;3927:34;;;3957:1;3954;3947:12;3927:34;4002:7;3997:2;3988:6;3984:2;3980:15;3976:24;3973:37;3970:57;;;4023:1;4020;4013:12;3970:57;4054:2;4046:11;;;;;4076:6;;-1:-1:-1;3496:592:1;;-1:-1:-1;;;;3496:592:1:o;4093:301::-;4152:6;4205:2;4193:9;4184:7;4180:23;4176:32;4173:52;;;4221:1;4218;4211:12;4173:52;4260:9;4247:23;-1:-1:-1;;;;;4303:5:1;4299:46;4292:5;4289:57;4279:85;;4360:1;4357;4350:12;4399:180;4458:6;4511:2;4499:9;4490:7;4486:23;4482:32;4479:52;;;4527:1;4524;4517:12;4479:52;-1:-1:-1;4550:23:1;;4399:180;-1:-1:-1;4399:180:1:o;4584:254::-;4652:6;4660;4713:2;4701:9;4692:7;4688:23;4684:32;4681:52;;;4729:1;4726;4719:12;4681:52;4765:9;4752:23;4742:33;;4794:38;4828:2;4817:9;4813:18;4794:38;:::i;4843:284::-;4901:6;4954:2;4942:9;4933:7;4929:23;4925:32;4922:52;;;4970:1;4967;4960:12;4922:52;5009:9;4996:23;-1:-1:-1;;;;;5052:5:1;5048:30;5041:5;5038:41;5028:69;;5093:1;5090;5083:12;5132:257;5173:3;5211:5;5205:12;5238:6;5233:3;5226:19;5254:63;5310:6;5303:4;5298:3;5294:14;5287:4;5280:5;5276:16;5254:63;:::i;:::-;5371:2;5350:15;-1:-1:-1;;5346:29:1;5337:39;;;;5378:4;5333:50;;5132:257;-1:-1:-1;;5132:257:1:o;5394:637::-;5674:3;5712:6;5706:13;5728:53;5774:6;5769:3;5762:4;5754:6;5750:17;5728:53;:::i;:::-;5844:13;;5803:16;;;;5866:57;5844:13;5803:16;5900:4;5888:17;;5866:57;:::i;:::-;-1:-1:-1;;;5945:20:1;;5974:22;;;6023:1;6012:13;;5394:637;-1:-1:-1;;;;5394:637:1:o;6454:488::-;-1:-1:-1;;;;;6723:15:1;;;6705:34;;6775:15;;6770:2;6755:18;;6748:43;6822:2;6807:18;;6800:34;;;6870:3;6865:2;6850:18;;6843:31;;;6648:4;;6891:45;;6916:19;;6908:6;6891:45;:::i;:::-;6883:53;6454:488;-1:-1:-1;;;;;;6454:488:1:o;6947:632::-;7118:2;7170:21;;;7240:13;;7143:18;;;7262:22;;;7089:4;;7118:2;7341:15;;;;7315:2;7300:18;;;7089:4;7384:169;7398:6;7395:1;7392:13;7384:169;;;7459:13;;7447:26;;7528:15;;;;7493:12;;;;7420:1;7413:9;7384:169;;;-1:-1:-1;7570:3:1;;6947:632;-1:-1:-1;;;;;;6947:632:1:o;7776:219::-;7925:2;7914:9;7907:21;7888:4;7945:44;7985:2;7974:9;7970:18;7962:6;7945:44;:::i;9103:356::-;9305:2;9287:21;;;9324:18;;;9317:30;9383:34;9378:2;9363:18;;9356:62;9450:2;9435:18;;9103:356::o;10982:128::-;11022:3;11053:1;11049:6;11046:1;11043:13;11040:39;;;11059:18;;:::i;:::-;-1:-1:-1;11095:9:1;;10982:128::o;11115:120::-;11155:1;11181;11171:35;;11186:18;;:::i;:::-;-1:-1:-1;11220:9:1;;11115:120::o;11240:168::-;11280:7;11346:1;11342;11338:6;11334:14;11331:1;11328:21;11323:1;11316:9;11309:17;11305:45;11302:71;;;11353:18;;:::i;:::-;-1:-1:-1;11393:9:1;;11240:168::o;11413:125::-;11453:4;11481:1;11478;11475:8;11472:34;;;11486:18;;:::i;:::-;-1:-1:-1;11523:9:1;;11413:125::o;11543:258::-;11615:1;11625:113;11639:6;11636:1;11633:13;11625:113;;;11715:11;;;11709:18;11696:11;;;11689:39;11661:2;11654:10;11625:113;;;11756:6;11753:1;11750:13;11747:48;;;-1:-1:-1;;11791:1:1;11773:16;;11766:27;11543:258::o;11806:380::-;11885:1;11881:12;;;;11928;;;11949:61;;12003:4;11995:6;11991:17;11981:27;;11949:61;12056:2;12048:6;12045:14;12025:18;12022:38;12019:161;;;12102:10;12097:3;12093:20;12090:1;12083:31;12137:4;12134:1;12127:15;12165:4;12162:1;12155:15;12019:161;;11806:380;;;:::o;12191:135::-;12230:3;-1:-1:-1;;12251:17:1;;12248:43;;;12271:18;;:::i;:::-;-1:-1:-1;12318:1:1;12307:13;;12191:135::o;12331:112::-;12363:1;12389;12379:35;;12394:18;;:::i;:::-;-1:-1:-1;12428:9:1;;12331:112::o;12448:127::-;12509:10;12504:3;12500:20;12497:1;12490:31;12540:4;12537:1;12530:15;12564:4;12561:1;12554:15;12580:127;12641:10;12636:3;12632:20;12629:1;12622:31;12672:4;12669:1;12662:15;12696:4;12693:1;12686:15;12712:127;12773:10;12768:3;12764:20;12761:1;12754:31;12804:4;12801:1;12794:15;12828:4;12825:1;12818:15;12844:127;12905:10;12900:3;12896:20;12893:1;12886:31;12936:4;12933:1;12926:15;12960:4;12957:1;12950:15;12976:131;-1:-1:-1;;;;;;13050:32:1;;13040:43;;13030:71;;13097:1;13094;13087:12

Swarm Source

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