{"sources":{"CaishenFortune.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\ninterface IAgentId { function balanceOf(address owner) external view returns (uint256); }\ninterface IERC721Receiver { function onERC721Received(address, address, uint256, bytes calldata) external returns (bytes4); }\n\n/// CAISHEN · God of Fortune (CAISHEN) - 五路财神\n/// Rules are fixed in code (no admin, no pause, no extra mint, no rule changes after deploy):\n/// - Only wallets holding a SPACE ID .ai Agent ID can mint.\n/// - Type 0 招财童子 Zhaocai Tongzi: free (gas only), 1 per wallet.\n/// - Paid card 0.0006 BNB: opens one of the five gods (types 1-5) at random, max 30 paid per wallet, several per tx.\n///   Each paid card has a GROUP_DROP_BPS / 10000 chance to come out as the group card (type 6) instead.\n/// - Milestones: when a wallet's paid count reaches 10 / 20 / 30 it also receives 3 / 5 / 7 random god cards (types 1-5).\n/// - Type 6 五路财神合体 Five Wealth Gods United: 0.013 BNB, max 1 bought per wallet (dropped ones do not count).\n/// - Mint is open for 5 days after deploy. Payment goes straight to the creator in the same tx; the contract holds no funds.\n/// - Randomness uses prevrandao + blockhash + sender + tokenId. It is NOT secure randomness and can be influenced by\n///   validators or by contracts that revert on unwanted results. Fine for a folk-legend collectible; nothing of value is promised.\n/// - A lucky folk-legend collectible. No profit, return or price is promised.\ncontract CaishenFortune {\n    string public constant name = \"CAISHEN God of Fortune\";\n    string public constant symbol = \"CAISHEN\";\n\n    uint8 public constant TONGZI = 0;\n    uint8 public constant GROUP = 6;\n    uint256 public constant PAID_PRICE = 0.0006 ether;\n    uint256 public constant GROUP_PRICE = 0.013 ether;\n    uint256 public constant MAX_PAID_PER_WALLET = 30;\n    /// Chance (basis points) that a paid card comes out as the group card. Change before deploy if needed.\n    uint256 public constant GROUP_DROP_BPS = 1000;\n    uint256 public constant MINT_DURATION = 5 days;\n    uint96 public constant ROYALTY_BPS = 100;\n    address public constant CREATOR = 0x45E2c8a09022914cE00cFce9A93dD3FDa54D8686;\n    IAgentId public constant AGENT_ID = IAgentId(0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F);\n\n    uint256 public immutable mintEnd;\n    /// IPFS folder with 0.png ... 6.png, set once at deploy (e.g. \"ipfs://<CID>/\"). No setter.\n    string public imageBase;\n\n    uint256 public totalSupply;\n    uint256[7] public typeCount;\n    uint256 public groupDropped;\n    mapping(address => bool) public freeMinted;\n    mapping(address => bool) public groupBought;\n    mapping(address => uint256) public paidMinted;\n    mapping(address => uint256) public bonusMinted;\n    mapping(uint256 => uint8) public typeOf;\n\n    mapping(uint256 => address) private _owners;\n    mapping(address => uint256) private _balances;\n    mapping(uint256 => address) private _tokenApprovals;\n    mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n    event FreeMinted(address indexed minter, uint256 tokenId);\n    event PaidMinted(address indexed minter, uint256 qty, uint256 bonus, uint256 groupDrops, uint256 paid);\n    event GroupBought(address indexed minter, uint256 tokenId);\n\n    error NotAgent(); error MintClosed(); error WalletLimit(); error WrongPayment(); error AlreadyFreeMinted();\n    error AlreadyBoughtGroup(); error NothingToMint(); error NotOwnerNorApproved(); error InvalidToken();\n    error ZeroAddress(); error NoContracts(); error UnsafeRecipient(); error TransferFailed();\n\n    constructor(string memory _imageBase) {\n        imageBase = _imageBase;\n        mintEnd = block.timestamp + MINT_DURATION;\n    }\n\n    /// Element / marketplaces read owner() to let the creator manage the collection page. It has no on-chain powers.\n    function owner() external pure returns (address) { return CREATOR; }\n\n    // ---------------- rules ----------------\n    function isAgent(address w) public view returns (bool) {\n        try AGENT_ID.balanceOf(w) returns (uint256 b) { return b > 0; } catch { return false; }\n    }\n    function mintOpen() public view returns (bool) { return block.timestamp < mintEnd; }\n    /// Total milestone bonus cards for a cumulative paid count: 10 -> 3, 20 -> 3+5, 30 -> 3+5+7.\n    function bonusFor(uint256 paid) public pure returns (uint256) {\n        if (paid >= 30) return 15; if (paid >= 20) return 8; if (paid >= 10) return 3; return 0;\n    }\n    function quote(address w, uint256 qty) external view returns (uint256 bonus, uint256 cost) {\n        uint256 p = paidMinted[w];\n        if (p + qty > MAX_PAID_PER_WALLET) revert WalletLimit();\n        return (bonusFor(p + qty) - bonusFor(p), qty * PAID_PRICE);\n    }\n\n    modifier gate() {\n        if (block.timestamp >= mintEnd) revert MintClosed();\n        if (tx.origin != msg.sender) revert NoContracts(); // wallets only: blocks bots that revert unlucky mints\n        if (!isAgent(msg.sender)) revert NotAgent();\n        _;\n    }\n\n    // ---------------- mint ----------------\n    function mintFree() external gate {\n        if (freeMinted[msg.sender]) revert AlreadyFreeMinted();\n        freeMinted[msg.sender] = true;\n        uint256 id = _mintOne(msg.sender, TONGZI);\n        _balances[msg.sender] += 1;\n        emit FreeMinted(msg.sender, id);\n    }\n\n    /// Paid mint of `qty` random cards (0.0006 BNB each). Milestone bonus cards are added automatically.\n    function mint(uint256 qty) external payable gate {\n        if (qty == 0) revert NothingToMint();\n        uint256 p = paidMinted[msg.sender];\n        if (p + qty > MAX_PAID_PER_WALLET) revert WalletLimit();\n        if (msg.value != qty * PAID_PRICE) revert WrongPayment();\n        uint256 bonus = bonusFor(p + qty) - bonusFor(p);\n        paidMinted[msg.sender] = p + qty;\n        if (bonus > 0) bonusMinted[msg.sender] += bonus;\n\n        uint256 drops;\n        for (uint256 i; i < qty; ++i) {\n            uint256 id = totalSupply + 1;\n            uint256 r = _rand(id);\n            uint8 t;\n            if (r % 10000 < GROUP_DROP_BPS) { t = GROUP; ++drops; } else t = uint8(1 + (r >> 128) % 5);\n            _mintOne(msg.sender, t);\n        }\n        for (uint256 i; i < bonus; ++i) {\n            uint256 id = totalSupply + 1;\n            _mintOne(msg.sender, uint8(1 + (_rand(id) >> 128) % 5));\n        }\n        if (drops > 0) groupDropped += drops;\n        _balances[msg.sender] += qty + bonus;\n        emit PaidMinted(msg.sender, qty, bonus, drops, msg.value);\n        _pay();\n    }\n\n    /// Buy the group card 五路财神合体 (0.013 BNB), max 1 per wallet.\n    function mintGroup() external payable gate {\n        if (groupBought[msg.sender]) revert AlreadyBoughtGroup();\n        if (msg.value != GROUP_PRICE) revert WrongPayment();\n        groupBought[msg.sender] = true;\n        uint256 id = _mintOne(msg.sender, GROUP);\n        _balances[msg.sender] += 1;\n        emit GroupBought(msg.sender, id);\n        _pay();\n    }\n\n    function _pay() private {\n        (bool ok, ) = payable(CREATOR).call{value: msg.value}(\"\");\n        if (!ok) revert TransferFailed();\n    }\n\n    /// NOT secure randomness (see contract notes).\n    function _rand(uint256 id) private view returns (uint256) {\n        return uint256(keccak256(abi.encodePacked(block.prevrandao, blockhash(block.number - 1), msg.sender, id)));\n    }\n\n    function _mintOne(address to, uint8 t) private returns (uint256 id) {\n        id = ++totalSupply;\n        typeCount[t] += 1;\n        if (t != 0) typeOf[id] = t;\n        _owners[id] = to;\n        emit Transfer(address(0), to, id);\n    }\n\n    // ---------------- read helpers for the mint page ----------------\n    function walletInfo(address w) external view returns (\n        bool agent, bool hasFree, bool hasBoughtGroup, uint256 paid, uint256 bonus, uint256 balance\n    ) {\n        return (isAgent(w), freeMinted[w], groupBought[w], paidMinted[w], bonusMinted[w], _balances[w]);\n    }\n    function stats() external view returns (uint256 minted, uint256 end, bool open, uint256[7] memory counts, uint256 drops) {\n        return (totalSupply, mintEnd, mintOpen(), typeCount, groupDropped);\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        for (uint256 id = 1; id <= totalSupply && j < n; ++id) if (_owners[id] == o) ids[j++] = id;\n    }\n\n    // ---------------- ERC-721 ----------------\n    function supportsInterface(bytes4 i) external pure returns (bool) {\n        return i == 0x01ffc9a7 || i == 0x80ac58cd || i == 0x5b5e139f || i == 0x2a55205a;\n    }\n    function balanceOf(address o) external view returns (uint256) {\n        if (o == address(0)) revert ZeroAddress();\n        return _balances[o];\n    }\n    function ownerOf(uint256 tokenId) public view returns (address o) {\n        o = _owners[tokenId];\n        if (o == address(0)) revert InvalidToken();\n    }\n    function approve(address to, uint256 tokenId) external {\n        address o = ownerOf(tokenId);\n        if (msg.sender != o && !_operatorApprovals[o][msg.sender]) revert NotOwnerNorApproved();\n        _tokenApprovals[tokenId] = to;\n        emit Approval(o, to, tokenId);\n    }\n    function getApproved(uint256 tokenId) external view returns (address) { ownerOf(tokenId); return _tokenApprovals[tokenId]; }\n    function setApprovalForAll(address operator, bool approved) external {\n        _operatorApprovals[msg.sender][operator] = approved;\n        emit ApprovalForAll(msg.sender, operator, approved);\n    }\n    function isApprovedForAll(address o, address operator) external view returns (bool) { return _operatorApprovals[o][operator]; }\n    function transferFrom(address from, address to, uint256 tokenId) public {\n        address o = ownerOf(tokenId);\n        if (o != from) revert NotOwnerNorApproved();\n        if (to == address(0)) revert ZeroAddress();\n        if (msg.sender != o && _tokenApprovals[tokenId] != msg.sender && !_operatorApprovals[o][msg.sender]) revert NotOwnerNorApproved();\n        delete _tokenApprovals[tokenId];\n        unchecked { _balances[from] -= 1; _balances[to] += 1; }\n        _owners[tokenId] = to;\n        emit Transfer(from, to, tokenId);\n    }\n    function safeTransferFrom(address from, address to, uint256 tokenId) external { safeTransferFrom(from, to, tokenId, \"\"); }\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public {\n        transferFrom(from, to, tokenId);\n        if (to.code.length > 0) {\n            try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, data) returns (bytes4 r) {\n                if (r != IERC721Receiver.onERC721Received.selector) revert UnsafeRecipient();\n            } catch { revert UnsafeRecipient(); }\n        }\n    }\n    function royaltyInfo(uint256, uint256 salePrice) external pure returns (address, uint256) {\n        return (CREATOR, (salePrice * ROYALTY_BPS) / 10000);\n    }\n\n    // ---------------- metadata ----------------\n    function _cn(uint256 t) internal pure returns (string memory) {\n        string[7] memory a = [unicode\"招财童子\", unicode\"赵公明\", unicode\"萧升\", unicode\"曹宝\", unicode\"陈九公\", unicode\"姚少司\", unicode\"五路财神合体\"];\n        return a[t];\n    }\n    function _en(uint256 t) internal pure returns (string memory) {\n        string[7] memory a = [\"Zhaocai Tongzi\", \"Zhao Gongming\", \"Xiao Sheng\", \"Cao Bao\", \"Chen Jiugong\", \"Yao Shaosi\", \"Five Wealth Gods United\"];\n        return a[t];\n    }\n    function _rarity(uint256 t) internal pure returns (string memory) {\n        if (t == 0) return \"Free\"; if (t == 6) return \"Supreme\"; return \"God\";\n    }\n    function imageOf(uint256 tokenId) public view returns (string memory) {\n        ownerOf(tokenId);\n        return string.concat(imageBase, _toString(typeOf[tokenId]), \".png\");\n    }\n    function tokenURI(uint256 tokenId) external view returns (string memory) {\n        ownerOf(tokenId);\n        uint256 t = typeOf[tokenId];\n        string memory json = string.concat(\n            '{\"name\":\"', _cn(t), ' ', _en(t), ' #', _toString(tokenId), '\",',\n            unicode'\"description\":\"CAISHEN · God of Fortune 五路财神：民间传说中的五路财神与招财童子主题吉祥收藏卡。',\n            unicode'A folk-legend lucky collectible of the Five Wealth Gods. 仅供收藏娱乐，不承诺任何收益、回报或价格。No profit, return or price is promised.\",',\n            '\"attributes\":[{\"trait_type\":\"Card\",\"value\":\"', _en(t), '\"},{\"trait_type\":\"Name\",\"value\":\"', _cn(t),\n            '\"},{\"trait_type\":\"Rarity\",\"value\":\"', _rarity(t), '\"}],\"image\":\"', imageOf(tokenId), '\"}'\n        );\n        return string.concat(\"data:application/json;base64,\", _b64(bytes(json)));\n    }\n\n    function _toString(uint256 v) internal pure returns (string memory) {\n        if (v == 0) return \"0\";\n        uint256 t = v; uint256 len;\n        while (t != 0) { len++; t /= 10; }\n        bytes memory bb = new bytes(len);\n        while (v != 0) { len--; bb[len] = bytes1(uint8(48 + v % 10)); v /= 10; }\n        return string(bb);\n    }\n    bytes internal constant TABLE = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    function _b64(bytes memory data) internal pure returns (string memory) {\n        if (data.length == 0) return \"\";\n        bytes memory out = new bytes(4 * ((data.length + 2) / 3));\n        uint256 j;\n        for (uint256 i; i < data.length; i += 3) {\n            uint256 x = uint8(data[i]);\n            uint256 y = i + 1 < data.length ? uint8(data[i + 1]) : 0;\n            uint256 z = i + 2 < data.length ? uint8(data[i + 2]) : 0;\n            uint256 tri = (x << 16) | (y << 8) | z;\n            out[j++] = TABLE[(tri >> 18) & 63];\n            out[j++] = TABLE[(tri >> 12) & 63];\n            out[j++] = i + 1 < data.length ? TABLE[(tri >> 6) & 63] : bytes1(\"=\");\n            out[j++] = i + 2 < data.length ? TABLE[tri & 63] : bytes1(\"=\");\n        }\n        return string(out);\n    }\n}\n"}},"abi":[{"type":"constructor","inputs":[{"name":"_imageBase","type":"string","internalType":"string"}],"stateMutability":"nonpayable"},{"name":"AlreadyBoughtGroup","type":"error","inputs":[]},{"name":"AlreadyFreeMinted","type":"error","inputs":[]},{"name":"InvalidToken","type":"error","inputs":[]},{"name":"MintClosed","type":"error","inputs":[]},{"name":"NoContracts","type":"error","inputs":[]},{"name":"NotAgent","type":"error","inputs":[]},{"name":"NotOwnerNorApproved","type":"error","inputs":[]},{"name":"NothingToMint","type":"error","inputs":[]},{"name":"TransferFailed","type":"error","inputs":[]},{"name":"UnsafeRecipient","type":"error","inputs":[]},{"name":"WalletLimit","type":"error","inputs":[]},{"name":"WrongPayment","type":"error","inputs":[]},{"name":"ZeroAddress","type":"error","inputs":[]},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"ApprovalForAll","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"FreeMinted","type":"event","inputs":[{"name":"minter","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"GroupBought","type":"event","inputs":[{"name":"minter","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"PaidMinted","type":"event","inputs":[{"name":"minter","type":"address","indexed":true,"internalType":"address"},{"name":"qty","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"bonus","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"groupDrops","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"paid","type":"uint256","indexed":false,"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":"CREATOR","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"GROUP","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"GROUP_DROP_BPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"GROUP_PRICE","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":"MINT_DURATION","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PAID_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":"TONGZI","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"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":"paid","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"bonusMinted","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeMinted","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":"groupBought","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"groupDropped","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"imageBase","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"imageOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"isAgent","type":"function","inputs":[{"name":"w","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"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":"qty","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"mintEnd","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mintFree","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"mintGroup","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"mintOpen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"pure"},{"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":"quote","type":"function","inputs":[{"name":"w","type":"address","internalType":"address"},{"name":"qty","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"bonus","type":"uint256","internalType":"uint256"},{"name":"cost","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":"pure"},{"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":"stats","type":"function","inputs":[],"outputs":[{"name":"minted","type":"uint256","internalType":"uint256"},{"name":"end","type":"uint256","internalType":"uint256"},{"name":"open","type":"bool","internalType":"bool"},{"name":"counts","type":"uint256[7]","internalType":"uint256[7]"},{"name":"drops","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"supportsInterface","type":"function","inputs":[{"name":"i","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"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":"typeCount","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"typeOf","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"walletInfo","type":"function","inputs":[{"name":"w","type":"address","internalType":"address"}],"outputs":[{"name":"agent","type":"bool","internalType":"bool"},{"name":"hasFree","type":"bool","internalType":"bool"},{"name":"hasBoughtGroup","type":"bool","internalType":"bool"},{"name":"paid","type":"uint256","internalType":"uint256"},{"name":"bonus","type":"uint256","internalType":"uint256"},{"name":"balance","type":"uint256","internalType":"uint256"}],"stateMutability":"view"}],"matchId":"57768232","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-31T04:22:37Z","match":"exact_match","chainId":"56","address":"0x2B2439F45C8639Bbd226599aC5AC551Fbf43B34d"}