ETH Price: $3,006.38 (+1.20%)
Gas: 6 Gwei

Token

MF GACHA (MFGACHA)
 

Overview

Max Total Supply

4,623 MFGACHA

Holders

1,219

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
tryluck.eth
0x5f1bf06ba6aeb4396f04745121f6c420bfa2a588
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:
MFGACHA

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 13 : ERC1155.sol
// SPDX-License-Identifier: Apache 2.0
pragma solidity ^0.8.0;

import "./interface/IERC1155.sol";
import "./interface/IERC1155Metadata.sol";
import "./interface/IERC1155Receiver.sol";

contract ERC1155 is IERC1155, IERC1155Metadata {
    /*//////////////////////////////////////////////////////////////
                        State variables
    //////////////////////////////////////////////////////////////*/

    string public name;
    string public symbol;

    /*//////////////////////////////////////////////////////////////
                            Mappings
    //////////////////////////////////////////////////////////////*/

    mapping(address => mapping(uint256 => uint256)) public override balanceOf;

    mapping(address => mapping(address => bool)) public override isApprovedForAll;

    mapping(uint256 => string) internal _uri;

    /*//////////////////////////////////////////////////////////////
                            Constructor
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*//////////////////////////////////////////////////////////////
                            View functions
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155
            interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI
    }

    function uri(uint256 tokenId) public view virtual override returns (string memory) {
        return _uri[tokenId];
    }

    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "LENGTH_MISMATCH");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf[accounts[i]][ids[i]];
        }

        return batchBalances;
    }

    /*//////////////////////////////////////////////////////////////
                            ERC1155 logic
    //////////////////////////////////////////////////////////////*/

    function setApprovalForAll(address operator, bool approved) public virtual override {
        address owner = msg.sender;
        require(owner != operator, "APPROVING_SELF");
        isApprovedForAll[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(from == msg.sender || isApprovedForAll[from][msg.sender], "!OWNER_OR_APPROVED");
        _safeTransferFrom(from, to, id, amount, data);
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(from == msg.sender || isApprovedForAll[from][msg.sender], "!OWNER_OR_APPROVED");
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /*//////////////////////////////////////////////////////////////
                            Internal logic
    //////////////////////////////////////////////////////////////*/

    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "TO_ZERO_ADDR");

        address operator = msg.sender;

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = balanceOf[from][id];
        require(fromBalance >= amount, "INSUFFICIENT_BAL");
        unchecked {
            balanceOf[from][id] = fromBalance - amount;
        }
        balanceOf[to][id] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "LENGTH_MISMATCH");
        require(to != address(0), "TO_ZERO_ADDR");

        address operator = msg.sender;

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = balanceOf[from][id];
            require(fromBalance >= amount, "INSUFFICIENT_BAL");
            unchecked {
                balanceOf[from][id] = fromBalance - amount;
            }
            balanceOf[to][id] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    function _setTokenURI(uint256 tokenId, string memory newuri) internal virtual {
        _uri[tokenId] = newuri;
    }

    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "TO_ZERO_ADDR");

        address operator = msg.sender;

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        balanceOf[to][id] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "TO_ZERO_ADDR");
        require(ids.length == amounts.length, "LENGTH_MISMATCH");

        address operator = msg.sender;

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            balanceOf[to][ids[i]] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "FROM_ZERO_ADDR");

        address operator = msg.sender;

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = balanceOf[from][id];
        require(fromBalance >= amount, "INSUFFICIENT_BAL");
        unchecked {
            balanceOf[from][id] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "FROM_ZERO_ADDR");
        require(ids.length == amounts.length, "LENGTH_MISMATCH");

        address operator = msg.sender;

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = balanceOf[from][id];
            require(fromBalance >= amount, "INSUFFICIENT_BAL");
            unchecked {
                balanceOf[from][id] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.code.length > 0) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("TOKENS_REJECTED");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("!ERC1155RECEIVER");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.code.length > 0) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("TOKENS_REJECTED");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("!ERC1155RECEIVER");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

File 2 of 13 : IERC1155.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;

/**
    @title ERC-1155 Multi Token Standard
    @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md
    Note: The ERC-165 identifier for this interface is 0xd9b67a26.
 */
interface IERC1155 {
    /**
        @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
        The `_operator` argument MUST be msg.sender.
        The `_from` argument MUST be the address of the holder whose balance is decreased.
        The `_to` argument MUST be the address of the recipient whose balance is increased.
        The `_id` argument MUST be the token type being transferred.
        The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by.
        When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
        When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
    */
    event TransferSingle(
        address indexed _operator,
        address indexed _from,
        address indexed _to,
        uint256 _id,
        uint256 _value
    );

    /**
        @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
        The `_operator` argument MUST be msg.sender.
        The `_from` argument MUST be the address of the holder whose balance is decreased.
        The `_to` argument MUST be the address of the recipient whose balance is increased.
        The `_ids` argument MUST be the list of tokens being transferred.
        The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by.
        When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
        When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
    */
    event TransferBatch(
        address indexed _operator,
        address indexed _from,
        address indexed _to,
        uint256[] _ids,
        uint256[] _values
    );

    /**
        @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absense of an event assumes disabled).
    */
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /**
        @dev MUST emit when the URI is updated for a token ID.
        URIs are defined in RFC 3986.
        The URI MUST point a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".
    */
    event URI(string _value, uint256 indexed _id);

    /**
        @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        MUST revert if `_to` is the zero address.
        MUST revert if balance of holder for token `_id` is lower than the `_value` sent.
        MUST revert on any other error.
        MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard).
        After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param _from    Source address
        @param _to      Target address
        @param _id      ID of the token type
        @param _value   Transfer amount
        @param _data    Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to`
    */
    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _id,
        uint256 _value,
        bytes calldata _data
    ) external;

    /**
        @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        MUST revert if `_to` is the zero address.
        MUST revert if length of `_ids` is not the same as length of `_values`.
        MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient.
        MUST revert on any other error.
        MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard).
        Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc).
        After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param _from    Source address
        @param _to      Target address
        @param _ids     IDs of each token type (order and length must match _values array)
        @param _values  Transfer amounts per token type (order and length must match _ids array)
        @param _data    Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to`
    */
    function safeBatchTransferFrom(
        address _from,
        address _to,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data
    ) external;

    /**
        @notice Get the balance of an account's Tokens.
        @param _owner  The address of the token holder
        @param _id     ID of the Token
        @return        The _owner's balance of the Token type requested
     */
    function balanceOf(address _owner, uint256 _id) external view returns (uint256);

    /**
        @notice Get the balance of multiple account/token pairs
        @param _owners The addresses of the token holders
        @param _ids    ID of the Tokens
        @return        The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair)
     */
    function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids)
        external
        view
        returns (uint256[] memory);

    /**
        @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens.
        @dev MUST emit the ApprovalForAll event on success.
        @param _operator  Address to add to the set of authorized operators
        @param _approved  True if the operator is approved, false to revoke approval
    */
    function setApprovalForAll(address _operator, bool _approved) external;

    /**
        @notice Queries the approval status of an operator for a given owner.
        @param _owner     The owner of the Tokens
        @param _operator  Address of authorized operator
        @return           True if the operator is approved, false if not
    */
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

File 3 of 13 : IERC1155Metadata.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;

/**
    Note: The ERC-165 identifier for this interface is 0x0e89341c.
*/
interface IERC1155Metadata {
    /**
        @notice A distinct Uniform Resource Identifier (URI) for a given token.
        @dev URIs are defined in RFC 3986.
        The URI may point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".
        @return URI string
    */
    function uri(uint256 _id) external view returns (string memory);
}

File 4 of 13 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 5 of 13 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * [EIP](https://eips.ethereum.org/EIPS/eip-165).
 *
 * 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
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 6 of 13 : BatchMintMetadata.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;

/**
 *  @title   Batch-mint Metadata
 *  @notice  The `BatchMintMetadata` is a contract extension for any base NFT contract. It lets the smart contract
 *           using this extension set metadata for `n` number of NFTs all at once. This is enabled by storing a single
 *           base URI for a batch of `n` NFTs, where the metadata for each NFT in a relevant batch is `baseURI/tokenId`.
 */

contract BatchMintMetadata {
    /// @dev Largest tokenId of each batch of tokens with the same baseURI.
    uint256[] private batchIds;

    /// @dev Mapping from id of a batch of tokens => to base URI for the respective batch of tokens.
    mapping(uint256 => string) private baseURI;

    /**
     *  @notice         Returns the count of batches of NFTs.
     *  @dev            Each batch of tokens has an in ID and an associated `baseURI`.
     *                  See {batchIds}.
     */
    function getBaseURICount() public view returns (uint256) {
        return batchIds.length;
    }

    /**
     *  @notice         Returns the ID for the batch of tokens the given tokenId belongs to.
     *  @dev            See {getBaseURICount}.
     *  @param _index   ID of a token.
     */
    function getBatchIdAtIndex(uint256 _index) public view returns (uint256) {
        if (_index >= getBaseURICount()) {
            revert("Invalid index");
        }
        return batchIds[_index];
    }

    /// @dev Returns the id for the batch of tokens the given tokenId belongs to.
    function _getBatchId(uint256 _tokenId) internal view returns (uint256 batchId, uint256 index) {
        uint256 numOfTokenBatches = getBaseURICount();
        uint256[] memory indices = batchIds;

        for (uint256 i = 0; i < numOfTokenBatches; i += 1) {
            if (_tokenId < indices[i]) {
                index = i;
                batchId = indices[i];

                return (batchId, index);
            }
        }

        revert("Invalid tokenId");
    }

    /// @dev Returns the baseURI for a token. The intended metadata URI for the token is baseURI + tokenId.
    function _getBaseURI(uint256 _tokenId) internal view returns (string memory) {
        uint256 numOfTokenBatches = getBaseURICount();
        uint256[] memory indices = batchIds;

        for (uint256 i = 0; i < numOfTokenBatches; i += 1) {
            if (_tokenId < indices[i]) {
                return baseURI[indices[i]];
            }
        }
        revert("Invalid tokenId");
    }

    /// @dev Sets the base URI for the batch of tokens with the given batchId.
    function _setBaseURI(uint256 _batchId, string memory _baseURI) internal {
        baseURI[_batchId] = _baseURI;
    }

    /// @dev Mints a batch of tokenIds and associates a common baseURI to all those Ids.
    function _batchMintMetadata(
        uint256 _startId,
        uint256 _amountToMint,
        string memory _baseURIForTokens
    ) internal returns (uint256 nextTokenIdToMint, uint256 batchId) {
        batchId = _startId + _amountToMint;
        nextTokenIdToMint = batchId;

        batchIds.push(batchId);

        baseURI[batchId] = _baseURIForTokens;
    }
}

File 7 of 13 : LazyMint.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;

import "./interface/ILazyMint.sol";
import "./BatchMintMetadata.sol";

/**
 *  The `LazyMint` is a contract extension for any base NFT contract. It lets you 'lazy mint' any number of NFTs
 *  at once. Here, 'lazy mint' means defining the metadata for particular tokenIds of your NFT contract, without actually
 *  minting a non-zero balance of NFTs of those tokenIds.
 */

abstract contract LazyMint is ILazyMint, BatchMintMetadata {
    uint256 internal nextTokenIdToLazyMint;

    /**
     *  @notice                  Lets an authorized address lazy mint a given amount of NFTs.
     *
     *  @param _amount           The number of NFTs to lazy mint.
     *  @param _baseURIForTokens The base URI for the 'n' number of NFTs being lazy minted, where the metadata for each
     *                           of those NFTs is `${baseURIForTokens}/${tokenId}`.
     *  @param _data             Additional bytes data to be used at the discretion of the consumer of the contract.
     *  @return batchId          A unique integer identifier for the batch of NFTs lazy minted together.
     */
    function lazyMint(
        uint256 _amount,
        string calldata _baseURIForTokens,
        bytes calldata _data
    ) public virtual override returns (uint256 batchId) {
        if (!_canLazyMint()) {
            revert("Not authorized");
        }

        if (_amount == 0) {
            revert("0 amt");
        }

        uint256 startId = nextTokenIdToLazyMint;

        (nextTokenIdToLazyMint, batchId) = _batchMintMetadata(startId, _amount, _baseURIForTokens);

        emit TokensLazyMinted(startId, startId + _amount - 1, _baseURIForTokens, _data);

        return batchId;
    }

    /// @dev Returns whether lazy minting can be performed in the given execution context.
    function _canLazyMint() internal view virtual returns (bool);
}

File 8 of 13 : Ownable.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;

import "./interface/IOwnable.sol";

/**
 *  @title   Ownable
 *  @notice  Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading
 *           who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses
 *           information about who the contract's owner is.
 */

abstract contract Ownable is IOwnable {
    /// @dev Owner of the contract (purpose: OpenSea compatibility)
    address private _owner;

    /// @dev Reverts if caller is not the owner.
    modifier onlyOwner() {
        if (msg.sender != _owner) {
            revert("Not authorized");
        }
        _;
    }

    /**
     *  @notice Returns the owner of the contract.
     */
    function owner() public view override returns (address) {
        return _owner;
    }

    /**
     *  @notice Lets an authorized wallet set a new owner for the contract.
     *  @param _newOwner The address to set as the new owner of the contract.
     */
    function setOwner(address _newOwner) external override {
        if (!_canSetOwner()) {
            revert("Not authorized");
        }
        _setupOwner(_newOwner);
    }

    /// @dev Lets a contract admin set a new owner for the contract. The new owner must be a contract admin.
    function _setupOwner(address _newOwner) internal {
        address _prevOwner = _owner;
        _owner = _newOwner;

        emit OwnerUpdated(_prevOwner, _newOwner);
    }

    /// @dev Returns whether owner can be set in the given execution context.
    function _canSetOwner() internal view virtual returns (bool);
}

File 9 of 13 : ILazyMint.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;

/**
 *  Thirdweb's `LazyMint` is a contract extension for any base NFT contract. It lets you 'lazy mint' any number of NFTs
 *  at once. Here, 'lazy mint' means defining the metadata for particular tokenIds of your NFT contract, without actually
 *  minting a non-zero balance of NFTs of those tokenIds.
 */

interface ILazyMint {
    /// @dev Emitted when tokens are lazy minted.
    event TokensLazyMinted(uint256 indexed startTokenId, uint256 endTokenId, string baseURI, bytes encryptedBaseURI);

    /**
     *  @notice Lazy mints a given amount of NFTs.
     *
     *  @param amount           The number of NFTs to lazy mint.
     *
     *  @param baseURIForTokens The base URI for the 'n' number of NFTs being lazy minted, where the metadata for each
     *                          of those NFTs is `${baseURIForTokens}/${tokenId}`.
     *
     *  @param extraData        Additional bytes data to be used at the discretion of the consumer of the contract.
     *
     *  @return batchId         A unique integer identifier for the batch of NFTs lazy minted together.
     */
    function lazyMint(
        uint256 amount,
        string calldata baseURIForTokens,
        bytes calldata extraData
    ) external returns (uint256 batchId);
}

File 10 of 13 : IOwnable.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;

/**
 *  Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading
 *  who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses
 *  information about who the contract's owner is.
 */

interface IOwnable {
    /// @dev Returns the owner of the contract.
    function owner() external view returns (address);

    /// @dev Lets a module admin set a new owner for the contract. The new owner must be a module admin.
    function setOwner(address _newOwner) external;

    /// @dev Emitted when a new Owner is set.
    event OwnerUpdated(address indexed prevOwner, address indexed newOwner);
}

File 11 of 13 : TWStrings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library TWStrings {
    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 12 of 13 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 13 of 13 : MFGACHA.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.17;

import {ERC1155} from "@thirdweb-dev/contracts/eip/ERC1155.sol";

import "@thirdweb-dev/contracts/extension/Ownable.sol";
import "@thirdweb-dev/contracts/extension/BatchMintMetadata.sol";
import "@thirdweb-dev/contracts/extension/LazyMint.sol";

import "@thirdweb-dev/contracts/lib/TWStrings.sol";
import "@thirdweb-dev/contracts/openzeppelin-presets/security/ReentrancyGuard.sol";
/**
 *                                WWWWWWWWW                  WNNNW
 *                         WNXK0OkkxxxxxxkkOO0XNW          N0xdddx0N
 *                     WNX0kxoooooooooooooooooodkOKNW     NOoooooookN
 *                   WXOxooooooooooooooooooooooooooxOXW   NkoooooooxX
 *                 WXkdoooooooooooooooooooooooooooooookKW WKxoooooxKW
 *                NOdoooooooooooooooooooooooooooooooooodK   NX000KN
 *              WKxoooooooooooooooooooodkOOOxooooooooodKW
 *             WKdoooooooooooooooooooxOKW  WNOdooooooxXW
 *             Kxoooooooooooooooooood0WW     WKxooookX      W
 *            NkoooooooooooddxdoooooON         NOooON     WKOX
 *           W0dooooooooodOXNNXOdooxX           WKKW     WKdoOW
 *           WOoooooooood0W    WXkxKW                   N0dooxN
 *           NkoooooooookN       WNW      NKX          NkooooxX
 *           NkooooooooxX                WOoxKW      WXxoooooxX
 *           WOoooooooo0W               WKdoodON    WKxooooookN
 *            XdooooookN     WXN        Xxooooox0KKKkdooooooo0W
 *            WOooooodKW    W0dkXW     NOoooooooooooooooooookN
 *             NkooooOW     XxoodOKXX00koooooooooooooooooooxXW
 *              XkoooOW    NOoooooodooooooooooooooooooooooxKW
 *               NOdodOKXXKkdooooooooooooooooooooooooooookXW
 *                WKkoooddooooooooooooooooooooooooooooox0N
 *                  WKkdooooooooooooooooooooooooooooox0NW
 *                    WXOxdoooooooooooooooooooooooxOKN
 *                       WXKOkxdooooooooooooddxO0XN
 *                           WNXKK00OOOO000KXNW
 *                                WWWWWWWWW
 *
 *      BASE:      ERC1155Base
 *      EXTENSION: LazyMint
 *
 *  The `MFGACHA` smart contract implements the ERC1155 NFT standard.
 *  It includes the following additions to standard ERC1155 logic:
 *
 *      - Lazy minting
 *
 *      - Ability to mint NFTs via the provided `mintTo` and `batchMintTo` functions.
 *
 *      - Ownership of the contract, with the ability to restrict certain functions to
 *        only be called by the contract's owner.
 *
 *
 *  The `MFGACHA` contract uses the `LazyMint` extension.
 *
 *  'Lazy minting' means defining the metadata of NFTs without minting it to an address. Regular 'minting'
 *  of  NFTs means actually assigning an owner to an NFT.
 *
 *  As a contract admin, this lets you prepare the metadata for NFTs that will be minted by an external party,
 *  without paying the gas cost for actually minting the NFTs.
 *
 */

contract MFGACHA is
    ERC1155,
    Ownable,
    BatchMintMetadata,
    LazyMint,
    ReentrancyGuard
{
    using TWStrings for uint256;

    /// @notice The end time(unix timestamp) of the claim duration
    uint256 public claimEndTimestamp;

    /*//////////////////////////////////////////////////////////////
                        Mappings
    //////////////////////////////////////////////////////////////*/

    /**
     *  @notice Returns the total supply of NFTs of a given tokenId
     *  @dev Mapping from tokenId => total circulating supply of NFTs of that tokenId.
     */
    mapping(uint256 => uint256) public totalSupply;

    /*//////////////////////////////////////////////////////////////
                            Constructor
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _claimEndTimestamp
    ) ERC1155(_name, _symbol) {
        _setupOwner(msg.sender);
        claimEndTimestamp = _claimEndTimestamp;
    }

    /*//////////////////////////////////////////////////////////////
                    Overriden metadata logic
    //////////////////////////////////////////////////////////////*/

    /// @notice Returns the metadata URI for the given tokenId.
    function uri(
        uint256 _tokenId
    ) public view virtual override returns (string memory) {
        string memory batchUri = _getBaseURI(_tokenId);
        return string(abi.encodePacked(batchUri, _tokenId.toString()));
    }

    /*//////////////////////////////////////////////////////////////
                            CLAIM LOGIC
    //////////////////////////////////////////////////////////////*/

    /// @dev Emitted when tokens are claimed
    event TokensClaimed(
        address indexed claimer,
        uint256 indexed tokenId,
        uint256 quantityClaimed
    );

    /**
     *  @dev             The logic in `verifyClaim` determines whether the caller is authorized to mint NFTs.
     *                   The logic in `transferTokensOnClaim` does actual minting of tokens,
     *                   can also be used to apply other state changes.
     *
     *  @param _tokenId   The tokenId of the lazy minted NFT to mint.
     */
    function _claim(uint256 _tokenId) internal {
        verifyClaim(_tokenId); // Add your claim verification logic by overriding this function.

        _mint(msg.sender, _tokenId, 1, "");
        emit TokensClaimed(msg.sender, _tokenId, 1);
    }

    /**
     *  @notice          Lets an address claim multiple lazy minted NFTs at once to a recipient.
     *                   This function prevents any reentrant calls, and is not allowed to be overridden.
     *
     *                   Contract creators should override `verifyClaim` and `transferTokensOnClaim`
     *                   functions to create custom logic for verification and claiming,
     *                   for e.g. price collection, allowlist, max quantity, etc.
     *
     *  @param _tokenId   The tokenId of the lazy minted NFT to mint.
     */
    function claim(uint256 _tokenId) public nonReentrant {
        _claim(_tokenId);
    }

    /**
     *  @notice          Let's try if you can't get the NFT you want.
     */
    function claimAll() public nonReentrant {
        for (uint256 tokenId = 0; tokenId < nextTokenIdToMint(); tokenId++) {
            _claim(tokenId);
        }
    }

    /**
     *  @notice          Override this function to add logic for claim verification, based on conditions
     *                   such as allowlist, price, max quantity etc.
     *
     *  @dev             Checks a request to claim NFTs against a custom condition.
     *
     *  @param _tokenId   The tokenId of the lazy minted NFT to mint.
     */
    function verifyClaim(uint256 _tokenId) public view {
        require(_tokenId < nextTokenIdToMint(), "invalid id");
        require(
            block.timestamp < claimEndTimestamp,
            "The claimable period has ended."
        );
    }

    /**
     *  @notice         Lets an owner or approved operator burn NFTs of the given tokenId.
     *
     *  @param _owner   The owner of the NFT to burn.
     *  @param _tokenId The tokenId of the NFT to burn.
     *  @param _amount  The amount of the NFT to burn.
     */
    function burn(
        address _owner,
        uint256 _tokenId,
        uint256 _amount
    ) external virtual {
        address caller = msg.sender;

        require(
            caller == _owner || isApprovedForAll[_owner][caller],
            "Unapproved caller"
        );
        require(
            balanceOf[_owner][_tokenId] >= _amount,
            "Not enough tokens owned"
        );

        _burn(_owner, _tokenId, _amount);
    }

    /**
     *  @notice         Lets an owner or approved operator burn NFTs of the given tokenIds.
     *
     *  @param _owner    The owner of the NFTs to burn.
     *  @param _tokenIds The tokenIds of the NFTs to burn.
     *  @param _amounts  The amounts of the NFTs to burn.
     */
    function burnBatch(
        address _owner,
        uint256[] memory _tokenIds,
        uint256[] memory _amounts
    ) external virtual {
        address caller = msg.sender;

        require(
            caller == _owner || isApprovedForAll[_owner][caller],
            "Unapproved caller"
        );
        require(_tokenIds.length == _amounts.length, "Length mismatch");

        for (uint256 i = 0; i < _tokenIds.length; i += 1) {
            require(
                balanceOf[_owner][_tokenIds[i]] >= _amounts[i],
                "Not enough tokens owned"
            );
        }

        _burnBatch(_owner, _tokenIds, _amounts);
    }

    /**
     *  @notice             For owner to update claimEndTimestamp.
     *
     *  @param _timestamp   The end time(unix timestamp) of the claim duration.
     */
    function setClaimEndTimestamp(uint256 _timestamp) external onlyOwner {
        claimEndTimestamp = _timestamp;
    }

    /*//////////////////////////////////////////////////////////////
                            View functions
    //////////////////////////////////////////////////////////////*/

    /// @notice The tokenId assigned to the next new NFT to be lazy minted.
    function nextTokenIdToMint() public view virtual returns (uint256) {
        return nextTokenIdToLazyMint;
    }

    /*//////////////////////////////////////////////////////////////
                        Internal functions
    //////////////////////////////////////////////////////////////*/

    /// @dev Returns whether lazy minting can be done in the given execution context.
    function _canLazyMint() internal view virtual override returns (bool) {
        return msg.sender == owner();
    }

    /// @dev Returns whether owner can be set in the given execution context.
    function _canSetOwner() internal view virtual override returns (bool) {
        return msg.sender == owner();
    }

    /// @dev Runs before every token transfer / mint / burn.
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                totalSupply[ids[i]] -= amounts[i];
            }
        }
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "london",
  "remappings": [
    ":@thirdweb-dev/=node_modules/@thirdweb-dev/",
    ":ds-test/=lib/forge-std/lib/ds-test/src/",
    ":forge-std/=lib/forge-std/src/"
  ],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_claimEndTimestamp","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"prevOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantityClaimed","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"startTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"baseURI","type":"string"},{"indexed":false,"internalType":"bytes","name":"encryptedBaseURI","type":"bytes"}],"name":"TokensLazyMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEndTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURICount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getBatchIdAtIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_baseURIForTokens","type":"string"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"lazyMint","outputs":[{"internalType":"uint256","name":"batchId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenIdToMint","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setClaimEndTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"setOwner","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":"","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"verifyClaim","outputs":[],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162002a1338038062002a13833981016040819052620000349162000189565b828260006200004483826200028b565b5060016200005382826200028b565b5050600160095550620000663362000072565b600a5550620003579050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000ec57600080fd5b81516001600160401b0380821115620001095762000109620000c4565b604051601f8301601f19908116603f01168101908282118183101715620001345762000134620000c4565b816040528381526020925086838588010111156200015157600080fd5b600091505b8382101562000175578582018301518183018401529082019062000156565b600093810190920192909252949350505050565b6000806000606084860312156200019f57600080fd5b83516001600160401b0380821115620001b757600080fd5b620001c587838801620000da565b94506020860151915080821115620001dc57600080fd5b50620001eb86828701620000da565b925050604084015190509250925092565b600181811c908216806200021157607f821691505b6020821081036200023257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200028657600081815260208120601f850160051c81016020861015620002615750805b601f850160051c820191505b8181101562000282578281556001016200026d565b5050505b505050565b81516001600160401b03811115620002a757620002a7620000c4565b620002bf81620002b88454620001fc565b8462000238565b602080601f831160018114620002f75760008415620002de5750858301515b600019600386901b1c1916600185901b17855562000282565b600085815260208120601f198616915b82811015620003285788860151825594840194600190910190840162000307565b5085821015620003475787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6126ac80620003676000396000f3fe608060405234801561001057600080fd5b50600436106101575760003560e01c80636b20c454116100c3578063c52645f21161007c578063c52645f2146102e8578063d1058e59146102fb578063d37c353b14610303578063e985e9c514610316578063f242432a14610344578063f5298aca1461035757600080fd5b80636b20c4541461026c5780638da5cb5b1461027f57806395d89b411461029a578063a22cb465146102a2578063bd85b039146102b5578063c0d7e2b6146102d557600080fd5b8063265385cd11610115578063265385cd1461020d5780632eb2c2d614610216578063379607f5146102295780633b1475a71461023c5780634e1273f41461024457806363b45e2d1461026457600080fd5b8062fdd58e1461015c57806301ffc9a71461019a57806306fdde03146101bd5780630e89341c146101d257806313af4035146101e55780632419f51b146101fa575b600080fd5b61018761016a366004611b91565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b6101ad6101a8366004611bd1565b61036a565b6040519015158152602001610191565b6101c56103bc565b6040516101919190611c45565b6101c56101e0366004611c58565b61044a565b6101f86101f3366004611c71565b61048b565b005b610187610208366004611c58565b6104c4565b610187600a5481565b6101f8610224366004611dd5565b610532565b6101f8610237366004611c58565b6105c1565b600854610187565b610257610252366004611e7e565b610629565b6040516101919190611f83565b600654610187565b6101f861027a366004611f96565b61073d565b6005546040516001600160a01b039091168152602001610191565b6101c56108df565b6101f86102b0366004612009565b6108ec565b6101876102c3366004611c58565b600b6020526000908152604090205481565b6101f86102e3366004611c58565b6109a3565b6101f86102f6366004611c58565b610a32565b6101f8610a61565b61018761031136600461208d565b610ae0565b6101ad610324366004612106565b600360209081526000928352604080842090915290825290205460ff1681565b6101f8610352366004612139565b610bed565b6101f861036536600461219d565b610c75565b60006301ffc9a760e01b6001600160e01b03198316148061039b5750636cdb3d1360e11b6001600160e01b03198316145b806103b657506303a24d0760e21b6001600160e01b03198316145b92915050565b600080546103c9906121d0565b80601f01602080910402602001604051908101604052809291908181526020018280546103f5906121d0565b80156104425780601f1061041757610100808354040283529160200191610442565b820191906000526020600020905b81548152906001019060200180831161042557829003601f168201915b505050505081565b6060600061045783610d6a565b90508061046384610f06565b60405160200161047492919061220a565b604051602081830303815290604052915050919050565b61049361100e565b6104b85760405162461bcd60e51b81526004016104af90612239565b60405180910390fd5b6104c18161103b565b50565b60006104cf60065490565b821061050d5760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016104af565b6006828154811061052057610520612261565b90600052602060002001549050919050565b6001600160a01b03851633148061056c57506001600160a01b038516600090815260036020908152604080832033845290915290205460ff165b6105ad5760405162461bcd60e51b81526020600482015260126024820152710853d5d3915497d3d497d054141493d5915160721b60448201526064016104af565b6105ba858585858561108d565b5050505050565b6002600954036106135760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104af565b600260095561062181611248565b506001600955565b6060815183511461064c5760405162461bcd60e51b81526004016104af90612277565b600083516001600160401b0381111561066757610667611c8c565b604051908082528060200260200182016040528015610690578160200160208202803683370190505b50905060005b845181101561073557600260008683815181106106b5576106b5612261565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008583815181106106f1576106f1612261565b602002602001015181526020019081526020016000205482828151811061071a5761071a612261565b602090810291909101015261072e816122b6565b9050610696565b509392505050565b336001600160a01b03841681148061077a57506001600160a01b0380851660009081526003602090815260408083209385168352929052205460ff165b6107ba5760405162461bcd60e51b81526020600482015260116024820152702ab730b8383937bb32b21031b0b63632b960791b60448201526064016104af565b81518351146107fd5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b60448201526064016104af565b60005b83518110156108cd5782818151811061081b5761081b612261565b602002602001015160026000876001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061085c5761085c612261565b602002602001015181526020019081526020016000205410156108bb5760405162461bcd60e51b8152602060048201526017602482015276139bdd08195b9bdd59da081d1bdad95b9cc81bdddb9959604a1b60448201526064016104af565b6108c66001826122cf565b9050610800565b506108d98484846112a8565b50505050565b600180546103c9906121d0565b336001600160a01b03831681036109365760405162461bcd60e51b815260206004820152600e60248201526d20a8282927ab24a723afa9a2a62360911b60448201526064016104af565b6001600160a01b03818116600081815260036020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60085481106109e15760405162461bcd60e51b815260206004820152600a6024820152691a5b9d985b1a59081a5960b21b60448201526064016104af565b600a5442106104c15760405162461bcd60e51b815260206004820152601f60248201527f54686520636c61696d61626c6520706572696f642068617320656e6465642e0060448201526064016104af565b6005546001600160a01b03163314610a5c5760405162461bcd60e51b81526004016104af90612239565b600a55565b600260095403610ab35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104af565b600260095560005b60085481101561062157610ace81611248565b80610ad8816122b6565b915050610abb565b6000610aea61100e565b610b065760405162461bcd60e51b81526004016104af90612239565b85600003610b3e5760405162461bcd60e51b81526020600482015260056024820152640c08185b5d60da1b60448201526064016104af565b60006008549050610b86818888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061145d92505050565b6008919091559150807f2a0365091ef1a40953c670dce28177e37520648a6fdc91506bffac0ab045570d6001610bbc8a846122cf565b610bc691906122e2565b88888888604051610bdb95949392919061231e565b60405180910390a25095945050505050565b6001600160a01b038516331480610c2757506001600160a01b038516600090815260036020908152604080832033845290915290205460ff165b610c685760405162461bcd60e51b81526020600482015260126024820152710853d5d3915497d3d497d054141493d5915160721b60448201526064016104af565b6105ba85858585856114c1565b336001600160a01b038416811480610cb257506001600160a01b0380851660009081526003602090815260408083209385168352929052205460ff165b610cf25760405162461bcd60e51b81526020600482015260116024820152702ab730b8383937bb32b21031b0b63632b960791b60448201526064016104af565b6001600160a01b0384166000908152600260209081526040808320868452909152902054821115610d5f5760405162461bcd60e51b8152602060048201526017602482015276139bdd08195b9bdd59da081d1bdad95b9cc81bdddb9959604a1b60448201526064016104af565b6108d98484846115ff565b60606000610d7760065490565b905060006006805480602002602001604051908101604052809291908181526020018280548015610dc757602002820191906000526020600020905b815481526020019060010190808311610db3575b5050505050905060005b82811015610ecb57818181518110610deb57610deb612261565b6020026020010151851015610eb95760076000838381518110610e1057610e10612261565b602002602001015181526020019081526020016000208054610e31906121d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5d906121d0565b8015610eaa5780601f10610e7f57610100808354040283529160200191610eaa565b820191906000526020600020905b815481529060010190602001808311610e8d57829003601f168201915b50505050509350505050919050565b610ec46001826122cf565b9050610dd1565b5060405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081d1bdad95b9259608a1b60448201526064016104af565b606081600003610f2d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610f575780610f41816122b6565b9150610f509050600a8361236d565b9150610f31565b6000816001600160401b03811115610f7157610f71611c8c565b6040519080825280601f01601f191660200182016040528015610f9b576020820181803683370190505b5090505b841561100657610fb06001836122e2565b9150610fbd600a86612381565b610fc89060306122cf565b60f81b818381518110610fdd57610fdd612261565b60200101906001600160f81b031916908160001a905350610fff600a8661236d565b9450610f9f565b949350505050565b60006110226005546001600160a01b031690565b6001600160a01b0316336001600160a01b031614905090565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a35050565b81518351146110ae5760405162461bcd60e51b81526004016104af90612277565b6001600160a01b0384166110d45760405162461bcd60e51b81526004016104af90612395565b336110e3818787878787611724565b60005b84518110156111da57600085828151811061110357611103612261565b60200260200101519050600085838151811061112157611121612261565b6020908102919091018101516001600160a01b038b1660009081526002835260408082208683529093529190912054909150818110156111735760405162461bcd60e51b81526004016104af906123bb565b6001600160a01b03808b16600090815260026020818152604080842088855282528084208787039055938d168352908152828220868352905290812080548492906111bf9084906122cf565b92505081905550505050806111d3906122b6565b90506110e6565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161122a9291906123e5565b60405180910390a4611240818787878787611830565b505050505050565b611251816109a3565b61126d3382600160405180602001604052806000815250611983565b60405160018152819033907f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b9060200160405180910390a350565b6001600160a01b0383166112ef5760405162461bcd60e51b815260206004820152600e60248201526d232927a6afad22a927afa0a2222960911b60448201526064016104af565b80518251146113105760405162461bcd60e51b81526004016104af90612277565b600033905061133381856000868660405180602001604052806000815250611724565b60005b83518110156113fe57600084828151811061135357611353612261565b60200260200101519050600084838151811061137157611371612261565b6020908102919091018101516001600160a01b03891660009081526002835260408082208683529093529190912054909150818110156113c35760405162461bcd60e51b81526004016104af906123bb565b6001600160a01b03881660009081526002602090815260408083209583529490529290922091039055806113f6816122b6565b915050611336565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161144f9291906123e5565b60405180910390a450505050565b60008061146a84866122cf565b60068054600181019091557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0181905560008181526007602052604090209092508291506114b8848261245e565b50935093915050565b6001600160a01b0384166114e75760405162461bcd60e51b81526004016104af90612395565b336115068187876114f788611a4d565b61150088611a4d565b87611724565b6001600160a01b03861660009081526002602090815260408083208784529091529020548381101561154a5760405162461bcd60e51b81526004016104af906123bb565b6001600160a01b0380881660009081526002602081815260408084208a855282528084208987039055938a168352908152828220888352905290812080548692906115969084906122cf565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115f6828888888888611a98565b50505050505050565b6001600160a01b0383166116465760405162461bcd60e51b815260206004820152600e60248201526d232927a6afad22a927afa0a2222960911b60448201526064016104af565b336116758185600061165787611a4d565b61166087611a4d565b60405180602001604052806000815250611724565b6001600160a01b0384166000908152600260209081526040808320868452909152902054828110156116b95760405162461bcd60e51b81526004016104af906123bb565b6001600160a01b03858116600081815260026020908152604080832089845282528083208887039055805189815291820188905291938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6001600160a01b0385166117ab5760005b83518110156117a95782818151811061175057611750612261565b6020026020010151600b600086848151811061176e5761176e612261565b60200260200101518152602001908152602001600020600082825461179391906122cf565b909155506117a29050816122b6565b9050611735565b505b6001600160a01b0384166112405760005b83518110156115f6578281815181106117d7576117d7612261565b6020026020010151600b60008684815181106117f5576117f5612261565b60200260200101518152602001908152602001600020600082825461181a91906122e2565b909155506118299050816122b6565b90506117bc565b6001600160a01b0384163b156112405760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611874908990899088908890889060040161251d565b6020604051808303816000875af19250505080156118af575060408051601f3d908101601f191682019092526118ac9181019061256f565b60015b611931576118bb61258c565b806308c379a0036118f457506118cf6125a8565b806118da57506118f6565b8060405162461bcd60e51b81526004016104af9190611c45565b505b60405162461bcd60e51b815260206004820152601060248201526f10a2a92198989a9aa922a1a2a4ab22a960811b60448201526064016104af565b6001600160e01b0319811663bc197c8160e01b146115f65760405162461bcd60e51b815260206004820152600f60248201526e1513d2d15394d7d491529150d51151608a1b60448201526064016104af565b6001600160a01b0384166119a95760405162461bcd60e51b81526004016104af90612395565b336119ba816000876114f788611a4d565b6001600160a01b0385166000908152600260209081526040808320878452909152812080548592906119ed9084906122cf565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46105ba81600087878787611a98565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611a8757611a87612261565b602090810291909101015292915050565b6001600160a01b0384163b156112405760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611adc9089908990889088908890600401612631565b6020604051808303816000875af1925050508015611b17575060408051601f3d908101601f19168201909252611b149181019061256f565b60015b611b23576118bb61258c565b6001600160e01b0319811663f23a6e6160e01b146115f65760405162461bcd60e51b815260206004820152600f60248201526e1513d2d15394d7d491529150d51151608a1b60448201526064016104af565b80356001600160a01b0381168114611b8c57600080fd5b919050565b60008060408385031215611ba457600080fd5b611bad83611b75565b946020939093013593505050565b6001600160e01b0319811681146104c157600080fd5b600060208284031215611be357600080fd5b8135611bee81611bbb565b9392505050565b60005b83811015611c10578181015183820152602001611bf8565b50506000910152565b60008151808452611c31816020860160208601611bf5565b601f01601f19169290920160200192915050565b602081526000611bee6020830184611c19565b600060208284031215611c6a57600080fd5b5035919050565b600060208284031215611c8357600080fd5b611bee82611b75565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715611cc757611cc7611c8c565b6040525050565b60006001600160401b03821115611ce757611ce7611c8c565b5060051b60200190565b600082601f830112611d0257600080fd5b81356020611d0f82611cce565b604051611d1c8282611ca2565b83815260059390931b8501820192828101915086841115611d3c57600080fd5b8286015b84811015611d575780358352918301918301611d40565b509695505050505050565b600082601f830112611d7357600080fd5b81356001600160401b03811115611d8c57611d8c611c8c565b604051611da3601f8301601f191660200182611ca2565b818152846020838601011115611db857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611ded57600080fd5b611df686611b75565b9450611e0460208701611b75565b935060408601356001600160401b0380821115611e2057600080fd5b611e2c89838a01611cf1565b94506060880135915080821115611e4257600080fd5b611e4e89838a01611cf1565b93506080880135915080821115611e6457600080fd5b50611e7188828901611d62565b9150509295509295909350565b60008060408385031215611e9157600080fd5b82356001600160401b0380821115611ea857600080fd5b818501915085601f830112611ebc57600080fd5b81356020611ec982611cce565b604051611ed68282611ca2565b83815260059390931b8501820192828101915089841115611ef657600080fd5b948201945b83861015611f1b57611f0c86611b75565b82529482019490820190611efb565b96505086013592505080821115611f3157600080fd5b50611f3e85828601611cf1565b9150509250929050565b600081518084526020808501945080840160005b83811015611f7857815187529582019590820190600101611f5c565b509495945050505050565b602081526000611bee6020830184611f48565b600080600060608486031215611fab57600080fd5b611fb484611b75565b925060208401356001600160401b0380821115611fd057600080fd5b611fdc87838801611cf1565b93506040860135915080821115611ff257600080fd5b50611fff86828701611cf1565b9150509250925092565b6000806040838503121561201c57600080fd5b61202583611b75565b91506020830135801515811461203a57600080fd5b809150509250929050565b60008083601f84011261205757600080fd5b5081356001600160401b0381111561206e57600080fd5b60208301915083602082850101111561208657600080fd5b9250929050565b6000806000806000606086880312156120a557600080fd5b8535945060208601356001600160401b03808211156120c357600080fd5b6120cf89838a01612045565b909650945060408801359150808211156120e857600080fd5b506120f588828901612045565b969995985093965092949392505050565b6000806040838503121561211957600080fd5b61212283611b75565b915061213060208401611b75565b90509250929050565b600080600080600060a0868803121561215157600080fd5b61215a86611b75565b945061216860208701611b75565b9350604086013592506060860135915060808601356001600160401b0381111561219157600080fd5b611e7188828901611d62565b6000806000606084860312156121b257600080fd5b6121bb84611b75565b95602085013595506040909401359392505050565b600181811c908216806121e457607f821691505b60208210810361220457634e487b7160e01b600052602260045260246000fd5b50919050565b6000835161221c818460208801611bf5565b835190830190612230818360208801611bf5565b01949350505050565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6020808252600f908201526e0988a9c8ea890be9a92a69a82a8869608b1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016122c8576122c86122a0565b5060010190565b808201808211156103b6576103b66122a0565b818103818111156103b6576103b66122a0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8581526060602082015260006123386060830186886122f5565b828103604084015261234b8185876122f5565b98975050505050505050565b634e487b7160e01b600052601260045260246000fd5b60008261237c5761237c612357565b500490565b60008261239057612390612357565b500690565b6020808252600c908201526b2a27afad22a927afa0a2222960a11b604082015260600190565b60208082526010908201526f125394d551919250d251539517d0905360821b604082015260600190565b6040815260006123f86040830185611f48565b828103602084015261240a8185611f48565b95945050505050565b601f82111561245957600081815260208120601f850160051c8101602086101561243a5750805b601f850160051c820191505b8181101561124057828155600101612446565b505050565b81516001600160401b0381111561247757612477611c8c565b61248b8161248584546121d0565b84612413565b602080601f8311600181146124c057600084156124a85750858301515b600019600386901b1c1916600185901b178555611240565b600085815260208120601f198616915b828110156124ef578886015182559484019460019091019084016124d0565b508582101561250d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0386811682528516602082015260a06040820181905260009061254990830186611f48565b828103606084015261255b8186611f48565b9050828103608084015261234b8185611c19565b60006020828403121561258157600080fd5b8151611bee81611bbb565b600060033d11156125a55760046000803e5060005160e01c5b90565b600060443d10156125b65790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156125e557505050505090565b82850191508151818111156125fd5750505050505090565b843d87010160208285010111156126175750505050505090565b61262660208286010187611ca2565b509095945050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061266b90830184611c19565b97965050505050505056fea2646970667358221220d1a1f97110885c7651aec829c719a856586fc0e05975ac844ad93671b6821da164736f6c63430008110033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084d4620474143484100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074d46474143484100000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101575760003560e01c80636b20c454116100c3578063c52645f21161007c578063c52645f2146102e8578063d1058e59146102fb578063d37c353b14610303578063e985e9c514610316578063f242432a14610344578063f5298aca1461035757600080fd5b80636b20c4541461026c5780638da5cb5b1461027f57806395d89b411461029a578063a22cb465146102a2578063bd85b039146102b5578063c0d7e2b6146102d557600080fd5b8063265385cd11610115578063265385cd1461020d5780632eb2c2d614610216578063379607f5146102295780633b1475a71461023c5780634e1273f41461024457806363b45e2d1461026457600080fd5b8062fdd58e1461015c57806301ffc9a71461019a57806306fdde03146101bd5780630e89341c146101d257806313af4035146101e55780632419f51b146101fa575b600080fd5b61018761016a366004611b91565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b6101ad6101a8366004611bd1565b61036a565b6040519015158152602001610191565b6101c56103bc565b6040516101919190611c45565b6101c56101e0366004611c58565b61044a565b6101f86101f3366004611c71565b61048b565b005b610187610208366004611c58565b6104c4565b610187600a5481565b6101f8610224366004611dd5565b610532565b6101f8610237366004611c58565b6105c1565b600854610187565b610257610252366004611e7e565b610629565b6040516101919190611f83565b600654610187565b6101f861027a366004611f96565b61073d565b6005546040516001600160a01b039091168152602001610191565b6101c56108df565b6101f86102b0366004612009565b6108ec565b6101876102c3366004611c58565b600b6020526000908152604090205481565b6101f86102e3366004611c58565b6109a3565b6101f86102f6366004611c58565b610a32565b6101f8610a61565b61018761031136600461208d565b610ae0565b6101ad610324366004612106565b600360209081526000928352604080842090915290825290205460ff1681565b6101f8610352366004612139565b610bed565b6101f861036536600461219d565b610c75565b60006301ffc9a760e01b6001600160e01b03198316148061039b5750636cdb3d1360e11b6001600160e01b03198316145b806103b657506303a24d0760e21b6001600160e01b03198316145b92915050565b600080546103c9906121d0565b80601f01602080910402602001604051908101604052809291908181526020018280546103f5906121d0565b80156104425780601f1061041757610100808354040283529160200191610442565b820191906000526020600020905b81548152906001019060200180831161042557829003601f168201915b505050505081565b6060600061045783610d6a565b90508061046384610f06565b60405160200161047492919061220a565b604051602081830303815290604052915050919050565b61049361100e565b6104b85760405162461bcd60e51b81526004016104af90612239565b60405180910390fd5b6104c18161103b565b50565b60006104cf60065490565b821061050d5760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016104af565b6006828154811061052057610520612261565b90600052602060002001549050919050565b6001600160a01b03851633148061056c57506001600160a01b038516600090815260036020908152604080832033845290915290205460ff165b6105ad5760405162461bcd60e51b81526020600482015260126024820152710853d5d3915497d3d497d054141493d5915160721b60448201526064016104af565b6105ba858585858561108d565b5050505050565b6002600954036106135760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104af565b600260095561062181611248565b506001600955565b6060815183511461064c5760405162461bcd60e51b81526004016104af90612277565b600083516001600160401b0381111561066757610667611c8c565b604051908082528060200260200182016040528015610690578160200160208202803683370190505b50905060005b845181101561073557600260008683815181106106b5576106b5612261565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008583815181106106f1576106f1612261565b602002602001015181526020019081526020016000205482828151811061071a5761071a612261565b602090810291909101015261072e816122b6565b9050610696565b509392505050565b336001600160a01b03841681148061077a57506001600160a01b0380851660009081526003602090815260408083209385168352929052205460ff165b6107ba5760405162461bcd60e51b81526020600482015260116024820152702ab730b8383937bb32b21031b0b63632b960791b60448201526064016104af565b81518351146107fd5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b60448201526064016104af565b60005b83518110156108cd5782818151811061081b5761081b612261565b602002602001015160026000876001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061085c5761085c612261565b602002602001015181526020019081526020016000205410156108bb5760405162461bcd60e51b8152602060048201526017602482015276139bdd08195b9bdd59da081d1bdad95b9cc81bdddb9959604a1b60448201526064016104af565b6108c66001826122cf565b9050610800565b506108d98484846112a8565b50505050565b600180546103c9906121d0565b336001600160a01b03831681036109365760405162461bcd60e51b815260206004820152600e60248201526d20a8282927ab24a723afa9a2a62360911b60448201526064016104af565b6001600160a01b03818116600081815260036020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60085481106109e15760405162461bcd60e51b815260206004820152600a6024820152691a5b9d985b1a59081a5960b21b60448201526064016104af565b600a5442106104c15760405162461bcd60e51b815260206004820152601f60248201527f54686520636c61696d61626c6520706572696f642068617320656e6465642e0060448201526064016104af565b6005546001600160a01b03163314610a5c5760405162461bcd60e51b81526004016104af90612239565b600a55565b600260095403610ab35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104af565b600260095560005b60085481101561062157610ace81611248565b80610ad8816122b6565b915050610abb565b6000610aea61100e565b610b065760405162461bcd60e51b81526004016104af90612239565b85600003610b3e5760405162461bcd60e51b81526020600482015260056024820152640c08185b5d60da1b60448201526064016104af565b60006008549050610b86818888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061145d92505050565b6008919091559150807f2a0365091ef1a40953c670dce28177e37520648a6fdc91506bffac0ab045570d6001610bbc8a846122cf565b610bc691906122e2565b88888888604051610bdb95949392919061231e565b60405180910390a25095945050505050565b6001600160a01b038516331480610c2757506001600160a01b038516600090815260036020908152604080832033845290915290205460ff165b610c685760405162461bcd60e51b81526020600482015260126024820152710853d5d3915497d3d497d054141493d5915160721b60448201526064016104af565b6105ba85858585856114c1565b336001600160a01b038416811480610cb257506001600160a01b0380851660009081526003602090815260408083209385168352929052205460ff165b610cf25760405162461bcd60e51b81526020600482015260116024820152702ab730b8383937bb32b21031b0b63632b960791b60448201526064016104af565b6001600160a01b0384166000908152600260209081526040808320868452909152902054821115610d5f5760405162461bcd60e51b8152602060048201526017602482015276139bdd08195b9bdd59da081d1bdad95b9cc81bdddb9959604a1b60448201526064016104af565b6108d98484846115ff565b60606000610d7760065490565b905060006006805480602002602001604051908101604052809291908181526020018280548015610dc757602002820191906000526020600020905b815481526020019060010190808311610db3575b5050505050905060005b82811015610ecb57818181518110610deb57610deb612261565b6020026020010151851015610eb95760076000838381518110610e1057610e10612261565b602002602001015181526020019081526020016000208054610e31906121d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5d906121d0565b8015610eaa5780601f10610e7f57610100808354040283529160200191610eaa565b820191906000526020600020905b815481529060010190602001808311610e8d57829003601f168201915b50505050509350505050919050565b610ec46001826122cf565b9050610dd1565b5060405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081d1bdad95b9259608a1b60448201526064016104af565b606081600003610f2d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610f575780610f41816122b6565b9150610f509050600a8361236d565b9150610f31565b6000816001600160401b03811115610f7157610f71611c8c565b6040519080825280601f01601f191660200182016040528015610f9b576020820181803683370190505b5090505b841561100657610fb06001836122e2565b9150610fbd600a86612381565b610fc89060306122cf565b60f81b818381518110610fdd57610fdd612261565b60200101906001600160f81b031916908160001a905350610fff600a8661236d565b9450610f9f565b949350505050565b60006110226005546001600160a01b031690565b6001600160a01b0316336001600160a01b031614905090565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a35050565b81518351146110ae5760405162461bcd60e51b81526004016104af90612277565b6001600160a01b0384166110d45760405162461bcd60e51b81526004016104af90612395565b336110e3818787878787611724565b60005b84518110156111da57600085828151811061110357611103612261565b60200260200101519050600085838151811061112157611121612261565b6020908102919091018101516001600160a01b038b1660009081526002835260408082208683529093529190912054909150818110156111735760405162461bcd60e51b81526004016104af906123bb565b6001600160a01b03808b16600090815260026020818152604080842088855282528084208787039055938d168352908152828220868352905290812080548492906111bf9084906122cf565b92505081905550505050806111d3906122b6565b90506110e6565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161122a9291906123e5565b60405180910390a4611240818787878787611830565b505050505050565b611251816109a3565b61126d3382600160405180602001604052806000815250611983565b60405160018152819033907f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b9060200160405180910390a350565b6001600160a01b0383166112ef5760405162461bcd60e51b815260206004820152600e60248201526d232927a6afad22a927afa0a2222960911b60448201526064016104af565b80518251146113105760405162461bcd60e51b81526004016104af90612277565b600033905061133381856000868660405180602001604052806000815250611724565b60005b83518110156113fe57600084828151811061135357611353612261565b60200260200101519050600084838151811061137157611371612261565b6020908102919091018101516001600160a01b03891660009081526002835260408082208683529093529190912054909150818110156113c35760405162461bcd60e51b81526004016104af906123bb565b6001600160a01b03881660009081526002602090815260408083209583529490529290922091039055806113f6816122b6565b915050611336565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161144f9291906123e5565b60405180910390a450505050565b60008061146a84866122cf565b60068054600181019091557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0181905560008181526007602052604090209092508291506114b8848261245e565b50935093915050565b6001600160a01b0384166114e75760405162461bcd60e51b81526004016104af90612395565b336115068187876114f788611a4d565b61150088611a4d565b87611724565b6001600160a01b03861660009081526002602090815260408083208784529091529020548381101561154a5760405162461bcd60e51b81526004016104af906123bb565b6001600160a01b0380881660009081526002602081815260408084208a855282528084208987039055938a168352908152828220888352905290812080548692906115969084906122cf565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115f6828888888888611a98565b50505050505050565b6001600160a01b0383166116465760405162461bcd60e51b815260206004820152600e60248201526d232927a6afad22a927afa0a2222960911b60448201526064016104af565b336116758185600061165787611a4d565b61166087611a4d565b60405180602001604052806000815250611724565b6001600160a01b0384166000908152600260209081526040808320868452909152902054828110156116b95760405162461bcd60e51b81526004016104af906123bb565b6001600160a01b03858116600081815260026020908152604080832089845282528083208887039055805189815291820188905291938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6001600160a01b0385166117ab5760005b83518110156117a95782818151811061175057611750612261565b6020026020010151600b600086848151811061176e5761176e612261565b60200260200101518152602001908152602001600020600082825461179391906122cf565b909155506117a29050816122b6565b9050611735565b505b6001600160a01b0384166112405760005b83518110156115f6578281815181106117d7576117d7612261565b6020026020010151600b60008684815181106117f5576117f5612261565b60200260200101518152602001908152602001600020600082825461181a91906122e2565b909155506118299050816122b6565b90506117bc565b6001600160a01b0384163b156112405760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611874908990899088908890889060040161251d565b6020604051808303816000875af19250505080156118af575060408051601f3d908101601f191682019092526118ac9181019061256f565b60015b611931576118bb61258c565b806308c379a0036118f457506118cf6125a8565b806118da57506118f6565b8060405162461bcd60e51b81526004016104af9190611c45565b505b60405162461bcd60e51b815260206004820152601060248201526f10a2a92198989a9aa922a1a2a4ab22a960811b60448201526064016104af565b6001600160e01b0319811663bc197c8160e01b146115f65760405162461bcd60e51b815260206004820152600f60248201526e1513d2d15394d7d491529150d51151608a1b60448201526064016104af565b6001600160a01b0384166119a95760405162461bcd60e51b81526004016104af90612395565b336119ba816000876114f788611a4d565b6001600160a01b0385166000908152600260209081526040808320878452909152812080548592906119ed9084906122cf565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46105ba81600087878787611a98565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611a8757611a87612261565b602090810291909101015292915050565b6001600160a01b0384163b156112405760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611adc9089908990889088908890600401612631565b6020604051808303816000875af1925050508015611b17575060408051601f3d908101601f19168201909252611b149181019061256f565b60015b611b23576118bb61258c565b6001600160e01b0319811663f23a6e6160e01b146115f65760405162461bcd60e51b815260206004820152600f60248201526e1513d2d15394d7d491529150d51151608a1b60448201526064016104af565b80356001600160a01b0381168114611b8c57600080fd5b919050565b60008060408385031215611ba457600080fd5b611bad83611b75565b946020939093013593505050565b6001600160e01b0319811681146104c157600080fd5b600060208284031215611be357600080fd5b8135611bee81611bbb565b9392505050565b60005b83811015611c10578181015183820152602001611bf8565b50506000910152565b60008151808452611c31816020860160208601611bf5565b601f01601f19169290920160200192915050565b602081526000611bee6020830184611c19565b600060208284031215611c6a57600080fd5b5035919050565b600060208284031215611c8357600080fd5b611bee82611b75565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715611cc757611cc7611c8c565b6040525050565b60006001600160401b03821115611ce757611ce7611c8c565b5060051b60200190565b600082601f830112611d0257600080fd5b81356020611d0f82611cce565b604051611d1c8282611ca2565b83815260059390931b8501820192828101915086841115611d3c57600080fd5b8286015b84811015611d575780358352918301918301611d40565b509695505050505050565b600082601f830112611d7357600080fd5b81356001600160401b03811115611d8c57611d8c611c8c565b604051611da3601f8301601f191660200182611ca2565b818152846020838601011115611db857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611ded57600080fd5b611df686611b75565b9450611e0460208701611b75565b935060408601356001600160401b0380821115611e2057600080fd5b611e2c89838a01611cf1565b94506060880135915080821115611e4257600080fd5b611e4e89838a01611cf1565b93506080880135915080821115611e6457600080fd5b50611e7188828901611d62565b9150509295509295909350565b60008060408385031215611e9157600080fd5b82356001600160401b0380821115611ea857600080fd5b818501915085601f830112611ebc57600080fd5b81356020611ec982611cce565b604051611ed68282611ca2565b83815260059390931b8501820192828101915089841115611ef657600080fd5b948201945b83861015611f1b57611f0c86611b75565b82529482019490820190611efb565b96505086013592505080821115611f3157600080fd5b50611f3e85828601611cf1565b9150509250929050565b600081518084526020808501945080840160005b83811015611f7857815187529582019590820190600101611f5c565b509495945050505050565b602081526000611bee6020830184611f48565b600080600060608486031215611fab57600080fd5b611fb484611b75565b925060208401356001600160401b0380821115611fd057600080fd5b611fdc87838801611cf1565b93506040860135915080821115611ff257600080fd5b50611fff86828701611cf1565b9150509250925092565b6000806040838503121561201c57600080fd5b61202583611b75565b91506020830135801515811461203a57600080fd5b809150509250929050565b60008083601f84011261205757600080fd5b5081356001600160401b0381111561206e57600080fd5b60208301915083602082850101111561208657600080fd5b9250929050565b6000806000806000606086880312156120a557600080fd5b8535945060208601356001600160401b03808211156120c357600080fd5b6120cf89838a01612045565b909650945060408801359150808211156120e857600080fd5b506120f588828901612045565b969995985093965092949392505050565b6000806040838503121561211957600080fd5b61212283611b75565b915061213060208401611b75565b90509250929050565b600080600080600060a0868803121561215157600080fd5b61215a86611b75565b945061216860208701611b75565b9350604086013592506060860135915060808601356001600160401b0381111561219157600080fd5b611e7188828901611d62565b6000806000606084860312156121b257600080fd5b6121bb84611b75565b95602085013595506040909401359392505050565b600181811c908216806121e457607f821691505b60208210810361220457634e487b7160e01b600052602260045260246000fd5b50919050565b6000835161221c818460208801611bf5565b835190830190612230818360208801611bf5565b01949350505050565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6020808252600f908201526e0988a9c8ea890be9a92a69a82a8869608b1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016122c8576122c86122a0565b5060010190565b808201808211156103b6576103b66122a0565b818103818111156103b6576103b66122a0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8581526060602082015260006123386060830186886122f5565b828103604084015261234b8185876122f5565b98975050505050505050565b634e487b7160e01b600052601260045260246000fd5b60008261237c5761237c612357565b500490565b60008261239057612390612357565b500690565b6020808252600c908201526b2a27afad22a927afa0a2222960a11b604082015260600190565b60208082526010908201526f125394d551919250d251539517d0905360821b604082015260600190565b6040815260006123f86040830185611f48565b828103602084015261240a8185611f48565b95945050505050565b601f82111561245957600081815260208120601f850160051c8101602086101561243a5750805b601f850160051c820191505b8181101561124057828155600101612446565b505050565b81516001600160401b0381111561247757612477611c8c565b61248b8161248584546121d0565b84612413565b602080601f8311600181146124c057600084156124a85750858301515b600019600386901b1c1916600185901b178555611240565b600085815260208120601f198616915b828110156124ef578886015182559484019460019091019084016124d0565b508582101561250d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0386811682528516602082015260a06040820181905260009061254990830186611f48565b828103606084015261255b8186611f48565b9050828103608084015261234b8185611c19565b60006020828403121561258157600080fd5b8151611bee81611bbb565b600060033d11156125a55760046000803e5060005160e01c5b90565b600060443d10156125b65790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156125e557505050505090565b82850191508151818111156125fd5750505050505090565b843d87010160208285010111156126175750505050505090565b61262660208286010187611ca2565b509095945050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061266b90830184611c19565b97965050505050505056fea2646970667358221220d1a1f97110885c7651aec829c719a856586fc0e05975ac844ad93671b6821da164736f6c63430008110033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084d4620474143484100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074d46474143484100000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): MF GACHA
Arg [1] : _symbol (string): MFGACHA
Arg [2] : _claimEndTimestamp (uint256): 0

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [4] : 4d46204741434841000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [6] : 4d46474143484100000000000000000000000000000000000000000000000000


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.