ETH Price: $3,873.93 (+0.13%)

Token

Smart Club NFT (SCN)
 

Overview

Max Total Supply

5,183 SCN

Holders

4,574

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SCN
0xE7daFD4a96F1544237fFdA0AB75D800dbaa42e43
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SmartClubNFT721

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 13 : SmartClubNFT721.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;


import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";


contract MinterRole is Ownable {
    mapping(address => uint256) public _mintersMap;
    uint256 private minterLength;

    event SetMinterLimit(address indexed account, uint256 indexed mintNum);

    constructor() {
        setMinterLimit(_msgSender(), 1000000000);
    }

    modifier onlyMinter(uint256 num) {
        require(
            hasEnoughMint(_msgSender(), num),
            "MinterRole: caller mintLimit does not enough"
        );
        _;
    }

    function getMinterLength() public view returns (uint256) {
        return minterLength;
    }


    function hasEnoughMint(address account, uint num) public view returns (bool) {
        if (_mintersMap[account] >= num) {
            return true;
        }
        return false;
    }

    function setMinterLimit(address account, uint mintNumLimit) public onlyOwner {
        require(
            account != address(0),
            "setMinterLimit: account is the zero address"
        );
        if (mintNumLimit > 0 && _mintersMap[account] == 0) {
            minterLength++;
        } else if (mintNumLimit == 0 && _mintersMap[account] > 0) {
            minterLength--;
        }
        _mintersMap[account] = mintNumLimit;
        emit SetMinterLimit(account, mintNumLimit);
    }

    function _reduceMintNum(uint mintNumLimit) internal {
        _mintersMap[_msgSender()] -= mintNumLimit;
        if (_mintersMap[_msgSender()] == 0) {
            minterLength--;
        }
    }
}


//## SmartClubNFT721
contract SmartClubNFT721 is ERC721Enumerable, MinterRole {

    string private _baseTokenURI;
    uint256 public nextFreeTokenId = 1;

    mapping(address => uint256) public mintRecord;

    constructor(
        string memory name,
        string memory symbol,
        string memory baseTokenURI
    ) ERC721(name, symbol) {
        _baseTokenURI = baseTokenURI;
    }

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

    function transferFromBatch(address from, address to, uint256[] memory tokenIds) public {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            transferFrom(from, to, tokenIds[i]);
        }
    }

    function transferFromBatchMulti(address from, address[] memory tos, uint256[] memory tokenIds) public {
        require(tos.length > 0 && tos.length == tokenIds.length, "param error");
        for (uint256 i = 0; i < tos.length; i++) {
            transferFrom(from, tos[i], tokenIds[i]);
        }
    }

    function safeTransferFromBatch(address from, address to, uint256[] memory tokenIds) public {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            safeTransferFrom(from, to, tokenIds[i]);
        }
    }

    function safeTransferFromBatchMulti(address from, address[] memory tos, uint256[] memory tokenIds) public {
        require(tos.length > 0 && tos.length == tokenIds.length, "param error");
        for (uint256 i = 0; i < tos.length; i++) {
            safeTransferFrom(from, tos[i], tokenIds[i]);
        }
    }

    function freeMint() public {
        require(mintRecord[_msgSender()] == 0,"The address has already mint it");
        mintRecord[_msgSender()] = nextFreeTokenId;
        _mint(_msgSender(), nextFreeTokenId);
        nextFreeTokenId++;
    }

      function mint(address to, uint256 tokenId) public onlyMinter(1) {
        _mint(to, tokenId);
        _reduceMintNum(1);
    }

    function safeMint(address to, uint256 tokenId, bytes memory data) public onlyMinter(1) {
        _safeMint(to, tokenId, data);
        _reduceMintNum(1);
    }

    function safeMintBatch(
        address to,
        uint256[] memory tokenIds,
        bytes memory data
    ) public onlyMinter(tokenIds.length) {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            _safeMint(to, tokenIds[i], data);
        }
        _reduceMintNum(tokenIds.length);
    }

    function burn(address to, uint256 tokenId) public {
        require(
            to == _msgSender() || isApprovedForAll(to, _msgSender()) || getApproved(tokenId) == _msgSender(),
            "ERC721: caller is not token owner nor approved"
        );
        _burn(tokenId);
    }


    function burnBatch(
        address to,
        uint256[] memory tokenIds
    ) public {
        require(
            to == _msgSender() || isApprovedForAll(to, _msgSender()),
            "ERC721: caller is not token owner nor approved"
        );
        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(getApproved(tokenIds[i]) == _msgSender());
            _burn(tokenIds[i]);
        }
    }


    function setURI(string memory baseTokenURI) public onlyOwner {
        _baseTokenURI = baseTokenURI;
    }

}

File 2 of 13 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

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

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

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

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

File 3 of 13 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../ERC721.sol";
import "./IERC721Enumerable.sol";

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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 5 of 13 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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

File 6 of 13 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 7 of 13 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

File 10 of 13 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 11 of 13 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 12 of 13 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseTokenURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"mintNum","type":"uint256"}],"name":"SetMinterLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_mintersMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinterLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"hasEnoughMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintRecord","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextFreeTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"safeTransferFromBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"safeTransferFromBatchMulti","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":"address","name":"account","type":"address"},{"internalType":"uint256","name":"mintNumLimit","type":"uint256"}],"name":"setMinterLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseTokenURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"transferFromBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"transferFromBatchMulti","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600e553480156200001657600080fd5b5060405162002b7538038062002b75833981016040819052620000399162000365565b8282600062000049838262000485565b50600162000058828262000485565b505050620000756200006f6200009d60201b60201c565b620000a1565b6200008533633b9aca00620000f3565b600d62000093828262000485565b505050506200059d565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620000fd62000242565b6001600160a01b0382166200016d5760405162461bcd60e51b815260206004820152602b60248201527f7365744d696e7465724c696d69743a206163636f756e7420697320746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b6000811180156200019457506001600160a01b0382166000908152600b6020526040902054155b15620001b757600c8054906000620001ac8362000567565b9190505550620001fb565b80158015620001dd57506001600160a01b0382166000908152600b602052604090205415155b15620001fb57600c8054906000620001f58362000583565b91905055505b6001600160a01b0382166000818152600b6020526040808220849055518392917fbcc0c3812dd6538272ef8bd9d7863f701a6783124a3bf3156eddbda64f6aacf091a35050565b600a546001600160a01b031633146200029e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000164565b565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620002c857600080fd5b81516001600160401b0380821115620002e557620002e5620002a0565b604051601f8301601f19908116603f01168101908282118183101715620003105762000310620002a0565b816040528381526020925086838588010111156200032d57600080fd5b600091505b8382101562000351578582018301518183018401529082019062000332565b600093810190920192909252949350505050565b6000806000606084860312156200037b57600080fd5b83516001600160401b03808211156200039357600080fd5b620003a187838801620002b6565b94506020860151915080821115620003b857600080fd5b620003c687838801620002b6565b93506040860151915080821115620003dd57600080fd5b50620003ec86828701620002b6565b9150509250925092565b600181811c908216806200040b57607f821691505b6020821081036200042c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200048057600081815260208120601f850160051c810160208610156200045b5750805b601f850160051c820191505b818110156200047c5782815560010162000467565b5050505b505050565b81516001600160401b03811115620004a157620004a1620002a0565b620004b981620004b28454620003f6565b8462000432565b602080601f831160018114620004f15760008415620004d85750858301515b600019600386901b1c1916600185901b1785556200047c565b600085815260208120601f198616915b82811015620005225788860151825594840194600190910190840162000501565b5085821015620005415787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b6000600182016200057c576200057c62000551565b5060010190565b60008162000595576200059562000551565b506000190190565b6125c880620005ad6000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c806370a0823111610125578063a4e9a74e116100ad578063cd523a2f1161007c578063cd523a2f14610473578063e985e9c514610493578063f108c686146104cf578063f2fde38b146104e2578063fe96a349146104f557600080fd5b8063a4e9a74e14610427578063b2dc5dc31461043a578063b88d4fde1461044d578063c87b56dd1461046057600080fd5b80638da5cb5b116100f45780638da5cb5b146103df5780639449d576146103f057806395d89b41146103f95780639dc29fac14610401578063a22cb4651461041457600080fd5b806370a082311461039e578063715018a6146103b15780637ea6e571146103b95780638832e6e3146103cc57600080fd5b80633074d754116101a8578063443bcf1a11610177578063443bcf1a1461034a5780634f6ccce71461035d57806355f48e46146103705780635b70ea9f146103835780636352211e1461038b57600080fd5b80633074d754146102f157806338aa38151461031157806340c10f191461032457806342842e0e1461033757600080fd5b8063081812fc116101ef578063081812fc14610285578063095ea7b3146102b057806318160ddd146102c357806323b872dd146102cb5780632f745c59146102de57600080fd5b806301ffc9a71461022157806302fe5305146102495780630323aac71461025e57806306fdde0314610270575b600080fd5b61023461022f366004611c30565b610508565b60405190151581526020015b60405180910390f35b61025c610257366004611cec565b610533565b005b600c545b604051908152602001610240565b61027861054b565b6040516102409190611d85565b610298610293366004611d98565b6105dd565b6040516001600160a01b039091168152602001610240565b61025c6102be366004611dcd565b610604565b600854610262565b61025c6102d9366004611df7565b61071e565b6102626102ec366004611dcd565b61074f565b6102626102ff366004611e33565b600f6020526000908152604090205481565b61025c61031f366004611edd565b6107e5565b61025c610332366004611dcd565b61082d565b61025c610345366004611df7565b61086a565b61025c610358366004611f5b565b610885565b61026261036b366004611d98565b6108f9565b61025c61037e366004611edd565b61098c565b61025c6109ce565b610298610399366004611d98565b610a60565b6102626103ac366004611e33565b610ac0565b61025c610b46565b6102346103c7366004611dcd565b610b5a565b61025c6103da366004611fc5565b610b8a565b600a546001600160a01b0316610298565b610262600e5481565b610278610bc6565b61025c61040f366004611dcd565b610bd5565b61025c610422366004612012565b610c31565b61025c61043536600461204e565b610c3c565b61025c610448366004612116565b610cd6565b61025c61045b366004612164565b610d8d565b61027861046e366004611d98565b610dbf565b610262610481366004611e33565b600b6020526000908152604090205481565b6102346104a13660046121cc565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61025c6104dd36600461204e565b610e26565b61025c6104f0366004611e33565b610ec0565b61025c610503366004611dcd565b610f39565b60006001600160e01b0319821663780e9d6360e01b148061052d575061052d82611077565b92915050565b61053b6110c7565b600d6105478282612287565b5050565b60606000805461055a906121ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610586906121ff565b80156105d35780601f106105a8576101008083540402835291602001916105d3565b820191906000526020600020905b8154815290600101906020018083116105b657829003601f168201915b5050505050905090565b60006105e882611121565b506000908152600460205260409020546001600160a01b031690565b600061060f82610a60565b9050806001600160a01b0316836001600160a01b0316036106815760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061069d575061069d81336104a1565b61070f5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610678565b6107198383611180565b505050565b61072833826111ee565b6107445760405162461bcd60e51b815260040161067890612347565b61071983838361124d565b600061075a83610ac0565b82106107bc5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610678565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60005b815181101561082757610815848484848151811061080857610808612395565b602002602001015161086a565b8061081f816123c1565b9150506107e8565b50505050565b600161083a335b82610b5a565b6108565760405162461bcd60e51b8152600401610678906123da565b61086083836113f4565b6107196001611542565b61071983838360405180602001604052806000815250610d8d565b815161089033610834565b6108ac5760405162461bcd60e51b8152600401610678906123da565b60005b83518110156108ee576108dc858583815181106108ce576108ce612395565b602002602001015185611594565b806108e6816123c1565b9150506108af565b506108278351611542565b600061090460085490565b82106109675760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610678565b6008828154811061097a5761097a612395565b90600052602060002001549050919050565b60005b8151811015610827576109bc84848484815181106109af576109af612395565b602002602001015161071e565b806109c6816123c1565b91505061098f565b336000908152600f602052604090205415610a2b5760405162461bcd60e51b815260206004820152601f60248201527f54686520616464726573732068617320616c7265616479206d696e74206974006044820152606401610678565b600e54336000818152600f60205260409020829055610a49916113f4565b600e8054906000610a59836123c1565b9190505550565b6000818152600260205260408120546001600160a01b03168061052d5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610678565b60006001600160a01b038216610b2a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610678565b506001600160a01b031660009081526003602052604090205490565b610b4e6110c7565b610b5860006115c7565b565b6001600160a01b0382166000908152600b60205260408120548211610b815750600161052d565b50600092915050565b6001610b9533610834565b610bb15760405162461bcd60e51b8152600401610678906123da565b610bbc848484611594565b6108276001611542565b60606001805461055a906121ff565b6001600160a01b038216331480610bf15750610bf182336104a1565b80610c0c575033610c01826105dd565b6001600160a01b0316145b610c285760405162461bcd60e51b815260040161067890612347565b61054781611619565b6105473383836116c0565b60008251118015610c4e575080518251145b610c885760405162461bcd60e51b815260206004820152600b60248201526a3830b930b69032b93937b960a91b6044820152606401610678565b60005b825181101561082757610cc484848381518110610caa57610caa612395565b602002602001015184848151811061080857610808612395565b80610cce816123c1565b915050610c8b565b6001600160a01b038216331480610cf25750610cf282336104a1565b610d0e5760405162461bcd60e51b815260040161067890612347565b60005b815181101561071957336001600160a01b0316610d46838381518110610d3957610d39612395565b60200260200101516105dd565b6001600160a01b031614610d5957600080fd5b610d7b828281518110610d6e57610d6e612395565b6020026020010151611619565b80610d85816123c1565b915050610d11565b610d9733836111ee565b610db35760405162461bcd60e51b815260040161067890612347565b6108278484848461178e565b6060610dca82611121565b6000610dd46117c1565b90506000815111610df45760405180602001604052806000815250610e1f565b80610dfe846117d0565b604051602001610e0f929190612426565b6040516020818303038152906040525b9392505050565b60008251118015610e38575080518251145b610e725760405162461bcd60e51b815260206004820152600b60248201526a3830b930b69032b93937b960a91b6044820152606401610678565b60005b825181101561082757610eae84848381518110610e9457610e94612395565b60200260200101518484815181106109af576109af612395565b80610eb8816123c1565b915050610e75565b610ec86110c7565b6001600160a01b038116610f2d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610678565b610f36816115c7565b50565b610f416110c7565b6001600160a01b038216610fab5760405162461bcd60e51b815260206004820152602b60248201527f7365744d696e7465724c696d69743a206163636f756e7420697320746865207a60448201526a65726f206164647265737360a81b6064820152608401610678565b600081118015610fd157506001600160a01b0382166000908152600b6020526040902054155b15610ff057600c8054906000610fe6836123c1565b9190505550611030565b8015801561101557506001600160a01b0382166000908152600b602052604090205415155b1561103057600c805490600061102a83612455565b91905055505b6001600160a01b0382166000818152600b6020526040808220849055518392917fbcc0c3812dd6538272ef8bd9d7863f701a6783124a3bf3156eddbda64f6aacf091a35050565b60006001600160e01b031982166380ac58cd60e01b14806110a857506001600160e01b03198216635b5e139f60e01b145b8061052d57506301ffc9a760e01b6001600160e01b031983161461052d565b600a546001600160a01b03163314610b585760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610678565b6000818152600260205260409020546001600160a01b0316610f365760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610678565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906111b582610a60565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806111fa83610a60565b9050806001600160a01b0316846001600160a01b03161480611221575061122181856104a1565b806112455750836001600160a01b031661123a846105dd565b6001600160a01b0316145b949350505050565b826001600160a01b031661126082610a60565b6001600160a01b0316146112c45760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610678565b6001600160a01b0382166113265760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610678565b6113318383836118d1565b61133c600082611180565b6001600160a01b038316600090815260036020526040812080546001929061136590849061246c565b90915550506001600160a01b038216600090815260036020526040812080546001929061139390849061247f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b03821661144a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610678565b6000818152600260205260409020546001600160a01b0316156114af5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610678565b6114bb600083836118d1565b6001600160a01b03821660009081526003602052604081208054600192906114e490849061247f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b336000908152600b60205260408120805483929061156190849061246c565b9091555050336000908152600b60205260408120549003610f3657600c805490600061158c83612455565b919050555050565b61159e83836113f4565b6115ab6000848484611989565b6107195760405162461bcd60e51b815260040161067890612492565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061162482610a60565b9050611632816000846118d1565b61163d600083611180565b6001600160a01b038116600090815260036020526040812080546001929061166690849061246c565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b0316036117215760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610678565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61179984848461124d565b6117a584848484611989565b6108275760405162461bcd60e51b815260040161067890612492565b6060600d805461055a906121ff565b6060816000036117f75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611821578061180b816123c1565b915061181a9050600a836124fa565b91506117fb565b60008167ffffffffffffffff81111561183c5761183c611c4d565b6040519080825280601f01601f191660200182016040528015611866576020820181803683370190505b5090505b84156112455761187b60018361246c565b9150611888600a8661250e565b61189390603061247f565b60f81b8183815181106118a8576118a8612395565b60200101906001600160f81b031916908160001a9053506118ca600a866124fa565b945061186a565b6001600160a01b03831661192c5761192781600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61194f565b816001600160a01b0316836001600160a01b03161461194f5761194f8382611a8a565b6001600160a01b0382166119665761071981611b27565b826001600160a01b0316826001600160a01b031614610719576107198282611bd6565b60006001600160a01b0384163b15611a7f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119cd903390899088908890600401612522565b6020604051808303816000875af1925050508015611a08575060408051601f3d908101601f19168201909252611a059181019061255f565b60015b611a65573d808015611a36576040519150601f19603f3d011682016040523d82523d6000602084013e611a3b565b606091505b508051600003611a5d5760405162461bcd60e51b815260040161067890612492565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611245565b506001949350505050565b60006001611a9784610ac0565b611aa1919061246c565b600083815260076020526040902054909150808214611af4576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611b399060019061246c565b60008381526009602052604081205460088054939450909284908110611b6157611b61612395565b906000526020600020015490508060088381548110611b8257611b82612395565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611bba57611bba61257c565b6001900381819060005260206000200160009055905550505050565b6000611be183610ac0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b031981168114610f3657600080fd5b600060208284031215611c4257600080fd5b8135610e1f81611c1a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611c8c57611c8c611c4d565b604052919050565b600067ffffffffffffffff831115611cae57611cae611c4d565b611cc1601f8401601f1916602001611c63565b9050828152838383011115611cd557600080fd5b828260208301376000602084830101529392505050565b600060208284031215611cfe57600080fd5b813567ffffffffffffffff811115611d1557600080fd5b8201601f81018413611d2657600080fd5b61124584823560208401611c94565b60005b83811015611d50578181015183820152602001611d38565b50506000910152565b60008151808452611d71816020860160208601611d35565b601f01601f19169290920160200192915050565b602081526000610e1f6020830184611d59565b600060208284031215611daa57600080fd5b5035919050565b80356001600160a01b0381168114611dc857600080fd5b919050565b60008060408385031215611de057600080fd5b611de983611db1565b946020939093013593505050565b600080600060608486031215611e0c57600080fd5b611e1584611db1565b9250611e2360208501611db1565b9150604084013590509250925092565b600060208284031215611e4557600080fd5b610e1f82611db1565b600067ffffffffffffffff821115611e6857611e68611c4d565b5060051b60200190565b600082601f830112611e8357600080fd5b81356020611e98611e9383611e4e565b611c63565b82815260059290921b84018101918181019086841115611eb757600080fd5b8286015b84811015611ed25780358352918301918301611ebb565b509695505050505050565b600080600060608486031215611ef257600080fd5b611efb84611db1565b9250611f0960208501611db1565b9150604084013567ffffffffffffffff811115611f2557600080fd5b611f3186828701611e72565b9150509250925092565b600082601f830112611f4c57600080fd5b610e1f83833560208501611c94565b600080600060608486031215611f7057600080fd5b611f7984611db1565b9250602084013567ffffffffffffffff80821115611f9657600080fd5b611fa287838801611e72565b93506040860135915080821115611fb857600080fd5b50611f3186828701611f3b565b600080600060608486031215611fda57600080fd5b611fe384611db1565b925060208401359150604084013567ffffffffffffffff81111561200657600080fd5b611f3186828701611f3b565b6000806040838503121561202557600080fd5b61202e83611db1565b91506020830135801515811461204357600080fd5b809150509250929050565b60008060006060848603121561206357600080fd5b61206c84611db1565b925060208085013567ffffffffffffffff8082111561208a57600080fd5b818701915087601f83011261209e57600080fd5b81356120ac611e9382611e4e565b81815260059190911b8301840190848101908a8311156120cb57600080fd5b938501935b828510156120f0576120e185611db1565b825293850193908501906120d0565b96505050604087013592508083111561210857600080fd5b5050611f3186828701611e72565b6000806040838503121561212957600080fd5b61213283611db1565b9150602083013567ffffffffffffffff81111561214e57600080fd5b61215a85828601611e72565b9150509250929050565b6000806000806080858703121561217a57600080fd5b61218385611db1565b935061219160208601611db1565b925060408501359150606085013567ffffffffffffffff8111156121b457600080fd5b6121c087828801611f3b565b91505092959194509250565b600080604083850312156121df57600080fd5b6121e883611db1565b91506121f660208401611db1565b90509250929050565b600181811c9082168061221357607f821691505b60208210810361223357634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561071957600081815260208120601f850160051c810160208610156122605750805b601f850160051c820191505b8181101561227f5782815560010161226c565b505050505050565b815167ffffffffffffffff8111156122a1576122a1611c4d565b6122b5816122af84546121ff565b84612239565b602080601f8311600181146122ea57600084156122d25750858301515b600019600386901b1c1916600185901b17855561227f565b600085815260208120601f198616915b82811015612319578886015182559484019460019091019084016122fa565b50858210156123375787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016123d3576123d36123ab565b5060010190565b6020808252602c908201527f4d696e746572526f6c653a2063616c6c6572206d696e744c696d697420646f6560408201526b0e640dcdee840cadcdeeaced60a31b606082015260800190565b60008351612438818460208801611d35565b83519083019061244c818360208801611d35565b01949350505050565b600081612464576124646123ab565b506000190190565b8181038181111561052d5761052d6123ab565b8082018082111561052d5761052d6123ab565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612509576125096124e4565b500490565b60008261251d5761251d6124e4565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061255590830184611d59565b9695505050505050565b60006020828403121561257157600080fd5b8151610e1f81611c1a565b634e487b7160e01b600052603160045260246000fdfea26469706673582212201d3080c3c91eca4c4300bbd82e56f79162385be6dfc00b3d3a42dc2a0efc9f0f64736f6c63430008110033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000e536d61727420436c7562204e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000353434e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021c5760003560e01c806370a0823111610125578063a4e9a74e116100ad578063cd523a2f1161007c578063cd523a2f14610473578063e985e9c514610493578063f108c686146104cf578063f2fde38b146104e2578063fe96a349146104f557600080fd5b8063a4e9a74e14610427578063b2dc5dc31461043a578063b88d4fde1461044d578063c87b56dd1461046057600080fd5b80638da5cb5b116100f45780638da5cb5b146103df5780639449d576146103f057806395d89b41146103f95780639dc29fac14610401578063a22cb4651461041457600080fd5b806370a082311461039e578063715018a6146103b15780637ea6e571146103b95780638832e6e3146103cc57600080fd5b80633074d754116101a8578063443bcf1a11610177578063443bcf1a1461034a5780634f6ccce71461035d57806355f48e46146103705780635b70ea9f146103835780636352211e1461038b57600080fd5b80633074d754146102f157806338aa38151461031157806340c10f191461032457806342842e0e1461033757600080fd5b8063081812fc116101ef578063081812fc14610285578063095ea7b3146102b057806318160ddd146102c357806323b872dd146102cb5780632f745c59146102de57600080fd5b806301ffc9a71461022157806302fe5305146102495780630323aac71461025e57806306fdde0314610270575b600080fd5b61023461022f366004611c30565b610508565b60405190151581526020015b60405180910390f35b61025c610257366004611cec565b610533565b005b600c545b604051908152602001610240565b61027861054b565b6040516102409190611d85565b610298610293366004611d98565b6105dd565b6040516001600160a01b039091168152602001610240565b61025c6102be366004611dcd565b610604565b600854610262565b61025c6102d9366004611df7565b61071e565b6102626102ec366004611dcd565b61074f565b6102626102ff366004611e33565b600f6020526000908152604090205481565b61025c61031f366004611edd565b6107e5565b61025c610332366004611dcd565b61082d565b61025c610345366004611df7565b61086a565b61025c610358366004611f5b565b610885565b61026261036b366004611d98565b6108f9565b61025c61037e366004611edd565b61098c565b61025c6109ce565b610298610399366004611d98565b610a60565b6102626103ac366004611e33565b610ac0565b61025c610b46565b6102346103c7366004611dcd565b610b5a565b61025c6103da366004611fc5565b610b8a565b600a546001600160a01b0316610298565b610262600e5481565b610278610bc6565b61025c61040f366004611dcd565b610bd5565b61025c610422366004612012565b610c31565b61025c61043536600461204e565b610c3c565b61025c610448366004612116565b610cd6565b61025c61045b366004612164565b610d8d565b61027861046e366004611d98565b610dbf565b610262610481366004611e33565b600b6020526000908152604090205481565b6102346104a13660046121cc565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61025c6104dd36600461204e565b610e26565b61025c6104f0366004611e33565b610ec0565b61025c610503366004611dcd565b610f39565b60006001600160e01b0319821663780e9d6360e01b148061052d575061052d82611077565b92915050565b61053b6110c7565b600d6105478282612287565b5050565b60606000805461055a906121ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610586906121ff565b80156105d35780601f106105a8576101008083540402835291602001916105d3565b820191906000526020600020905b8154815290600101906020018083116105b657829003601f168201915b5050505050905090565b60006105e882611121565b506000908152600460205260409020546001600160a01b031690565b600061060f82610a60565b9050806001600160a01b0316836001600160a01b0316036106815760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061069d575061069d81336104a1565b61070f5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610678565b6107198383611180565b505050565b61072833826111ee565b6107445760405162461bcd60e51b815260040161067890612347565b61071983838361124d565b600061075a83610ac0565b82106107bc5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610678565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60005b815181101561082757610815848484848151811061080857610808612395565b602002602001015161086a565b8061081f816123c1565b9150506107e8565b50505050565b600161083a335b82610b5a565b6108565760405162461bcd60e51b8152600401610678906123da565b61086083836113f4565b6107196001611542565b61071983838360405180602001604052806000815250610d8d565b815161089033610834565b6108ac5760405162461bcd60e51b8152600401610678906123da565b60005b83518110156108ee576108dc858583815181106108ce576108ce612395565b602002602001015185611594565b806108e6816123c1565b9150506108af565b506108278351611542565b600061090460085490565b82106109675760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610678565b6008828154811061097a5761097a612395565b90600052602060002001549050919050565b60005b8151811015610827576109bc84848484815181106109af576109af612395565b602002602001015161071e565b806109c6816123c1565b91505061098f565b336000908152600f602052604090205415610a2b5760405162461bcd60e51b815260206004820152601f60248201527f54686520616464726573732068617320616c7265616479206d696e74206974006044820152606401610678565b600e54336000818152600f60205260409020829055610a49916113f4565b600e8054906000610a59836123c1565b9190505550565b6000818152600260205260408120546001600160a01b03168061052d5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610678565b60006001600160a01b038216610b2a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610678565b506001600160a01b031660009081526003602052604090205490565b610b4e6110c7565b610b5860006115c7565b565b6001600160a01b0382166000908152600b60205260408120548211610b815750600161052d565b50600092915050565b6001610b9533610834565b610bb15760405162461bcd60e51b8152600401610678906123da565b610bbc848484611594565b6108276001611542565b60606001805461055a906121ff565b6001600160a01b038216331480610bf15750610bf182336104a1565b80610c0c575033610c01826105dd565b6001600160a01b0316145b610c285760405162461bcd60e51b815260040161067890612347565b61054781611619565b6105473383836116c0565b60008251118015610c4e575080518251145b610c885760405162461bcd60e51b815260206004820152600b60248201526a3830b930b69032b93937b960a91b6044820152606401610678565b60005b825181101561082757610cc484848381518110610caa57610caa612395565b602002602001015184848151811061080857610808612395565b80610cce816123c1565b915050610c8b565b6001600160a01b038216331480610cf25750610cf282336104a1565b610d0e5760405162461bcd60e51b815260040161067890612347565b60005b815181101561071957336001600160a01b0316610d46838381518110610d3957610d39612395565b60200260200101516105dd565b6001600160a01b031614610d5957600080fd5b610d7b828281518110610d6e57610d6e612395565b6020026020010151611619565b80610d85816123c1565b915050610d11565b610d9733836111ee565b610db35760405162461bcd60e51b815260040161067890612347565b6108278484848461178e565b6060610dca82611121565b6000610dd46117c1565b90506000815111610df45760405180602001604052806000815250610e1f565b80610dfe846117d0565b604051602001610e0f929190612426565b6040516020818303038152906040525b9392505050565b60008251118015610e38575080518251145b610e725760405162461bcd60e51b815260206004820152600b60248201526a3830b930b69032b93937b960a91b6044820152606401610678565b60005b825181101561082757610eae84848381518110610e9457610e94612395565b60200260200101518484815181106109af576109af612395565b80610eb8816123c1565b915050610e75565b610ec86110c7565b6001600160a01b038116610f2d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610678565b610f36816115c7565b50565b610f416110c7565b6001600160a01b038216610fab5760405162461bcd60e51b815260206004820152602b60248201527f7365744d696e7465724c696d69743a206163636f756e7420697320746865207a60448201526a65726f206164647265737360a81b6064820152608401610678565b600081118015610fd157506001600160a01b0382166000908152600b6020526040902054155b15610ff057600c8054906000610fe6836123c1565b9190505550611030565b8015801561101557506001600160a01b0382166000908152600b602052604090205415155b1561103057600c805490600061102a83612455565b91905055505b6001600160a01b0382166000818152600b6020526040808220849055518392917fbcc0c3812dd6538272ef8bd9d7863f701a6783124a3bf3156eddbda64f6aacf091a35050565b60006001600160e01b031982166380ac58cd60e01b14806110a857506001600160e01b03198216635b5e139f60e01b145b8061052d57506301ffc9a760e01b6001600160e01b031983161461052d565b600a546001600160a01b03163314610b585760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610678565b6000818152600260205260409020546001600160a01b0316610f365760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610678565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906111b582610a60565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806111fa83610a60565b9050806001600160a01b0316846001600160a01b03161480611221575061122181856104a1565b806112455750836001600160a01b031661123a846105dd565b6001600160a01b0316145b949350505050565b826001600160a01b031661126082610a60565b6001600160a01b0316146112c45760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610678565b6001600160a01b0382166113265760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610678565b6113318383836118d1565b61133c600082611180565b6001600160a01b038316600090815260036020526040812080546001929061136590849061246c565b90915550506001600160a01b038216600090815260036020526040812080546001929061139390849061247f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b03821661144a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610678565b6000818152600260205260409020546001600160a01b0316156114af5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610678565b6114bb600083836118d1565b6001600160a01b03821660009081526003602052604081208054600192906114e490849061247f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b336000908152600b60205260408120805483929061156190849061246c565b9091555050336000908152600b60205260408120549003610f3657600c805490600061158c83612455565b919050555050565b61159e83836113f4565b6115ab6000848484611989565b6107195760405162461bcd60e51b815260040161067890612492565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061162482610a60565b9050611632816000846118d1565b61163d600083611180565b6001600160a01b038116600090815260036020526040812080546001929061166690849061246c565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b0316036117215760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610678565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61179984848461124d565b6117a584848484611989565b6108275760405162461bcd60e51b815260040161067890612492565b6060600d805461055a906121ff565b6060816000036117f75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611821578061180b816123c1565b915061181a9050600a836124fa565b91506117fb565b60008167ffffffffffffffff81111561183c5761183c611c4d565b6040519080825280601f01601f191660200182016040528015611866576020820181803683370190505b5090505b84156112455761187b60018361246c565b9150611888600a8661250e565b61189390603061247f565b60f81b8183815181106118a8576118a8612395565b60200101906001600160f81b031916908160001a9053506118ca600a866124fa565b945061186a565b6001600160a01b03831661192c5761192781600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61194f565b816001600160a01b0316836001600160a01b03161461194f5761194f8382611a8a565b6001600160a01b0382166119665761071981611b27565b826001600160a01b0316826001600160a01b031614610719576107198282611bd6565b60006001600160a01b0384163b15611a7f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119cd903390899088908890600401612522565b6020604051808303816000875af1925050508015611a08575060408051601f3d908101601f19168201909252611a059181019061255f565b60015b611a65573d808015611a36576040519150601f19603f3d011682016040523d82523d6000602084013e611a3b565b606091505b508051600003611a5d5760405162461bcd60e51b815260040161067890612492565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611245565b506001949350505050565b60006001611a9784610ac0565b611aa1919061246c565b600083815260076020526040902054909150808214611af4576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611b399060019061246c565b60008381526009602052604081205460088054939450909284908110611b6157611b61612395565b906000526020600020015490508060088381548110611b8257611b82612395565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611bba57611bba61257c565b6001900381819060005260206000200160009055905550505050565b6000611be183610ac0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b031981168114610f3657600080fd5b600060208284031215611c4257600080fd5b8135610e1f81611c1a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611c8c57611c8c611c4d565b604052919050565b600067ffffffffffffffff831115611cae57611cae611c4d565b611cc1601f8401601f1916602001611c63565b9050828152838383011115611cd557600080fd5b828260208301376000602084830101529392505050565b600060208284031215611cfe57600080fd5b813567ffffffffffffffff811115611d1557600080fd5b8201601f81018413611d2657600080fd5b61124584823560208401611c94565b60005b83811015611d50578181015183820152602001611d38565b50506000910152565b60008151808452611d71816020860160208601611d35565b601f01601f19169290920160200192915050565b602081526000610e1f6020830184611d59565b600060208284031215611daa57600080fd5b5035919050565b80356001600160a01b0381168114611dc857600080fd5b919050565b60008060408385031215611de057600080fd5b611de983611db1565b946020939093013593505050565b600080600060608486031215611e0c57600080fd5b611e1584611db1565b9250611e2360208501611db1565b9150604084013590509250925092565b600060208284031215611e4557600080fd5b610e1f82611db1565b600067ffffffffffffffff821115611e6857611e68611c4d565b5060051b60200190565b600082601f830112611e8357600080fd5b81356020611e98611e9383611e4e565b611c63565b82815260059290921b84018101918181019086841115611eb757600080fd5b8286015b84811015611ed25780358352918301918301611ebb565b509695505050505050565b600080600060608486031215611ef257600080fd5b611efb84611db1565b9250611f0960208501611db1565b9150604084013567ffffffffffffffff811115611f2557600080fd5b611f3186828701611e72565b9150509250925092565b600082601f830112611f4c57600080fd5b610e1f83833560208501611c94565b600080600060608486031215611f7057600080fd5b611f7984611db1565b9250602084013567ffffffffffffffff80821115611f9657600080fd5b611fa287838801611e72565b93506040860135915080821115611fb857600080fd5b50611f3186828701611f3b565b600080600060608486031215611fda57600080fd5b611fe384611db1565b925060208401359150604084013567ffffffffffffffff81111561200657600080fd5b611f3186828701611f3b565b6000806040838503121561202557600080fd5b61202e83611db1565b91506020830135801515811461204357600080fd5b809150509250929050565b60008060006060848603121561206357600080fd5b61206c84611db1565b925060208085013567ffffffffffffffff8082111561208a57600080fd5b818701915087601f83011261209e57600080fd5b81356120ac611e9382611e4e565b81815260059190911b8301840190848101908a8311156120cb57600080fd5b938501935b828510156120f0576120e185611db1565b825293850193908501906120d0565b96505050604087013592508083111561210857600080fd5b5050611f3186828701611e72565b6000806040838503121561212957600080fd5b61213283611db1565b9150602083013567ffffffffffffffff81111561214e57600080fd5b61215a85828601611e72565b9150509250929050565b6000806000806080858703121561217a57600080fd5b61218385611db1565b935061219160208601611db1565b925060408501359150606085013567ffffffffffffffff8111156121b457600080fd5b6121c087828801611f3b565b91505092959194509250565b600080604083850312156121df57600080fd5b6121e883611db1565b91506121f660208401611db1565b90509250929050565b600181811c9082168061221357607f821691505b60208210810361223357634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561071957600081815260208120601f850160051c810160208610156122605750805b601f850160051c820191505b8181101561227f5782815560010161226c565b505050505050565b815167ffffffffffffffff8111156122a1576122a1611c4d565b6122b5816122af84546121ff565b84612239565b602080601f8311600181146122ea57600084156122d25750858301515b600019600386901b1c1916600185901b17855561227f565b600085815260208120601f198616915b82811015612319578886015182559484019460019091019084016122fa565b50858210156123375787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016123d3576123d36123ab565b5060010190565b6020808252602c908201527f4d696e746572526f6c653a2063616c6c6572206d696e744c696d697420646f6560408201526b0e640dcdee840cadcdeeaced60a31b606082015260800190565b60008351612438818460208801611d35565b83519083019061244c818360208801611d35565b01949350505050565b600081612464576124646123ab565b506000190190565b8181038181111561052d5761052d6123ab565b8082018082111561052d5761052d6123ab565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612509576125096124e4565b500490565b60008261251d5761251d6124e4565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061255590830184611d59565b9695505050505050565b60006020828403121561257157600080fd5b8151610e1f81611c1a565b634e487b7160e01b600052603160045260246000fdfea26469706673582212201d3080c3c91eca4c4300bbd82e56f79162385be6dfc00b3d3a42dc2a0efc9f0f64736f6c63430008110033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000e536d61727420436c7562204e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000353434e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Smart Club NFT
Arg [1] : symbol (string): SCN
Arg [2] : baseTokenURI (string):

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [4] : 536d61727420436c7562204e4654000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 53434e0000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

1736:3335:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;990:222:4;;;;;;:::i;:::-;;:::i;:::-;;;565:14:13;;558:22;540:41;;528:2;513:18;990:222:4;;;;;;;;4958:108:12;;;;;;:::i;:::-;;:::i;:::-;;687:95;762:12;;687:95;;;2018:25:13;;;2006:2;1991:18;687:95:12;1872:177:13;2470:98:1;;;:::i;:::-;;;;;;;:::i;3935:167::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3159:32:13;;;3141:51;;3129:2;3114:18;3935:167:1;2995:203:13;3467:407:1;;;;;;:::i;:::-;;:::i;1615:111:4:-;1702:10;:17;1615:111;;4612:327:1;;;;;;:::i;:::-;;:::i;1291:253:4:-;;;;;;:::i;:::-;;:::i;1880:45:12:-;;;;;;:::i;:::-;;;;;;;;;;;;;;2786:221;;;;;;:::i;:::-;;:::i;3596:129::-;;;;;;:::i;:::-;;:::i;5005:179:1:-;;;;;;:::i;:::-;;:::i;3903:315:12:-;;;;;;:::i;:::-;;:::i;1798:230:4:-;;;;;;:::i;:::-;;:::i;2248:213:12:-;;;;;;:::i;:::-;;:::i;3340:246::-;;;:::i;2190:218:1:-;;;;;;:::i;:::-;;:::i;1929:204::-;;;;;;:::i;:::-;;:::i;1831:101:0:-;;;:::i;792:189:12:-;;;;;;:::i;:::-;;:::i;3733:162::-;;;;;;:::i;:::-;;:::i;1201:85:0:-;1273:6;;-1:-1:-1;;;;;1273:6:0;1201:85;;1837:34:12;;;;;;2632:102:1;;;:::i;4226:286:12:-;;;;;;:::i;:::-;;:::i;4169:153:1:-;;;;;;:::i;:::-;;:::i;3015:317:12:-;;;;;;:::i;:::-;;:::i;4522:426::-;;;;;;:::i;:::-;;:::i;5250:315:1:-;;;;;;:::i;:::-;;:::i;2800:276::-;;;;;;:::i;:::-;;:::i;239:46:12:-;;;;;;:::i;:::-;;;;;;;;;;;;;;4388:162:1;;;;;;:::i;:::-;-1:-1:-1;;;;;4508:25:1;;;4485:4;4508:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4388:162;2469:309:12;;;;;;:::i;:::-;;:::i;2081:198:0:-;;;;;;:::i;:::-;;:::i;989:509:12:-;;;;;;:::i;:::-;;:::i;990:222:4:-;1092:4;-1:-1:-1;;;;;;1115:50:4;;-1:-1:-1;;;1115:50:4;;:90;;;1169:36;1193:11;1169:23;:36::i;:::-;1108:97;990:222;-1:-1:-1;;990:222:4:o;4958:108:12:-;1094:13:0;:11;:13::i;:::-;5030::12::1;:28;5046:12:::0;5030:13;:28:::1;:::i;:::-;;4958:108:::0;:::o;2470:98:1:-;2524:13;2556:5;2549:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2470:98;:::o;3935:167::-;4011:7;4030:23;4045:7;4030:14;:23::i;:::-;-1:-1:-1;4071:24:1;;;;:15;:24;;;;;;-1:-1:-1;;;;;4071:24:1;;3935:167::o;3467:407::-;3547:13;3563:23;3578:7;3563:14;:23::i;:::-;3547:39;;3610:5;-1:-1:-1;;;;;3604:11:1;:2;-1:-1:-1;;;;;3604:11:1;;3596:57;;;;-1:-1:-1;;;3596:57:1;;12459:2:13;3596:57:1;;;12441:21:13;12498:2;12478:18;;;12471:30;12537:34;12517:18;;;12510:62;-1:-1:-1;;;12588:18:13;;;12581:31;12629:19;;3596:57:1;;;;;;;;;719:10:8;-1:-1:-1;;;;;3685:21:1;;;;:62;;-1:-1:-1;3710:37:1;3727:5;719:10:8;4388:162:1;:::i;3710:37::-;3664:171;;;;-1:-1:-1;;;3664:171:1;;12861:2:13;3664:171:1;;;12843:21:13;12900:2;12880:18;;;12873:30;12939:34;12919:18;;;12912:62;13010:32;12990:18;;;12983:60;13060:19;;3664:171:1;12659:426:13;3664:171:1;3846:21;3855:2;3859:7;3846:8;:21::i;:::-;3537:337;3467:407;;:::o;4612:327::-;4801:41;719:10:8;4834:7:1;4801:18;:41::i;:::-;4793:100;;;;-1:-1:-1;;;4793:100:1;;;;;;;:::i;:::-;4904:28;4914:4;4920:2;4924:7;4904:9;:28::i;1291:253:4:-;1388:7;1423:23;1440:5;1423:16;:23::i;:::-;1415:5;:31;1407:87;;;;-1:-1:-1;;;1407:87:4;;13707:2:13;1407:87:4;;;13689:21:13;13746:2;13726:18;;;13719:30;13785:34;13765:18;;;13758:62;-1:-1:-1;;;13836:18:13;;;13829:41;13887:19;;1407:87:4;13505:407:13;1407:87:4;-1:-1:-1;;;;;;1511:19:4;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1291:253::o;2786:221:12:-;2893:9;2888:112;2912:8;:15;2908:1;:19;2888:112;;;2949:39;2966:4;2972:2;2976:8;2985:1;2976:11;;;;;;;;:::i;:::-;;;;;;;2949:16;:39::i;:::-;2929:3;;;;:::i;:::-;;;;2888:112;;;;2786:221;;;:::o;3596:129::-;3657:1;555:32;719:10:8;569:12:12;583:3;555:13;:32::i;:::-;533:126;;;;-1:-1:-1;;;533:126:12;;;;;;;:::i;:::-;3671:18:::1;3677:2;3681:7;3671:5;:18::i;:::-;3700:17;3715:1;3700:14;:17::i;5005:179:1:-:0;5138:39;5155:4;5161:2;5165:7;5138:39;;;;;;;;;;;;:16;:39::i;3903:315:12:-;4036:15;;555:32;719:10:8;569:12:12;640:96:8;555:32:12;533:126;;;;-1:-1:-1;;;533:126:12;;;;;;;:::i;:::-;4069:9:::1;4064:105;4088:8;:15;4084:1;:19;4064:105;;;4125:32;4135:2;4139:8;4148:1;4139:11;;;;;;;;:::i;:::-;;;;;;;4152:4;4125:9;:32::i;:::-;4105:3:::0;::::1;::::0;::::1;:::i;:::-;;;;4064:105;;;;4179:31;4194:8;:15;4179:14;:31::i;1798:230:4:-:0;1873:7;1908:30;1702:10;:17;;1615:111;1908:30;1900:5;:38;1892:95;;;;-1:-1:-1;;;1892:95:4;;14936:2:13;1892:95:4;;;14918:21:13;14975:2;14955:18;;;14948:30;15014:34;14994:18;;;14987:62;-1:-1:-1;;;15065:18:13;;;15058:42;15117:19;;1892:95:4;14734:408:13;1892:95:4;2004:10;2015:5;2004:17;;;;;;;;:::i;:::-;;;;;;;;;1997:24;;1798:230;;;:::o;2248:213:12:-;2351:9;2346:108;2370:8;:15;2366:1;:19;2346:108;;;2407:35;2420:4;2426:2;2430:8;2439:1;2430:11;;;;;;;;:::i;:::-;;;;;;;2407:12;:35::i;:::-;2387:3;;;;:::i;:::-;;;;2346:108;;3340:246;719:10:8;3386:24:12;;;;:10;:24;;;;;;:29;3378:72;;;;-1:-1:-1;;;3378:72:12;;15349:2:13;3378:72:12;;;15331:21:13;15388:2;15368:18;;;15361:30;15427:33;15407:18;;;15400:61;15478:18;;3378:72:12;15147:355:13;3378:72:12;3488:15;;719:10:8;3461:24:12;;;;:10;:24;;;;;:42;;;3514:36;;:5;:36::i;:::-;3561:15;:17;;;:15;:17;;;:::i;:::-;;;;;;3340:246::o;2190:218:1:-;2262:7;2297:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2297:16:1;;2323:56;;;;-1:-1:-1;;;2323:56:1;;15709:2:13;2323:56:1;;;15691:21:13;15748:2;15728:18;;;15721:30;-1:-1:-1;;;15767:18:13;;;15760:54;15831:18;;2323:56:1;15507:348:13;1929:204:1;2001:7;-1:-1:-1;;;;;2028:19:1;;2020:73;;;;-1:-1:-1;;;2020:73:1;;16062:2:13;2020:73:1;;;16044:21:13;16101:2;16081:18;;;16074:30;16140:34;16120:18;;;16113:62;-1:-1:-1;;;16191:18:13;;;16184:39;16240:19;;2020:73:1;15860:405:13;2020:73:1;-1:-1:-1;;;;;;2110:16:1;;;;;:9;:16;;;;;;;1929:204::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;792:189:12:-;-1:-1:-1;;;;;884:20:12;;863:4;884:20;;;:11;:20;;;;;;:27;-1:-1:-1;880:71:12;;-1:-1:-1;935:4:12;928:11;;880:71;-1:-1:-1;968:5:12;792:189;;;;:::o;3733:162::-;3817:1;555:32;719:10:8;569:12:12;640:96:8;555:32:12;533:126;;;;-1:-1:-1;;;533:126:12;;;;;;;:::i;:::-;3831:28:::1;3841:2;3845:7;3854:4;3831:9;:28::i;:::-;3870:17;3885:1;3870:14;:17::i;2632:102:1:-:0;2688:13;2720:7;2713:14;;;;;:::i;4226:286:12:-;-1:-1:-1;;;;;4309:18:12;;719:10:8;4309:18:12;;:56;;-1:-1:-1;4331:34:12;4348:2;719:10:8;4388:162:1;:::i;4331:34:12:-;4309:96;;;-1:-1:-1;719:10:8;4369:20:12;4381:7;4369:11;:20::i;:::-;-1:-1:-1;;;;;4369:36:12;;4309:96;4287:192;;;;-1:-1:-1;;;4287:192:12;;;;;;;:::i;:::-;4490:14;4496:7;4490:5;:14::i;4169:153:1:-;4263:52;719:10:8;4296:8:1;4306;4263:18;:52::i;3015:317:12:-;3153:1;3140:3;:10;:14;:47;;;;;3172:8;:15;3158:3;:10;:29;3140:47;3132:71;;;;-1:-1:-1;;;3132:71:12;;16472:2:13;3132:71:12;;;16454:21:13;16511:2;16491:18;;;16484:30;-1:-1:-1;;;16530:18:13;;;16523:41;16581:18;;3132:71:12;16270:335:13;3132:71:12;3219:9;3214:111;3238:3;:10;3234:1;:14;3214:111;;;3270:43;3287:4;3293:3;3297:1;3293:6;;;;;;;;:::i;:::-;;;;;;;3301:8;3310:1;3301:11;;;;;;;;:::i;3270:43::-;3250:3;;;;:::i;:::-;;;;3214:111;;4522:426;-1:-1:-1;;;;;4645:18:12;;719:10:8;4645:18:12;;:56;;-1:-1:-1;4667:34:12;4684:2;719:10:8;4388:162:1;:::i;4667:34:12:-;4623:152;;;;-1:-1:-1;;;4623:152:12;;;;;;;:::i;:::-;4791:9;4786:155;4810:8;:15;4806:1;:19;4786:155;;;719:10:8;-1:-1:-1;;;;;4855:40:12;:24;4867:8;4876:1;4867:11;;;;;;;;:::i;:::-;;;;;;;4855;:24::i;:::-;-1:-1:-1;;;;;4855:40:12;;4847:49;;;;;;4911:18;4917:8;4926:1;4917:11;;;;;;;;:::i;:::-;;;;;;;4911:5;:18::i;:::-;4827:3;;;;:::i;:::-;;;;4786:155;;5250:315:1;5418:41;719:10:8;5451:7:1;5418:18;:41::i;:::-;5410:100;;;;-1:-1:-1;;;5410:100:1;;;;;;;:::i;:::-;5520:38;5534:4;5540:2;5544:7;5553:4;5520:13;:38::i;2800:276::-;2873:13;2898:23;2913:7;2898:14;:23::i;:::-;2932:21;2956:10;:8;:10::i;:::-;2932:34;;3007:1;2989:7;2983:21;:25;:86;;;;;;;;;;;;;;;;;3035:7;3044:18;:7;:16;:18::i;:::-;3018:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2983:86;2976:93;2800:276;-1:-1:-1;;;2800:276:1:o;2469:309:12:-;2603:1;2590:3;:10;:14;:47;;;;;2622:8;:15;2608:3;:10;:29;2590:47;2582:71;;;;-1:-1:-1;;;2582:71:12;;16472:2:13;2582:71:12;;;16454:21:13;16511:2;16491:18;;;16484:30;-1:-1:-1;;;16530:18:13;;;16523:41;16581:18;;2582:71:12;16270:335:13;2582:71:12;2669:9;2664:107;2688:3;:10;2684:1;:14;2664:107;;;2720:39;2733:4;2739:3;2743:1;2739:6;;;;;;;;:::i;:::-;;;;;;;2747:8;2756:1;2747:11;;;;;;;;:::i;2720:39::-;2700:3;;;;:::i;:::-;;;;2664:107;;2081:198:0;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;17313:2:13;2161:73:0::1;::::0;::::1;17295:21:13::0;17352:2;17332:18;;;17325:30;17391:34;17371:18;;;17364:62;-1:-1:-1;;;17442:18:13;;;17435:36;17488:19;;2161:73:0::1;17111:402:13::0;2161:73:0::1;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;989:509:12:-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;1099:21:12;::::1;1077:114;;;::::0;-1:-1:-1;;;1077:114:12;;17720:2:13;1077:114:12::1;::::0;::::1;17702:21:13::0;17759:2;17739:18;;;17732:30;17798:34;17778:18;;;17771:62;-1:-1:-1;;;17849:18:13;;;17842:41;17900:19;;1077:114:12::1;17518:407:13::0;1077:114:12::1;1221:1;1206:12;:16;:45;;;;-1:-1:-1::0;;;;;;1226:20:12;::::1;;::::0;;;:11:::1;:20;::::0;;;;;:25;1206:45:::1;1202:190;;;1268:12;:14:::0;;;:12:::1;:14;::::0;::::1;:::i;:::-;;;;;;1202:190;;;1304:17:::0;;:45;::::1;;;-1:-1:-1::0;;;;;;1325:20:12;::::1;1348:1;1325:20:::0;;;:11:::1;:20;::::0;;;;;:24;;1304:45:::1;1300:92;;;1366:12;:14:::0;;;:12:::1;:14;::::0;::::1;:::i;:::-;;;;;;1300:92;-1:-1:-1::0;;;;;1402:20:12;::::1;;::::0;;;:11:::1;:20;::::0;;;;;:35;;;1453:37;1425:12;;1402:20;1453:37:::1;::::0;::::1;989:509:::0;;:::o;1570:300:1:-;1672:4;-1:-1:-1;;;;;;1707:40:1;;-1:-1:-1;;;1707:40:1;;:104;;-1:-1:-1;;;;;;;1763:48:1;;-1:-1:-1;;;1763:48:1;1707:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:10;;;1827:36:1;829:155:10;1359:130:0;1273:6;;-1:-1:-1;;;;;1273:6:0;719:10:8;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;18273:2:13;1414:68:0;;;18255:21:13;;;18292:18;;;18285:30;18351:34;18331:18;;;18324:62;18403:18;;1414:68:0;18071:356:13;11657:133:1;7099:4;7122:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7122:16:1;11730:53;;;;-1:-1:-1;;;11730:53:1;;15709:2:13;11730:53:1;;;15691:21:13;15748:2;15728:18;;;15721:30;-1:-1:-1;;;15767:18:13;;;15760:54;15831:18;;11730:53:1;15507:348:13;10959:171:1;11033:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11033:29:1;-1:-1:-1;;;;;11033:29:1;;;;;;;;:24;;11086:23;11033:24;11086:14;:23::i;:::-;-1:-1:-1;;;;;11077:46:1;;;;;;;;;;;10959:171;;:::o;7317:261::-;7410:4;7426:13;7442:23;7457:7;7442:14;:23::i;:::-;7426:39;;7494:5;-1:-1:-1;;;;;7483:16:1;:7;-1:-1:-1;;;;;7483:16:1;;:52;;;;7503:32;7520:5;7527:7;7503:16;:32::i;:::-;7483:87;;;;7563:7;-1:-1:-1;;;;;7539:31:1;:20;7551:7;7539:11;:20::i;:::-;-1:-1:-1;;;;;7539:31:1;;7483:87;7475:96;7317:261;-1:-1:-1;;;;7317:261:1:o;10242:605::-;10396:4;-1:-1:-1;;;;;10369:31:1;:23;10384:7;10369:14;:23::i;:::-;-1:-1:-1;;;;;10369:31:1;;10361:81;;;;-1:-1:-1;;;10361:81:1;;18634:2:13;10361:81:1;;;18616:21:13;18673:2;18653:18;;;18646:30;18712:34;18692:18;;;18685:62;-1:-1:-1;;;18763:18:13;;;18756:35;18808:19;;10361:81:1;18432:401:13;10361:81:1;-1:-1:-1;;;;;10460:16:1;;10452:65;;;;-1:-1:-1;;;10452:65:1;;19040:2:13;10452:65:1;;;19022:21:13;19079:2;19059:18;;;19052:30;19118:34;19098:18;;;19091:62;-1:-1:-1;;;19169:18:13;;;19162:34;19213:19;;10452:65:1;18838:400:13;10452:65:1;10528:39;10549:4;10555:2;10559:7;10528:20;:39::i;:::-;10629:29;10646:1;10650:7;10629:8;:29::i;:::-;-1:-1:-1;;;;;10669:15:1;;;;;;:9;:15;;;;;:20;;10688:1;;10669:15;:20;;10688:1;;10669:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10699:13:1;;;;;;:9;:13;;;;;:18;;10716:1;;10699:13;:18;;10716:1;;10699:18;:::i;:::-;;;;-1:-1:-1;;10727:16:1;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10727:21:1;-1:-1:-1;;;;;10727:21:1;;;;;;;;;10764:27;;10727:16;;10764:27;;;;;;;3537:337;3467:407;;:::o;8868:427::-;-1:-1:-1;;;;;8947:16:1;;8939:61;;;;-1:-1:-1;;;8939:61:1;;19708:2:13;8939:61:1;;;19690:21:13;;;19727:18;;;19720:30;19786:34;19766:18;;;19759:62;19838:18;;8939:61:1;19506:356:13;8939:61:1;7099:4;7122:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7122:16:1;:30;9010:58;;;;-1:-1:-1;;;9010:58:1;;20069:2:13;9010:58:1;;;20051:21:13;20108:2;20088:18;;;20081:30;20147;20127:18;;;20120:58;20195:18;;9010:58:1;19867:352:13;9010:58:1;9079:45;9108:1;9112:2;9116:7;9079:20;:45::i;:::-;-1:-1:-1;;;;;9135:13:1;;;;;;:9;:13;;;;;:18;;9152:1;;9135:13;:18;;9152:1;;9135:18;:::i;:::-;;;;-1:-1:-1;;9163:16:1;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9163:21:1;-1:-1:-1;;;;;9163:21:1;;;;;;;;9200:33;;9163:16;;;9200:33;;9163:16;;9200:33;5030:28:12::1;4958:108:::0;:::o;1506:199::-;719:10:8;1569:25:12;;;;:11;:25;;;;;:41;;1598:12;;1569:25;:41;;1598:12;;1569:41;:::i;:::-;;;;-1:-1:-1;;719:10:8;1625:25:12;;;;:11;:25;;;;;;:30;;1621:77;;1672:12;:14;;;:12;:14;;;:::i;:::-;;;;;;1506:199;:::o;8237:309:1:-;8361:18;8367:2;8371:7;8361:5;:18::i;:::-;8410:53;8441:1;8445:2;8449:7;8458:4;8410:22;:53::i;:::-;8389:150;;;;-1:-1:-1;;;8389:150:1;;;;;;;:::i;2433:187:0:-;2525:6;;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;;;;;2541:17:0;;;;;;;2573:40;;2525:6;;;2541:17;2525:6;;2573:40;;2506:16;;2573:40;2496:124;2433:187;:::o;9512:406:1:-;9571:13;9587:23;9602:7;9587:14;:23::i;:::-;9571:39;;9621:48;9642:5;9657:1;9661:7;9621:20;:48::i;:::-;9707:29;9724:1;9728:7;9707:8;:29::i;:::-;-1:-1:-1;;;;;9747:16:1;;;;;;:9;:16;;;;;:21;;9767:1;;9747:16;:21;;9767:1;;9747:21;:::i;:::-;;;;-1:-1:-1;;9785:16:1;;;;:7;:16;;;;;;9778:23;;-1:-1:-1;;;;;;9778:23:1;;;9817:36;9793:7;;9785:16;-1:-1:-1;;;;;9817:36:1;;;;;9785:16;;9817:36;5030:28:12::1;4958:108:::0;:::o;11266:307:1:-;11416:8;-1:-1:-1;;;;;11407:17:1;:5;-1:-1:-1;;;;;11407:17:1;;11399:55;;;;-1:-1:-1;;;11399:55:1;;20845:2:13;11399:55:1;;;20827:21:13;20884:2;20864:18;;;20857:30;20923:27;20903:18;;;20896:55;20968:18;;11399:55:1;20643:349:13;11399:55:1;-1:-1:-1;;;;;11464:25:1;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11464:46:1;;;;;;;;;;11525:41;;540::13;;;11525::1;;513:18:13;11525:41:1;;;;;;;11266:307;;;:::o;6426:305::-;6576:28;6586:4;6592:2;6596:7;6576:9;:28::i;:::-;6622:47;6645:4;6651:2;6655:7;6664:4;6622:22;:47::i;:::-;6614:110;;;;-1:-1:-1;;;6614:110:1;;;;;;;:::i;2126:114:12:-;2186:13;2219;2212:20;;;;;:::i;328:703:9:-;384:13;601:5;610:1;601:10;597:51;;-1:-1:-1;;627:10:9;;;;;;;;;;;;-1:-1:-1;;;627:10:9;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:9;;-1:-1:-1;773:2:9;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:9;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:9;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:9;;;;;;;;-1:-1:-1;972:11:9;981:2;972:11;;:::i;:::-;;;844:150;;2624:572:4;-1:-1:-1;;;;;2823:18:4;;2819:183;;2857:40;2889:7;4005:10;:17;;3978:24;;;;:15;:24;;;;;:44;;;4032:24;;;;;;;;;;;;3902:161;2857:40;2819:183;;;2926:2;-1:-1:-1;;;;;2918:10:4;:4;-1:-1:-1;;;;;2918:10:4;;2914:88;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;-1:-1:-1;;;;;3015:16:4;;3011:179;;3047:45;3084:7;3047:36;:45::i;3011:179::-;3119:4;-1:-1:-1;;;;;3113:10:4;:2;-1:-1:-1;;;;;3113:10:4;;3109:81;;3139:40;3167:2;3171:7;3139:27;:40::i;12342:831:1:-;12491:4;-1:-1:-1;;;;;12511:13:1;;1465:19:7;:23;12507:660:1;;12546:71;;-1:-1:-1;;;12546:71:1;;-1:-1:-1;;;;;12546:36:1;;;;;:71;;719:10:8;;12597:4:1;;12603:7;;12612:4;;12546:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12546:71:1;;;;;;;;-1:-1:-1;;12546:71:1;;;;;;;;;;;;:::i;:::-;;;12542:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12784:6;:13;12801:1;12784:18;12780:321;;12826:60;;-1:-1:-1;;;12826:60:1;;;;;;;:::i;12780:321::-;13053:6;13047:13;13038:6;13034:2;13030:15;13023:38;12542:573;-1:-1:-1;;;;;;12667:51:1;-1:-1:-1;;;12667:51:1;;-1:-1:-1;12660:58:1;;12507:660;-1:-1:-1;13152:4:1;12342:831;;;;;;:::o;4680:970:4:-;4942:22;4992:1;4967:22;4984:4;4967:16;:22::i;:::-;:26;;;;:::i;:::-;5003:18;5024:26;;;:17;:26;;;;;;4942:51;;-1:-1:-1;5154:28:4;;;5150:323;;-1:-1:-1;;;;;5220:18:4;;5198:19;5220:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5269:30;;;;;;:44;;;5385:30;;:17;:30;;;;;:43;;;5150:323;-1:-1:-1;5566:26:4;;;;:17;:26;;;;;;;;5559:33;;;-1:-1:-1;;;;;5609:18:4;;;;;:12;:18;;;;;:34;;;;;;;5602:41;4680:970::o;5938:1061::-;6212:10;:17;6187:22;;6212:21;;6232:1;;6212:21;:::i;:::-;6243:18;6264:24;;;:15;:24;;;;;;6632:10;:26;;6187:46;;-1:-1:-1;6264:24:4;;6187:46;;6632:26;;;;;;:::i;:::-;;;;;;;;;6610:48;;6694:11;6669:10;6680;6669:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6773:28;;;:15;:28;;;;;;;:41;;;6942:24;;;;;6935:31;6976:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6009:990;;;5938:1061;:::o;3490:217::-;3574:14;3591:20;3608:2;3591:16;:20::i;:::-;-1:-1:-1;;;;;3621:16:4;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3665:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3490:217:4:o;14:131:13:-;-1:-1:-1;;;;;;88:32:13;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:127::-;653:10;648:3;644:20;641:1;634:31;684:4;681:1;674:15;708:4;705:1;698:15;724:275;795:2;789:9;860:2;841:13;;-1:-1:-1;;837:27:13;825:40;;895:18;880:34;;916:22;;;877:62;874:88;;;942:18;;:::i;:::-;978:2;971:22;724:275;;-1:-1:-1;724:275:13:o;1004:407::-;1069:5;1103:18;1095:6;1092:30;1089:56;;;1125:18;;:::i;:::-;1163:57;1208:2;1187:15;;-1:-1:-1;;1183:29:13;1214:4;1179:40;1163:57;:::i;:::-;1154:66;;1243:6;1236:5;1229:21;1283:3;1274:6;1269:3;1265:16;1262:25;1259:45;;;1300:1;1297;1290:12;1259:45;1349:6;1344:3;1337:4;1330:5;1326:16;1313:43;1403:1;1396:4;1387:6;1380:5;1376:18;1372:29;1365:40;1004:407;;;;;:::o;1416:451::-;1485:6;1538:2;1526:9;1517:7;1513:23;1509:32;1506:52;;;1554:1;1551;1544:12;1506:52;1594:9;1581:23;1627:18;1619:6;1616:30;1613:50;;;1659:1;1656;1649:12;1613:50;1682:22;;1735:4;1727:13;;1723:27;-1:-1:-1;1713:55:13;;1764:1;1761;1754:12;1713:55;1787:74;1853:7;1848:2;1835:16;1830:2;1826;1822:11;1787:74;:::i;2054:250::-;2139:1;2149:113;2163:6;2160:1;2157:13;2149:113;;;2239:11;;;2233:18;2220:11;;;2213:39;2185:2;2178:10;2149:113;;;-1:-1:-1;;2296:1:13;2278:16;;2271:27;2054:250::o;2309:271::-;2351:3;2389:5;2383:12;2416:6;2411:3;2404:19;2432:76;2501:6;2494:4;2489:3;2485:14;2478:4;2471:5;2467:16;2432:76;:::i;:::-;2562:2;2541:15;-1:-1:-1;;2537:29:13;2528:39;;;;2569:4;2524:50;;2309:271;-1:-1:-1;;2309:271:13:o;2585:220::-;2734:2;2723:9;2716:21;2697:4;2754:45;2795:2;2784:9;2780:18;2772:6;2754:45;:::i;2810:180::-;2869:6;2922:2;2910:9;2901:7;2897:23;2893:32;2890:52;;;2938:1;2935;2928:12;2890:52;-1:-1:-1;2961:23:13;;2810:180;-1:-1:-1;2810:180:13:o;3203:173::-;3271:20;;-1:-1:-1;;;;;3320:31:13;;3310:42;;3300:70;;3366:1;3363;3356:12;3300:70;3203:173;;;:::o;3381:254::-;3449:6;3457;3510:2;3498:9;3489:7;3485:23;3481:32;3478:52;;;3526:1;3523;3516:12;3478:52;3549:29;3568:9;3549:29;:::i;:::-;3539:39;3625:2;3610:18;;;;3597:32;;-1:-1:-1;;;3381:254:13:o;3640:328::-;3717:6;3725;3733;3786:2;3774:9;3765:7;3761:23;3757:32;3754:52;;;3802:1;3799;3792:12;3754:52;3825:29;3844:9;3825:29;:::i;:::-;3815:39;;3873:38;3907:2;3896:9;3892:18;3873:38;:::i;:::-;3863:48;;3958:2;3947:9;3943:18;3930:32;3920:42;;3640:328;;;;;:::o;3973:186::-;4032:6;4085:2;4073:9;4064:7;4060:23;4056:32;4053:52;;;4101:1;4098;4091:12;4053:52;4124:29;4143:9;4124:29;:::i;4164:183::-;4224:4;4257:18;4249:6;4246:30;4243:56;;;4279:18;;:::i;:::-;-1:-1:-1;4324:1:13;4320:14;4336:4;4316:25;;4164:183::o;4352:662::-;4406:5;4459:3;4452:4;4444:6;4440:17;4436:27;4426:55;;4477:1;4474;4467:12;4426:55;4513:6;4500:20;4539:4;4563:60;4579:43;4619:2;4579:43;:::i;:::-;4563:60;:::i;:::-;4657:15;;;4743:1;4739:10;;;;4727:23;;4723:32;;;4688:12;;;;4767:15;;;4764:35;;;4795:1;4792;4785:12;4764:35;4831:2;4823:6;4819:15;4843:142;4859:6;4854:3;4851:15;4843:142;;;4925:17;;4913:30;;4963:12;;;;4876;;4843:142;;;-1:-1:-1;5003:5:13;4352:662;-1:-1:-1;;;;;;4352:662:13:o;5019:496::-;5121:6;5129;5137;5190:2;5178:9;5169:7;5165:23;5161:32;5158:52;;;5206:1;5203;5196:12;5158:52;5229:29;5248:9;5229:29;:::i;:::-;5219:39;;5277:38;5311:2;5300:9;5296:18;5277:38;:::i;:::-;5267:48;;5366:2;5355:9;5351:18;5338:32;5393:18;5385:6;5382:30;5379:50;;;5425:1;5422;5415:12;5379:50;5448:61;5501:7;5492:6;5481:9;5477:22;5448:61;:::i;:::-;5438:71;;;5019:496;;;;;:::o;5520:221::-;5562:5;5615:3;5608:4;5600:6;5596:17;5592:27;5582:55;;5633:1;5630;5623:12;5582:55;5655:80;5731:3;5722:6;5709:20;5702:4;5694:6;5690:17;5655:80;:::i;5746:641::-;5857:6;5865;5873;5926:2;5914:9;5905:7;5901:23;5897:32;5894:52;;;5942:1;5939;5932:12;5894:52;5965:29;5984:9;5965:29;:::i;:::-;5955:39;;6045:2;6034:9;6030:18;6017:32;6068:18;6109:2;6101:6;6098:14;6095:34;;;6125:1;6122;6115:12;6095:34;6148:61;6201:7;6192:6;6181:9;6177:22;6148:61;:::i;:::-;6138:71;;6262:2;6251:9;6247:18;6234:32;6218:48;;6291:2;6281:8;6278:16;6275:36;;;6307:1;6304;6297:12;6275:36;;6330:51;6373:7;6362:8;6351:9;6347:24;6330:51;:::i;6392:462::-;6478:6;6486;6494;6547:2;6535:9;6526:7;6522:23;6518:32;6515:52;;;6563:1;6560;6553:12;6515:52;6586:29;6605:9;6586:29;:::i;:::-;6576:39;;6662:2;6651:9;6647:18;6634:32;6624:42;;6717:2;6706:9;6702:18;6689:32;6744:18;6736:6;6733:30;6730:50;;;6776:1;6773;6766:12;6730:50;6799:49;6840:7;6831:6;6820:9;6816:22;6799:49;:::i;6859:347::-;6924:6;6932;6985:2;6973:9;6964:7;6960:23;6956:32;6953:52;;;7001:1;6998;6991:12;6953:52;7024:29;7043:9;7024:29;:::i;:::-;7014:39;;7103:2;7092:9;7088:18;7075:32;7150:5;7143:13;7136:21;7129:5;7126:32;7116:60;;7172:1;7169;7162:12;7116:60;7195:5;7185:15;;;6859:347;;;;;:::o;7211:1218::-;7338:6;7346;7354;7407:2;7395:9;7386:7;7382:23;7378:32;7375:52;;;7423:1;7420;7413:12;7375:52;7446:29;7465:9;7446:29;:::i;:::-;7436:39;;7494:2;7547;7536:9;7532:18;7519:32;7570:18;7611:2;7603:6;7600:14;7597:34;;;7627:1;7624;7617:12;7597:34;7665:6;7654:9;7650:22;7640:32;;7710:7;7703:4;7699:2;7695:13;7691:27;7681:55;;7732:1;7729;7722:12;7681:55;7768:2;7755:16;7791:60;7807:43;7847:2;7807:43;:::i;7791:60::-;7885:15;;;7967:1;7963:10;;;;7955:19;;7951:28;;;7916:12;;;;7991:19;;;7988:39;;;8023:1;8020;8013:12;7988:39;8047:11;;;;8067:148;8083:6;8078:3;8075:15;8067:148;;;8149:23;8168:3;8149:23;:::i;:::-;8137:36;;8100:12;;;;8193;;;;8067:148;;;8234:5;-1:-1:-1;;;8292:2:13;8277:18;;8264:32;;-1:-1:-1;8308:16:13;;;8305:36;;;8337:1;8334;8327:12;8305:36;;;8360:63;8415:7;8404:8;8393:9;8389:24;8360:63;:::i;8434:422::-;8527:6;8535;8588:2;8576:9;8567:7;8563:23;8559:32;8556:52;;;8604:1;8601;8594:12;8556:52;8627:29;8646:9;8627:29;:::i;:::-;8617:39;;8707:2;8696:9;8692:18;8679:32;8734:18;8726:6;8723:30;8720:50;;;8766:1;8763;8756:12;8720:50;8789:61;8842:7;8833:6;8822:9;8818:22;8789:61;:::i;:::-;8779:71;;;8434:422;;;;;:::o;8861:537::-;8956:6;8964;8972;8980;9033:3;9021:9;9012:7;9008:23;9004:33;9001:53;;;9050:1;9047;9040:12;9001:53;9073:29;9092:9;9073:29;:::i;:::-;9063:39;;9121:38;9155:2;9144:9;9140:18;9121:38;:::i;:::-;9111:48;;9206:2;9195:9;9191:18;9178:32;9168:42;;9261:2;9250:9;9246:18;9233:32;9288:18;9280:6;9277:30;9274:50;;;9320:1;9317;9310:12;9274:50;9343:49;9384:7;9375:6;9364:9;9360:22;9343:49;:::i;:::-;9333:59;;;8861:537;;;;;;;:::o;9403:260::-;9471:6;9479;9532:2;9520:9;9511:7;9507:23;9503:32;9500:52;;;9548:1;9545;9538:12;9500:52;9571:29;9590:9;9571:29;:::i;:::-;9561:39;;9619:38;9653:2;9642:9;9638:18;9619:38;:::i;:::-;9609:48;;9403:260;;;;;:::o;9668:380::-;9747:1;9743:12;;;;9790;;;9811:61;;9865:4;9857:6;9853:17;9843:27;;9811:61;9918:2;9910:6;9907:14;9887:18;9884:38;9881:161;;9964:10;9959:3;9955:20;9952:1;9945:31;9999:4;9996:1;9989:15;10027:4;10024:1;10017:15;9881:161;;9668:380;;;:::o;10179:545::-;10281:2;10276:3;10273:11;10270:448;;;10317:1;10342:5;10338:2;10331:17;10387:4;10383:2;10373:19;10457:2;10445:10;10441:19;10438:1;10434:27;10428:4;10424:38;10493:4;10481:10;10478:20;10475:47;;;-1:-1:-1;10516:4:13;10475:47;10571:2;10566:3;10562:12;10559:1;10555:20;10549:4;10545:31;10535:41;;10626:82;10644:2;10637:5;10634:13;10626:82;;;10689:17;;;10670:1;10659:13;10626:82;;;10630:3;;;10179:545;;;:::o;10900:1352::-;11026:3;11020:10;11053:18;11045:6;11042:30;11039:56;;;11075:18;;:::i;:::-;11104:97;11194:6;11154:38;11186:4;11180:11;11154:38;:::i;:::-;11148:4;11104:97;:::i;:::-;11256:4;;11320:2;11309:14;;11337:1;11332:663;;;;12039:1;12056:6;12053:89;;;-1:-1:-1;12108:19:13;;;12102:26;12053:89;-1:-1:-1;;10857:1:13;10853:11;;;10849:24;10845:29;10835:40;10881:1;10877:11;;;10832:57;12155:81;;11302:944;;11332:663;10126:1;10119:14;;;10163:4;10150:18;;-1:-1:-1;;11368:20:13;;;11486:236;11500:7;11497:1;11494:14;11486:236;;;11589:19;;;11583:26;11568:42;;11681:27;;;;11649:1;11637:14;;;;11516:19;;11486:236;;;11490:3;11750:6;11741:7;11738:19;11735:201;;;11811:19;;;11805:26;-1:-1:-1;;11894:1:13;11890:14;;;11906:3;11886:24;11882:37;11878:42;11863:58;11848:74;;11735:201;-1:-1:-1;;;;;11982:1:13;11966:14;;;11962:22;11949:36;;-1:-1:-1;10900:1352:13:o;13090:410::-;13292:2;13274:21;;;13331:2;13311:18;;;13304:30;13370:34;13365:2;13350:18;;13343:62;-1:-1:-1;;;13436:2:13;13421:18;;13414:44;13490:3;13475:19;;13090:410::o;13917:127::-;13978:10;13973:3;13969:20;13966:1;13959:31;14009:4;14006:1;13999:15;14033:4;14030:1;14023:15;14049:127;14110:10;14105:3;14101:20;14098:1;14091:31;14141:4;14138:1;14131:15;14165:4;14162:1;14155:15;14181:135;14220:3;14241:17;;;14238:43;;14261:18;;:::i;:::-;-1:-1:-1;14308:1:13;14297:13;;14181:135::o;14321:408::-;14523:2;14505:21;;;14562:2;14542:18;;;14535:30;14601:34;14596:2;14581:18;;14574:62;-1:-1:-1;;;14667:2:13;14652:18;;14645:42;14719:3;14704:19;;14321:408::o;16610:496::-;16789:3;16827:6;16821:13;16843:66;16902:6;16897:3;16890:4;16882:6;16878:17;16843:66;:::i;:::-;16972:13;;16931:16;;;;16994:70;16972:13;16931:16;17041:4;17029:17;;16994:70;:::i;:::-;17080:20;;16610:496;-1:-1:-1;;;;16610:496:13:o;17930:136::-;17969:3;17997:5;17987:39;;18006:18;;:::i;:::-;-1:-1:-1;;;18042:18:13;;17930:136::o;19243:128::-;19310:9;;;19331:11;;;19328:37;;;19345:18;;:::i;19376:125::-;19441:9;;;19462:10;;;19459:36;;;19475:18;;:::i;20224:414::-;20426:2;20408:21;;;20465:2;20445:18;;;20438:30;20504:34;20499:2;20484:18;;20477:62;-1:-1:-1;;;20570:2:13;20555:18;;20548:48;20628:3;20613:19;;20224:414::o;20997:127::-;21058:10;21053:3;21049:20;21046:1;21039:31;21089:4;21086:1;21079:15;21113:4;21110:1;21103:15;21129:120;21169:1;21195;21185:35;;21200:18;;:::i;:::-;-1:-1:-1;21234:9:13;;21129:120::o;21254:112::-;21286:1;21312;21302:35;;21317:18;;:::i;:::-;-1:-1:-1;21351:9:13;;21254:112::o;21371:489::-;-1:-1:-1;;;;;21640:15:13;;;21622:34;;21692:15;;21687:2;21672:18;;21665:43;21739:2;21724:18;;21717:34;;;21787:3;21782:2;21767:18;;21760:31;;;21565:4;;21808:46;;21834:19;;21826:6;21808:46;:::i;:::-;21800:54;21371:489;-1:-1:-1;;;;;;21371:489:13:o;21865:249::-;21934:6;21987:2;21975:9;21966:7;21962:23;21958:32;21955:52;;;22003:1;22000;21993:12;21955:52;22035:9;22029:16;22054:30;22078:5;22054:30;:::i;22119:127::-;22180:10;22175:3;22171:20;22168:1;22161:31;22211:4;22208:1;22201:15;22235:4;22232:1;22225:15

Swarm Source

ipfs://1d3080c3c91eca4c4300bbd82e56f79162385be6dfc00b3d3a42dc2a0efc9f0f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.