{"sources":{"FightBots.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/// Fight Bots (FBOT) - 格斗机器人 arena robots\n/// Rules are fixed in code:\n/// - Only addresses holding a .ai Agent ID can mint; total supply 6,000\n/// - Max 6 robots per wallet. The robot's tier is set by its mint slot:\n///   1st STANDARD free (gas only); 2nd ADVANCED 0.004 BNB; 3rd ELITE 0.0054 BNB; 4th PRIME 0.0067 BNB; 5th OMEGA 0.0081 BNB; 6th ULTIMA 0.027 BNB\n/// - Each tier has strictly higher stat floors than the tier below; class and stat rolls are random at mint\n/// - Mint open 7 days from deploy; payment forwarded to creator in the same tx; no admin, no extra mint; stats on-chain, art on IPFS\n/// - Entertainment only. No prizes, no value or returns implied.\ncontract FightBots {\n    string public constant name = \"Fight Bots\";\n    string public constant symbol = \"FBOT\";\n\n    uint256 public constant MAX_SUPPLY = 6000;\n    uint256 public constant MAX_PER_WALLET = 6;\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 => uint256) public mintedBy;\n    mapping(uint256 => uint256) public seedOf;\n    uint256[6] public tierCount;\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    /// Price of a wallet's n-th robot (n starts at 1)\n    function priceOf(uint256 n) public pure returns (uint256) {\n        if (n == 2) return 0.004 ether;\n        if (n == 3) return 0.0054 ether;\n        if (n == 4) return 0.0067 ether;\n        if (n == 5) return 0.0081 ether;\n        if (n == 6) return 0.027 ether;\n        return 0;\n    }\n\n    /// Total cost for `minter` to mint `qty` more robots now\n    function quote(address minter, uint256 qty) public view returns (uint256 cost) {\n        uint256 m = mintedBy[minter];\n        for (uint256 i = 1; i <= qty; ++i) cost += priceOf(m + i);\n    }\n\n    function mintsLeft(address minter) external view returns (uint256) { return MAX_PER_WALLET - mintedBy[minter]; }\n\n    function mint(uint256 qty) external payable {\n        if (block.timestamp >= mintEnd) revert MintClosed();\n        if (qty == 0) revert NothingToMint();\n        if (AGENT_ID.balanceOf(msg.sender) == 0) revert NotAgent();\n        uint256 before = mintedBy[msg.sender];\n        if (before + qty > MAX_PER_WALLET) revert WalletLimit();\n        if (totalSupply + qty > MAX_SUPPLY) revert SoldOut();\n        if (msg.value != quote(msg.sender, qty)) revert WrongPayment();\n\n        mintedBy[msg.sender] = before + qty;\n        uint256 id = totalSupply;\n        bytes32 entropy = keccak256(abi.encodePacked(blockhash(block.number - 1), block.prevrandao, msg.sender, block.timestamp));\n        for (uint256 i; i < qty; ++i) {\n            ++id;\n            uint256 tier = before + i; // 0..5 = mint slot 1..6\n            seedOf[id] = (uint256(keccak256(abi.encodePacked(entropy, id))) >> 3) | (tier << 253);\n            tierCount[tier] += 1;\n            _owners[id] = msg.sender;\n            emit Transfer(address(0), msg.sender, id);\n        }\n        _balances[msg.sender] += qty;\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 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    // ---------------- game stats (read by the arena web page) ----------------\n    // class: 0 TITAN 1 STRIKER 2 PHANTOM 3 SENTINEL 4 VOLT 5 NOVA\n    // tier:  0 STANDARD 1 ADVANCED 2 ELITE 3 PRIME 4 OMEGA 5 ULTIMA\n    // stat = classBase * tierPct / 100 + roll(0 .. classBase/10); tierPct = 100,120,135,150,175,210\n    // specialPower (%) = specialBase + tier * specialStep\n    struct Robot { uint8 class_; uint8 tier; uint16 hp; uint16 atk; uint16 def; uint16 spd; uint16 specialPower; uint16 power; }\n\n    function _base(uint256 c, uint256 k) internal pure returns (uint256) {\n        // packed: per class 4 bytes HP,ATK,DEF,SPD\n        uint256 t = 0x1016188412101e690c1b168c1a0e1a6412141b7a081c15a0;\n        return (t >> ((c * 4 + k) * 8)) & 0xff;\n    }\n    function _robot(uint256 s) internal pure returns (Robot memory r) {\n        uint256 tier = s >> 253;\n        uint256 c = s % 6;\n        uint256 pct = tier == 0 ? 100 : tier == 1 ? 120 : tier == 2 ? 135 : tier == 3 ? 150 : tier == 4 ? 175 : 210;\n        uint256[4] memory v;\n        for (uint256 k; k < 4; ++k) {\n            uint256 b = _base(c, k);\n            v[k] = b * pct / 100 + ((s >> (32 + k * 16)) % (b / 10 + 1));\n        }\n        uint256 spBase = 0x16d24696b4a0;\n        uint256 spStep = 0x40f0f0f0f0f;\n        r.class_ = uint8(c);\n        r.tier = uint8(tier);\n        r.hp = uint16(v[0]); r.atk = uint16(v[1]); r.def = uint16(v[2]); r.spd = uint16(v[3]);\n        r.specialPower = uint16(((spBase >> (c * 8)) & 0xff) + tier * ((spStep >> (c * 8)) & 0xff));\n        r.power = uint16(v[0] / 2 + 2 * v[1] + v[2] + v[3]);\n    }\n\n    /// All battle stats of a robot. special move id == class id.\n    function robotStats(uint256 tokenId) public view returns (\n        uint8 robotClass, uint8 tier, uint16 hp, uint16 atk, uint16 def, uint16 spd, uint16 specialPower, uint16 power\n    ) {\n        ownerOf(tokenId);\n        Robot memory r = _robot(seedOf[tokenId]);\n        return (r.class_, r.tier, r.hp, r.atk, r.def, r.spd, r.specialPower, r.power);\n    }\n\n    /// Display names of a robot\n    function robotNames(uint256 tokenId) public view returns (string memory botName, string memory className, string memory tierName, string memory specialName) {\n        ownerOf(tokenId);\n        uint256 s = seedOf[tokenId];\n        uint256 c = s % 6;\n        return (string.concat(_prefix((s >> 16) % 12), \" \", _cls(c)), _cls(c), _tier(s >> 253), _special(c));\n    }\n\n    /// Token ids held by `owner` (scans all ids; view-only, for the web game)\n    function tokensOfOwner(address owner) external view returns (uint256[] memory ids) {\n        uint256 n = _balances[owner];\n        ids = new uint256[](n);\n        uint256 j;\n        for (uint256 id = 1; id <= totalSupply && j < n; ++id) if (_owners[id] == owner) ids[j++] = id;\n    }\n\n    /// Batch read for the leaderboard: owners and power of ids [from, from+count)\n    function powersBatch(uint256 from, uint256 count) external view returns (address[] memory owners, uint16[] memory powers, uint8[] memory classes, uint8[] memory tiers) {\n        uint256 end = from + count; if (end > totalSupply + 1) end = totalSupply + 1;\n        uint256 n = end > from ? end - from : 0;\n        owners = new address[](n); powers = new uint16[](n); classes = new uint8[](n); tiers = new uint8[](n);\n        for (uint256 i; i < n; ++i) {\n            Robot memory r = _robot(seedOf[from + i]);\n            owners[i] = _owners[from + i]; powers[i] = r.power; classes[i] = r.class_; tiers[i] = r.tier;\n        }\n    }\n\n    // ---------------- ERC-721 ----------------\n    function supportsInterface(bytes4 i) external pure returns (bool) {\n        return i == 0x01ffc9a7 || i == 0x80ac58cd || i == 0x5b5e139f || i == 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    // ---------------- names ----------------\n    function _cls(uint256 c) internal pure returns (string memory) {\n        string[6] memory a = [\"TITAN\", \"STRIKER\", \"PHANTOM\", \"SENTINEL\", \"VOLT\", \"NOVA\"];\n        return a[c];\n    }\n    function _tier(uint256 t) internal pure returns (string memory) {\n        string[6] memory a = [\"STANDARD\", \"ADVANCED\", \"ELITE\", \"PRIME\", \"OMEGA\", \"ULTIMA\"];\n        return a[t];\n    }\n    function _special(uint256 c) internal pure returns (string memory) {\n        string[6] memory a = [\"Quake Slam\", \"Plasma Combo\", \"Shadow Blink\", \"Mirror Aegis\", \"Thunder Lance\", \"Nano Repair\"];\n        return a[c];\n    }\n    function _prefix(uint256 i) internal pure returns (string memory) {\n        string[12] memory a = [\"IRON\", \"NEON\", \"VOID\", \"SOLAR\", \"COBALT\", \"CRIMSON\", \"QUANTUM\", \"HEX\", \"STORM\", \"CHROME\", \"ASTRO\", \"ROGUE\"];\n        return a[i];\n    }\n    // ---------------- artwork (IPFS) ----------------\n    string public constant IMAGE_BASE = \"ipfs://bafybeidwe5actryuwh7yn4lzuqu3eucatkzzbrrbqgfjjlz2jqqaq2zhkq/\";\n    function _lc(uint256 i, bool isTier) internal pure returns (string memory) {\n        if (isTier) { string[6] memory t = [\"standard\", \"advanced\", \"elite\", \"prime\", \"omega\", \"ultima\"]; return t[i]; }\n        string[6] memory c = [\"titan\", \"striker\", \"phantom\", \"sentinel\", \"volt\", \"nova\"]; return c[i];\n    }\n    function imageOf(uint256 tokenId) public view returns (string memory) {\n        ownerOf(tokenId);\n        Robot memory r = _robot(seedOf[tokenId]);\n        return string.concat(IMAGE_BASE, _lc(r.tier, true), \"_\", _lc(r.class_, false), \".jpg\");\n    }\n\n    function _attrs(uint256 s) internal pure returns (string memory) {\n        Robot memory r = _robot(s);\n        string memory x = string.concat(\n            '[{\"trait_type\":\"Class\",\"value\":\"', _cls(r.class_), '\"},{\"trait_type\":\"Tier\",\"value\":\"', _tier(r.tier),\n            '\"},{\"trait_type\":\"Special\",\"value\":\"', _special(r.class_), '\"},{\"display_type\":\"number\",\"trait_type\":\"HP\",\"value\":', _toString(r.hp)\n        );\n        return string.concat(x,\n            '},{\"display_type\":\"number\",\"trait_type\":\"ATK\",\"value\":', _toString(r.atk), '},{\"display_type\":\"number\",\"trait_type\":\"DEF\",\"value\":', _toString(r.def),\n            '},{\"display_type\":\"number\",\"trait_type\":\"SPD\",\"value\":', _toString(r.spd), '},{\"display_type\":\"number\",\"trait_type\":\"Power\",\"value\":', _toString(r.power), '}]'\n        );\n    }\n\n    function tokenURI(uint256 tokenId) external view returns (string memory) {\n        ownerOf(tokenId);\n        uint256 s = seedOf[tokenId];\n        string memory json = string.concat(\n            '{\"name\":\"', _prefix((s >> 16) % 12), ' ', _cls(s % 6), ' #', _toString(tokenId),\n            '\",\"description\":\"Fight Bots: 6,000 arena robots for .ai Agent ID holders. Stats live on-chain; artwork on IPFS. Tier is set by mint slot (Standard, Advanced, Elite, Prime, Omega, Ultima); stats are on-chain for the arena game. For fun only; no prizes, no value or returns implied.\",',\n            '\"attributes\":', _attrs(s), ',\"image\":\"', imageOf(tokenId), '\"}'\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 bb = new bytes(len);\n        while (v != 0) { len--; bb[len] = bytes1(uint8(48 + v % 10)); v /= 10; }\n        return string(bb);\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 x = uint8(data[i]);\n            uint256 y = i + 1 < data.length ? uint8(data[i + 1]) : 0;\n            uint256 z = i + 2 < data.length ? uint8(data[i + 2]) : 0;\n            uint256 tri = (x << 16) | (y << 8) | z;\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":"IMAGE_BASE","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"MAX_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":"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":"creator","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getApproved","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"imageOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"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":"qty","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":"mintedBy","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mintsLeft","type":"function","inputs":[{"name":"minter","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":"ownerOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"o","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"powersBatch","type":"function","inputs":[{"name":"from","type":"uint256","internalType":"uint256"},{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"owners","type":"address[]","internalType":"address[]"},{"name":"powers","type":"uint16[]","internalType":"uint16[]"},{"name":"classes","type":"uint8[]","internalType":"uint8[]"},{"name":"tiers","type":"uint8[]","internalType":"uint8[]"}],"stateMutability":"view"},{"name":"priceOf","type":"function","inputs":[{"name":"n","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"quote","type":"function","inputs":[{"name":"minter","type":"address","internalType":"address"},{"name":"qty","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"cost","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"remaining","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"robotNames","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"botName","type":"string","internalType":"string"},{"name":"className","type":"string","internalType":"string"},{"name":"tierName","type":"string","internalType":"string"},{"name":"specialName","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"robotStats","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"robotClass","type":"uint8","internalType":"uint8"},{"name":"tier","type":"uint8","internalType":"uint8"},{"name":"hp","type":"uint16","internalType":"uint16"},{"name":"atk","type":"uint16","internalType":"uint16"},{"name":"def","type":"uint16","internalType":"uint16"},{"name":"spd","type":"uint16","internalType":"uint16"},{"name":"specialPower","type":"uint16","internalType":"uint16"},{"name":"power","type":"uint16","internalType":"uint16"}],"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":"seedOf","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"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":"i","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":"tierCount","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"tokenURI","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"tokensOfOwner","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"ids","type":"uint256[]","internalType":"uint256[]"}],"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":"57115563","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-26T15:11:49Z","match":"exact_match","chainId":"56","address":"0xA390311f2B1FC204F9F73A7372459B13E51fcb62"}