{"sources":{"MascotBNB.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.24;\n\n/// @title Mascot BNB\n/// @notice 5,000 fully on-chain mascot NFTs on BNB Chain. Only wallets holding a\n/// .ai Agent ID can mint. First 2 per wallet are free, then 0.001 BNB each.\n/// Max 20 per wallet. Payments go straight to CREATOR in the same tx.\n/// No owner, no pause, no withdraw, no admin mint. Collectible only.\ninterface IAgentID { function balanceOf(address) external view returns (uint256); }\n\ncontract MascotBNB {\n    string public constant name = \"Mascot BNB\";\n    string public constant symbol = \"MASCOT\";\n    uint256 public constant MAX_SUPPLY = 5000;\n    uint256 public constant FREE_PER_WALLET = 2;\n    uint256 public constant MAX_PER_WALLET = 20;\n    uint256 public constant PRICE = 0.001 ether;\n    address public constant AGENT_ID = 0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F;\n    address payable public constant CREATOR = payable(0xc22fAea03B96269725f6c04b43b969C718736376);\n\n    uint256 public totalSupply;\n    mapping(address => uint256) public minted;\n    mapping(uint256 => address) private _owner;\n    mapping(address => uint256) private _bal;\n    mapping(uint256 => address) public getApproved;\n    mapping(address => mapping(address => bool)) public isApprovedForAll;\n\n    event Transfer(address indexed from, address indexed to, uint256 indexed id);\n    event Approval(address indexed owner, address indexed spender, uint256 indexed id);\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n    function priceFor(address w, uint256 q) public view returns (uint256) {\n        uint256 m = minted[w];\n        uint256 free = m >= FREE_PER_WALLET ? 0 : FREE_PER_WALLET - m;\n        return q > free ? (q - free) * PRICE : 0;\n    }\n\n    function mint(uint256 q) external payable {\n        require(q > 0, \"qty\");\n        require(IAgentID(AGENT_ID).balanceOf(msg.sender) > 0, \"need .ai Agent ID\");\n        require(minted[msg.sender] + q <= MAX_PER_WALLET, \"wallet max\");\n        uint256 s = totalSupply;\n        require(s + q <= MAX_SUPPLY, \"sold out\");\n        require(msg.value == priceFor(msg.sender, q), \"wrong value\");\n        minted[msg.sender] += q;\n        _bal[msg.sender] += q;\n        for (uint256 i = 1; i <= q; ++i) {\n            _owner[s + i] = msg.sender;\n            emit Transfer(address(0), msg.sender, s + i);\n        }\n        totalSupply = s + q;\n        if (msg.value > 0) {\n            (bool ok, ) = CREATOR.call{value: msg.value}(\"\");\n            require(ok, \"pay\");\n        }\n    }\n\n    // ---- ERC721 ----\n    function ownerOf(uint256 id) public view returns (address o) { o = _owner[id]; require(o != address(0), \"none\"); }\n    function balanceOf(address o) external view returns (uint256) { require(o != address(0)); return _bal[o]; }\n    function approve(address sp, uint256 id) external {\n        address o = ownerOf(id);\n        require(msg.sender == o || isApprovedForAll[o][msg.sender], \"auth\");\n        getApproved[id] = sp; emit Approval(o, sp, 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 == _owner[id], \"from\");\n        require(t != address(0), \"to\");\n        require(msg.sender == f || isApprovedForAll[f][msg.sender] || msg.sender == getApproved[id], \"auth\");\n        unchecked { _bal[f]--; _bal[t]++; }\n        _owner[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) {\n            require(IERC721Receiver(t).onERC721Received(msg.sender, f, id, d) == 0x150b7a02, \"unsafe\");\n        }\n    }\n    function supportsInterface(bytes4 i) external pure returns (bool) {\n        return i == 0x01ffc9a7 || i == 0x80ac58cd || i == 0x5b5e139f;\n    }\n\n    // ---- on-chain art ----\n    function _pick(string memory csv, uint256 n, uint256 k) private pure returns (string memory) {\n        // csv: fixed 7-char items like \"#F0B90B\"\n        bytes memory b = bytes(csv); bytes memory o = new bytes(7);\n        uint256 st = (k % n) * 8;\n        for (uint256 i; i < 7; ++i) o[i] = b[st + i];\n        return string(o);\n    }\n\n    function _svg(uint256 id) private pure returns (string memory, uint256, uint256, uint256) {\n        uint256 r = uint256(keccak256(abi.encodePacked(\"MASCOT\", id)));\n        string memory bg = _pick(\"#1E2026,#0B0E11,#2B3139,#12355B,#3B1E54,#103B2E,#5A1F1F,#4A3B00\", 8, r);\n        string memory body = _pick(\"#F0B90B,#F8D12F,#FCD535,#E6A700,#FFC93C,#F3BA2F\", 6, r >> 8);\n        uint256 eyes = (r >> 16) % 4;\n        uint256 mouth = (r >> 24) % 4;\n        uint256 acc = (r >> 32) % 6;\n        string memory e = eyes == 0 ? '<circle cx=\"122\" cy=\"135\" r=\"11\"/><circle cx=\"178\" cy=\"135\" r=\"11\"/>'\n            : eyes == 1 ? '<rect x=\"104\" y=\"124\" width=\"40\" height=\"18\" rx=\"4\"/><rect x=\"156\" y=\"124\" width=\"40\" height=\"18\" rx=\"4\"/><rect x=\"144\" y=\"130\" width=\"12\" height=\"4\"/>'\n            : eyes == 2 ? '<path d=\"M110 138q12-14 24 0M166 138q12-14 24 0\" stroke=\"#111\" stroke-width=\"6\" fill=\"none\"/>'\n            : '<circle cx=\"122\" cy=\"135\" r=\"13\" fill=\"#fff\"/><circle cx=\"178\" cy=\"135\" r=\"13\" fill=\"#fff\"/><circle cx=\"125\" cy=\"137\" r=\"6\"/><circle cx=\"181\" cy=\"137\" r=\"6\"/>';\n        string memory m = mouth == 0 ? '<path d=\"M128 172q22 20 44 0\" stroke=\"#111\" stroke-width=\"6\" fill=\"none\"/>'\n            : mouth == 1 ? '<ellipse cx=\"150\" cy=\"178\" rx=\"12\" ry=\"9\"/>'\n            : mouth == 2 ? '<path d=\"M130 175h40\" stroke=\"#111\" stroke-width=\"6\"/>'\n            : '<path d=\"M126 170q24 26 48 0z\" fill=\"#111\"/>';\n        string memory a = acc == 0 ? ''\n            : acc == 1 ? '<path d=\"M110 70h80l-10-30h-60z\" fill=\"#111\"/><rect x=\"96\" y=\"68\" width=\"108\" height=\"8\" fill=\"#111\"/>'\n            : acc == 2 ? '<path d=\"M150 22l14 28 30 4-22 20 6 30-28-15-28 15 6-30-22-20 30-4z\" fill=\"#fff\"/>'\n            : acc == 3 ? '<path d=\"M80 150a70 70 0 0 1 140 0\" stroke=\"#111\" stroke-width=\"10\" fill=\"none\"/><rect x=\"70\" y=\"140\" width=\"22\" height=\"40\" rx=\"8\" fill=\"#111\"/><rect x=\"208\" y=\"140\" width=\"22\" height=\"40\" rx=\"8\" fill=\"#111\"/>'\n            : acc == 4 ? '<path d=\"M118 60l12-26 20 20 20-20 12 26z\" fill=\"#fff\" stroke=\"#111\" stroke-width=\"4\"/>'\n            : '<circle cx=\"150\" cy=\"40\" r=\"10\" fill=\"#fff\"/><path d=\"M150 50v22\" stroke=\"#111\" stroke-width=\"5\"/>';\n        bytes memory head = abi.encodePacked(\n            '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 300 300\"><rect width=\"300\" height=\"300\" fill=\"', bg,\n            '\"/><path d=\"M150 60l90 90-90 90-90-90z\" fill=\"', body,\n            '\" stroke=\"#111\" stroke-width=\"6\"/><path d=\"M150 112l38 38-38 38-38-38z\" fill=\"#fff\" opacity=\".18\"/><g fill=\"#111\">');\n        bytes memory face = abi.encodePacked(e, m, '</g>', a);\n        bytes memory tail = abi.encodePacked('<text x=\"150\" y=\"286\" font-family=\"monospace\" font-size=\"16\" text-anchor=\"middle\" fill=\"', body, '\">#', _str(id), '</text></svg>');\n        string memory s = string(abi.encodePacked(head, face, tail));\n        return (s, eyes, mouth, acc);\n    }\n\n    function tokenURI(uint256 id) external view returns (string memory) {\n        ownerOf(id);\n        (string memory s, uint256 e, uint256 m, uint256 a) = _svg(id);\n        string[4] memory E = [\"Dots\", \"Shades\", \"Happy\", \"Wide\"];\n        string[4] memory M = [\"Smile\", \"Wow\", \"Flat\", \"Laugh\"];\n        string[6] memory A = [\"None\", \"Top Hat\", \"Star\", \"Headphones\", \"Crown\", \"Antenna\"];\n        string memory j = string(abi.encodePacked(\n            '{\"name\":\"Mascot BNB #', _str(id),\n            '\",\"description\":\"5,000 fully on-chain BNB-yellow mascots, minted only by .ai Agent ID wallets.\",\"attributes\":[{\"trait_type\":\"Eyes\",\"value\":\"', E[e],\n            '\"},{\"trait_type\":\"Mouth\",\"value\":\"', M[m], '\"},{\"trait_type\":\"Accessory\",\"value\":\"', A[a],\n            '\"}],\"image\":\"data:image/svg+xml;base64,', _b64(bytes(s)), '\"}'));\n        return string(abi.encodePacked(\"data:application/json;base64,\", _b64(bytes(j))));\n    }\n\n    function _str(uint256 v) private pure returns (string memory) {\n        if (v == 0) return \"0\";\n        uint256 t = v; uint256 d;\n        while (t != 0) { d++; t /= 10; }\n        bytes memory b = new bytes(d);\n        while (v != 0) { d--; b[d] = bytes1(uint8(48 + v % 10)); v /= 10; }\n        return string(b);\n    }\n\n    function _b64(bytes memory data) private pure returns (string memory) {\n        bytes memory T = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n        uint256 len = data.length;\n        if (len == 0) return \"\";\n        bytes memory out = 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            out[j++] = T[(n >> 18) & 63];\n            out[j++] = T[(n >> 12) & 63];\n            out[j++] = i + 1 < len ? T[(n >> 6) & 63] : bytes1(\"=\");\n            out[j++] = i + 2 < len ? T[n & 63] : bytes1(\"=\");\n        }\n        return string(out);\n    }\n}\n\ninterface IERC721Receiver {\n    function onERC721Received(address, address, uint256, bytes calldata) external returns (bytes4);\n}\n"}},"abi":[{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"id","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"ApprovalForAll","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"id","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"AGENT_ID","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"CREATOR","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address payable"}],"stateMutability":"view"},{"name":"FREE_PER_WALLET","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":"PRICE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"sp","type":"address","internalType":"address"},{"name":"id","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":"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":"q","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"minted","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":"ownerOf","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"o","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"priceFor","type":"function","inputs":[{"name":"w","type":"address","internalType":"address"},{"name":"q","type":"uint256","internalType":"uint256"}],"outputs":[{"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":"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"}],"matchId":"57000375","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-25T19:47:58Z","match":"exact_match","chainId":"56","address":"0x692d634E64f6Fa10f80B81DE3dD5b5Fb27B6A02B"}