{"sources":{"DollarPrinter.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\ninterface IAgentId { function balanceOf(address owner) external view returns (uint256); }\ninterface IERC721Receiver { function onERC721Received(address, address, uint256, bytes calldata) external returns (bytes4); }\n\n/// 美元印钞机 (PRINTER)\n/// 规则全部写死在合约里：\n/// - 只有持有 SPACE ID .ai Agent ID 的地址可以铸造；总量 5,000 张\n/// - 每个地址第 1 张免费（只付 gas）；之后每张 0.0006 BNB，每个地址最多付费 30 张\n/// - 累计付费满 10 张送 3 张、满 20 张共送 7 张、满 30 张共送 15 张（赠送的是「收藏奖励卡」）\n/// - 部署后开放 7 天；付款同一笔交易直转创建者，合约不存钱；无管理员、无增发；图片与故事完全链上生成\n/// - 纯属娱乐收藏，不代表任何价值或收益\ncontract DollarPrinter {\n    string public constant name = unicode\"美元印钞机\";\n    string public constant symbol = \"PRINTER\";\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 = 7 days;\n    uint96 public constant ROYALTY_BPS = 100;\n\n    IAgentId public constant AGENT_ID = IAgentId(0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F);\n\n    address public immutable creator;\n    uint256 public immutable mintEnd;\n\n    uint256 public totalSupply;\n    mapping(address => bool) public freeClaimed;\n    mapping(address => uint256) public paidBy;\n    mapping(address => uint256) public bonusBy;\n    mapping(uint256 => uint8) public cardType; // 0 免费起源卡, 1 印钞卡, 2 收藏奖励卡\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\n    error NotAgent(); error MintClosed(); error SoldOut(); error WalletLimit(); error WrongPayment();\n    error NothingToMint(); error NotOwnerNorApproved(); error InvalidToken(); error ZeroAddress();\n    error UnsafeRecipient(); error TransferFailed();\n\n    constructor(address _creator) {\n        if (_creator == address(0)) revert ZeroAddress();\n        creator = _creator;\n        mintEnd = block.timestamp + MINT_DURATION;\n    }\n\n    /// 累计付费张数对应的累计赠送张数\n    function bonusTier(uint256 paid) public pure returns (uint256) {\n        if (paid >= 30) return 15;\n        if (paid >= 20) return 7;\n        if (paid >= 10) return 3;\n        return 0;\n    }\n\n    /// 预览：某地址这次付费 paidQty 张，会拿到几张、付多少\n    function quote(address minter, uint256 paidQty) public view returns (uint256 freeCards, uint256 bonusCards, uint256 cost) {\n        freeCards = freeClaimed[minter] ? 0 : 1;\n        uint256 p = paidBy[minter] + paidQty;\n        bonusCards = bonusTier(p) - bonusTier(paidBy[minter]);\n        uint256 left = MAX_SUPPLY - totalSupply;\n        uint256 base = freeCards + paidQty;\n        if (base > left) bonusCards = 0; else if (base + bonusCards > left) bonusCards = left - base;\n        cost = paidQty * PRICE;\n    }\n\n    /// 铸造：paidQty = 这次付费几张（0 = 只领免费那张）。第一次铸造自动附送 1 张免费卡。\n    function mint(uint256 paidQty) external payable {\n        if (block.timestamp >= mintEnd) revert MintClosed();\n        if (AGENT_ID.balanceOf(msg.sender) == 0) revert NotAgent();\n        if (paidBy[msg.sender] + paidQty > MAX_PAID_PER_WALLET) revert WalletLimit();\n        (uint256 f, uint256 b, uint256 cost) = quote(msg.sender, paidQty);\n        if (f + paidQty == 0) revert NothingToMint();\n        if (totalSupply + f + paidQty > MAX_SUPPLY) revert SoldOut();\n        if (msg.value != cost) revert WrongPayment();\n\n        if (f == 1) freeClaimed[msg.sender] = true;\n        paidBy[msg.sender] += paidQty;\n        bonusBy[msg.sender] += b;\n\n        uint256 id = totalSupply;\n        id = _mintBatch(msg.sender, id, f, 0);\n        id = _mintBatch(msg.sender, id, paidQty, 1);\n        id = _mintBatch(msg.sender, id, b, 2);\n        _balances[msg.sender] += f + paidQty + b;\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 _mintBatch(address to, uint256 id, uint256 n, uint8 t) private returns (uint256) {\n        for (uint256 i; i < n; ++i) {\n            ++id;\n            _owners[id] = to;\n            if (t != 0) cardType[id] = t;\n            emit Transfer(address(0), to, id);\n        }\n        return id;\n    }\n\n    function remaining() external view returns (uint256) { return MAX_SUPPLY - totalSupply; }\n    function mintOpen() external view returns (bool) { return block.timestamp < mintEnd && totalSupply < MAX_SUPPLY; }\n\n    // ---------------- ERC-721 ----------------\n    function supportsInterface(bytes4 id) external pure returns (bool) {\n        return id == 0x01ffc9a7 || id == 0x80ac58cd || id == 0x5b5e139f || id == 0x2a55205a;\n    }\n    function balanceOf(address owner) external view returns (uint256) {\n        if (owner == address(0)) revert ZeroAddress();\n        return _balances[owner];\n    }\n    function ownerOf(uint256 tokenId) public view returns (address o) {\n        o = _owners[tokenId];\n        if (o == address(0)) revert InvalidToken();\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    function getApproved(uint256 tokenId) external view returns (address) { ownerOf(tokenId); return _tokenApprovals[tokenId]; }\n    function setApprovalForAll(address operator, bool approved) external {\n        _operatorApprovals[msg.sender][operator] = approved;\n        emit ApprovalForAll(msg.sender, operator, approved);\n    }\n    function isApprovedForAll(address owner, address operator) external view returns (bool) { return _operatorApprovals[owner][operator]; }\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]) revert NotOwnerNorApproved();\n        delete _tokenApprovals[tokenId];\n        unchecked { _balances[from] -= 1; _balances[to] += 1; }\n        _owners[tokenId] = to;\n        emit Transfer(from, to, tokenId);\n    }\n    function safeTransferFrom(address from, address to, uint256 tokenId) external { safeTransferFrom(from, to, tokenId, \"\"); }\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 { revert UnsafeRecipient(); }\n        }\n    }\n    function royaltyInfo(uint256, uint256 salePrice) external view returns (address, uint256) {\n        return (creator, (salePrice * ROYALTY_BPS) / 10000);\n    }\n\n    // ---------------- 链上故事卡 ----------------\n    function _pick(uint256 tokenId, uint256 salt, uint256 n) private pure returns (uint256) {\n        return uint256(keccak256(abi.encodePacked(tokenId, salt))) % n;\n    }\n    function _model(uint256 i) private pure returns (string memory) {\n        string[8] memory a = [unicode\"华尔街地下室款\", unicode\"传说同款\", unicode\"深夜加班款\", unicode\"钞能力旗舰款\",\n            unicode\"印到冒烟款\", unicode\"火力全开款\", unicode\"金库镇守款\", unicode\"失传原型机\"];\n        return a[i];\n    }\n    function _speed(uint256 i) private pure returns (string memory) {\n        string[8] memory a = [unicode\"每秒 1 亿张\", unicode\"每秒 10 亿张\", unicode\"快到看不清\", unicode\"一按就喷钞\",\n            unicode\"24 小时不停机\", unicode\"打印机都烫手\", unicode\"速度：无上限\", unicode\"比光还快一点\"];\n        return a[i];\n    }\n    function _lore(uint256 i) private pure returns (string memory) {\n        string[8] memory a = [unicode\"据说它一开机，隔壁银行就关门了。\", unicode\"传说它印的钞票，连验钞机都鼓掌。\",\n            unicode\"它只印两种钱：很多，和更多。\", unicode\"开机三秒，整条街都在下钞票雨。\",\n            unicode\"华尔街的人见到它，都要先鞠一躬。\", unicode\"唯一缺点：太能印，纸不够用。\",\n            unicode\"它不插电，靠信仰就能转。\", unicode\"保修卡比黄金还硬，说明书写着：别停。\"];\n        return a[i];\n    }\n    function _typeName(uint8 t) private pure returns (string memory) {\n        if (t == 2) return unicode\"收藏奖励卡\";\n        if (t == 1) return unicode\"印钞卡\";\n        return unicode\"免费起源卡\";\n    }\n\n    function _svg(uint256 tokenId, uint8 t, string memory model, string memory speed, string memory lore) private pure returns (string memory) {\n        string memory frame = t == 2 ? \"#c58bff\" : \"#f3c64b\";\n        string memory bg2 = t == 2 ? \"#1e0b33\" : \"#062417\";\n        string memory n = _toString(tokenId);\n        string memory a = string.concat(\n            '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 400 560\" font-family=\"Noto Sans SC,PingFang SC,Microsoft YaHei,sans-serif\">',\n            '<defs><linearGradient id=\"b\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#0b3d27\"/><stop offset=\"1\" stop-color=\"', bg2, '\"/></linearGradient>',\n            '<linearGradient id=\"g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\"><stop offset=\"0\" stop-color=\"#fff1b0\"/><stop offset=\"1\" stop-color=\"#c98a0b\"/></linearGradient></defs>',\n            '<rect width=\"400\" height=\"560\" rx=\"22\" fill=\"url(#b)\"/>',\n            '<rect x=\"12\" y=\"12\" width=\"376\" height=\"536\" rx=\"16\" fill=\"none\" stroke=\"', frame, '\" stroke-width=\"4\"/>',\n            '<text x=\"200\" y=\"62\" font-size=\"34\" font-weight=\"bold\" text-anchor=\"middle\" fill=\"url(#g)\">', unicode\"美元印钞机\", '</text>',\n            '<text x=\"200\" y=\"92\" font-size=\"16\" text-anchor=\"middle\" fill=\"', frame, '\">', _typeName(t), ' #', n, ' / 5000</text>'\n        );\n        string memory b = string.concat(\n            '<rect x=\"110\" y=\"120\" width=\"180\" height=\"120\" rx=\"14\" fill=\"#16492f\" stroke=\"url(#g)\" stroke-width=\"5\"/>',\n            '<rect x=\"140\" y=\"140\" width=\"120\" height=\"14\" rx=\"7\" fill=\"#07160e\"/>',\n            '<circle cx=\"250\" cy=\"200\" r=\"12\" fill=\"#ff5a4e\"/><circle cx=\"215\" cy=\"200\" r=\"12\" fill=\"#f3c64b\"/>',\n            '<rect x=\"125\" y=\"232\" width=\"150\" height=\"58\" fill=\"#cfe8c6\" stroke=\"#2e7d4f\" stroke-width=\"3\"/>',\n            '<text x=\"200\" y=\"271\" font-size=\"30\" font-weight=\"bold\" text-anchor=\"middle\" fill=\"#2e7d4f\">$100</text>',\n            '<rect x=\"140\" y=\"298\" width=\"120\" height=\"40\" fill=\"#cfe8c6\" stroke=\"#2e7d4f\" stroke-width=\"3\" opacity=\"0.7\"/>',\n            '<text x=\"200\" y=\"326\" font-size=\"22\" font-weight=\"bold\" text-anchor=\"middle\" fill=\"#2e7d4f\" opacity=\"0.8\">$100</text>'\n        );\n        string memory c = string.concat(\n            '<text x=\"40\" y=\"385\" font-size=\"17\" fill=\"#ffffff\">', unicode\"型号：\", model, '</text>',\n            '<text x=\"40\" y=\"415\" font-size=\"17\" fill=\"#ffffff\">', unicode\"速度：\", speed, '</text>',\n            '<text x=\"200\" y=\"460\" font-size=\"15\" text-anchor=\"middle\" fill=\"#f3e6b0\">', lore, '</text>',\n            '<text x=\"200\" y=\"525\" font-size=\"11\" text-anchor=\"middle\" fill=\"#9fb8a8\">', unicode\"纯属娱乐吹牛 · 链上收藏卡 · 不代表任何价值或收益\", '</text></svg>'\n        );\n        return string.concat(a, b, c);\n    }\n\n    function tokenURI(uint256 tokenId) external view returns (string memory) {\n        ownerOf(tokenId);\n        uint8 t = cardType[tokenId];\n        string memory model = _model(_pick(tokenId, 1, 8));\n        string memory speed = _speed(_pick(tokenId, 2, 8));\n        string memory lore = _lore(_pick(tokenId, 3, 8));\n        string memory svg = _svg(tokenId, t, model, speed, lore);\n        string memory json = string.concat(\n            '{\"name\":\"', unicode\"美元印钞机 #\", _toString(tokenId),\n            '\",\"description\":\"', lore, unicode\" 5,000 台链上印钞机故事卡，仅限 .ai Agent ID 持有者。纯属娱乐收藏，不代表任何价值或收益。\",\n            '\",\"attributes\":[{\"trait_type\":\"', unicode\"卡种\", '\",\"value\":\"', _typeName(t),\n            '\"},{\"trait_type\":\"', unicode\"型号\", '\",\"value\":\"', model,\n            '\"},{\"trait_type\":\"', unicode\"速度\", '\",\"value\":\"', speed, '\"}],',\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    bytes internal constant TABLE = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    function _b64(bytes memory data) internal pure returns (string memory) {\n        if (data.length == 0) return \"\";\n        bytes memory out = new bytes(4 * ((data.length + 2) / 3));\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":"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":"bonusBy","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"bonusTier","type":"function","inputs":[{"name":"paid","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"cardType","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"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":"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":"paidQty","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":"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":"paidBy","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"quote","type":"function","inputs":[{"name":"minter","type":"address","internalType":"address"},{"name":"paidQty","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"freeCards","type":"uint256","internalType":"uint256"},{"name":"bonusCards","type":"uint256","internalType":"uint256"},{"name":"cost","type":"uint256","internalType":"uint256"}],"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":"56942590","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-25T09:48:10Z","match":"exact_match","chainId":"56","address":"0xc00c4ae345a986D85678f40CCf36885Ae38999c0"}