ETH Price: $3,603.18 (-2.23%)

Contract

0x127B3Fe0Ddf9F260452a7D06FeC59ea9cB6E8007
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Amount:Between 1-10k
Reset Filter

Transaction Hash
Method
Block
From
To

There are no matching entries

Update your filters to view other transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

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 : 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];
            }
        }
    }
}

File 2 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 3 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 4 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 5 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 6 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 7 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 8 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 9 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 10 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 11 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 12 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 13 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;
    }
}

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


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.