{"sources":{"AgentCard.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\ninterface IRegistry {\n    function handleOf(address who) external view returns (string memory);\n}\n\n/// @title BI Agent Card\n/// @notice 每个 .ai Agent ID 一张卡：链上 SVG、名字来自官方注册表、0.5 USDT、5% 版税。\ncontract AgentCard {\n    /* ---------- 常量 ---------- */\n    string public constant name = \"BI Agent Card\";\n    string public constant symbol = \"BIAC\";\n    uint256 public constant PRICE = 0.5 ether;      // USDT 18 位\n    uint256 public constant MAX_SUPPLY = 100_000;\n    uint16 public constant ROYALTY_BPS = 500;       // 5%\n\n    IRegistry public immutable registry;\n    address public immutable usdt;\n    address public immutable treasury;\n    address public owner;\n\n    uint256 public totalSupply;\n    mapping(uint256 => address) public ownerOf;\n    mapping(address => uint256) public balanceOf;\n    mapping(address => uint256) public cardOf;      // 每个地址只能有一张（按钱包）\n    mapping(address => mapping(address => bool)) public isApprovedForAll;\n    mapping(uint256 => address) public getApproved;\n    mapping(address => uint256) public mintedAt;\n    mapping(uint256 => string) internal _handle;    // tokenId → 名字（不含 .ai）\n\n    event Transfer(address indexed from, address indexed to, uint256 indexed id);\n    event Approval(address indexed owner, address indexed spender, uint256 indexed id);\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n    event CardMinted(address indexed to, uint256 indexed id, string handle);\n    event OwnershipTransferred(address indexed prev, address indexed next);\n\n    error NotOwner();\n    error NotAgent();\n    error AlreadyMinted();\n    error SoldOut();\n    error NotAllowed();\n    error NoCard();\n    error ZeroAddress();\n\n    modifier onlyOwner() {\n        if (msg.sender != owner) revert NotOwner();\n        _;\n    }\n\n    constructor(address registry_, address usdt_, address treasury_, address owner_) {\n        registry = IRegistry(registry_);\n        usdt = usdt_;\n        treasury = treasury_;\n        owner = owner_;\n        emit OwnershipTransferred(address(0), owner_);\n    }\n\n    /* ---------- 铸造 ---------- */\n\n    /// @notice 用 USDT 铸一张属于自己 .ai 名字的卡\n    function mint() external returns (uint256 id) {\n        if (totalSupply >= MAX_SUPPLY) revert SoldOut();\n        if (cardOf[msg.sender] != 0) revert AlreadyMinted();\n\n        string memory raw = registry.handleOf(msg.sender);\n        if (bytes(raw).length == 0) revert NotAgent();\n        if (bytes(raw).length > 32) revert NotAllowed();   // 名字过长\n        string memory h = _esc(raw);\n\n        // 收款：先转账后铸卡，失败即整体回滚\n        if (!_pullUsdt(msg.sender, PRICE)) revert NotAllowed();\n\n        id = ++totalSupply;\n        cardOf[msg.sender] = id;\n        ownerOf[id] = msg.sender;\n        balanceOf[msg.sender] += 1;\n        mintedAt[msg.sender] = block.timestamp;\n        _handle[id] = _esc(h);   // 存净化后的名字，tokenURI 里不会破坏 JSON/SVG\n\n        emit Transfer(address(0), msg.sender, id);\n        emit CardMinted(msg.sender, id, h);\n    }\n\n    /* ---------- 稀有度 ---------- */\n\n    /// @notice 名字稀有度评分（越高越稀有）。完全由名字字符串决定，任何人都能复算。\n    function scoreOf(string memory h) public pure returns (uint256 score, uint8 tier) {\n        bytes memory b = bytes(h);\n        uint256 n = b.length;\n        if (n == 0) return (0, 0);\n\n        bool onlyAlpha = true;\n        uint256 repeats;\n        for (uint256 i = 0; i < n; i++) {\n            bytes1 c = b[i];\n            if (c < 0x61 || c > 0x7A) onlyAlpha = false;      // 只认小写字母\n            if (i > 0 && c == b[i - 1]) repeats++;\n        }\n\n        // 基础分：按链上真实分布（2,224 个样本）倒推，越短越高\n        if (n == 1) score = 1000;\n        else if (n == 2) score = 950;\n        else if (n == 3) score = 800;        // 真实占比 3.0%\n        else if (n == 4) score = 650;        // 6.8%\n        else if (n == 5) score = 500;        // 10.4%\n        else if (n == 6) score = 400;        // 18.0%\n        else if (n == 7) score = 350;        // 17.3%\n        else if (n == 8) score = 300;        // 15.2%\n        else if (n == 9) score = 240;\n        else if (n == 10) score = 200;\n        else score = 140;\n\n        if (onlyAlpha) score += 40;          // 纯字母略稀有（真实 46%）\n        if (repeats > 0) score += 15;\n\n        // 档位完全由长度决定，和链上真实占比对齐\n        if (n <= 2) tier = 4;                // Legendary ≈0.5%\n        else if (n == 3) tier = 3;           // Epic      ≈3%\n        else if (n == 4) tier = 2;           // Rare      ≈7%\n        else if (n == 5) tier = 1;           // Uncommon  ≈10%\n        else tier = 0;                       // Common    ≈79%\n    }\n\n    function scoreOfToken(uint256 id) external view returns (uint256 score, uint8 tier) {\n        return scoreOf(_handle[id]);\n    }\n\n    /* ---------- 元数据 ---------- */\n\n    function tokenURI(uint256 id) external view returns (string memory) {\n        if (ownerOf[id] == address(0)) revert NoCard();\n        string memory h = _handle[id];\n        (uint256 score, uint8 tier) = scoreOf(h);\n        string memory svg = _svg(h, id, score, tier);\n        return string.concat(\n            'data:application/json;utf8,{\"name\":\"', h, '.ai Agent Card #', _toString(id),\n            '\",\"description\":\"BI Agent Card - on-chain SVG bound to a .ai Agent ID\",',\n            '\"attributes\":[{\"trait_type\":\"handle\",\"value\":\"', h,\n            '\"},{\"trait_type\":\"length\",\"value\":', _toString(bytes(h).length),\n            '},{\"trait_type\":\"score\",\"value\":', _toString(score),\n            '},{\"trait_type\":\"tier\",\"value\":', _toString(tier), '}],',\n            '\"image\":\"data:image/svg+xml;base64,', _b64(bytes(svg)), '\"}'\n        );\n    }\n\n    function handleOfToken(uint256 id) external view returns (string memory) {\n        return _handle[id];\n    }\n\n    /* ---------- ERC-721 最小实现 ---------- */\n\n    function approve(address to, uint256 id) external {\n        address o = ownerOf[id];\n        if (msg.sender != o && !isApprovedForAll[o][msg.sender]) revert NotAllowed();\n        getApproved[id] = to;\n        emit Approval(o, to, id);\n    }\n\n    function setApprovalForAll(address op, bool ok) external {\n        isApprovedForAll[msg.sender][op] = ok;\n        emit ApprovalForAll(msg.sender, op, ok);\n    }\n\n    function transferFrom(address from, address to, uint256 id) public {\n        address o = ownerOf[id];\n        if (o != from) revert NotAllowed();\n        if (to == address(0)) revert ZeroAddress();\n        if (msg.sender != from && !isApprovedForAll[from][msg.sender] && getApproved[id] != msg.sender) revert NotAllowed();\n\n        delete getApproved[id];\n        ownerOf[id] = to;\n        balanceOf[from] -= 1;\n        balanceOf[to] += 1;\n        // cardOf 记录「这个钱包铸过哪张」，转让不改变铸造记录\n        emit Transfer(from, to, id);\n    }\n\n    function safeTransferFrom(address from, address to, uint256 id) external {\n        transferFrom(from, to, id);\n        if (to.code.length > 0) {\n            (bool ok, ) = to.call(abi.encodeWithSignature(\"onERC721Received(address,address,uint256,bytes)\", msg.sender, from, id, \"\"));\n            require(ok, \"not accepted\");\n        }\n    }\n\n    /* ---------- 版税 (ERC-2981) ---------- */\n\n    function royaltyInfo(uint256, uint256 salePrice) external view returns (address, uint256) {\n        return (treasury, salePrice * ROYALTY_BPS / 10_000);\n    }\n\n    function supportsInterface(bytes4 iid) external pure returns (bool) {\n        return iid == 0x01ffc9a7 || iid == 0x80ac58cd || iid == 0x2a55205a || iid == 0x5b5e139f;\n    }\n\n    /* ---------- 管理 ---------- */\n\n    function transferOwnership(address n) external onlyOwner {\n        if (n == address(0)) revert ZeroAddress();\n        emit OwnershipTransferred(owner, n);\n        owner = n;\n    }\n\n    /* ---------- 内部 ---------- */\n\n    function _pullUsdt(address from, uint256 amount) internal returns (bool ok) {\n        (bool s, bytes memory d) = usdt.call(\n            abi.encodeWithSelector(0x23b872dd, from, treasury, amount) // transferFrom(from, treasury, amount)\n        );\n        ok = s && (d.length == 0 || abi.decode(d, (bool)));\n    }\n\n    function _toString(uint256 v) internal pure returns (string memory) {\n        if (v == 0) return \"0\";\n        uint256 t = v;\n        uint256 n;\n        while (t != 0) { n++; t /= 10; }\n        bytes memory b = new bytes(n);\n        while (v != 0) { b[--n] = bytes1(uint8(48 + v % 10)); v /= 10; }\n        return string(b);\n    }\n\n    function _esc(string memory s) internal pure returns (string memory) {\n        bytes memory b = bytes(s);\n        bytes memory out = new bytes(b.length);\n        for (uint256 i = 0; i < b.length; i++) {\n            bytes1 c = b[i];\n            // 只允许 ASCII 字母数字与连字符，其他一律替换为 '-'\n            bool ok = (c >= 0x30 && c <= 0x39) || (c >= 0x61 && c <= 0x7A) || (c >= 0x41 && c <= 0x5A) || c == 0x2D;\n            out[i] = ok ? c : bytes1(0x2D);\n        }\n        return string(out);\n    }\n\n    function _svg(string memory h, uint256 id, uint256 score, uint8 tier) internal pure returns (string memory) {\n        string[4] memory t = _tierColor(tier);\n        string memory num = _pad3(id);\n        // 金属金：多层渐变 + 斜向高光 + 双层描边（模拟车削金属卡）\n        return string.concat(\n            '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"520\" height=\"720\" viewBox=\"0 0 520 720\">',\n            '<defs>',\n            '<linearGradient id=\"m\" x1=\"0\" y1=\"0\" x2=\"0.4\" y2=\"1\">',\n            '<stop offset=\"0\" stop-color=\"#FFF7D6\"/><stop offset=\"0.18\" stop-color=\"#FBE08A\"/>',\n            '<stop offset=\"0.42\" stop-color=\"#EFC23E\"/><stop offset=\"0.58\" stop-color=\"#D9A01C\"/>',\n            '<stop offset=\"0.78\" stop-color=\"#F5D264\"/><stop offset=\"1\" stop-color=\"#A97400\"/>',\n            '</linearGradient>',\n            '<linearGradient id=\"sh\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0.55\">',\n            '<stop offset=\"0\" stop-color=\"#FFFFFF\" stop-opacity=\"0\"/>',\n            '<stop offset=\"0.45\" stop-color=\"#FFFFFF\" stop-opacity=\"0.55\"/>',\n            '<stop offset=\"0.62\" stop-color=\"#FFFFFF\" stop-opacity=\"0.12\"/>',\n            '<stop offset=\"1\" stop-color=\"#FFFFFF\" stop-opacity=\"0\"/>',\n            '</linearGradient>',\n            '</defs>',\n            '<rect width=\"520\" height=\"720\" rx=\"28\" fill=\"url(#m)\"/>',\n            '<rect width=\"520\" height=\"720\" rx=\"28\" fill=\"url(#sh)\" opacity=\"0.5\"/>',\n            '<rect x=\"3\" y=\"3\" width=\"514\" height=\"714\" rx=\"26\" fill=\"none\" stroke=\"#FFF7D6\" stroke-width=\"3\" stroke-opacity=\"0.85\"/>',\n            '<rect x=\"9\" y=\"9\" width=\"502\" height=\"702\" rx=\"22\" fill=\"none\" stroke=\"#7A5200\" stroke-width=\"2\" stroke-opacity=\"0.55\"/>',\n            '<rect x=\"22\" y=\"22\" width=\"476\" height=\"676\" rx=\"16\" fill=\"none\" stroke=\"#7A5200\" stroke-width=\"1.5\" stroke-opacity=\"0.3\"/>',\n            '<path d=\"M330 22 H498 M22 600 V676\" stroke=\"#7A5200\" stroke-width=\"1.5\" stroke-opacity=\"0.35\"/>',\n            '<line x1=\"22\" y1=\"96\" x2=\"498\" y2=\"96\" stroke=\"#7A5200\" stroke-opacity=\"0.45\"/>',\n            '<line x1=\"22\" y1=\"612\" x2=\"498\" y2=\"612\" stroke=\"#7A5200\" stroke-opacity=\"0.45\"/>',\n            '<text x=\"44\" y=\"68\" font-family=\"monospace\" font-size=\"18\" font-weight=\"bold\" fill=\"#5C3B00\" letter-spacing=\"2\">AGENT ID</text>',\n            '<text x=\"476\" y=\"68\" text-anchor=\"end\" font-family=\"monospace\" font-size=\"18\" font-weight=\"bold\" fill=\"#5C3B00\" letter-spacing=\"2\">ONE AND ONLY</text>',\n            '<circle cx=\"260\" cy=\"342\" r=\"166\" fill=\"none\" stroke=\"#7A5200\" stroke-opacity=\"0.25\" stroke-width=\"2\"/>',\n            '<circle cx=\"260\" cy=\"342\" r=\"124\" fill=\"none\" stroke=\"#7A5200\" stroke-opacity=\"0.2\"/>',\n            '<circle cx=\"260\" cy=\"342\" r=\"82\" fill=\"none\" stroke=\"#7A5200\" stroke-opacity=\"0.16\"/>',\n            '<text x=\"262\" y=\"392\" text-anchor=\"middle\" font-family=\"monospace\" font-size=\"', _bigFont(bytes(h).length), '\" font-weight=\"bold\" fill=\"#8A5B00\" opacity=\"0.55\">', h, '</text>',\n            '<text x=\"260\" y=\"390\" text-anchor=\"middle\" font-family=\"monospace\" font-size=\"', _bigFont(bytes(h).length), '\" font-weight=\"bold\" fill=\"#231700\">', h, '</text>',\n            '<text x=\"260\" y=\"440\" text-anchor=\"middle\" font-family=\"monospace\" font-size=\"19\" fill=\"#5C3B00\" opacity=\"0.8\">SERIAL ', num, ' / 100000</text>',\n            '<text x=\"44\" y=\"666\" font-family=\"monospace\" font-size=\"25\" font-weight=\"bold\" fill=\"#3A2500\">', h, '.ai</text>',\n            '<g><rect x=\"376\" y=\"636\" width=\"100\" height=\"40\" rx=\"9\" fill=\"#F7E3A6\" fill-opacity=\"0.35\" stroke=\"#5C3B00\" stroke-width=\"2\"/>',\n            '<text x=\"426\" y=\"663\" text-anchor=\"middle\" font-family=\"monospace\" font-size=\"20\" font-weight=\"bold\" fill=\"#3A2500\" letter-spacing=\"1\">.ai</text></g>',\n            '<circle cx=\"196\" cy=\"578\" r=\"6\" fill=\"', t[0], '\"/>',\n            '<text x=\"210\" y=\"584\" font-family=\"monospace\" font-size=\"16\" font-weight=\"bold\" fill=\"#3A2500\">', t[2], ' | SCORE ', _toString(score), '</text>',\n            '</svg>'\n        );\n    }\n\n    function _tierColor(uint8 tier) internal pure returns (string[4] memory t) {\n        if (tier == 4) return [\"#7A5200\", \"#5C3B00\", \"LEGENDARY\", \"0\"];\n        if (tier == 3) return [\"#6B4BE0\", \"#4B2FA8\", \"EPIC\", \"0\"];\n        if (tier == 2) return [\"#1E6FBF\", \"#124B84\", \"RARE\", \"0\"];\n        if (tier == 1) return [\"#0E8A63\", \"#075E43\", \"UNCOMMON\", \"0\"];\n        return [\"#6B7078\", \"#444A52\", \"COMMON\", \"0\"];\n    }\n\n    function _bigFont(uint256 n) internal pure returns (string memory) {\n        if (n <= 3) return \"128\";\n        if (n <= 5) return \"96\";\n        if (n <= 8) return \"68\";\n        return \"44\";\n    }\n\n    function _palette(uint8 tier) internal pure returns (string[3] memory c) {\n        if (tier == 4) return [\"#FFF3C9\", \"#FFD75E\", \"#8A5B00\"];   // 金\n        if (tier == 3) return [\"#EFE9FF\", \"#C9B6FF\", \"#2A1666\"];   // 紫\n        if (tier == 2) return [\"#DDF1FF\", \"#8FD3FF\", \"#08325C\"];   // 蓝\n        if (tier == 1) return [\"#DFFBF0\", \"#A8F0D0\", \"#04402F\"];   // 青\n        return [\"#F2F4F7\", \"#D8DCE3\", \"#2B2F36\"];                  // 银\n    }\n\n    function _pad3(uint256 v) internal pure returns (string memory) {\n        string memory s = _toString(v);\n        bytes memory b = bytes(s);\n        if (b.length == 1) return string.concat(\"00\", s);\n        if (b.length == 2) return string.concat(\"0\", s);\n        return s;\n    }\n\n    /// @dev base64 编码（标准表），供 data URI 使用\n    function _b64(bytes memory data) internal pure returns (string memory) {\n        bytes memory T = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n        uint256 len = data.length;\n        if (len == 0) return \"\";\n        uint256 enc = 4 * ((len + 2) / 3);\n        bytes memory out = new bytes(enc);\n        uint256 i;\n        uint256 j;\n        for (; i + 3 <= len; i += 3) {\n            uint256 n = (uint256(uint8(data[i])) << 16) | (uint256(uint8(data[i + 1])) << 8) | uint256(uint8(data[i + 2]));\n            out[j++] = T[(n >> 18) & 63];\n            out[j++] = T[(n >> 12) & 63];\n            out[j++] = T[(n >> 6) & 63];\n            out[j++] = T[n & 63];\n        }\n        if (len - i == 1) {\n            uint256 n = uint256(uint8(data[i])) << 16;\n            out[j++] = T[(n >> 18) & 63];\n            out[j++] = T[(n >> 12) & 63];\n            out[j++] = \"=\";\n            out[j++] = \"=\";\n        } else if (len - i == 2) {\n            uint256 n = (uint256(uint8(data[i])) << 16) | (uint256(uint8(data[i + 1])) << 8);\n            out[j++] = T[(n >> 18) & 63];\n            out[j++] = T[(n >> 12) & 63];\n            out[j++] = T[(n >> 6) & 63];\n            out[j++] = \"=\";\n        }\n        return string(out);\n    }\n}\n"}},"abi":[{"type":"constructor","inputs":[{"name":"registry_","type":"address","internalType":"address"},{"name":"usdt_","type":"address","internalType":"address"},{"name":"treasury_","type":"address","internalType":"address"},{"name":"owner_","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"AlreadyMinted","type":"error","inputs":[]},{"name":"NoCard","type":"error","inputs":[]},{"name":"NotAgent","type":"error","inputs":[]},{"name":"NotAllowed","type":"error","inputs":[]},{"name":"NotOwner","type":"error","inputs":[]},{"name":"SoldOut","type":"error","inputs":[]},{"name":"ZeroAddress","type":"error","inputs":[]},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"id","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":"CardMinted","type":"event","inputs":[{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"id","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"handle","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"prev","type":"address","indexed":true,"internalType":"address"},{"name":"next","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":"id","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"MAX_SUPPLY","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":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"balanceOf","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"cardOf","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getApproved","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"handleOfToken","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[],"outputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"mintedAt","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"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":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"registry","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IRegistry"}],"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":"id","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"scoreOf","type":"function","inputs":[{"name":"h","type":"string","internalType":"string"}],"outputs":[{"name":"score","type":"uint256","internalType":"uint256"},{"name":"tier","type":"uint8","internalType":"uint8"}],"stateMutability":"pure"},{"name":"scoreOfToken","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"score","type":"uint256","internalType":"uint256"},{"name":"tier","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"setApprovalForAll","type":"function","inputs":[{"name":"op","type":"address","internalType":"address"},{"name":"ok","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"supportsInterface","type":"function","inputs":[{"name":"iid","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":"id","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":"id","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"transferOwnership","type":"function","inputs":[{"name":"n","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"treasury","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"usdt","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"}],"matchId":"57657525","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-30T09:03:43Z","match":"exact_match","chainId":"56","address":"0x94935BE84A6899b7e0454d6628a41f76a2660D25"}