{"sources":{"PixelFrogs.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 FROGS (PFROG) - 10,000 fully on-chain pixel frogs.\n/// Rules are fixed in code and cannot be changed by anyone:\n/// - Total supply 10,000. Mint is open for 7 days after deploy, then closes forever\n/// - Free: 1 per wallet, gas only, for wallets holding a Binance / SPACE ID .ai Agent ID (plain frame)\n/// - Paid: open to every wallet, max 30 per wallet. Price depends on how many the wallet has bought:\n///     paid cards 1-10   0.0006 BNB each (LILY frame)\n///     paid cards 11-20  0.0009 BNB each (GOLDEN frame)\n///     paid cards 21-30  0.0012 BNB each (DIAMOND frame)\n/// - Bonus frogs when a wallet's paid total reaches: 10 -> +3 Jade Frog, 20 -> +5 Ruby Crown Frog, 30 -> +8 Cosmic King Frog\n/// - 100% of each payment goes to the creator in the same transaction; overpayment is refunded in the same transaction\n/// - No admin, no pool, no withdraw, no pause, no setters. owner() only reports the creator for marketplace collection claims\n/// - Art and metadata are generated on-chain. 1% secondary royalty (EIP-2981)\n/// - A collectible, not an investment. No airdrop or reward is promised\ncontract PixelFrogs {\n    string public constant name = \"PIXEL FROGS\";\n    string public constant symbol = \"PFROG\";\n\n    uint256 public constant MAX_SUPPLY = 10000;\n    uint256 public constant MAX_PAID_PER_WALLET = 30;\n    uint256 public constant PRICE_1 = 0.0006 ether; // paid cards 1-10\n    uint256 public constant PRICE_2 = 0.0009 ether; // paid cards 11-20\n    uint256 public constant PRICE_3 = 0.0012 ether; // paid cards 21-30\n    uint256 public constant MINT_DURATION = 7 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    /// minted per type: 0 Free, 1 Lily, 2 Golden, 3 Diamond, 4 Jade, 5 Ruby Crown, 6 Cosmic King\n    uint256[7] private _minted;\n\n    mapping(address => bool) public freeClaimed;\n    mapping(address => uint256) public paidMinted;\n\n    /// low 160 bits owner; bits 160-162 type; bits 168-183 serial within a special type\n    mapping(uint256 => uint256) private _tok;\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();\n    error MintClosed();\n    error SoldOut();\n    error PaidLimit();\n    error Underpaid();\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    /// Collection owner for marketplaces (\"claim collection\"). Fixed; there are no owner powers.\n    function owner() external view returns (address) {\n        return creator;\n    }\n\n    // ---------------- Mint ----------------\n\n    /// Price of a wallet's n-th paid card (n starts at 1)\n    function priceOf(uint256 n) public pure returns (uint256) {\n        if (n <= 10) return PRICE_1;\n        if (n <= 20) return PRICE_2;\n        return PRICE_3;\n    }\n\n    /// Cost in wei for a wallet that already bought `already` paid cards to buy `qty` more\n    function costFrom(uint256 already, uint256 qty) public pure returns (uint256 c) {\n        for (uint256 n = already + 1; n <= already + qty; ++n) c += priceOf(n);\n    }\n\n    /// Bonus frogs a wallet receives when its paid total goes from `a` to `b`: (jade, ruby, cosmic)\n    function bonusFor(uint256 a, uint256 b) public pure returns (uint256 jade, uint256 ruby, uint256 cosmic) {\n        if (a < 10 && b >= 10) jade = 3;\n        if (a < 20 && b >= 20) ruby = 5;\n        if (a < 30 && b >= 30) cosmic = 8;\n    }\n\n    /// Preview for a mint page: what `minter` gets for buying `paidQty` now, and what it costs\n    function quote(address minter, uint256 paidQty)\n        external\n        view\n        returns (bool freeCard, uint256 jade, uint256 ruby, uint256 cosmic, uint256 cost)\n    {\n        uint256 a = paidMinted[minter];\n        freeCard = !freeClaimed[minter] && AGENT_ID.balanceOf(minter) > 0;\n        (jade, ruby, cosmic) = bonusFor(a, a + paidQty);\n        cost = costFrom(a, paidQty);\n    }\n\n    /// One call: mints the free frog automatically on an Agent ID wallet's first mint, plus `paidQty` paid frogs\n    /// and any bonus frogs reached. msg.value must be at least the cost; any extra is refunded in the same transaction.\n    function mint(uint256 paidQty) external payable {\n        if (block.timestamp < mintStart || block.timestamp >= mintEnd) revert MintClosed();\n        bool free = !freeClaimed[msg.sender] && AGENT_ID.balanceOf(msg.sender) > 0;\n        if (paidQty == 0 && !free) {\n            if (freeClaimed[msg.sender]) revert NothingToMint();\n            revert NotAgent();\n        }\n        uint256 a = paidMinted[msg.sender];\n        uint256 b = a + paidQty;\n        if (b > MAX_PAID_PER_WALLET) revert PaidLimit();\n        uint256 id = totalSupply;\n        uint256 base = (free ? 1 : 0) + paidQty;\n        if (id + base > MAX_SUPPLY) revert SoldOut();\n        uint256 price = costFrom(a, paidQty);\n        if (msg.value < price) revert Underpaid();\n\n        if (free) freeClaimed[msg.sender] = true;\n        paidMinted[msg.sender] = b;\n        uint256 owned = uint256(uint160(msg.sender));\n        if (free) id = _mintType(owned, id, 0, 1);\n        for (uint256 n = a + 1; n <= b; ++n) id = _mintType(owned, id, n <= 10 ? 1 : (n <= 20 ? 2 : 3), 1);\n        (uint256 j, uint256 r, uint256 c) = bonusFor(a, b);\n        id = _mintType(owned, id, 4, _cap(id, j));\n        id = _mintType(owned, id, 5, _cap(id, r));\n        id = _mintType(owned, id, 6, _cap(id, c));\n        _balances[msg.sender] += id - totalSupply;\n        totalSupply = id;\n\n        if (price > 0) {\n            (bool ok, ) = payable(creator).call{value: price}(\"\");\n            if (!ok) revert TransferFailed();\n        }\n        if (msg.value > price) {\n            (bool ok2, ) = payable(msg.sender).call{value: msg.value - price}(\"\");\n            if (!ok2) revert TransferFailed();\n        }\n    }\n\n    function _cap(uint256 id, uint256 n) private pure returns (uint256) {\n        uint256 left = MAX_SUPPLY - id;\n        return n > left ? left : n;\n    }\n\n    function _mintType(uint256 owned, uint256 id, uint256 t, uint256 n) private returns (uint256) {\n        if (n == 0) return id;\n        uint256 serial = _minted[t];\n        for (uint256 k; k < n; ++k) {\n            ++id;\n            ++serial;\n            _tok[id] = owned | (t << 160) | (t >= 4 ? serial << 168 : 0);\n            emit Transfer(address(0), address(uint160(owned)), id);\n        }\n        _minted[t] = serial;\n        return id;\n    }\n\n    // ---------------- Views for the mint page ----------------\n\n    /// freeClaimed, paid so far, Agent ID holder, paid cards left, price of the next paid card\n    function walletInfo(address a)\n        external\n        view\n        returns (bool freeUsed, uint256 paidCount, bool eligible, uint256 paidLeft, uint256 nextPrice)\n    {\n        freeUsed = freeClaimed[a];\n        paidCount = paidMinted[a];\n        eligible = AGENT_ID.balanceOf(a) > 0;\n        paidLeft = MAX_PAID_PER_WALLET - paidCount;\n        nextPrice = paidLeft == 0 ? 0 : priceOf(paidCount + 1);\n    }\n\n    /// Minted per type: Free, Lily, Golden, Diamond, Jade, Ruby Crown, Cosmic King\n    function mintedByType() external view returns (uint256[7] memory) {\n        return _minted;\n    }\n\n    function remaining() external view returns (uint256) {\n        return MAX_SUPPLY - totalSupply;\n    }\n\n    function mintOpen() public view returns (bool) {\n        return block.timestamp >= mintStart && block.timestamp < mintEnd && totalSupply < MAX_SUPPLY;\n    }\n\n    function mintInfo() external view returns (uint256 supply, uint256 maxSupply, uint256 start, uint256 end, bool open) {\n        return (totalSupply, MAX_SUPPLY, mintStart, mintEnd, mintOpen());\n    }\n\n    /// 0 Free, 1 Lily, 2 Golden, 3 Diamond, 4 Jade, 5 Ruby Crown, 6 Cosmic King\n    function typeOf(uint256 tokenId) public view returns (uint8) {\n        ownerOf(tokenId);\n        return uint8((_tok[tokenId] >> 160) & 7);\n    }\n\n    function tokensOfOwner(address o) external view returns (uint256[] memory ids) {\n        uint256 n = _balances[o];\n        ids = new uint256[](n);\n        uint256 j;\n        uint256 ts = totalSupply;\n        for (uint256 i = 1; i <= ts && j < n; ++i) {\n            if (address(uint160(_tok[i])) == o) ids[j++] = i;\n        }\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 o) external view returns (uint256) {\n        if (o == address(0)) revert ZeroAddress();\n        return _balances[o];\n    }\n\n    function ownerOf(uint256 tokenId) public view returns (address o) {\n        o = address(uint160(_tok[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 o, address operator) external view returns (bool) {\n        return _operatorApprovals[o][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        _tok[tokenId] = (_tok[tokenId] & ~uint256(type(uint160).max)) | uint256(uint160(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 ----------------\n\n    // sprite runs: x, y, length, colour (1-4 skin outline/main/belly/dark, 5+ shared COLS)\n    bytes internal constant SPR = hex\"030306010f03060102040101090406011504010101050101160501010106010116060101010701011607010100080101170801010009010117090101000a0101170a0101000b0101170b0101000c0101170c0101000d0101170d0101000e0101170e0101000f0101170f010101100101161001010211010115110101011201011612010100130101171301010014010117140101001701010817080117170101030406020f040602020501020905060215050102020601020906060215060102020701020907060215070102010802020908060215080202010902020909060215090202010a1602010b09020b0b02020e0b0902010c0102040c1002160c0102010d0102040d1002160d0102010e0202040e1002150e0202010f0302140f03020210140203110302121103020212030213120302011304021313040201140402131404020015060212150602001607021116070206110c0305120e0305130e0305140e0306150c0307160a030117070410170704030506050f050605030606050f06060503070205070702050f0702051307020503080205070802050f08020513080205030906050f090605050702061107020605080206110802060a0b01060d0b0106020c0207140c0207020d0207140d0207030e0108140e0108040f10080a0001010d000101090101010e010101080201010f020101090301010e0301010a0401010d0401010b0502010b0202090b00020c0a01010c0d01010c0902010c0e02010c0a03010c0d03010c0b01020d0a02010d0d02010d0b03020d0b04020e080001010b0002010f000201070101010c01010111010101080202010b0202010e0203010a0301010d0301010a0401010d0401010b0502010900020e0d00020e0801040e0d01040e0a02010e0d02010e0b03020e0b04020e090002010d000201070102010f0102010602010111020101050301011203010106040c010b0002050901060f07020a0f06030c140a0001010c000101090101010d010101080201010e020101080301010e030101090405010b000109090201090d0201090b01010f0903050f0a0101110c0101110a02031107010109100101090801080a0800080b0802080b06000101080001010a0001010c0002010f00010111000101130001010601010109010101100101011301010106020101130201010603010113030101060401011304010107050c01070001090b0001090e00010912000109070102090a0106091101020907020c0907030109090303090e0303091203010907040c090c03020f080301111103011102061406020701060407100615070106020808060e080806030906060f0906060307011414070114100406090f050109160501090f060109160601090f070109160701090f080109160801090f09010916090109100a0609160b0109160c0109030506020f050602030606020f060602030706060f0706060407011107070111100701111307011104080411100804110509021111090211091002100d10021009110610091202100d1202100410010906100109081001090a1001090c1001090e10010910100109121001090b1102090a1204090b1302090510010a0710010a0910010a0b10010a0d10010a0f10010a1110010a1310010a031001050510010507100105091001050b1001050d1001050f10010511100105131001050411010506110105081101050a1101050c1101050e11010510110105121101051411010503120105041301050410010e0610010e0810010e0a10010e0c10010e0e10010e1010010e1210010e1410010e0311010e0511010e0711010e0911010e0b11010e0d11010e0f11010e1111010e1311010e0412010e0313010e0510010507100105091001050b1001050d1001050f100105111001051310010506110105081101050a1101050c1101050e1101051011010512110105\";\n    bytes internal constant IDX = hex\"00000078009000a600b300c400c900eb00f50103010901110116012901510160\";\n    bytes internal constant COLS = \"#ffffff#15141c#ff8fa8#e0435a#ffd23f#e8a417#fff2a8#ff6fa8#ffc2dc#3fae4f#4f8bff#8e5bff#ff4f6d#b3263c#7a4a2a#f4f6fa#c9d1db#7fe3ff#ff8a3d#2b2d42\";\n    bytes internal constant SKINS = \"#24470f#8bd346#eaf8b8#5e9e25#0f4a44#3cbfa8#cdf7ee#248f7d#17361a#4caf50#dff3c0#2f7d34#2e1a5e#9b6cdb#eadcff#7044b5#15325e#5ea4ff#e2efff#3a78d6#5a2a0a#ff9a3d#ffe9c8#d06a1e#6a1f48#ff8fc4#ffeaf4#e0609e#5a4a08#f2d33c#fff8cc#c9a81a#2a2e36#9aa3ad#eef1f5#6e7782#07070c#34324a#6b6888#221f33#0a3a26#2fbf8a#c8ffe6#1c8a60#4a0812#e23b4e#ffd6dc#a51f33#1e1260#9a7cff#eee6ff#6b4ce0\";\n    bytes internal constant BGS = \"#c8f2dc#cfe6ff#e4d6ff#fff2b3#ffd9c2#ffd1e1#bfeee8#efe3cf\";\n    bytes internal constant W_SKIN = hex\"281e1a161612100e0a06\";\n    bytes internal constant W_HAT = hex\"5028221a180000\";\n    bytes internal constant W_EYES = hex\"6e22161a10\";\n    bytes internal constant W_NECK = hex\"5a241a1c16\";\n    bytes internal constant HAT_SPR = hex\"00010203040506\";\n    bytes internal constant EYE_SPR = hex\"000708090a\";\n    bytes internal constant NECK_SPR = hex\"000b0c0d0e\";\n\n    struct Look {\n        uint256 skin;\n        uint256 hat;\n        uint256 eyes;\n        uint256 neck;\n        uint256 bg;\n    }\n\n    function _pick(uint256 r, bytes memory w) internal pure returns (uint256 i) {\n        uint256 total;\n        for (uint256 k; k < w.length; ++k) total += uint8(w[k]);\n        r %= total;\n        uint256 acc;\n        for (; i < w.length; ++i) {\n            acc += uint8(w[i]);\n            if (r < acc) return i;\n        }\n        return w.length - 1;\n    }\n\n    /// Traits come only from the token id; the three bonus types have fixed looks\n    function _look(uint256 id, uint256 t) internal pure returns (Look memory l) {\n        if (t == 4) return Look(10, 5, 0, 2, 0);\n        if (t == 5) return Look(11, 6, 0, 2, 0);\n        if (t == 6) return Look(12, 6, 1, 2, 0);\n        uint256 h = uint256(keccak256(abi.encodePacked(\"PFROG\", id)));\n        l.skin = _pick(h & 0xffff, W_SKIN);\n        l.hat = _pick((h >> 16) & 0xffff, W_HAT);\n        l.eyes = _pick((h >> 32) & 0xffff, W_EYES);\n        l.neck = _pick((h >> 48) & 0xffff, W_NECK);\n        l.bg = (h >> 64) % 8;\n    }\n\n    function _put(bytes memory buf, uint256 w, bytes memory x) internal pure returns (uint256) {\n        uint256 n = x.length;\n        assembly {\n            let dst := add(add(buf, 32), w)\n            let src := add(x, 32)\n            for { let i := 0 } lt(i, n) { i := add(i, 32) } { mstore(add(dst, i), mload(add(src, i))) }\n        }\n        return w + n;\n    }\n\n    function _num(bytes memory b, uint256 p, uint256 v) private pure returns (uint256) {\n        if (v >= 10) b[p++] = bytes1(uint8(48 + v / 10));\n        b[p++] = bytes1(uint8(48 + v % 10));\n        return p;\n    }\n\n    /// Writes one sprite as stroked 1-pixel runs, one <path> per colour (runs are sorted by colour)\n    function _sprite(bytes memory buf, uint256 w, bytes memory spr, bytes memory idx, bytes memory pal, uint256 s) private pure returns (uint256) {\n        uint256 a = (uint256(uint8(idx[2 * s])) << 8) | uint8(idx[2 * s + 1]);\n        uint256 e = (uint256(uint8(idx[2 * s + 2])) << 8) | uint8(idx[2 * s + 3]);\n        uint256 prev;\n        for (uint256 i = a; i < e; ++i) {\n            uint256 q = 4 * i;\n            uint256 c = uint8(spr[q + 3]);\n            if (c != prev) {\n                if (prev != 0) w = _put(buf, w, '\"/>');\n                w = _put(buf, w, '<path stroke=\"');\n                for (uint256 k; k < 7; ++k) buf[w + k] = pal[(c - 1) * 7 + k];\n                w = _put(buf, w + 7, '\" d=\"');\n                prev = c;\n            }\n            buf[w++] = \"M\";\n            w = _num(buf, w, uint8(spr[q]));\n            buf[w++] = \" \";\n            w = _num(buf, w, uint8(spr[q + 1]));\n            w = _put(buf, w, \".5h\");\n            w = _num(buf, w, uint8(spr[q + 2]));\n        }\n        if (prev != 0) w = _put(buf, w, '\"/>');\n        return w;\n    }\n\n    function _slice(bytes memory src, uint256 start, uint256 len) internal pure returns (bytes memory o) {\n        o = new bytes(len);\n        for (uint256 i; i < len; ++i) o[i] = src[start + i];\n    }\n\n    function _frog(Look memory l) internal pure returns (bytes memory buf) {\n        bytes memory spr = SPR;\n        bytes memory idx = IDX;\n        bytes memory pal = bytes.concat(_slice(SKINS, l.skin * 28, 28), COLS);\n        buf = new bytes(9000);\n        uint256 w = _put(buf, 0, '<g transform=\"translate(72 92) scale(14)\" shape-rendering=\"crispEdges\" fill=\"none\">');\n        w = _sprite(buf, w, spr, idx, pal, 0);\n        if (l.neck != 0) w = _sprite(buf, w, spr, idx, pal, uint8(NECK_SPR[l.neck]));\n        if (l.eyes != 0) w = _sprite(buf, w, spr, idx, pal, uint8(EYE_SPR[l.eyes]));\n        if (l.hat != 0) w = _sprite(buf, w, spr, idx, pal, uint8(HAT_SPR[l.hat]));\n        w = _put(buf, w, \"</g>\");\n        assembly { mstore(buf, w) }\n    }\n\n    string internal constant HOLO =\n        '<linearGradient id=\"g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" spreadMethod=\"reflect\"><stop offset=\"0\" stop-color=\"#fff6c2\"/><stop offset=\".2\" stop-color=\"#f2b320\"/><stop offset=\".4\" stop-color=\"#ff9ad5\"/><stop offset=\".6\" stop-color=\"#8cf0ff\"/><stop offset=\".8\" stop-color=\"#b6ff9a\"/><stop offset=\"1\" stop-color=\"#c9a0ff\"/><animate attributeName=\"x1\" values=\"0;1;0\" dur=\"4s\" repeatCount=\"indefinite\"/><animate attributeName=\"x2\" values=\"1;2;1\" dur=\"4s\" repeatCount=\"indefinite\"/></linearGradient>';\n    string internal constant GOLD =\n        '<linearGradient id=\"g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\"><stop offset=\"0\" stop-color=\"#fff6c2\"/><stop offset=\".3\" stop-color=\"#f2b320\"/><stop offset=\".55\" stop-color=\"#fff1a8\"/><stop offset=\".8\" stop-color=\"#c98a0c\"/><stop offset=\"1\" stop-color=\"#ffe27a\"/></linearGradient>';\n    string internal constant SPARKS =\n        '<g fill=\"#fff6c8\"><path d=\"M60 120l5 12 12 5-12 5-5 12-5-12-12-5 12-5zM420 210l4 9 9 4-9 4-4 9-4-9-9-4 9-4zM404 380l4 9 9 4-9 4-4 9-4-9-9-4 9-4zM78 330l3 7 7 3-7 3-3 7-3-7-7-3 7-3z\"/><animate attributeName=\"opacity\" values=\".2;1;.2\" dur=\"2.4s\" repeatCount=\"indefinite\"/></g>';\n\n    function _badge(string memory label, string memory fill, string memory ink, uint256 wpx) internal pure returns (string memory) {\n        string memory x = _u(452 - wpx);\n        return string.concat(\n            '<rect x=\"', x, '\" y=\"28\" width=\"', _u(wpx), '\" height=\"28\" rx=\"14\" fill=\"', fill,\n            '\"/><text x=\"', _u(452 - wpx / 2), '\" y=\"47\" font-size=\"14\" fill=\"', ink, '\" text-anchor=\"middle\" letter-spacing=\"2\">', label, \"</text>\"\n        );\n    }\n\n    function _specialName(uint256 t) internal pure returns (string memory) {\n        if (t == 4) return \"JADE FROG\";\n        if (t == 5) return \"RUBY CROWN FROG\";\n        return \"COSMIC KING FROG\";\n    }\n\n    function _pad4(uint256 v) internal pure returns (string memory) {\n        string memory s = _u(v);\n        uint256 n = bytes(s).length;\n        if (n >= 4) return s;\n        if (n == 3) return string.concat(\"0\", s);\n        if (n == 2) return string.concat(\"00\", s);\n        return string.concat(\"000\", s);\n    }\n\n    function _special(uint256 id, uint256 t, uint256 serial, string memory frog) internal pure returns (string memory) {\n        string memory ink = t == 4 ? \"#b8ffdf\" : (t == 5 ? \"#ffd27a\" : \"#e6dcff\");\n        string memory head = string.concat(\n            '<defs>', HOLO, '<radialGradient id=\"b\" cx=\".5\" cy=\".45\" r=\".7\"><stop offset=\"0\" stop-color=\"', t == 4 ? \"#0f4a33\" : (t == 5 ? \"#6a1020\" : \"#221a66\"),\n            '\"/><stop offset=\"1\" stop-color=\"', t == 4 ? \"#06261a\" : (t == 5 ? \"#2e0610\" : \"#0b0826\"),\n            '\"/></radialGradient></defs><rect width=\"480\" height=\"480\" fill=\"url(#b)\"/>',\n            t == 6 ? '<g fill=\"#fff\"><circle cx=\"70\" cy=\"90\" r=\"2\"/><circle cx=\"400\" cy=\"120\" r=\"1.6\"/><circle cx=\"120\" cy=\"300\" r=\"1.4\"/><circle cx=\"380\" cy=\"320\" r=\"2\"/><circle cx=\"250\" cy=\"70\" r=\"1.4\"/><circle cx=\"440\" cy=\"250\" r=\"1.4\"/><circle cx=\"40\" cy=\"220\" r=\"1.6\"/></g>' : \"\",\n            SPARKS\n        );\n        string memory tail = string.concat(\n            '<rect x=\"10\" y=\"10\" width=\"460\" height=\"460\" rx=\"24\" fill=\"none\" stroke=\"url(#g)\" stroke-width=\"20\"/><text x=\"240\" y=\"60\" font-size=\"24\" fill=\"', ink,\n            '\" text-anchor=\"middle\" letter-spacing=\"3\">', _specialName(t), '</text><text x=\"240\" y=\"458\" font-size=\"16\" fill=\"', ink, '\" text-anchor=\"middle\" letter-spacing=\"2\">No. ',\n            _pad4(serial)\n        );\n        return string.concat(head, frog, tail, '</text><text x=\"36\" y=\"458\" font-size=\"11\" fill=\"', ink, '\" opacity=\".7\">#', _u(id), \"</text>\");\n    }\n\n    function _svg(uint256 id, uint256 t, uint256 serial) internal pure returns (string memory) {\n        Look memory l = _look(id, t);\n        string memory frog = string(_frog(l));\n        string memory body;\n        if (t < 4) {\n            string memory bg = string(_slice(BGS, l.bg * 7, 7));\n            string memory label = string.concat('<text x=\"36\" y=\"48\" font-size=\"17\" fill=\"#1f2a1c\" opacity=\".8\">PIXEL FROGS #', _u(id), \"</text>\");\n            if (t == 0) {\n                body = string.concat('<rect width=\"480\" height=\"480\" fill=\"', bg, '\"/>', frog,\n                    '<rect x=\"8\" y=\"8\" width=\"464\" height=\"464\" rx=\"22\" fill=\"none\" stroke=\"#ffffff\" stroke-opacity=\".7\" stroke-width=\"4\"/>', label);\n            } else if (t == 1) {\n                body = string.concat('<rect width=\"480\" height=\"480\" fill=\"', bg, '\"/>', frog,\n                    '<rect x=\"9\" y=\"9\" width=\"462\" height=\"462\" rx=\"22\" fill=\"none\" stroke=\"#3fae4f\" stroke-width=\"18\"/><g fill=\"#2f8f3e\"><circle cx=\"34\" cy=\"446\" r=\"20\"/><circle cx=\"446\" cy=\"446\" r=\"20\"/></g><g fill=\"#ff8fc4\"><circle cx=\"34\" cy=\"446\" r=\"6\"/><circle cx=\"446\" cy=\"446\" r=\"6\"/></g>',\n                    _badge(\"LILY\", \"#3fae4f\", \"#ffffff\", 84), label);\n            } else if (t == 2) {\n                body = string.concat('<defs>', GOLD, '</defs><rect width=\"480\" height=\"480\" fill=\"', bg, '\"/>', frog,\n                    '<rect x=\"9\" y=\"9\" width=\"462\" height=\"462\" rx=\"22\" fill=\"none\" stroke=\"url(#g)\" stroke-width=\"18\"/><rect x=\"19\" y=\"19\" width=\"442\" height=\"442\" rx=\"14\" fill=\"none\" stroke=\"#b07a0c\" stroke-width=\"2\"/>',\n                    _badge(\"GOLDEN\", \"url(#g)\", \"#5a3a00\", 104), label);\n            } else {\n                body = string.concat('<defs>', HOLO, '</defs><rect width=\"480\" height=\"480\" fill=\"', bg, '\"/><rect width=\"480\" height=\"480\" fill=\"url(#g)\" opacity=\".28\"/>', SPARKS, frog,\n                    '<rect x=\"10\" y=\"10\" width=\"460\" height=\"460\" rx=\"24\" fill=\"none\" stroke=\"url(#g)\" stroke-width=\"20\"/>',\n                    _badge(\"DIAMOND\", \"url(#g)\", \"#3a2a5a\", 116), label);\n            }\n        } else {\n            body = _special(id, t, serial, frog);\n        }\n        return string.concat('<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 480 480\" font-family=\"monospace\" font-weight=\"bold\">', body, \"</svg>\");\n    }\n\n    /// Raw SVG for any traits id and type (0-6), for previews and the mint page\n    function previewSVG(uint256 traitsId, uint256 t) external pure returns (string memory) {\n        return _svg(traitsId, t % 7, 1);\n    }\n\n    // ---------------- Metadata ----------------\n\n    function _skinName(uint256 i) internal pure returns (string memory) {\n        if (i == 0) return \"Leaf Green\";\n        if (i == 1) return \"Pond Teal\";\n        if (i == 2) return \"Forest\";\n        if (i == 3) return \"Grape\";\n        if (i == 4) return \"Sky\";\n        if (i == 5) return \"Tangerine\";\n        if (i == 6) return \"Bubblegum\";\n        if (i == 7) return \"Lemon\";\n        if (i == 8) return \"Stone\";\n        if (i == 9) return \"Midnight\";\n        if (i == 10) return \"Jade\";\n        if (i == 11) return \"Ruby\";\n        return \"Cosmic\";\n    }\n\n    function _hatName(uint256 i) internal pure returns (string memory) {\n        if (i == 0) return \"None\";\n        if (i == 1) return \"Lotus\";\n        if (i == 2) return \"Sprout\";\n        if (i == 3) return \"Beanie\";\n        if (i == 4) return \"Party Hat\";\n        if (i == 5) return \"Halo\";\n        return \"Crown\";\n    }\n\n    function _eyeName(uint256 i) internal pure returns (string memory) {\n        if (i == 0) return \"Normal\";\n        if (i == 1) return \"Shades\";\n        if (i == 2) return \"Monocle\";\n        if (i == 3) return \"Sleepy\";\n        return \"Hearts\";\n    }\n\n    function _neckName(uint256 i) internal pure returns (string memory) {\n        if (i == 0) return \"None\";\n        if (i == 1) return \"Bowtie\";\n        if (i == 2) return \"Gold Chain\";\n        if (i == 3) return \"Scarf\";\n        return \"Pearls\";\n    }\n\n    function _bgName(uint256 i) internal pure returns (string memory) {\n        if (i == 0) return \"Mint\";\n        if (i == 1) return \"Sky\";\n        if (i == 2) return \"Lilac\";\n        if (i == 3) return \"Butter\";\n        if (i == 4) return \"Peach\";\n        if (i == 5) return \"Rose\";\n        if (i == 6) return \"Pond\";\n        return \"Sand\";\n    }\n\n\n    function _typeName(uint256 t) internal pure returns (string memory) {\n        if (t == 0) return \"Free\";\n        if (t == 1) return \"Lily\";\n        if (t == 2) return \"Golden\";\n        if (t == 3) return \"Diamond\";\n        if (t == 4) return \"Jade Frog\";\n        if (t == 5) return \"Ruby Crown Frog\";\n        return \"Cosmic King Frog\";\n    }\n\n    function _attr(string memory k, string memory v) internal pure returns (string memory) {\n        return string.concat('{\"trait_type\":\"', k, '\",\"value\":\"', v, '\"},');\n    }\n\n    function tokenURI(uint256 tokenId) external view returns (string memory) {\n        ownerOf(tokenId);\n        uint256 t = (_tok[tokenId] >> 160) & 7;\n        uint256 serial = (_tok[tokenId] >> 168) & 0xffff;\n        Look memory l = _look(tokenId, t);\n        string memory attrs = string.concat(\n            _attr(\"Type\", _typeName(t)),\n            _attr(\"Skin\", _skinName(l.skin)),\n            _attr(\"Head\", _hatName(l.hat)),\n            _attr(\"Eyes\", _eyeName(l.eyes)),\n            _attr(\"Neck\", _neckName(l.neck)),\n            t < 4 ? _attr(\"Background\", _bgName(l.bg)) : _attr(\"Serial\", _pad4(serial))\n        );\n        bytes memory json = abi.encodePacked(\n            '{\"name\":\"', t < 4 ? \"PIXEL FROGS\" : _specialName(t), \" #\", _u(tokenId),\n            '\",\"description\":\"PIXEL FROGS: 10,000 fully on-chain pixel frogs on BNB Chain. Free for .ai Agent ID holders; paid frogs have Lily, Golden and Diamond frames; Jade, Ruby Crown and Cosmic King frogs are bonus-only. No admin. A collectible, not an investment.\",',\n            '\"attributes\":[', attrs, '{\"trait_type\":\"Collection\",\"value\":\"PIXEL FROGS\"}],',\n            '\"image\":\"data:image/svg+xml;base64,', _b64(bytes(_svg(tokenId, t, serial))), '\"}'\n        );\n        return string.concat(\"data:application/json;base64,\", _b64(json));\n    }\n\n    /// Collection-level metadata (name, image, royalty) for marketplaces\n    function contractURI() external view returns (string memory) {\n        bytes memory json = abi.encodePacked(\n            '{\"name\":\"PIXEL FROGS\",\"description\":\"10,000 fully on-chain pixel frogs. 1 free per .ai Agent ID wallet; paid 0.0006 / 0.0009 / 0.0012 BNB (cards 1-10 / 11-20 / 21-30 per wallet, max 30); bonus +3 Jade at 10, +5 Ruby Crown at 20, +8 Cosmic King at 30. No admin.\",\"image\":\"data:image/svg+xml;base64,',\n            _b64(bytes(_svg(6, 6, 1))), '\",\"seller_fee_basis_points\":100,\"fee_recipient\":\"', _addr(creator), '\"}'\n        );\n        return string.concat(\"data:application/json;base64,\", _b64(json));\n    }\n\n    function _u(uint256 v) internal pure returns (string memory) {\n        if (v == 0) return \"0\";\n        uint256 t = v;\n        uint256 len;\n        while (t != 0) { len++; t /= 10; }\n        bytes memory o = new bytes(len);\n        while (v != 0) { len--; o[len] = bytes1(uint8(48 + v % 10)); v /= 10; }\n        return string(o);\n    }\n\n    function _addr(address a) internal pure returns (string memory) {\n        bytes memory o = new bytes(42);\n        bytes memory h = \"0123456789abcdef\";\n        o[0] = \"0\";\n        o[1] = \"x\";\n        uint160 v = uint160(a);\n        for (uint256 i; i < 20; ++i) {\n            uint8 x = uint8(v >> (8 * (19 - i)));\n            o[2 + 2 * i] = h[x >> 4];\n            o[3 + 2 * i] = h[x & 15];\n        }\n        return string(o);\n    }\n\n    /// Base64 (adapted from OpenZeppelin Contracts, MIT)\n    function _b64(bytes memory data) internal pure returns (string memory result) {\n        if (data.length == 0) return \"\";\n        string memory table = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n        result = new string(4 * ((data.length + 2) / 3));\n        assembly {\n            let tablePtr := add(table, 1)\n            let resultPtr := add(result, 32)\n            let dataPtr := data\n            let endPtr := add(data, mload(data))\n            let afterCache := mload(add(endPtr, 0x20))\n            mstore(add(endPtr, 0x20), 0x00)\n            for {} lt(dataPtr, endPtr) {} {\n                dataPtr := add(dataPtr, 3)\n                let input := mload(dataPtr)\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))\n                mstore8(add(resultPtr, 1), mload(add(tablePtr, and(shr(12, input), 0x3F))))\n                mstore8(add(resultPtr, 2), mload(add(tablePtr, and(shr(6, input), 0x3F))))\n                mstore8(add(resultPtr, 3), mload(add(tablePtr, and(input, 0x3F))))\n                resultPtr := add(resultPtr, 4)\n            }\n            mstore(add(endPtr, 0x20), afterCache)\n            switch mod(mload(data), 3)\n            case 1 {\n                mstore8(sub(resultPtr, 1), 0x3d)\n                mstore8(sub(resultPtr, 2), 0x3d)\n            }\n            case 2 {\n                mstore8(sub(resultPtr, 1), 0x3d)\n            }\n        }\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":"PaidLimit","type":"error","inputs":[]},{"name":"SoldOut","type":"error","inputs":[]},{"name":"TransferFailed","type":"error","inputs":[]},{"name":"Underpaid","type":"error","inputs":[]},{"name":"UnsafeRecipient","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_1","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PRICE_2","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PRICE_3","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":"o","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"bonusFor","type":"function","inputs":[{"name":"a","type":"uint256","internalType":"uint256"},{"name":"b","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"jade","type":"uint256","internalType":"uint256"},{"name":"ruby","type":"uint256","internalType":"uint256"},{"name":"cosmic","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"contractURI","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"costFrom","type":"function","inputs":[{"name":"already","type":"uint256","internalType":"uint256"},{"name":"qty","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"c","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"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":"o","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":"mintInfo","type":"function","inputs":[],"outputs":[{"name":"supply","type":"uint256","internalType":"uint256"},{"name":"maxSupply","type":"uint256","internalType":"uint256"},{"name":"start","type":"uint256","internalType":"uint256"},{"name":"end","type":"uint256","internalType":"uint256"},{"name":"open","type":"bool","internalType":"bool"}],"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":"mintedByType","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256[7]","internalType":"uint256[7]"}],"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":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"o","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"paidMinted","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"previewSVG","type":"function","inputs":[{"name":"traitsId","type":"uint256","internalType":"uint256"},{"name":"t","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"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":"paidQty","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"freeCard","type":"bool","internalType":"bool"},{"name":"jade","type":"uint256","internalType":"uint256"},{"name":"ruby","type":"uint256","internalType":"uint256"},{"name":"cosmic","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":"tokensOfOwner","type":"function","inputs":[{"name":"o","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"},{"name":"typeOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"walletInfo","type":"function","inputs":[{"name":"a","type":"address","internalType":"address"}],"outputs":[{"name":"freeUsed","type":"bool","internalType":"bool"},{"name":"paidCount","type":"uint256","internalType":"uint256"},{"name":"eligible","type":"bool","internalType":"bool"},{"name":"paidLeft","type":"uint256","internalType":"uint256"},{"name":"nextPrice","type":"uint256","internalType":"uint256"}],"stateMutability":"view"}],"matchId":"58017318","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-11-01T23:23:47Z","match":"exact_match","chainId":"56","address":"0xBd144C91F0bcA43Ee86a47a07488710D33281E8b"}