{"sources":{"contracts/KijinNFT.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/// @dev Agent ID registry (BSC 0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F):\n///      an ERC-721 whose balanceOf gates Agent ID holders.\ninterface IAgentIdRegistry {\n    function balanceOf(address owner) external view returns (uint256);\n}\n\ninterface IERC721Receiver {\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\n}\n\n/**\n * @title KijinNFT — KIJIN （鬼神） oni warlord collection.\n * @notice ERC-721, 15,000 supply, gated to Agent ID holders. NO token.\n *\n *         Artwork rule: every NFT shows the FIXED official artwork of its\n *         tier (five locked artworks). The contract stores only the tier of\n *         each token; tokenURI points at metadata whose image is that\n *         tier's artwork file under an owner-settable base URI. There is no\n *         generative art and no on-chain image engine.\n *\n *         Tier is a weighted random draw from the remaining tier pools at\n *         mint time (NOT a function of the token id). Ids are sequential\n *         from 1. Tier sizes and the free-block size are constructor\n *         arguments so tests can deploy reduced instances; production\n *         values (9,000 / 3,750 / 1,500 / 600 / 150 and 5,000) are pinned\n *         in the deploy manifest and asserted by the test suite.\n *\n *         Mint paths (quotas are per wallet, gated by the Agent ID\n *         registry):\n *           - mintFree(): while global totalMinted < freeBlock, one free\n *             mint per wallet (gas only).\n *           - mintPaid(): 0.0003 BNB, max 20 paid mints per wallet.\n *         Mint BNB stays in this contract; the owner may withdraw it to\n *         the treasury (the owner address) at any time — it is NOT locked.\n */\ncontract KijinNFT {\n    // ─── ERC-721 metadata ──────────────────────────────────────────────────\n    string public constant name = \"KIJIN\";\n    string public constant symbol = \"KIJIN\";\n\n    // ─── Locked sale constants (DESIGN.md) ─────────────────────────────────\n    uint256 public constant PAID_PRICE = 0.0003 ether;\n    uint256 public constant MAX_PAID_PER_WALLET = 20;\n\n    uint8 public constant TIER_COMMON = 0;\n    uint8 public constant TIER_RARE = 1;\n    uint8 public constant TIER_EPIC = 2;\n    uint8 public constant TIER_LEGENDARY = 3;\n    uint8 public constant TIER_MYTHIC = 4;\n\n    // Official artwork file per tier (the five locked artworks).\n    string internal constant IMG0 = \"kijin-common-red.jpg\";\n    string internal constant IMG1 = \"kijin-rare-emerald.webp\";\n    string internal constant IMG2 = \"kijin-epic-blue.jpg\";\n    string internal constant IMG3 = \"kijin-legendary-purple.webp\";\n    string internal constant IMG4 = \"kijin-mythic-goldking.jpg\";\n\n    string internal constant TIER_NAME0 = \"Common\";\n    string internal constant TIER_NAME1 = \"Rare\";\n    string internal constant TIER_NAME2 = \"Epic\";\n    string internal constant TIER_NAME3 = \"Legendary\";\n    string internal constant TIER_NAME4 = \"Mythic\";\n\n    // ─── Wiring ────────────────────────────────────────────────────────────\n    IAgentIdRegistry public immutable registry;\n    address public owner;\n    string public baseURI;\n\n    // ─── Collection shape (constructor-set, production values in DESIGN) ──\n    uint256 public immutable maxSupply;\n    uint256 public immutable freeBlock;\n    uint256[5] public tierSizes;\n\n    // ─── ERC-721 state ─────────────────────────────────────────────────────\n    mapping(uint256 => address) private _owners;\n    mapping(address => uint256) private _balances;\n    mapping(uint256 => address) private _tokenApprovals;\n    mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n    // ─── Sale state ────────────────────────────────────────────────────────\n    uint256 public totalMinted;\n    uint256[5] public tierMinted;\n    mapping(uint256 => uint8) public tokenTier;\n    mapping(address => bool) public freeUsed;\n    mapping(address => uint256) public paidCount;\n\n    bool private _locked;\n\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n    event Minted(address indexed minter, uint256 indexed tokenId, uint8 tier, bool paid);\n    event Withdrawn(address indexed to, uint256 amount);\n    event BaseURISet(string newBaseURI);\n\n    modifier onlyOwner() {\n        require(msg.sender == owner, \"Not owner\");\n        _;\n    }\n\n    modifier nonReentrant() {\n        require(!_locked, \"Reentrant\");\n        _locked = true;\n        _;\n        _locked = false;\n    }\n\n    constructor(\n        address registry_,\n        address initialOwner_,\n        string memory baseURI_,\n        uint256 freeBlock_,\n        uint256[5] memory tierSizes_\n    ) {\n        require(registry_ != address(0) && initialOwner_ != address(0), \"Invalid\");\n        uint256 sum;\n        for (uint256 i = 0; i < 5; i++) {\n            tierSizes[i] = tierSizes_[i];\n            sum += tierSizes_[i];\n        }\n        require(sum > 0, \"Empty supply\");\n        require(freeBlock_ <= sum, \"Free block too large\");\n        registry = IAgentIdRegistry(registry_);\n        owner = initialOwner_;\n        baseURI = baseURI_;\n        freeBlock = freeBlock_;\n        maxSupply = sum;\n    }\n\n    function transferOwnership(address newOwner) external onlyOwner {\n        require(newOwner != address(0), \"Invalid\");\n        emit OwnershipTransferred(owner, newOwner);\n        owner = newOwner;\n    }\n\n    /// @notice Point metadata at the final hosting location (post-deploy).\n    function setBaseURI(string calldata newBaseURI) external onlyOwner {\n        baseURI = newBaseURI;\n        emit BaseURISet(newBaseURI);\n    }\n\n    /// @notice Withdraw mint proceeds to the treasury (owner). Any amount,\n    ///         any time — proceeds are never locked.\n    function withdraw(uint256 amount) external onlyOwner nonReentrant {\n        require(amount > 0, \"Zero amount\");\n        require(address(this).balance >= amount, \"Insufficient balance\");\n        (bool ok, ) = owner.call{value: amount}(\"\");\n        require(ok, \"Withdraw failed\");\n        emit Withdrawn(owner, amount);\n    }\n\n    // ─── Views ─────────────────────────────────────────────────────────────\n\n    function tierOf(uint256 tokenId) public view returns (uint8) {\n        require(_owners[tokenId] != address(0), \"Nonexistent token\");\n        return tokenTier[tokenId];\n    }\n\n    function tierRemaining(uint8 tier) public view returns (uint256) {\n        require(tier <= TIER_MYTHIC, \"Bad tier\");\n        return tierSizes[tier] - tierMinted[tier];\n    }\n\n    /// @notice Free mints still available globally (0 once the block ends\n    ///         or the collection sells out).\n    function freeRemaining() public view returns (uint256) {\n        if (totalMinted >= freeBlock) return 0;\n        return freeBlock - totalMinted;\n    }\n\n    function imageFileOf(uint8 tier) public pure returns (string memory) {\n        if (tier == 0) return IMG0;\n        if (tier == 1) return IMG1;\n        if (tier == 2) return IMG2;\n        if (tier == 3) return IMG3;\n        return IMG4;\n    }\n\n    function tierNameOf(uint8 tier) public pure returns (string memory) {\n        if (tier == 0) return TIER_NAME0;\n        if (tier == 1) return TIER_NAME1;\n        if (tier == 2) return TIER_NAME2;\n        if (tier == 3) return TIER_NAME3;\n        return TIER_NAME4;\n    }\n\n    function tokenURI(uint256 tokenId) public view returns (string memory) {\n        uint8 tier = tierOf(tokenId);\n        string memory json = string.concat(\n            '{\"name\":\"KIJIN #', _toString(tokenId),\n            '\",\"description\":\"KIJIN - oni warlord collection. No token. The image is the official artwork of this NFT tier.\",',\n            '\"image\":\"', baseURI, imageFileOf(tier),\n            '\",\"attributes\":[{\"trait_type\":\"Tier\",\"value\":\"', tierNameOf(tier), '\"}]}'\n        );\n        return string.concat(\"data:application/json;base64,\", _base64(bytes(json)));\n    }\n\n    // ─── Minting ───────────────────────────────────────────────────────────\n\n    function _requireAgentId() internal view {\n        require(registry.balanceOf(msg.sender) > 0, \"Agent ID required\");\n    }\n\n    /// @dev Weighted draw over the remaining pools of ALL five tiers.\n    function _drawTier() internal view returns (uint8) {\n        uint256 total;\n        uint256[5] memory rem;\n        for (uint256 i = 0; i < 5; i++) {\n            rem[i] = tierSizes[i] - tierMinted[i];\n            total += rem[i];\n        }\n        require(total > 0, \"Sold out\");\n        uint256 seed = uint256(keccak256(abi.encodePacked(\n            block.prevrandao, blockhash(block.number - 1), msg.sender, totalMinted, address(this)\n        )));\n        uint256 roll = seed % total;\n        for (uint256 i = 0; i < 5; i++) {\n            if (roll < rem[i]) return uint8(i);\n            roll -= rem[i];\n        }\n        return TIER_MYTHIC; // unreachable: roll < total always lands above\n    }\n\n    function _issue(address to, bool paid) internal returns (uint256 tokenId) {\n        uint8 tier = _drawTier();\n        tokenId = totalMinted + 1;\n        tierMinted[tier] += 1;\n        totalMinted += 1;\n        tokenTier[tokenId] = tier;\n        _mint(to, tokenId);\n        emit Minted(to, tokenId, tier, paid);\n    }\n\n    /// @notice Free mint: one per Agent ID wallet while the global free\n    ///         block (first freeBlock mints) has not been reached.\n    function mintFree() external returns (uint256 tokenId) {\n        _requireAgentId();\n        require(!freeUsed[msg.sender], \"Free already used\");\n        require(totalMinted < freeBlock, \"Free block ended\");\n        freeUsed[msg.sender] = true;\n        tokenId = _issue(msg.sender, false);\n    }\n\n    /// @notice Paid mint at exactly 0.0003 BNB. Max 20 per Agent ID wallet.\n    function mintPaid() external payable returns (uint256 tokenId) {\n        _requireAgentId();\n        require(msg.value == PAID_PRICE, \"Price is 0.0003 BNB\");\n        require(paidCount[msg.sender] < MAX_PAID_PER_WALLET, \"Paid quota reached\");\n        require(totalMinted < maxSupply, \"Sold out\");\n        paidCount[msg.sender] += 1;\n        tokenId = _issue(msg.sender, true);\n    }\n\n    // ─── ERC-721 core ──────────────────────────────────────────────────────\n\n    function balanceOf(address account) external view returns (uint256) {\n        require(account != address(0), \"Zero address\");\n        return _balances[account];\n    }\n\n    function ownerOf(uint256 tokenId) public view returns (address) {\n        address o = _owners[tokenId];\n        require(o != address(0), \"Nonexistent token\");\n        return o;\n    }\n\n    function approve(address to, uint256 tokenId) external {\n        address o = ownerOf(tokenId);\n        require(to != o, \"Approve to owner\");\n        require(msg.sender == o || _operatorApprovals[o][msg.sender], \"Not authorized\");\n        _tokenApprovals[tokenId] = to;\n        emit Approval(o, to, tokenId);\n    }\n\n    function getApproved(uint256 tokenId) public view returns (address) {\n        require(_owners[tokenId] != address(0), \"Nonexistent token\");\n        return _tokenApprovals[tokenId];\n    }\n\n    function setApprovalForAll(address operator, bool approved) external {\n        require(operator != msg.sender, \"Approve to caller\");\n        _operatorApprovals[msg.sender][operator] = approved;\n        emit ApprovalForAll(msg.sender, operator, approved);\n    }\n\n    function isApprovedForAll(address account, address operator) public view returns (bool) {\n        return _operatorApprovals[account][operator];\n    }\n\n    function transferFrom(address from, address to, uint256 tokenId) public {\n        require(_isApprovedOrOwner(msg.sender, tokenId), \"Not authorized\");\n        _transfer(from, to, tokenId);\n    }\n\n    function safeTransferFrom(address from, address to, uint256 tokenId) public {\n        safeTransferFrom(from, to, tokenId, \"\");\n    }\n\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public {\n        require(_isApprovedOrOwner(msg.sender, tokenId), \"Not authorized\");\n        _transfer(from, to, tokenId);\n        require(_checkOnERC721Received(from, to, tokenId, data), \"Receiver rejected\");\n    }\n\n    function supportsInterface(bytes4 interfaceId) external pure returns (bool) {\n        return interfaceId == 0x80ac58cd || interfaceId == 0x5b5e139f || interfaceId == 0x01ffc9a7;\n    }\n\n    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {\n        address o = ownerOf(tokenId);\n        return spender == o || _tokenApprovals[tokenId] == spender || _operatorApprovals[o][spender];\n    }\n\n    function _mint(address to, uint256 tokenId) internal {\n        require(to != address(0), \"Mint to zero\");\n        require(_owners[tokenId] == address(0), \"Already minted\");\n        _balances[to] += 1;\n        _owners[tokenId] = to;\n        emit Transfer(address(0), to, tokenId);\n        require(_checkOnERC721Received(address(0), to, tokenId, \"\"), \"Receiver rejected\");\n    }\n\n    function _transfer(address from, address to, uint256 tokenId) internal {\n        require(ownerOf(tokenId) == from, \"From not owner\");\n        require(to != address(0), \"Transfer to zero\");\n        delete _tokenApprovals[tokenId];\n        _balances[from] -= 1;\n        _balances[to] += 1;\n        _owners[tokenId] = to;\n        emit Transfer(from, to, tokenId);\n    }\n\n    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private returns (bool) {\n        if (to.code.length == 0) return true;\n        try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, data) returns (bytes4 retval) {\n            return retval == IERC721Receiver.onERC721Received.selector;\n        } catch {\n            return false;\n        }\n    }\n\n    // ─── Small string helpers ──────────────────────────────────────────────\n\n    function _toString(uint256 value) internal pure returns (string memory) {\n        if (value == 0) return \"0\";\n        uint256 temp = value;\n        uint256 digits;\n        while (temp != 0) {\n            digits++;\n            temp /= 10;\n        }\n        bytes memory buffer = new bytes(digits);\n        while (value != 0) {\n            digits -= 1;\n            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\n            value /= 10;\n        }\n        return string(buffer);\n    }\n\n    function _base64(bytes memory data) internal pure returns (string memory) {\n        bytes memory table = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n        if (data.length == 0) return \"\";\n        uint256 encodedLength = ((data.length + 2) / 3) * 4;\n        bytes memory result = new bytes(encodedLength);\n        uint256 i;\n        uint256 j;\n        while (i < data.length) {\n            uint256 a = uint8(data[i]);\n            uint256 b = i + 1 < data.length ? uint8(data[i + 1]) : 0;\n            uint256 c = i + 2 < data.length ? uint8(data[i + 2]) : 0;\n            result[j++] = table[(a >> 2) & 0x3F];\n            result[j++] = table[((a & 0x03) << 4) | (b >> 4)];\n            result[j++] = i + 1 < data.length ? table[((b & 0x0F) << 2) | (c >> 6)] : bytes1(\"=\");\n            result[j++] = i + 2 < data.length ? table[c & 0x3F] : bytes1(\"=\");\n            i += 3;\n        }\n        return string(result);\n    }\n}\n"}},"abi":[{"type":"constructor","inputs":[{"name":"registry_","type":"address","internalType":"address"},{"name":"initialOwner_","type":"address","internalType":"address"},{"name":"baseURI_","type":"string","internalType":"string"},{"name":"freeBlock_","type":"uint256","internalType":"uint256"},{"name":"tierSizes_","type":"uint256[5]","internalType":"uint256[5]"}],"stateMutability":"nonpayable"},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"ApprovalForAll","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"BaseURISet","type":"event","inputs":[{"name":"newBaseURI","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"Minted","type":"event","inputs":[{"name":"minter","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"tier","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"paid","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"Withdrawn","type":"event","inputs":[{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"MAX_PAID_PER_WALLET","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PAID_PRICE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"TIER_COMMON","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"TIER_EPIC","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"TIER_LEGENDARY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"TIER_MYTHIC","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"TIER_RARE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"balanceOf","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"baseURI","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"freeBlock","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeRemaining","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeUsed","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"getApproved","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"imageFileOf","type":"function","inputs":[{"name":"tier","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"maxSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mintFree","type":"function","inputs":[],"outputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"mintPaid","type":"function","inputs":[],"outputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"ownerOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"paidCount","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"registry","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAgentIdRegistry"}],"stateMutability":"view"},{"name":"safeTransferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"safeTransferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setApprovalForAll","type":"function","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setBaseURI","type":"function","inputs":[{"name":"newBaseURI","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"supportsInterface","type":"function","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"tierMinted","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"tierNameOf","type":"function","inputs":[{"name":"tier","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"name":"tierOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"tierRemaining","type":"function","inputs":[{"name":"tier","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"tierSizes","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"tokenTier","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"tokenURI","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"withdraw","type":"function","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"}],"matchId":"58823946","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-11-08T17:34:47Z","match":"exact_match","chainId":"56","address":"0x625188954784D2f8c542FE8206050fF540Ae3B20"}