{"sources":{"PixelCatClub.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 CAT CLUB (PCAT) - 10,000 fully on-chain pixel cats for .ai Agent ID holders.\n/// Rules are fixed in code and cannot be changed by anyone:\n/// - Only addresses holding a Binance / SPACE ID .ai Agent ID can mint\n/// - Total supply 10,000. Mint is open for 5 days after deploy, then closes forever\n/// - Free card: 2 per wallet, gas only (plain cat)\n/// - Normal card: 0.00085 BNB each (silver frame). Each normal card has a fixed 10% chance to become Premium\n/// - Premium card: 0.0017 BNB each, guaranteed Premium (gold holo frame)\n/// - Max 10 paid cards per wallet (normal + premium combined)\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 PixelCatClub {\n    string public constant name = \"PIXEL CAT CLUB\";\n    string public constant symbol = \"PCAT\";\n\n    uint256 public constant MAX_SUPPLY = 10000;\n    uint256 public constant FREE_PER_WALLET = 2;\n    uint256 public constant MAX_PAID_PER_WALLET = 10;\n    uint256 public constant NORMAL_PRICE = 0.00085 ether;\n    uint256 public constant PREMIUM_PRICE = 0.0017 ether;\n    uint256 public constant PREMIUM_CHANCE_BPS = 1000; // 10.00% for each normal card\n    uint256 public constant MINT_DURATION = 5 days;\n    uint96 public constant ROYALTY_BPS = 100; // 1%\n\n    IAgentId public constant AGENT_ID = IAgentId(0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F);\n\n    address public immutable creator;\n    uint256 public immutable mintStart;\n    uint256 public immutable mintEnd;\n\n    uint256 public totalSupply;\n    uint256 public freeMinted;\n    uint256 public silverMinted; // normal cards that stayed normal\n    uint256 public premiumMinted; // all premium cards (bought + lucky)\n    uint256 public luckyUpgrades; // normal cards that became premium\n\n    mapping(address => uint256) public freeUsed;\n    mapping(address => uint256) public paidMinted;\n\n    /// low 160 bits owner; bits 160-161 tier (0 Free, 1 Silver, 2 Premium); bit 162 lucky upgrade\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    event LuckyPremium(address indexed minter, uint256 indexed tokenId);\n\n    error NotAgent();\n    error MintClosed();\n    error SoldOut();\n    error FreeLimit();\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    /// Cost in wei of `normalCount` normal cards plus `premiumCount` premium cards. Free cards cost nothing.\n    function cost(uint256 normalCount, uint256 premiumCount) public pure returns (uint256) {\n        return normalCount * NORMAL_PRICE + premiumCount * PREMIUM_PRICE;\n    }\n\n    /// One call mints any mix: free cards (max 2 per wallet), normal cards and premium cards (max 10 paid per wallet).\n    /// msg.value must be at least cost(normalCount, premiumCount); any extra is refunded in the same transaction.\n    function mint(uint256 freeCount, uint256 normalCount, uint256 premiumCount) external payable {\n        if (block.timestamp < mintStart || block.timestamp >= mintEnd) revert MintClosed();\n        if (AGENT_ID.balanceOf(msg.sender) == 0) revert NotAgent();\n        uint256 n = freeCount + normalCount + premiumCount;\n        if (n == 0) revert NothingToMint();\n        uint256 f = freeUsed[msg.sender] + freeCount;\n        if (f > FREE_PER_WALLET) revert FreeLimit();\n        uint256 p = paidMinted[msg.sender] + normalCount + premiumCount;\n        if (p > MAX_PAID_PER_WALLET) revert PaidLimit();\n        uint256 id = totalSupply;\n        if (id + n > MAX_SUPPLY) revert SoldOut();\n        uint256 price = cost(normalCount, premiumCount);\n        if (msg.value < price) revert Underpaid();\n\n        freeUsed[msg.sender] = f;\n        paidMinted[msg.sender] = p;\n        uint256 owned = uint256(uint160(msg.sender));\n        for (uint256 k; k < freeCount; ++k) {\n            _tok[++id] = owned;\n            emit Transfer(address(0), msg.sender, id);\n        }\n        if (normalCount > 0) {\n            uint256 seed = uint256(keccak256(abi.encodePacked(block.prevrandao, blockhash(block.number - 1), msg.sender)));\n            uint256 lucky;\n            for (uint256 k; k < normalCount; ++k) {\n                ++id;\n                if (uint256(keccak256(abi.encodePacked(seed, id))) % 10000 < PREMIUM_CHANCE_BPS) {\n                    _tok[id] = owned | (uint256(2) << 160) | (uint256(1) << 162);\n                    ++lucky;\n                    emit LuckyPremium(msg.sender, id);\n                } else {\n                    _tok[id] = owned | (uint256(1) << 160);\n                }\n                emit Transfer(address(0), msg.sender, id);\n            }\n            silverMinted += normalCount - lucky;\n            luckyUpgrades += lucky;\n            premiumMinted += lucky;\n        }\n        for (uint256 k; k < premiumCount; ++k) {\n            _tok[++id] = owned | (uint256(2) << 160);\n            emit Transfer(address(0), msg.sender, id);\n        }\n        freeMinted += freeCount;\n        premiumMinted += premiumCount;\n        _balances[msg.sender] += n;\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    // ---------------- Views for the mint page ----------------\n\n    /// freeUsed / paidCount so far, whether the wallet holds an Agent ID, and what it can still mint\n    function walletInfo(address a)\n        external\n        view\n        returns (uint256 freeUsedCount, uint256 paidCount, bool eligible, uint256 freeLeft, uint256 paidLeft)\n    {\n        freeUsedCount = freeUsed[a];\n        paidCount = paidMinted[a];\n        eligible = AGENT_ID.balanceOf(a) > 0;\n        freeLeft = FREE_PER_WALLET - freeUsedCount;\n        paidLeft = MAX_PAID_PER_WALLET - paidCount;\n    }\n\n    /// Prices in wei (BNB) and the fixed premium chance of a normal card in basis points\n    function prices() external pure returns (uint256 normalPrice, uint256 premiumPrice, uint256 premiumChanceBps) {\n        return (NORMAL_PRICE, PREMIUM_PRICE, PREMIUM_CHANCE_BPS);\n    }\n\n    /// Minted per tier. premium includes lucky upgrades; lucky is the subset of premium that came from normal cards\n    function mintedByTier() external view returns (uint256 free, uint256 silver, uint256 premium, uint256 lucky) {\n        return (freeMinted, silverMinted, premiumMinted, luckyUpgrades);\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    /// Everything a mint page needs in one call\n    function mintInfo()\n        external\n        view\n        returns (uint256 supply, uint256 maxSupply, uint256 start, uint256 end, bool open)\n    {\n        return (totalSupply, MAX_SUPPLY, mintStart, mintEnd, mintOpen());\n    }\n\n    /// 0 Free, 1 Silver (normal), 2 Premium\n    function tierOf(uint256 tokenId) public view returns (uint8) {\n        ownerOf(tokenId);\n        return uint8((_tok[tokenId] >> 160) & 3);\n    }\n\n    /// true when a normal card was upgraded to Premium by the 10% draw\n    function isLucky(uint256 tokenId) public view returns (bool) {\n        ownerOf(tokenId);\n        return (_tok[tokenId] >> 162) & 1 == 1;\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 fur outline/main/light/dark, 5+ shared COLS)\n    bytes internal constant SPR = hex\"1c0f02011b1001011e1001011a1101011f1101011a1201011f1201011b1301011e1301011b1401011e1401011a1501011e150101191601011d160101191701011c170101181801011c180101171901011b190101171a01011a1a0101161b0101191b0101171c02011c1002021b1104021b1201021d1202021c1302021c1402021c1502021a1602021a1702021918030218190202181a0202171b02021c1201041b1501041c1601041a190104050301011a0301010404010106040101190401011b0401010405010107050101180501011b0501010406010108060101170601011b0601010407010109070e011b070101040801011b080101030901011c090101030a01011c0a0101030b01011c0b0101030c01011c0c0101030d01011c0d0101030e01011c0e0101030f01011c0f0101031001010d1001010f100201121001011c100101041101010e110101111101011b110101051201011a120101061302010a130c011813020106140101191401010615010119150101051601011a160101051701011a170101051801011a180101051901011a190101051a01010f1a02011a1a0101061b01010f1b0201191b0101071c0801111c0801050401021a04010205050202190502020506010207060102180601021a0601020507010208070102170701021a07010205080102080805020e080402130805021a08010204090202080905020e090402130905021a090202040a0b02110a0b02040b1802040c03020a0c0c02190c0302040d03020a0d0c02190d0302040e03020a0e0c02190e0302040f0102070f0502140f05021b0f01020410070215100702051106021511060206120802121208020813020216130202071405021414050207150502141505020616060214160602061706021417060206180602141806020619060214190602061a0602141a0602071b01020a1b0202141b0202181b01020c0f0303110f03030b1002030e10010311100103131002030b1103030f110203121103030e1204030c1408030c1508030c1608030c1708030c1808030c1908030c1a0303111a0303081b02030c1b0303111b0303161b02030d080104120801040d090104120901040f0a020406060105190601050607020518070205060802051808020506090205180902050f0f0205080c0206170c0206070d0306160d0306070e0306160e0306070c0107160c0107050f0208190f02080e000101100001010d010101110101010d020101110201010c030101120301010c040101120401010b050101130501010b060101130601010c0707010f01010a0e02030a0d03020a1003020a0d04010a1104010a0c05070a0f00010b0e01010b1001010b0f03010b0d06050b0e04030d0c06010d1206010d150203011a02030114030101180302011d030101140401011e040101140501011e050101140601011e06010115070101190702011e070101160803011b080301150303051a030305150401051d040105150501051d050105150601051d060105160703051b0703051904010a1805030a1906010a160403161a040316160502161b050216160603161a0603160f0001010e010101100101010b02030111020301090302011403020108040101160401010705010117050101060601011806010106070101190701010608010119080101070912010f0101070e0203070b03090d09040d0d08050f0d0706110d0707121307081213170101011901010116020101180201011a020101150301011b030101160401011a0401011505010117050101190501011b05010116060101180601011a060101170701011702010b1902010b1603020b1903020b1704010b1904010b1605010b1805010b1a05010b1706010c18030118180401180c0101010f01010112010101150101010b0201010d0202011002020113020201160201010b0301010e0301011103010114030101170301010b040101170401010b050101170501010b060101170601010c070b010d05010a1305010a1005010d0c0201100f02011012020110150201100c0302100f03021012030210150302100c040b100c0501100e05021011050210140503100c060b10090001010e000201140002010801010116010101080201011702010109030101160301010a040101150401010a050101150501010a060101150601010b070a010b050a120a0004131000041309010d1309020e130a030c130b040a130b060a130b020a0e0903020e1503020e0804010e1704010e0705010e1805010e0606010e1906010e0607010e1907010e0608010e1908010e0509030e1809030e040a050e170a050e040b010e070b020e170b020e1b0b010e040c010e070c020e170c020e1b0c010e040d050e170d050e050b0216190b0216050c0216190c0216060b0509150b0509050c01090b0c0109140c01091a0c0109050d01090b0d0a091a0d0109050e01090b0e0109140e01091a0e0109060f0509150f0509060d0207180d0207040b1809050c0709140c0709050d0109080d0409140d04091a0d0109060e0509150e0509060b020a090b020a150b020a180b020a050c010a080c010a0b0c0a0a170c010a1a0c010a050d010a0b0d010a140d010a1a0d010a060e010a0a0e010a150e010a190e010a070f010a090f010a160f010a180f010a0810010a1710010a060c0216090c0216150c0216180c0216060d0516150d0516070e0316160e0316080f0116170f0116080a010b170a010b070b030b160b030b040c180b060d050b150d050b060e020b090e020b150e020b180e020b050f010b0b0f010b140f010b1a0f010b150b0510140c01101a0c0110140d01101a0d0110140e01101a0e0110150f05101a1001101a1101101912011009120e010813010117130101081401011714010109150501121505010d160101121601010e170101111701010f1802010f16020909130e0a09140e0a0e1504100e160110111601100f17021008120f010713010117130101071401011714010108150b0117150101121601011716010112170101171701011218010117180101121901011419020117190101131a0101161a01010813020d0b13020d0e13020d1113020d1413030d0814020d0b14020d0e14020d1114020d1414030d1315010d1515020d1316020d1616010d1317010d1517020d1318040d0a1301130d13011310130113131301130a1401130d140113101401131314011314150113151601131417011313190113161901130d120201131202010c1301010f130401151301010c140101151401010c150101151501010c1601010f160401151601010d170201131702010d13020e1313020e0d14030e1214030e0d15030e1215030e0d16020e1316020e10140216101502160315010102160101041601010616050102170101051701010b170101031801010c18010102190101051901010b190101021a0101041a0101061a0501031b01010a180109031601150317021506170515041806150b1801150319021506190515031a011502150401011601010616010100170101071701010018010107180201001901010719010109190101011a0101061a0101081a01010a1a0201021b0401091b01010c1b01010a1c020103170113021801130518011303190113021604160117021604170316011801160318021606180116011902160419031608190116021a0416091a01160a1b0216091301100b1301100d1301100f130110111301101313011015130110171301100a1401100c1401100e140110101401101214011014140110161401100b1501100d1501100f1501101115011013150110151501100f1602100e170110111701100f1802100f170211\";\n    bytes internal constant IDX = hex\"0000002b00dc00fa011d01370154017a019201b101c001cb01ec01fb0206021902490261027a029c02b6\";\n    bytes internal constant COLS = \"#ff8fa8#2a1b2e#ffffff#ff9eb5#111018#ff4f6d#ffd23f#4fc97a#4f8bff#9a6bff#7a4a2a#f2b320#fff2a8#c9d1db#f4f6fa#b3263c#7fe3ff#ff6fcf#2b2d42#ff8a3d\";\n    bytes internal constant FURS = \"#5a2a12#f39a3c#fff1dc#d06a1e#2f3442#b8c0cc#f4f6fa#7d8796#0b0a10#2c2a36#4a4758#1a1922#5b5a6e#ffffff#ffeef3#e8e6f0#6b4a2a#f5dcb0#fff6e6#e3bf86#0b0a10#2c2a36#ffffff#2c2a36#3b2516#f3e3c8#fffaf0#6b4430#4a2a18#ffffff#fff4ea#e88a3a#7a2a55#ffb3d6#fff0f7#ff7fb8#1d3a5e#9dd0ff#eef7ff#6aa8e8#3a2a6b#c9b6ff#f6f0ff#a68cf0#1d4d3c#9be8c6#effff7#62c9a0\";\n    bytes internal constant BGS = \"#ffd9c2#c8f2dc#cfe6ff#e4d6ff#fff2b3#ffd1e1#efe3cf#2b2d42\";\n    bytes internal constant W_FUR = hex\"2822181e1a16100e0c0c0a0a\";\n    bytes internal constant W_HAT = hex\"46221e1e1e101a14\";\n    bytes internal constant W_GLS = hex\"64241e1a1412\";\n    bytes internal constant W_ACC = hex\"462824241e1814\";\n    bytes internal constant HAT_SPR = hex\"0002030405060708\";\n    bytes internal constant GLS_SPR = hex\"00090a0b0c0d\";\n    bytes internal constant ACC_SPR = hex\"000e0f10111213\";\n\n    struct Look {\n        uint256 fur;\n        uint256 hat;\n        uint256 gls;\n        uint256 acc;\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\n    function _look(uint256 id) internal pure returns (Look memory l) {\n        uint256 h = uint256(keccak256(abi.encodePacked(\"PCAT\", id)));\n        l.fur = _pick(h & 0xffff, W_FUR);\n        l.hat = _pick((h >> 16) & 0xffff, W_HAT);\n        l.gls = _pick((h >> 32) & 0xffff, W_GLS);\n        l.acc = _pick((h >> 48) & 0xffff, W_ACC);\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 _cat(Look memory l) internal pure returns (bytes memory buf) {\n        bytes memory spr = SPR;\n        bytes memory idx = IDX;\n        bytes memory fur = bytes.concat(_slice(FURS, l.fur * 28, 28), COLS); // colours 1-4 fur, 5+ shared\n        buf = new bytes(9000);\n        uint256 w = _put(buf, 0, '<g transform=\"translate(48 56) scale(12)\" shape-rendering=\"crispEdges\" fill=\"none\">');\n        w = _sprite(buf, w, spr, idx, fur, 0); // tail\n        w = _sprite(buf, w, spr, idx, fur, 1); // body\n        if (l.acc != 0) w = _sprite(buf, w, spr, idx, fur, uint8(ACC_SPR[l.acc]));\n        if (l.gls != 0) w = _sprite(buf, w, spr, idx, fur, uint8(GLS_SPR[l.gls]));\n        if (l.hat != 0) w = _sprite(buf, w, spr, idx, fur, uint8(HAT_SPR[l.hat]));\n        w = _put(buf, w, \"</g>\");\n        assembly { mstore(buf, w) }\n    }\n\n    function _label(uint256 id, string memory fill) internal pure returns (string memory) {\n        return string.concat('<text x=\"36\" y=\"452\" font-size=\"17\" fill=\"', fill, '\" opacity=\".75\">PIXEL CAT CLUB #', _u(id), \"</text>\");\n    }\n\n    string internal constant SHADOW = '<ellipse cx=\"238\" cy=\"404\" rx=\"128\" ry=\"13\" fill=\"#000\" fill-opacity=\".12\"/>';\n\n    function _svg(uint256 id, uint256 tier, bool lucky) internal pure returns (string memory) {\n        Look memory l = _look(id);\n        bytes memory cat = _cat(l);\n        string memory bg = string(_slice(BGS, l.bg * 7, 7));\n        bool night = l.bg == 7;\n        string memory body;\n        if (tier == 0) {\n            body = string.concat('<rect width=\"480\" height=\"480\" fill=\"', bg, '\"/>', SHADOW, string(cat), _label(id, night ? \"#ffffff\" : \"#2a1b2e\"));\n        } else if (tier == 1) {\n            body = string.concat(\n                '<defs><linearGradient id=\"s\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\"><stop offset=\"0\" stop-color=\"#ffffff\"/><stop offset=\".28\" stop-color=\"#aeb6c2\"/><stop offset=\".5\" stop-color=\"#f4f6f9\"/><stop offset=\".74\" stop-color=\"#8d96a3\"/><stop offset=\"1\" stop-color=\"#eef1f5\"/></linearGradient>',\n                '<pattern id=\"d\" width=\"48\" height=\"48\" patternUnits=\"userSpaceOnUse\"><circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"#fff\" fill-opacity=\".5\"/><circle cx=\"36\" cy=\"36\" r=\"4\" fill=\"#fff\" fill-opacity=\".5\"/></pattern></defs>',\n                '<rect width=\"480\" height=\"480\" fill=\"', bg, '\"/><rect width=\"480\" height=\"480\" fill=\"url(#d)\"/>', SHADOW, string(cat),\n                '<rect x=\"9\" y=\"9\" width=\"462\" height=\"462\" rx=\"22\" fill=\"none\" stroke=\"url(#s)\" stroke-width=\"18\"/><rect x=\"19\" y=\"19\" width=\"442\" height=\"442\" rx=\"14\" fill=\"none\" stroke=\"#6b7480\" stroke-opacity=\".6\" stroke-width=\"2\"/>',\n                '<rect x=\"356\" y=\"30\" width=\"96\" height=\"28\" rx=\"14\" fill=\"url(#s)\" stroke=\"#6b7480\" stroke-width=\"2\"/><text x=\"404\" y=\"49\" font-size=\"14\" fill=\"#3a414b\" text-anchor=\"middle\" letter-spacing=\"2\">SILVER</text>',\n                _label(id, night ? \"#ffffff\" : \"#2a1b2e\")\n            );\n        } else {\n            body = string.concat(\n                '<defs><linearGradient id=\"h\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\"><stop offset=\"0\" stop-color=\"#ffd6ec\"/><stop offset=\".25\" stop-color=\"#fff1b8\"/><stop offset=\".5\" stop-color=\"#c9ffe9\"/><stop offset=\".75\" stop-color=\"#cfe0ff\"/><stop offset=\"1\" stop-color=\"#ecd2ff\"/><animate attributeName=\"x1\" values=\"0;1;0\" dur=\"6s\" repeatCount=\"indefinite\"/></linearGradient>',\n                '<linearGradient id=\"g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\" spreadMethod=\"reflect\"><stop offset=\"0\" stop-color=\"#fff6c2\"/><stop offset=\".22\" stop-color=\"#f2b320\"/><stop offset=\".42\" stop-color=\"#ff9ad5\"/><stop offset=\".58\" stop-color=\"#8cf0ff\"/><stop offset=\".78\" stop-color=\"#f7c948\"/><stop offset=\"1\" stop-color=\"#b07a0c\"/><animate attributeName=\"x1\" values=\"0;1;0\" dur=\"4s\" repeatCount=\"indefinite\"/><animate attributeName=\"x2\" values=\"1;2;1\" dur=\"4s\" repeatCount=\"indefinite\"/></linearGradient>',\n                '<radialGradient id=\"r\"><stop offset=\"0\" stop-color=\"#fff2a8\" stop-opacity=\".95\"/><stop offset=\"1\" stop-color=\"#fff2a8\" stop-opacity=\"0\"/></radialGradient>',\n                '<linearGradient id=\"w\" x1=\"0\" x2=\"1\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\"0\"/><stop offset=\".5\" stop-color=\"#fff\" stop-opacity=\".6\"/><stop offset=\"1\" stop-color=\"#fff\" stop-opacity=\"0\"/></linearGradient><clipPath id=\"c\"><rect width=\"480\" height=\"480\" rx=\"26\"/></clipPath></defs>',\n                '<g clip-path=\"url(#c)\"><rect width=\"480\" height=\"480\" fill=\"url(#h)\"/><circle cx=\"240\" cy=\"236\" r=\"210\" fill=\"url(#r)\"/>',\n                '<g fill=\"#f2b320\"><path d=\"M58 112l6 14 14 6-14 6-6 14-6-14-14-6 14-6zM424 196l5 11 11 5-11 5-5 11-5-11-11-5 11-5zM400 372l4 9 9 4-9 4-4 9-4-9-9-4 9-4z\"/><animate attributeName=\"opacity\" values=\".25;1;.25\" dur=\"2.2s\" repeatCount=\"indefinite\"/></g>',\n                '<g fill=\"#fff\"><path d=\"M70 300l4 9 9 4-9 4-4 9-4-9-9-4 9-4zM398 92l5 11 11 5-11 5-5 11-5-11-11-5 11-5zM240 60l3 7 7 3-7 3-3 7-3-7-7-3 7-3z\"/><animate attributeName=\"opacity\" values=\"1;.2;1\" dur=\"2.2s\" repeatCount=\"indefinite\"/></g>',\n                SHADOW, string(cat),\n                '<rect x=\"-220\" y=\"0\" width=\"140\" height=\"480\" fill=\"url(#w)\" transform=\"skewX(-20)\"><animateTransform attributeName=\"transform\" type=\"translate\" values=\"-100 0;860 0\" dur=\"3.6s\" repeatCount=\"indefinite\" additive=\"sum\"/></rect>',\n                '<rect x=\"10\" y=\"10\" width=\"460\" height=\"460\" rx=\"24\" fill=\"none\" stroke=\"url(#g)\" stroke-width=\"20\"/><rect x=\"21\" y=\"21\" width=\"438\" height=\"438\" rx=\"16\" fill=\"none\" stroke=\"#b07a0c\" stroke-width=\"2\"/></g>',\n                '<rect x=\"328\" y=\"30\" width=\"124\" height=\"30\" rx=\"15\" fill=\"url(#g)\" stroke=\"#b07a0c\" stroke-width=\"2\"/><text x=\"390\" y=\"50\" font-size=\"15\" fill=\"#5a3a00\" text-anchor=\"middle\" letter-spacing=\"2\">PREMIUM</text>',\n                lucky ? '<text x=\"390\" y=\"80\" font-size=\"12\" fill=\"#8a5a00\" text-anchor=\"middle\" letter-spacing=\"2\">LUCKY DRAW</text>' : \"\",\n                _label(id, \"#5a3a00\")\n            );\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 tier (0 Free, 1 Silver, 2 Premium), for previews and the mint page\n    function previewSVG(uint256 traitsId, uint256 tier, bool lucky) external pure returns (string memory) {\n        return _svg(traitsId, tier % 3, lucky);\n    }\n\n    // ---------------- Metadata ----------------\n\n    function _furName(uint256 i) internal pure returns (string memory) {\n        if (i == 0) return \"Ginger Tabby\";\n        if (i == 1) return \"Silver Tabby\";\n        if (i == 2) return \"Midnight\";\n        if (i == 3) return \"Snow\";\n        if (i == 4) return \"Cream\";\n        if (i == 5) return \"Tuxedo\";\n        if (i == 6) return \"Siamese\";\n        if (i == 7) return \"Calico\";\n        if (i == 8) return \"Bubblegum\";\n        if (i == 9) return \"Sky Blue\";\n        if (i == 10) return \"Lavender\";\n        return \"Mint\";\n    }\n\n    function _hatName(uint256 i) internal pure returns (string memory) {\n        if (i == 0) return \"None\";\n        if (i == 1) return \"Party Hat\";\n        if (i == 2) return \"Pink Bow\";\n        if (i == 3) return \"Beanie\";\n        if (i == 4) return \"Flower\";\n        if (i == 5) return \"Tiny Crown\";\n        if (i == 6) return \"Chef Hat\";\n        return \"Headphones\";\n    }\n\n    function _glsName(uint256 i) internal pure returns (string memory) {\n        if (i == 0) return \"None\";\n        if (i == 1) return \"Round Specs\";\n        if (i == 2) return \"Shades\";\n        if (i == 3) return \"Heart Glasses\";\n        if (i == 4) return \"Star Shades\";\n        return \"Monocle\";\n    }\n\n    function _accName(uint256 i) internal pure returns (string memory) {\n        if (i == 0) return \"None\";\n        if (i == 1) return \"Bell Collar\";\n        if (i == 2) return \"Scarf\";\n        if (i == 3) return \"Bowtie\";\n        if (i == 4) return \"Fish Snack\";\n        if (i == 5) return \"Yarn Ball\";\n        return \"Gold Chain\";\n    }\n\n    function _bgName(uint256 i) internal pure returns (string memory) {\n        if (i == 0) return \"Peach\";\n        if (i == 1) return \"Mint\";\n        if (i == 2) return \"Sky\";\n        if (i == 3) return \"Lilac\";\n        if (i == 4) return \"Butter\";\n        if (i == 5) return \"Rose\";\n        if (i == 6) return \"Sand\";\n        return \"Night\";\n    }\n\n\n    function _tierName(uint256 t) internal pure returns (string memory) {\n        if (t == 0) return \"Free\";\n        if (t == 1) return \"Silver\";\n        return \"Premium\";\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) & 3;\n        bool lucky = (_tok[tokenId] >> 162) & 1 == 1;\n        Look memory l = _look(tokenId);\n        string memory attrs = string.concat(\n            _attr(\"Tier\", _tierName(t)),\n            _attr(\"Fur\", _furName(l.fur)),\n            _attr(\"Hat\", _hatName(l.hat)),\n            _attr(\"Glasses\", _glsName(l.gls)),\n            _attr(\"Accessory\", _accName(l.acc)),\n            _attr(\"Background\", t == 2 ? \"Holo\" : _bgName(l.bg)),\n            t == 2 ? _attr(\"Premium Source\", lucky ? \"Lucky Draw\" : \"Direct\") : \"\"\n        );\n        bytes memory json = abi.encodePacked(\n            '{\"name\":\"PIXEL CAT CLUB #', _u(tokenId),\n            '\",\"description\":\"PIXEL CAT CLUB: 10,000 fully on-chain pixel cats for .ai Agent ID holders. Free cards are plain, normal cards have a silver frame, premium cards have a gold holo frame. No admin. A collectible, not an investment.\",',\n            '\"attributes\":[', attrs, '{\"trait_type\":\"Collection\",\"value\":\"PIXEL CAT CLUB\"}],',\n            '\"image\":\"data:image/svg+xml;base64,', _b64(bytes(_svg(tokenId, t, lucky))), '\"}'\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 CAT CLUB\",\"description\":\"10,000 fully on-chain pixel cats for .ai Agent ID holders. 2 free cards per wallet, normal cards 0.00085 BNB with a 10% premium chance, premium cards 0.0017 BNB. No admin.\",\"image\":\"data:image/svg+xml;base64,',\n            _b64(bytes(_svg(7, 2, false))), '\",\"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":"FreeLimit","type":"error","inputs":[]},{"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":"LuckyPremium","type":"event","inputs":[{"name":"minter","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"AGENT_ID","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAgentId"}],"stateMutability":"view"},{"name":"FREE_PER_WALLET","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"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":"NORMAL_PRICE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PREMIUM_CHANCE_BPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PREMIUM_PRICE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"ROYALTY_BPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"balanceOf","type":"function","inputs":[{"name":"o","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"contractURI","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"cost","type":"function","inputs":[{"name":"normalCount","type":"uint256","internalType":"uint256"},{"name":"premiumCount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"creator","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"freeMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeUsed","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getApproved","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"o","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isLucky","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"luckyUpgrades","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"freeCount","type":"uint256","internalType":"uint256"},{"name":"normalCount","type":"uint256","internalType":"uint256"},{"name":"premiumCount","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":"mintedByTier","type":"function","inputs":[],"outputs":[{"name":"free","type":"uint256","internalType":"uint256"},{"name":"silver","type":"uint256","internalType":"uint256"},{"name":"premium","type":"uint256","internalType":"uint256"},{"name":"lucky","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":"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":"premiumMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"previewSVG","type":"function","inputs":[{"name":"traitsId","type":"uint256","internalType":"uint256"},{"name":"tier","type":"uint256","internalType":"uint256"},{"name":"lucky","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"name":"prices","type":"function","inputs":[],"outputs":[{"name":"normalPrice","type":"uint256","internalType":"uint256"},{"name":"premiumPrice","type":"uint256","internalType":"uint256"},{"name":"premiumChanceBps","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"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":"silverMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"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":"tierOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"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":"walletInfo","type":"function","inputs":[{"name":"a","type":"address","internalType":"address"}],"outputs":[{"name":"freeUsedCount","type":"uint256","internalType":"uint256"},{"name":"paidCount","type":"uint256","internalType":"uint256"},{"name":"eligible","type":"bool","internalType":"bool"},{"name":"freeLeft","type":"uint256","internalType":"uint256"},{"name":"paidLeft","type":"uint256","internalType":"uint256"}],"stateMutability":"view"}],"matchId":"57877053","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-31T22:15:07Z","match":"exact_match","chainId":"56","address":"0x9b9E0a4358449Eebf4437877A9B36E26c24Ce703"}