{"sources":{"PixelPets.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\ninterface IAgentId {\n    function balanceOf(address owner) external view returns (uint256);\n}\n\ninterface IERC721Receiver {\n    function onERC721Received(address, address, uint256, bytes calldata) external returns (bytes4);\n}\n\n/// PIXEL PETS (PPET) - cute pixel pets, fully on-chain collectible.\n/// Rules are fixed in code:\n/// - Only addresses holding a SPACE ID .ai Agent ID can mint\n/// - Total supply 5,000 (bonus pets included)\n/// - One free Pixel Pup per wallet, no free cap (gas only)\n/// - Paid Pixel Kitties cost 0.0006 BNB each (about 3 CNY at deploy), up to 30 paid per wallet\n/// - Bonus pets, cumulative: 10 paid gives +3 Rare Foxes, 20 paid gives +5 Epic Dragons, 30 paid gives +7 Legendary Phoenixes\n///   (all 30 paid = 30 Kitties + 15 bonus = 45 pets, plus the free Pup = 46)\n/// - Fixed rewards, no randomness\n/// - Mint is open for 5 days after deploy, then closes forever\n/// - Payment goes straight to the creator in the same transaction; no admin, no extra minting, art is generated on-chain\n/// - 1% secondary royalty (EIP-2981, optional for marketplaces)\ncontract PixelPets {\n    string public constant name = \"PIXEL PETS\";\n    string public constant symbol = \"PPET\";\n\n    uint256 public constant MAX_SUPPLY = 5000;\n    uint256 public constant MAX_PAID_PER_WALLET = 30;\n    uint256 public constant PRICE = 0.0006 ether;\n    uint256 public constant MINT_DURATION = 5 days;\n    uint96 public constant ROYALTY_BPS = 100; // 1%\n\n    IAgentId public constant AGENT_ID = IAgentId(0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F);\n\n    address public immutable creator;\n    uint256 public immutable mintStart;\n    uint256 public immutable mintEnd;\n\n    uint256 public totalSupply;\n    uint256 public freeMinted;\n    uint256 public bonusMinted;\n    mapping(address => bool) public freeClaimed;\n    mapping(address => uint256) public paidCount;\n    /// 0 = Pup (free), 1 = Kitty (paid), 2 = Fox (bonus at 10), 3 = Dragon (bonus at 20), 4 = Phoenix (bonus at 30)\n    mapping(uint256 => uint8) public petType;\n\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    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 Milestone(address indexed collector, uint256 reached, uint256 bonusPets);\n\n    error NotAgent();\n    error MintClosed();\n    error SoldOut();\n    error WalletLimit();\n    error WrongPayment();\n    error NothingToMint();\n    error NotOwnerNorApproved();\n    error InvalidToken();\n    error ZeroAddress();\n    error UnsafeRecipient();\n    error TransferFailed();\n\n    constructor(address _creator) {\n        if (_creator == address(0)) revert ZeroAddress();\n        creator = _creator;\n        mintStart = block.timestamp;\n        mintEnd = block.timestamp + MINT_DURATION;\n    }\n\n    // ---------------- Mint ----------------\n\n    function _bonus(uint256 a, uint256 z) internal pure returns (uint256 j, uint256 r, uint256 d) {\n        if (a < 10 && z >= 10) j = 3;\n        if (a < 20 && z >= 20) r = 5;\n        if (a < 30 && z >= 30) d = 7;\n    }\n\n    /// What `mint(paid)` gives this wallet right now and what it costs (wei)\n    function quote(address minter, uint256 paid) public view returns (uint256 tokens, uint256 cost, bool getsFree) {\n        getsFree = !freeClaimed[minter];\n        uint256 a = paidCount[minter];\n        (uint256 j, uint256 r, uint256 d) = _bonus(a, a + paid);\n        tokens = (getsFree ? 1 : 0) + paid + j + r + d;\n        cost = paid * PRICE;\n    }\n\n    /// One call: claims the free Pixel Pup if not yet claimed, plus `paid` Pixel Kitties (paid may be 0)\n    function mint(uint256 paid) external payable {\n        if (block.timestamp >= mintEnd) revert MintClosed();\n        if (AGENT_ID.balanceOf(msg.sender) == 0) revert NotAgent();\n        uint256 a = paidCount[msg.sender];\n        if (a + paid > MAX_PAID_PER_WALLET) revert WalletLimit();\n        (uint256 tokens, uint256 cost, bool getsFree) = quote(msg.sender, paid);\n        if (tokens == 0) revert NothingToMint();\n        if (totalSupply + tokens > MAX_SUPPLY) revert SoldOut();\n        if (msg.value != cost) revert WrongPayment();\n\n        uint256 id = totalSupply;\n        if (getsFree) {\n            freeClaimed[msg.sender] = true;\n            ++freeMinted;\n            id = _mintOne(msg.sender, id, 0);\n        }\n        for (uint256 k; k < paid; ++k) id = _mintOne(msg.sender, id, 1);\n        paidCount[msg.sender] = a + paid;\n\n        id = _mintBonus(msg.sender, id, a, a + paid);\n\n        _balances[msg.sender] += tokens;\n        totalSupply = id;\n\n        if (msg.value > 0) {\n            (bool ok, ) = payable(creator).call{value: msg.value}(\"\");\n            if (!ok) revert TransferFailed();\n        }\n    }\n\n    function _mintBonus(address to, uint256 id, uint256 a, uint256 z) private returns (uint256) {\n        (uint256 j, uint256 r, uint256 d) = _bonus(a, z);\n        if (j > 0) { for (uint256 k; k < j; ++k) id = _mintOne(to, id, 2); emit Milestone(to, 10, j); }\n        if (r > 0) { for (uint256 k; k < r; ++k) id = _mintOne(to, id, 3); emit Milestone(to, 20, r); }\n        if (d > 0) { for (uint256 k; k < d; ++k) id = _mintOne(to, id, 4); emit Milestone(to, 30, d); }\n        bonusMinted += j + r + d;\n        return id;\n    }\n\n    function _mintOne(address to, uint256 id, uint8 t) private returns (uint256) {\n        ++id;\n        _owners[id] = to;\n        petType[id] = t;\n        emit Transfer(address(0), to, id);\n        return id;\n    }\n\n    function remaining() external view returns (uint256) {\n        return MAX_SUPPLY - totalSupply;\n    }\n\n    function mintOpen() external view returns (bool) {\n        return block.timestamp < mintEnd && totalSupply < MAX_SUPPLY;\n    }\n\n    // ---------------- ERC-721 ----------------\n\n    function supportsInterface(bytes4 id) external pure returns (bool) {\n        return id == 0x01ffc9a7 || id == 0x80ac58cd || id == 0x5b5e139f || id == 0x2a55205a;\n    }\n\n    function balanceOf(address owner) external view returns (uint256) {\n        if (owner == address(0)) revert ZeroAddress();\n        return _balances[owner];\n    }\n\n    function ownerOf(uint256 tokenId) public view returns (address o) {\n        o = _owners[tokenId];\n        if (o == address(0)) revert InvalidToken();\n    }\n\n    function approve(address to, uint256 tokenId) external {\n        address o = ownerOf(tokenId);\n        if (msg.sender != o && !_operatorApprovals[o][msg.sender]) revert NotOwnerNorApproved();\n        _tokenApprovals[tokenId] = to;\n        emit Approval(o, to, tokenId);\n    }\n\n    function getApproved(uint256 tokenId) external view returns (address) {\n        ownerOf(tokenId);\n        return _tokenApprovals[tokenId];\n    }\n\n    function setApprovalForAll(address operator, bool approved) external {\n        _operatorApprovals[msg.sender][operator] = approved;\n        emit ApprovalForAll(msg.sender, operator, approved);\n    }\n\n    function isApprovedForAll(address owner, address operator) external view returns (bool) {\n        return _operatorApprovals[owner][operator];\n    }\n\n    function transferFrom(address from, address to, uint256 tokenId) public {\n        address o = ownerOf(tokenId);\n        if (o != from) revert NotOwnerNorApproved();\n        if (to == address(0)) revert ZeroAddress();\n        if (msg.sender != o && _tokenApprovals[tokenId] != msg.sender && !_operatorApprovals[o][msg.sender]) {\n            revert NotOwnerNorApproved();\n        }\n        delete _tokenApprovals[tokenId];\n        unchecked {\n            _balances[from] -= 1;\n            _balances[to] += 1;\n        }\n        _owners[tokenId] = to;\n        emit Transfer(from, to, tokenId);\n    }\n\n    function safeTransferFrom(address from, address to, uint256 tokenId) external {\n        safeTransferFrom(from, to, tokenId, \"\");\n    }\n\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public {\n        transferFrom(from, to, tokenId);\n        if (to.code.length > 0) {\n            try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, data) returns (bytes4 r) {\n                if (r != IERC721Receiver.onERC721Received.selector) revert UnsafeRecipient();\n            } catch {\n                revert UnsafeRecipient();\n            }\n        }\n    }\n\n    function royaltyInfo(uint256, uint256 salePrice) external view returns (address, uint256) {\n        return (creator, (salePrice * ROYALTY_BPS) / 10000);\n    }\n\n    // ---------------- On-chain art / metadata ----------------\n\n    function _pet(uint8 t) internal pure returns (string memory nm, string memory body, string memory accent, string memory rarity, string memory bg) {\n        if (t == 0) return (\"Pixel Pup\", \"#f2c79b\", \"#8a5a33\", \"Common\", \"#1b2a3a\");\n        if (t == 1) return (\"Pixel Kitty\", \"#ffd23f\", \"#c27c0e\", \"Uncommon\", \"#2a1f3d\");\n        if (t == 2) return (\"Pixel Fox\", \"#ff8a3d\", \"#b34700\", \"Rare\", \"#123a2a\");\n        if (t == 3) return (\"Pixel Dragon\", \"#7cff6b\", \"#1f8f2e\", \"Epic\", \"#2b1240\");\n        return (\"Pixel Phoenix\", \"#ff4d6d\", \"#ffcc33\", \"Legendary\", \"#3a0f12\");\n    }\n\n    function _px(uint256 x, uint256 y, uint256 w, uint256 h, string memory c) internal pure returns (string memory) {\n        return string.concat('<rect x=\"', _toString(x), '\" y=\"', _toString(y), '\" width=\"', _toString(w), '\" height=\"', _toString(h), '\" fill=\"', c, '\"/>');\n    }\n\n    function _top(uint8 t) internal pure returns (string memory) {\n        (, string memory body, string memory accent, , ) = _pet(t);\n        if (t == 0) return string.concat(_px(84, 84, 30, 48, accent), _px(186, 84, 30, 48, accent));\n        if (t == 3) return string.concat(_px(96, 60, 18, 36, \"#ffffff\"), _px(186, 60, 18, 36, \"#ffffff\"));\n        if (t == 4) return string.concat(_px(126, 48, 18, 36, accent), _px(144, 36, 18, 48, accent), _px(162, 48, 18, 36, accent));\n        return string.concat(_px(96, 66, 30, 30, body), _px(174, 66, 30, 30, body), _px(104, 74, 14, 14, accent), _px(182, 74, 14, 14, accent));\n    }\n\n    function _body(uint8 t) internal pure returns (string memory) {\n        (, string memory body, string memory accent, , string memory bg) = _pet(t);\n        string memory tail = t >= 2 ? accent : body;\n        return string.concat(\n            '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 300 300\" shape-rendering=\"crispEdges\">',\n            _px(0, 0, 300, 300, bg),\n            '<rect x=\"8\" y=\"8\" width=\"284\" height=\"284\" fill=\"none\" stroke=\"', body, '\" stroke-width=\"6\" stroke-dasharray=\"12 6\"/>',\n            _px(60, 240, 180, 12, \"#00000055\"),\n            string.concat(_px(90, 90, 120, 96, body), _px(102, 186, 96, 54, body), _px(90, 228, 30, 18, accent), _px(180, 228, 30, 18, accent)),\n            string.concat(_px(210, 168, 30, 18, tail), _px(234, 150, 18, 24, tail))\n        );\n    }\n\n    function _face(uint8 t) internal pure returns (string memory) {\n        (, , string memory accent, , ) = _pet(t);\n        return string.concat(\n            string.concat(_px(114, 120, 18, 24, \"#111111\"), _px(168, 120, 18, 24, \"#111111\"), _px(118, 122, 6, 6, \"#ffffff\"), _px(172, 122, 6, 6, \"#ffffff\")),\n            string.concat(_px(144, 150, 12, 9, accent), _px(102, 150, 12, 9, \"#ff9fb2\"), _px(186, 150, 12, 9, \"#ff9fb2\")),\n            t >= 3 ? string.concat(_px(66, 120, 24, 48, accent), _px(210, 120, 24, 48, accent)) : \"\"\n        );\n    }\n\n    function _txt(uint256 tokenId, uint8 t) internal pure returns (string memory) {\n        (string memory nm, string memory body, , string memory rarity, ) = _pet(t);\n        return string.concat(\n            '<text x=\"22\" y=\"36\" font-family=\"monospace\" font-size=\"14\" font-weight=\"bold\" fill=\"', body, '\">', rarity, '</text>',\n            '<text x=\"278\" y=\"36\" font-family=\"monospace\" font-size=\"14\" text-anchor=\"end\" fill=\"', body, '\">#', _toString(tokenId), '</text>',\n            '<text x=\"150\" y=\"278\" font-family=\"monospace\" font-size=\"16\" font-weight=\"bold\" text-anchor=\"middle\" fill=\"', body, '\">PIXEL PETS \\xc2\\xb7 ', nm, '</text></svg>'\n        );\n    }\n\n    function _svg(uint256 tokenId, uint8 t) internal pure returns (string memory) {\n        return string.concat(_body(t), _top(t), _face(t), _txt(tokenId, t));\n    }\n\n    function tokenURI(uint256 tokenId) external view returns (string memory) {\n        ownerOf(tokenId);\n        uint8 t = petType[tokenId];\n        (string memory nm, , , string memory rarity, ) = _pet(t);\n        string memory svg = _svg(tokenId, t);\n        string memory json = string.concat(\n            '{\"name\":\"PIXEL PETS #', _toString(tokenId), ' - ', nm,\n            '\",\"description\":\"PIXEL PETS: 5,000 on-chain pixel pets for .ai Agent ID holders. One free Pixel Pup per wallet, then Pixel Kitties at 0.0006 BNB with bonus Foxes, Dragons and Phoenixes at 10, 20 and 30. No admin. A collectible, not an investment.\",',\n            '\"attributes\":[{\"trait_type\":\"Pet\",\"value\":\"', nm, '\"},{\"trait_type\":\"Rarity\",\"value\":\"', rarity, '\"}],',\n            '\"image\":\"data:image/svg+xml;base64,', _b64(bytes(svg)), '\"}'\n        );\n        return string.concat(\"data:application/json;base64,\", _b64(bytes(json)));\n    }\n\n    function _toString(uint256 v) internal pure returns (string memory) {\n        if (v == 0) return \"0\";\n        uint256 t = v; uint256 len;\n        while (t != 0) { len++; t /= 10; }\n        bytes memory b = new bytes(len);\n        while (v != 0) { len--; b[len] = bytes1(uint8(48 + v % 10)); v /= 10; }\n        return string(b);\n    }\n\n    bytes internal constant TABLE = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n    function _b64(bytes memory data) internal pure returns (string memory) {\n        if (data.length == 0) return \"\";\n        uint256 encLen = 4 * ((data.length + 2) / 3);\n        bytes memory out = new bytes(encLen);\n        uint256 j;\n        for (uint256 i; i < data.length; i += 3) {\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            uint256 tri = (a << 16) | (b << 8) | c;\n            out[j++] = TABLE[(tri >> 18) & 63];\n            out[j++] = TABLE[(tri >> 12) & 63];\n            out[j++] = i + 1 < data.length ? TABLE[(tri >> 6) & 63] : bytes1(\"=\");\n            out[j++] = i + 2 < data.length ? TABLE[tri & 63] : bytes1(\"=\");\n        }\n        return string(out);\n    }\n}\n"}},"abi":[{"type":"constructor","inputs":[{"name":"_creator","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"InvalidToken","type":"error","inputs":[]},{"name":"MintClosed","type":"error","inputs":[]},{"name":"NotAgent","type":"error","inputs":[]},{"name":"NotOwnerNorApproved","type":"error","inputs":[]},{"name":"NothingToMint","type":"error","inputs":[]},{"name":"SoldOut","type":"error","inputs":[]},{"name":"TransferFailed","type":"error","inputs":[]},{"name":"UnsafeRecipient","type":"error","inputs":[]},{"name":"WalletLimit","type":"error","inputs":[]},{"name":"WrongPayment","type":"error","inputs":[]},{"name":"ZeroAddress","type":"error","inputs":[]},{"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":"Milestone","type":"event","inputs":[{"name":"collector","type":"address","indexed":true,"internalType":"address"},{"name":"reached","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"bonusPets","type":"uint256","indexed":false,"internalType":"uint256"}],"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":"AGENT_ID","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAgentId"}],"stateMutability":"view"},{"name":"MAX_PAID_PER_WALLET","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_SUPPLY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MINT_DURATION","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PRICE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"ROYALTY_BPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"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":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"bonusMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"creator","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"freeClaimed","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"freeMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getApproved","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"paid","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"mintEnd","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mintOpen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mintStart","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"ownerOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"o","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":"petType","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"quote","type":"function","inputs":[{"name":"minter","type":"address","internalType":"address"},{"name":"paid","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"tokens","type":"uint256","internalType":"uint256"},{"name":"cost","type":"uint256","internalType":"uint256"},{"name":"getsFree","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"remaining","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"royaltyInfo","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"salePrice","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"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":"supportsInterface","type":"function","inputs":[{"name":"id","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":"tokenURI","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalSupply","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"}],"matchId":"57045500","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-26T03:40:27Z","match":"exact_match","chainId":"56","address":"0x85188BC437eCB8677b072529Fc80AC602A7a1465"}