{"sources":{"FortuneCats.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.24;\n\n/// @title Fortune Cats - 1,888 fully on-chain pixel fortune cats (maneki-neko) for Binance .ai agents. First 888 mints free, then 0.0002 BNB.\ninterface IERC721Bal { function balanceOf(address) external view returns (uint256); }\ninterface IReceiver { function onERC721Received(address,address,uint256,bytes calldata) external returns (bytes4); }\n\ncontract FortuneCats {\n    string public constant name = unicode\"招财猫 Agents\";\n    string public constant symbol = \"FCAT\";\n    uint256 public constant MAX_SUPPLY = 1888;\n    uint256 public constant FREE_SUPPLY = 888;\n    uint256 public constant MAX_PER_WALLET = 5;\n    uint96 public constant ROYALTY_BPS = 500;\n    IERC721Bal public constant AGENT_ID = IERC721Bal(0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F);\n    string private constant DESC = \"Fortune Cats are 1,888 pixel fortune cats (maneki-neko, the beckoning cat) living 100% on BNB Chain - every pixel is drawn by the smart contract, no IPFS, nothing can rug the art. Only wallets holding a Binance .ai Agent ID can mint. The first 888 mints are free; after that each mint costs 0.0002 BNB. In Chinese tradition the zhaocai mao raises its paw to call in wealth, customers and good fortune. Traits include Calico coats, Tabby stripes, lucky collars with golden bells, raised beckoning paws, and treasures like the Koban coin, the gold ingot and the treasure fish. May fortune answer every raised paw.\";\n\n    address public owner;\n    address public immutable payout;\n    uint256 public price = 0.0002 ether;\n    bool public mintOpen = true;\n    uint256 public totalSupply;\n    uint256 public freeClaimed;\n\n    mapping(uint256 => address) private _owners;\n    mapping(address => uint256) private _balances;\n    mapping(uint256 => address) public getApproved;\n    mapping(address => mapping(address => bool)) public isApprovedForAll;\n    mapping(address => uint256) public mintedBy;\n    mapping(uint256 => uint256) private _seed;\n\n    event Transfer(address indexed from, address indexed to, uint256 indexed id);\n    event Approval(address indexed o, address indexed s, uint256 indexed id);\n    event ApprovalForAll(address indexed o, address indexed op, bool ok);\n    event OwnershipTransferred(address indexed prev, address indexed next);\n\n    constructor(address _owner, address _payout) {\n        owner = _owner; payout = _payout;\n        emit OwnershipTransferred(address(0), _owner);\n    }\n\n    modifier onlyOwner() { require(msg.sender == owner, \"owner\"); _; }\n\n    // ---------------- mint ----------------\n    function cost(address who, uint256 qty) public view returns (uint256) {\n        if (qty == 0) return 0;\n        bool free = mintedBy[who] == 0 && freeClaimed < FREE_SUPPLY;\n        return price * (free ? qty - 1 : qty);\n    }\n\n    function mint(uint256 qty) external payable {\n        require(mintOpen, \"closed\");\n        require(qty > 0 && mintedBy[msg.sender] + qty <= MAX_PER_WALLET, \"limit\");\n        require(totalSupply + qty <= MAX_SUPPLY, \"sold out\");\n        require(AGENT_ID.balanceOf(msg.sender) > 0, \"need .ai Agent ID\");\n        uint256 c = cost(msg.sender, qty);\n        require(msg.value >= c, \"price\");\n        if (mintedBy[msg.sender] == 0 && freeClaimed < FREE_SUPPLY) freeClaimed++;\n        mintedBy[msg.sender] += qty;\n        for (uint256 i; i < qty; i++) {\n            uint256 id = ++totalSupply;\n            _seed[id] = uint256(keccak256(abi.encode(id, msg.sender, block.prevrandao, block.timestamp)));\n            _owners[id] = msg.sender;\n            _balances[msg.sender]++;\n            emit Transfer(address(0), msg.sender, id);\n        }\n        if (msg.value > c) payable(msg.sender).transfer(msg.value - c);\n    }\n\n    function withdraw() external { payable(payout).transfer(address(this).balance); }\n    function setPrice(uint256 p) external onlyOwner { price = p; }\n    function setMintOpen(bool o) external onlyOwner { mintOpen = o; }\n    function transferOwnership(address n) external onlyOwner { emit OwnershipTransferred(owner, n); owner = n; }\n\n    // ---------------- ERC721 ----------------\n    function balanceOf(address a) external view returns (uint256) { require(a != address(0)); return _balances[a]; }\n    function ownerOf(uint256 id) public view returns (address o) { o = _owners[id]; require(o != address(0), \"none\"); }\n    function approve(address s, uint256 id) external {\n        address o = ownerOf(id);\n        require(msg.sender == o || isApprovedForAll[o][msg.sender], \"auth\");\n        getApproved[id] = s; emit Approval(o, s, id);\n    }\n    function setApprovalForAll(address op, bool ok) external { isApprovedForAll[msg.sender][op] = ok; emit ApprovalForAll(msg.sender, op, ok); }\n    function transferFrom(address f, address t, uint256 id) public {\n        require(f == ownerOf(id), \"from\");\n        require(t != address(0), \"to\");\n        require(msg.sender == f || isApprovedForAll[f][msg.sender] || msg.sender == getApproved[id], \"auth\");\n        _balances[f]--; _balances[t]++; _owners[id] = t; delete getApproved[id];\n        emit Transfer(f, t, id);\n    }\n    function safeTransferFrom(address f, address t, uint256 id) external { safeTransferFrom(f, t, id, \"\"); }\n    function safeTransferFrom(address f, address t, uint256 id, bytes memory d) public {\n        transferFrom(f, t, id);\n        if (t.code.length > 0) require(IReceiver(t).onERC721Received(msg.sender, f, id, d) == IReceiver.onERC721Received.selector, \"recv\");\n    }\n    function supportsInterface(bytes4 i) external pure returns (bool) {\n        return i == 0x01ffc9a7 || i == 0x80ac58cd || i == 0x5b5e139f || i == 0x2a55205a;\n    }\n    function royaltyInfo(uint256, uint256 sale) external view returns (address, uint256) { return (payout, sale * ROYALTY_BPS / 10000); }\n\n    // ---------------- traits ----------------\n    function _pick(uint256 r, uint8[8] memory cum, uint256 n) private pure returns (uint256) {\n        r = (r & 0xffff) % 100;\n        for (uint256 i; i < n; i++) if (r < cum[i]) return i;\n        return n - 1;\n    }\n    function _traits(uint256 s) private pure returns (uint256[7] memory t) {\n        t[0] = (s & 0xff) % 8;                                                   // background\n        t[1] = _pick(s >> 8, [uint8(30), 52, 66, 76, 84, 90, 95, 100], 8);      // fur\n        t[2] = _pick(s >> 24, [uint8(34), 60, 82, 100, 100, 100, 100, 100], 4);  // pattern\n        t[3] = _pick(s >> 40, [uint8(26), 46, 62, 74, 84, 91, 96, 100], 8);     // eyes\n        t[4] = _pick(s >> 56, [uint8(30), 55, 75, 90, 100, 100, 100, 100], 5);   // collar\n        t[5] = _pick(s >> 72, [uint8(45), 80, 100, 100, 100, 100, 100, 100], 3); // raised paw\n        t[6] = _pick(s >> 88, [uint8(20), 55, 78, 92, 100, 100, 100, 100], 5);   // treasure\n    }\n    function _bgC(uint256 i) private pure returns (string memory) {\n        return [\"#F0B90B\",\"#C8102E\",\"#0E5E42\",\"#14213D\",\"#F5E6CC\",\"#6D213C\",\"#065A60\",\"#E26D5C\"][i];\n    }\n    function _bgN(uint256 i) private pure returns (string memory) {\n        return [\"BNB Gold\",\"Lucky Red\",\"Jade\",\"Midnight\",\"Cream\",\"Plum\",\"Deep Teal\",\"Sunset\"][i];\n    }\n    function _furC(uint256 i) private pure returns (string memory) {\n        return [\"#F7F3EA\",\"#F2C230\",\"#33302B\",\"#F08A24\",\"#F5D7C4\",\"#F5A8BC\",\"#B8BDC4\",\"#D64541\"][i];\n    }\n    function _furN(uint256 i) private pure returns (string memory) {\n        return [\"Classic White\",\"Imperial Gold\",\"Lucky Black\",\"Orange\",\"Cream\",\"Sakura Pink\",\"Silver Grey\",\"Fortune Red\"][i];\n    }\n    function _patN(uint256 i) private pure returns (string memory) { return [\"None\",\"Tabby Stripes\",\"Spots\",\"Calico\"][i]; }\n    function _eyesN(uint256 i) private pure returns (string memory) {\n        return [\"Kind\",\"Joyful\",\"Golden\",\"BNB\",\"Sleepy\",\"Diamond\",\"Stern\",\"Wink\"][i];\n    }\n    function _collarN(uint256 i) private pure returns (string memory) {\n        return [\"Red Collar\",\"Jade Collar\",\"Royal Purple\",\"Golden Collar\",\"Lucky Knot\"][i];\n    }\n    function _pawN(uint256 i) private pure returns (string memory) { return [\"Right Paw\",\"Left Paw\",\"Both Paws\"][i]; }\n    function _treasureN(uint256 i) private pure returns (string memory) {\n        return [\"None\",\"Koban Coin\",\"Grand Koban\",\"Gold Ingot\",\"Treasure Fish\"][i];\n    }\n\n    // ---------------- art ----------------\n    // 24x24 pixel grid, drawn as SVG rects exactly like the template collections.\n    // A _rect() builder keeps the bytecode under the 24,576-byte mainnet limit;\n    // the emitted SVG is identical in form to the template's literal rects.\n    function _rect(uint256 x, uint256 y, uint256 w, uint256 h, string memory f) private pure returns (string memory) {\n        return string.concat('<rect x=\"', _str(x), '\" y=\"', _str(y), '\" width=\"', _str(w), '\" height=\"', _str(h), '\" fill=\"', f, '\"/>');\n    }\n    function _rectO(uint256 x, uint256 y, uint256 w, uint256 h, string memory f, string memory op) private pure returns (string memory) {\n        return string.concat('<rect x=\"', _str(x), '\" y=\"', _str(y), '\" width=\"', _str(w), '\" height=\"', _str(h), '\" fill=\"', f, '\" fill-opacity=\"', op, '\"/>');\n    }\n    function _base(string memory fur) private pure returns (string memory) {\n        string memory oc = \"#2A1D16\";\n        // tail curling up the right side, drawn first so the body overlaps its root\n        string memory s = string.concat(_rect(19, 16, 4, 3, oc), _rect(18, 19, 5, 3, oc), _rect(20, 17, 2, 1, fur), _rect(19, 20, 3, 1, fur), _rect(22, 19, 1, 2, oc));\n        // body: neck row, main block, wide base; then fur fill inset by one pixel\n        s = string.concat(s, _rect(6, 14, 12, 1, oc), _rect(4, 15, 16, 7, oc), _rect(3, 22, 18, 2, oc));\n        s = string.concat(s, _rect(5, 15, 14, 6, fur), _rect(5, 21, 14, 1, fur), _rect(4, 22, 16, 1, fur));\n        // light chest and front-paw toe separations on the base row\n        s = string.concat(s, _rectO(9, 17, 6, 4, \"#FFFFFF\", \".22\"), _rect(8, 22, 1, 1, oc), _rect(15, 22, 1, 1, oc));\n        // neck and chin\n        s = string.concat(s, _rect(6, 13, 12, 1, oc), _rect(7, 13, 10, 1, fur));\n        // head block and fill\n        s = string.concat(s, _rect(4, 3, 16, 10, oc), _rect(5, 4, 14, 8, fur));\n        // ears with pink inners\n        s = string.concat(s, _rect(6, 0, 2, 1, oc), _rect(5, 1, 4, 2, oc), _rect(6, 1, 2, 1, \"#F28BA8\"));\n        s = string.concat(s, _rect(16, 0, 2, 1, oc), _rect(15, 1, 4, 2, oc), _rect(16, 1, 2, 1, \"#F28BA8\"));\n        return s;\n    }\n    function _pattern(uint256 k) private pure returns (string memory) {\n        if (k == 0) return \"\";\n        string memory s;\n        if (k == 1) {\n            // tabby: three forehead stripes and stripes on both body sides\n            s = string.concat(_rectO(9, 4, 1, 2, \"#000000\", \".22\"), _rectO(11, 4, 2, 2, \"#000000\", \".22\"), _rectO(14, 4, 1, 2, \"#000000\", \".22\"));\n            s = string.concat(s, _rectO(5, 17, 2, 1, \"#000000\", \".18\"), _rectO(5, 19, 2, 1, \"#000000\", \".18\"), _rectO(17, 17, 2, 1, \"#000000\", \".18\"), _rectO(17, 19, 2, 1, \"#000000\", \".18\"));\n            return s;\n        }\n        if (k == 2) {\n            s = string.concat(_rectO(7, 5, 2, 1, \"#000000\", \".18\"), _rectO(15, 10, 1, 1, \"#000000\", \".18\"), _rectO(7, 16, 2, 1, \"#000000\", \".18\"));\n            s = string.concat(s, _rectO(14, 18, 2, 1, \"#000000\", \".18\"), _rectO(10, 20, 1, 1, \"#000000\", \".18\"), _rectO(16, 16, 1, 1, \"#000000\", \".18\"));\n            return s;\n        }\n        // calico: orange and black patches over head and body\n        s = string.concat(_rect(5, 4, 4, 2, \"#F08A24\"), _rect(5, 6, 2, 1, \"#F08A24\"), _rect(16, 4, 3, 2, \"#33302B\"));\n        s = string.concat(s, _rect(5, 19, 4, 2, \"#33302B\"), _rect(5, 18, 2, 1, \"#33302B\"), _rect(15, 17, 4, 2, \"#F08A24\"), _rect(17, 19, 2, 1, \"#F08A24\"));\n        return s;\n    }\n    function _whiskers() private pure returns (string memory) {\n        return string.concat(_rectO(0, 8, 3, 1, \"#1A1A1A\", \".4\"), _rectO(0, 10, 3, 1, \"#1A1A1A\", \".4\"), _rectO(21, 8, 3, 1, \"#1A1A1A\", \".4\"), _rectO(21, 10, 3, 1, \"#1A1A1A\", \".4\"));\n    }\n    function _ew() private pure returns (string memory) {\n        return string.concat(_rect(6, 7, 4, 3, \"#FFFFFF\"), _rect(14, 7, 4, 3, \"#FFFFFF\"));\n    }\n    function _iris(string memory c, string memory hl) private pure returns (string memory) {\n        return string.concat(_rect(7, 8, 2, 2, c), _rect(15, 8, 2, 2, c), _rect(7, 8, 1, 1, hl), _rect(15, 8, 1, 1, hl));\n    }\n    function _eyes(uint256 k) private pure returns (string memory) {\n        string memory oc = \"#2A1D16\";\n        if (k == 0) return string.concat(_ew(), _iris(\"#2B2B2B\", \"#FFFFFF\"));\n        if (k == 1) return string.concat(_rect(6, 8, 4, 1, oc), _rect(6, 7, 1, 1, oc), _rect(9, 7, 1, 1, oc), _rect(14, 8, 4, 1, oc), _rect(14, 7, 1, 1, oc), _rect(17, 7, 1, 1, oc));\n        if (k == 2) return string.concat(_ew(), _iris(\"#FFD700\", \"#111\"));\n        if (k == 3) return string.concat(_ew(), _rect(7, 8, 2, 2, \"#F0B90B\"), _rect(15, 8, 2, 2, \"#F0B90B\"), _rect(8, 7, 1, 3, \"#111\"), _rect(16, 7, 1, 3, \"#111\"));\n        if (k == 4) return string.concat(_rect(6, 9, 4, 1, oc), _rect(14, 9, 4, 1, oc), _rect(7, 10, 1, 1, oc), _rect(16, 10, 1, 1, oc));\n        if (k == 5) return string.concat(_ew(), _iris(\"#9BE7FF\", \"#111\"));\n        if (k == 6) {\n            string memory e = string.concat(_rect(6, 6, 2, 1, oc), _rect(8, 5, 2, 1, oc), _rect(14, 5, 2, 1, oc), _rect(16, 6, 2, 1, oc));\n            return string.concat(e, _rect(6, 8, 4, 2, \"#FFFFFF\"), _rect(14, 8, 4, 2, \"#FFFFFF\"), _rect(7, 9, 2, 1, oc), _rect(15, 9, 2, 1, oc));\n        }\n        // wink: left eye a joyful arc, right eye open\n        return string.concat(_rect(6, 8, 4, 1, oc), _rect(6, 7, 1, 1, oc), _rect(9, 7, 1, 1, oc), _rect(14, 7, 4, 3, \"#FFFFFF\"), _rect(15, 8, 2, 2, \"#2B2B2B\"), _rect(15, 8, 1, 1, \"#FFFFFF\"));\n    }\n    function _face() private pure returns (string memory) {\n        // nose and a small w-shaped mouth\n        return string.concat(_rect(11, 9, 2, 1, \"#C2504A\"), _rect(10, 10, 1, 1, \"#2A1D16\"), _rect(13, 10, 1, 1, \"#2A1D16\"));\n    }\n    function _collar(uint256 k) private pure returns (string memory) {\n        string memory band = [\"#C8102E\",\"#0E5E42\",\"#5B2A86\",\"#D9A404\",\"#C8102E\"][k];\n        string memory s = _rect(6, 14, 12, 1, band);\n        if (k == 4) {\n            // lucky knot with tassels instead of a bell\n            return string.concat(s, _rect(11, 15, 2, 2, \"#C8102E\"), _rect(11, 15, 1, 1, \"#FFD700\"), _rect(10, 17, 1, 2, \"#C8102E\"), _rect(13, 17, 1, 2, \"#C8102E\"));\n        }\n        string memory bell = k == 3 ? \"#C8102E\" : \"#FFD700\";\n        s = string.concat(s, _rect(11, 15, 2, 1, bell), _rect(10, 16, 4, 1, bell), _rect(11, 17, 2, 1, bell));\n        s = string.concat(s, _rect(11, 15, 1, 1, \"#FFF3B0\"), _rect(11, 16, 2, 1, \"#8A6508\"));\n        return s;\n    }\n    function _paw(uint256 k, string memory fur) private pure returns (string memory) {\n        string memory oc = \"#2A1D16\";\n        string memory right = string.concat(_rect(20, 2, 3, 4, oc), _rect(21, 3, 1, 2, fur), _rect(21, 4, 1, 1, \"#F28BA8\"), _rect(20, 6, 3, 6, oc), _rect(21, 7, 1, 4, fur));\n        string memory left = string.concat(_rect(1, 2, 3, 4, oc), _rect(2, 3, 1, 2, fur), _rect(2, 4, 1, 1, \"#F28BA8\"), _rect(1, 6, 3, 6, oc), _rect(2, 7, 1, 4, fur));\n        if (k == 0) return right;\n        if (k == 1) return left;\n        return string.concat(left, right);\n    }\n    function _treasure(uint256 k) private pure returns (string memory) {\n        if (k == 0) return \"\";\n        string memory s;\n        if (k == 1) {\n            // koban: the classic oval gold coin, held between the front paws\n            s = string.concat(_rect(10, 18, 4, 1, \"#FFE066\"), _rect(9, 19, 6, 1, \"#FFD700\"), _rect(9, 20, 6, 1, \"#FFD700\"), _rect(10, 21, 4, 1, \"#B8860B\"));\n            s = string.concat(s, _rect(9, 19, 1, 1, \"#B8860B\"), _rect(14, 20, 1, 1, \"#B8860B\"), _rect(11, 19, 2, 2, \"#8A6508\"));\n            return s;\n        }\n        if (k == 2) {\n            s = string.concat(_rect(9, 17, 6, 1, \"#FFE066\"), _rect(8, 18, 8, 1, \"#FFD700\"), _rect(8, 19, 8, 1, \"#FFD700\"), _rect(8, 20, 8, 1, \"#FFD700\"), _rect(9, 21, 6, 1, \"#B8860B\"));\n            s = string.concat(s, _rect(8, 18, 1, 1, \"#B8860B\"), _rect(15, 19, 1, 1, \"#B8860B\"), _rect(8, 20, 1, 1, \"#B8860B\"), _rect(11, 18, 2, 2, \"#8A6508\"));\n            return s;\n        }\n        if (k == 3) {\n            s = string.concat(_rect(10, 19, 4, 1, \"#FFE066\"), _rect(9, 20, 1, 1, \"#B8860B\"), _rect(10, 20, 4, 1, \"#FFD700\"), _rect(14, 20, 1, 1, \"#B8860B\"));\n            s = string.concat(s, _rect(8, 21, 1, 1, \"#B8860B\"), _rect(9, 21, 6, 1, \"#FFD700\"), _rect(15, 21, 1, 1, \"#B8860B\"), _rect(8, 22, 8, 1, \"#B8860B\"));\n            return s;\n        }\n        // treasure fish (tai), a red sea bream for celebration\n        s = string.concat(_rect(11, 18, 2, 1, \"#F08A24\"), _rect(8, 19, 6, 2, \"#E8442E\"), _rect(8, 19, 2, 2, \"#C8102E\"));\n        s = string.concat(s, _rect(14, 18, 2, 1, \"#E8442E\"), _rect(14, 21, 2, 1, \"#E8442E\"), _rect(15, 19, 1, 2, \"#C8102E\"), _rect(9, 19, 1, 1, \"#FFFFFF\"));\n        return s;\n    }\n    function _svg(uint256 s) private pure returns (string memory) {\n        return _draw(_traits(s));\n    }\n    function _draw(uint256[7] memory t) private pure returns (string memory) {\n        return string.concat(\n            '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" shape-rendering=\"crispEdges\">',\n            string.concat('<rect x=\"0\" y=\"0\" width=\"24\" height=\"24\" fill=\"', _bgC(t[0]), '\"/>', _base(_furC(t[1])), _pattern(t[2])),\n            string.concat(_whiskers(), _eyes(t[3]), _face(), _collar(t[4]), _treasure(t[6]), _paw(t[5], _furC(t[1]))),\n            '</svg>'\n        );\n    }\n    function tokenURI(uint256 id) external view returns (string memory) {\n        ownerOf(id);\n        uint256 s = _seed[id];\n        uint256[7] memory t = _traits(s);\n        string memory attrs = string.concat(\n            string.concat('[{\"trait_type\":\"Background\",\"value\":\"', _bgN(t[0]), '\"},{\"trait_type\":\"Fur\",\"value\":\"', _furN(t[1]), '\"},{\"trait_type\":\"Pattern\",\"value\":\"', _patN(t[2])),\n            string.concat('\"},{\"trait_type\":\"Eyes\",\"value\":\"', _eyesN(t[3]), '\"},{\"trait_type\":\"Collar\",\"value\":\"', _collarN(t[4])),\n            string.concat('\"},{\"trait_type\":\"Raised Paw\",\"value\":\"', _pawN(t[5]), '\"},{\"trait_type\":\"Treasure\",\"value\":\"', _treasureN(t[6]), '\"}]')\n        );\n        string memory json = string.concat(\n            '{\"name\":\"Fortune Cat #', _str(id), '\",\"description\":\"', DESC,\n            '\",\"image\":\"data:image/svg+xml;base64,', _b64(bytes(_svg(s))), '\",\"attributes\":', attrs, '}'\n        );\n        return string.concat(\"data:application/json;base64,\", _b64(bytes(json)));\n    }\n    function contractURI() external view returns (string memory) {\n        string memory json = string.concat(\n            '{\"name\":\"Fortune Cats\",\"description\":\"', DESC,\n            '\",\"image\":\"data:image/svg+xml;base64,', _b64(bytes(_draw([uint256(1), 0, 3, 1, 0, 2, 2]))),\n            '\",\"seller_fee_basis_points\":500,\"fee_recipient\":\"', _hex(payout), '\"}'\n        );\n        return string.concat(\"data:application/json;base64,\", _b64(bytes(json)));\n    }\n\n    // ---------------- utils ----------------\n    function _hex(address a) private pure returns (string memory) {\n        bytes memory h = \"0123456789abcdef\"; bytes memory r = new bytes(42);\n        r[0] = \"0\"; r[1] = \"x\";\n        for (uint256 i; i < 20; i++) {\n            uint8 b = uint8(uint160(a) >> (8 * (19 - i)));\n            r[2 + i * 2] = h[b >> 4]; r[3 + i * 2] = h[b & 15];\n        }\n        return string(r);\n    }\n    function _str(uint256 v) private pure returns (string memory) {\n        if (v == 0) return \"0\";\n        uint256 l; for (uint256 t = v; t > 0; t /= 10) l++;\n        bytes memory b = new bytes(l);\n        while (v > 0) { b[--l] = bytes1(uint8(48 + v % 10)); v /= 10; }\n        return string(b);\n    }\n    function _b64(bytes memory data) private pure returns (string memory) {\n        bytes memory T = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n        uint256 len = data.length; if (len == 0) return \"\";\n        bytes memory r = new bytes(4 * ((len + 2) / 3));\n        uint256 j;\n        for (uint256 i; i < len; i += 3) {\n            uint256 a = uint8(data[i]);\n            uint256 b = i + 1 < len ? uint8(data[i + 1]) : 0;\n            uint256 c = i + 2 < len ? uint8(data[i + 2]) : 0;\n            uint256 n = (a << 16) | (b << 8) | c;\n            r[j++] = T[(n >> 18) & 63]; r[j++] = T[(n >> 12) & 63];\n            r[j++] = i + 1 < len ? T[(n >> 6) & 63] : bytes1(\"=\");\n            r[j++] = i + 2 < len ? T[n & 63] : bytes1(\"=\");\n        }\n        return string(r);\n    }\n}\n"}},"abi":[{"type":"constructor","inputs":[{"name":"_owner","type":"address","internalType":"address"},{"name":"_payout","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"Approval","type":"event","inputs":[{"name":"o","type":"address","indexed":true,"internalType":"address"},{"name":"s","type":"address","indexed":true,"internalType":"address"},{"name":"id","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"ApprovalForAll","type":"event","inputs":[{"name":"o","type":"address","indexed":true,"internalType":"address"},{"name":"op","type":"address","indexed":true,"internalType":"address"},{"name":"ok","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"prev","type":"address","indexed":true,"internalType":"address"},{"name":"next","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"id","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"AGENT_ID","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IERC721Bal"}],"stateMutability":"view"},{"name":"FREE_SUPPLY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_PER_WALLET","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_SUPPLY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"ROYALTY_BPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"s","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"balanceOf","type":"function","inputs":[{"name":"a","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":"who","type":"address","internalType":"address"},{"name":"qty","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeClaimed","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getApproved","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"qty","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"mintOpen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mintedBy","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"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":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"o","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"payout","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"price","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"royaltyInfo","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"sale","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"safeTransferFrom","type":"function","inputs":[{"name":"f","type":"address","internalType":"address"},{"name":"t","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"safeTransferFrom","type":"function","inputs":[{"name":"f","type":"address","internalType":"address"},{"name":"t","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"},{"name":"d","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setApprovalForAll","type":"function","inputs":[{"name":"op","type":"address","internalType":"address"},{"name":"ok","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setMintOpen","type":"function","inputs":[{"name":"o","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPrice","type":"function","inputs":[{"name":"p","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"supportsInterface","type":"function","inputs":[{"name":"i","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"tokenURI","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transferFrom","type":"function","inputs":[{"name":"f","type":"address","internalType":"address"},{"name":"t","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"transferOwnership","type":"function","inputs":[{"name":"n","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"withdraw","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"}],"matchId":"58937334","creationMatch":"match","runtimeMatch":"match","verifiedAt":"2026-11-09T22:36:36Z","match":"match","chainId":"56","address":"0x349d8FBed5DE52A4e5065E143797d7B92846Be0e"}