{"sources":{"AgentNFT.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\n/// @title AgentNFT — shared template for the t0mek21 NFT batch (BSC).\n/// @notice ERC-721 collection with three mint lanes and zero admin surface:\n///  - claimAgentFree(): 1 free NFT per Binance Agent ID wallet, capped.\n///  - claimXFree(permit): 1 free NFT per verified X handle, capped. The\n///    EIP-712 permit is issued by the gate signer only after the claimer's\n///    own X post is verified off-chain; the contract enforces one claim\n///    per wallet AND one claim per handle hash on-chain (audit rule 2).\n///  - mint(count, referrer): public paid mint, open to all wallets. The\n///    exact purchase price is forwarded to the treasury in the same\n///    transaction (100% of price, contract keeps nothing); any excess\n///    payment is refunded to the buyer. Referrers earn 1 bonus NFT per\n///    5 paid mints routed through them, claimable via claimReferralBonus().\n/// Artwork is generated fully on-chain and is purely cosmetic: shapes and\n/// palette are a deterministic function of the token id only. There are no\n/// rarity tiers, no luck/value attributes and no prizes (audit rule 1).\n/// No owner, no admin functions, no pause, no setters — all configuration\n/// is immutable constructor state.\ninterface IAgentIdRegistry {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ncontract AgentNFT {\n    // ---------------- ERC-721 ----------------\n    string public name;\n    string public symbol;\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\n    function balanceOf(address owner) public view returns (uint256) {\n        require(owner != address(0), \"zero address\");\n        return _balances[owner];\n    }\n\n    function ownerOf(uint256 tokenId) public view returns (address) {\n        address o = _owners[tokenId];\n        require(o != address(0), \"nonexistent token\");\n        return o;\n    }\n\n    function approve(address to, uint256 tokenId) external {\n        address o = ownerOf(tokenId);\n        require(msg.sender == o || _operatorApprovals[o][msg.sender], \"not authorized\");\n        _tokenApprovals[tokenId] = to;\n        emit Approval(o, to, tokenId);\n    }\n\n    function getApproved(uint256 tokenId) external view returns (address) {\n        require(_owners[tokenId] != address(0), \"nonexistent token\");\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 owner, address operator) external view returns (bool) {\n        return _operatorApprovals[owner][operator];\n    }\n\n    function transferFrom(address from, address to, uint256 tokenId) public {\n        address o = ownerOf(tokenId);\n        require(o == from, \"wrong from\");\n        require(\n            msg.sender == o || _tokenApprovals[tokenId] == msg.sender || _operatorApprovals[o][msg.sender],\n            \"not authorized\"\n        );\n        require(to != address(0), \"zero to\");\n        delete _tokenApprovals[tokenId];\n        _balances[from] -= 1;\n        _balances[to] += 1;\n        _owners[tokenId] = 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            (bool ok, bytes memory ret) = to.call(\n                abi.encodeWithSignature(\"onERC721Received(address,address,uint256,bytes)\", msg.sender, from, tokenId, data)\n            );\n            require(ok && ret.length == 32 && abi.decode(ret, (bytes4)) == bytes4(0x150b7a02), \"unsafe recipient\");\n        }\n    }\n\n    function supportsInterface(bytes4 interfaceId) external pure returns (bool) {\n        return interfaceId == 0x80ac58cd // ERC-721\n            || interfaceId == 0x5b5e139f // ERC-721 metadata\n            || interfaceId == 0x01ffc9a7; // ERC-165\n    }\n\n    // ---------------- Configuration (immutable) ----------------\n    /// @notice Binance Agent ID registry on BSC. Gate = balanceOf > 0.\n    /// (The registry's hasAgentId() reverts — never call it.)\n    address public constant REGISTRY = 0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F;\n\n    uint256 public immutable cap;\n    uint256 public immutable agentFreeCap;\n    uint256 public immutable xFreeCap;\n    uint256 public immutable priceWei;\n    address public immutable gateSigner;\n    address public immutable treasury;\n\n    uint256 public constant MAX_PER_TX = 10;\n    uint256 public constant REFERRALS_PER_BONUS = 5;\n\n    // ---------------- Sale state ----------------\n    uint256 public totalMinted;\n    uint256 public agentFreeUsed;\n    uint256 public xFreeUsed;\n    uint256 public paidSold;\n    uint256 public referralMinted;\n\n    mapping(address => bool) public agentClaimed;\n    mapping(address => bool) public walletXClaimed;\n    mapping(bytes32 => bool) public handleUsed; // keccak256(bytes(handle)) -> used\n    mapping(address => uint256) public referralPaid; // paid mints routed via referrer\n    mapping(address => uint256) public referralBonusClaimed; // bonus NFTs already minted\n\n    event AgentFreeClaimed(address indexed wallet, uint256 tokenId);\n    event XFreeClaimed(address indexed wallet, bytes32 indexed handleHash, uint256 tokenId);\n    event PaidMint(address indexed buyer, uint256 count, address indexed referrer);\n    event ReferralBonusClaimed(address indexed referrer, uint256 count);\n\n    // ---------------- EIP-712 permit ----------------\n    /// XPermit(address wallet,string handle,uint256 deadline)\n    bytes32 private constant XPERMIT_TYPEHASH =\n        keccak256(\"XPermit(address wallet,string handle,uint256 deadline)\");\n    bytes32 private immutable _domainSeparator;\n\n    function domainSeparator() external view returns (bytes32) {\n        return _domainSeparator;\n    }\n\n    bool private _lock;\n    modifier nonReentrant() {\n        require(!_lock, \"reentrant\");\n        _lock = true;\n        _;\n        _lock = false;\n    }\n\n    constructor(\n        string memory name_,\n        string memory symbol_,\n        uint256 cap_,\n        uint256 agentFreeCap_,\n        uint256 xFreeCap_,\n        uint256 priceWei_,\n        address gateSigner_,\n        address treasury_\n    ) {\n        require(bytes(name_).length > 0 && bytes(symbol_).length > 0, \"empty name/symbol\");\n        require(cap_ > 0, \"cap zero\");\n        require(agentFreeCap_ + xFreeCap_ <= cap_, \"free caps exceed cap\");\n        require(priceWei_ > 0, \"price zero\");\n        require(gateSigner_ != address(0), \"gate signer zero\");\n        require(treasury_ != address(0), \"treasury zero\");\n        name = name_;\n        symbol = symbol_;\n        cap = cap_;\n        agentFreeCap = agentFreeCap_;\n        xFreeCap = xFreeCap_;\n        priceWei = priceWei_;\n        gateSigner = gateSigner_;\n        treasury = treasury_;\n        _domainSeparator = keccak256(\n            abi.encode(\n                keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n                keccak256(bytes(name_)),\n                keccak256(bytes(\"1\")),\n                block.chainid,\n                address(this)\n            )\n        );\n    }\n\n    // ---------------- Mint internals ----------------\n    function _mintOne(address to) internal returns (uint256 id) {\n        totalMinted += 1;\n        id = totalMinted; // token ids are sequential, starting at 1\n        _owners[id] = to;\n        _balances[to] += 1;\n        emit Transfer(address(0), to, id);\n    }\n\n    // ---------------- Free lane 1: Agent ID ----------------\n    function claimAgentFree() external {\n        require(!agentClaimed[msg.sender], \"agent free already claimed\");\n        require(agentFreeUsed < agentFreeCap, \"agent free quota exhausted\");\n        require(totalMinted < cap, \"collection sold out\");\n        require(IAgentIdRegistry(REGISTRY).balanceOf(msg.sender) > 0, \"no agent id\");\n        agentClaimed[msg.sender] = true;\n        agentFreeUsed += 1;\n        uint256 id = _mintOne(msg.sender);\n        emit AgentFreeClaimed(msg.sender, id);\n    }\n\n    // ---------------- Free lane 2: verified X handle (permit) ----------------\n    /// @notice The gate signer signs XPermit(wallet, handle, deadline) only\n    /// after verifying the claimer's own X post off-chain. The contract\n    /// enforces: deadline, signer, one claim per wallet, one claim per\n    /// handle (handleUsed on keccak256(bytes(handle))).\n    function claimXFree(string calldata handle, uint256 deadline, bytes calldata sig) external {\n        require(bytes(handle).length > 0, \"empty handle\");\n        require(block.timestamp <= deadline, \"permit expired\");\n        require(!walletXClaimed[msg.sender], \"x free already claimed\");\n        bytes32 handleHash = keccak256(bytes(handle));\n        require(!handleUsed[handleHash], \"handle already used\");\n        require(xFreeUsed < xFreeCap, \"x free quota exhausted\");\n        require(totalMinted < cap, \"collection sold out\");\n        require(sig.length == 65, \"bad sig length\");\n        bytes32 structHash = keccak256(abi.encode(XPERMIT_TYPEHASH, msg.sender, handleHash, deadline));\n        bytes32 digest = keccak256(abi.encodePacked(\"\\x19\\x01\", _domainSeparator, structHash));\n        bytes32 r;\n        bytes32 s;\n        uint8 v;\n        assembly {\n            r := calldataload(sig.offset)\n            s := calldataload(add(sig.offset, 32))\n            v := byte(0, calldataload(add(sig.offset, 64)))\n        }\n        address signer = ecrecover(digest, v, r, s);\n        require(signer != address(0) && signer == gateSigner, \"bad permit\");\n        walletXClaimed[msg.sender] = true;\n        handleUsed[handleHash] = true;\n        xFreeUsed += 1;\n        uint256 id = _mintOne(msg.sender);\n        emit XFreeClaimed(msg.sender, handleHash, id);\n    }\n\n    // ---------------- Paid lane: open to all wallets ----------------\n    /// @notice Forwards exactly priceWei * count to the treasury in this\n    /// transaction (100% of the purchase price) and refunds any excess.\n    function mint(uint256 count, address referrer) external payable nonReentrant {\n        require(count >= 1 && count <= MAX_PER_TX, \"count out of range\");\n        require(totalMinted + count <= cap, \"cap exceeded\");\n        uint256 cost = priceWei * count;\n        require(msg.value >= cost, \"insufficient payment\");\n        paidSold += count;\n        if (referrer != address(0) && referrer != msg.sender) {\n            referralPaid[referrer] += count;\n        }\n        for (uint256 i = 0; i < count; i++) {\n            _mintOne(msg.sender);\n        }\n        (bool ok, ) = treasury.call{value: cost}(\"\");\n        require(ok, \"treasury transfer failed\");\n        uint256 excess = msg.value - cost;\n        if (excess > 0) {\n            (bool ok2, ) = msg.sender.call{value: excess}(\"\");\n            require(ok2, \"refund failed\");\n        }\n        emit PaidMint(msg.sender, count, referrer);\n    }\n\n    /// @notice Bonus NFTs earned but not yet minted: 1 per 5 paid referrals.\n    function referralBonusPending(address referrer) public view returns (uint256) {\n        return referralPaid[referrer] / REFERRALS_PER_BONUS - referralBonusClaimed[referrer];\n    }\n\n    /// @notice Mints all pending bonus NFTs to the caller. If the cap only\n    /// leaves room for part of the pending amount, mints what fits and\n    /// keeps the rest pending — never reverts solely because of the cap.\n    function claimReferralBonus() external returns (uint256 minted) {\n        uint256 pending = referralBonusPending(msg.sender);\n        require(pending > 0, \"no bonus pending\");\n        uint256 room = cap - totalMinted;\n        minted = pending < room ? pending : room;\n        if (minted > 0) {\n            referralBonusClaimed[msg.sender] += minted;\n            referralMinted += minted;\n            for (uint256 i = 0; i < minted; i++) {\n                _mintOne(msg.sender);\n            }\n            emit ReferralBonusClaimed(msg.sender, minted);\n        }\n    }\n\n    // ---------------- Views ----------------\n    /// @notice Fixed tuple for sites and snapshots:\n    /// (totalMinted, agentFreeUsed, xFreeUsed, paidSold, referralMinted,\n    ///  cap, priceWei, agentFreeCap, xFreeCap)\n    function status()\n        external\n        view\n        returns (\n            uint256 totalMinted_,\n            uint256 agentFreeUsed_,\n            uint256 xFreeUsed_,\n            uint256 paidSold_,\n            uint256 referralMinted_,\n            uint256 cap_,\n            uint256 priceWei_,\n            uint256 agentFreeCap_,\n            uint256 xFreeCap_\n        )\n    {\n        return (\n            totalMinted,\n            agentFreeUsed,\n            xFreeUsed,\n            paidSold,\n            referralMinted,\n            cap,\n            priceWei,\n            agentFreeCap,\n            xFreeCap\n        );\n    }\n\n    // ---------------- On-chain metadata (purely cosmetic) ----------------\n    function _palette(uint256 idx)\n        internal\n        pure\n        returns (string memory bg, string memory fg, string memory ac)\n    {\n        if (idx == 0) return (\"#10243e\", \"#e8f1f8\", \"#f4b942\");\n        if (idx == 1) return (\"#3e1024\", \"#f8e8f1\", \"#42f4b9\");\n        if (idx == 2) return (\"#123e10\", \"#f1f8e8\", \"#f44242\");\n        if (idx == 3) return (\"#2e2e2e\", \"#f5f0e1\", \"#d4a017\");\n        if (idx == 4) return (\"#e8e3d5\", \"#1d3557\", \"#e63946\");\n        if (idx == 5) return (\"#1a0533\", \"#e0aaff\", \"#48cae4\");\n        if (idx == 6) return (\"#f4f1de\", \"#3d405b\", \"#e07a5f\");\n        return (\"#0d1b2a\", \"#e0e1dd\", \"#fcbf49\");\n    }\n\n    /// @notice Deterministic cosmetic artwork: palette and shapes are a\n    /// function of the token id only. No rarity, no value attributes.\n    function _svg(uint256 tokenId) internal view returns (string memory) {\n        (string memory bg, string memory fg, string memory ac) = _palette(tokenId % 8);\n        uint256 cx = 18 + ((tokenId * 37) % 56);\n        uint256 cy = 16 + ((tokenId * 53) % 52);\n        uint256 r = 7 + ((tokenId * 7) % 13);\n        uint256 rx = (tokenId * 29) % 68;\n        uint256 ry = (tokenId * 41) % 62;\n        uint256 rs = 9 + ((tokenId * 3) % 17);\n        uint256 cx2 = 15 + ((tokenId * 71) % 62);\n        uint256 cy2 = 60 + ((tokenId * 17) % 26);\n        return\n            string(\n                abi.encodePacked(\n                    '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\">',\n                    '<rect width=\"100\" height=\"100\" fill=\"',\n                    bg,\n                    '\"/><rect x=\"',\n                    _toString(rx),\n                    '\" y=\"',\n                    _toString(ry),\n                    '\" width=\"',\n                    _toString(rs),\n                    '\" height=\"',\n                    _toString(rs),\n                    '\" fill=\"',\n                    ac,\n                    '\" opacity=\"0.55\"/><circle cx=\"',\n                    _toString(cx),\n                    '\" cy=\"',\n                    _toString(cy),\n                    '\" r=\"',\n                    _toString(r),\n                    '\" fill=\"',\n                    fg,\n                    '\" opacity=\"0.85\"/><circle cx=\"',\n                    _toString(cx2),\n                    '\" cy=\"',\n                    _toString(cy2),\n                    '\" r=\"4\" fill=\"',\n                    ac,\n                    '\"/><text x=\"50\" y=\"15\" font-family=\"monospace\" font-size=\"9\" fill=\"',\n                    fg,\n                    '\" text-anchor=\"middle\">',\n                    symbol,\n                    '</text><text x=\"50\" y=\"95\" font-family=\"monospace\" font-size=\"10\" fill=\"',\n                    fg,\n                    '\" text-anchor=\"middle\">#',\n                    _toString(tokenId),\n                    \"</text></svg>\"\n                )\n            );\n    }\n\n    function tokenURI(uint256 tokenId) external view returns (string memory) {\n        require(_owners[tokenId] != address(0), \"nonexistent token\");\n        string memory json = string(\n            abi.encodePacked(\n                '{\"name\":\"',\n                name,\n                \" #\",\n                _toString(tokenId),\n                '\",\"description\":\"',\n                name,\n                ' - on-chain generated artwork. Purely cosmetic: no rarity tiers, no prizes, no promised value.\",\"image\":\"data:image/svg+xml;base64,',\n                _b64(bytes(_svg(tokenId))),\n                '\"}'\n            )\n        );\n        return string(abi.encodePacked(\"data:application/json;base64,\", _b64(bytes(json))));\n    }\n\n    // ---------------- Utils ----------------\n    function _toString(uint256 v) internal pure returns (string memory) {\n        if (v == 0) return \"0\";\n        uint256 digits;\n        uint256 t = v;\n        while (t > 0) {\n            digits++;\n            t /= 10;\n        }\n        bytes memory b = new bytes(digits);\n        while (v > 0) {\n            b[--digits] = bytes1(uint8(48 + (v % 10)));\n            v /= 10;\n        }\n        return string(b);\n    }\n\n    function _b64(bytes memory data) internal pure returns (string memory) {\n        if (data.length == 0) return \"\";\n        string memory table = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n        uint256 encodedLen = 4 * ((data.length + 2) / 3);\n        string memory result = new string(encodedLen + 32);\n        assembly {\n            let tablePtr := add(table, 1)\n            let resultPtr := add(result, 32)\n            let dataPtr := data\n            let endPtr := add(dataPtr, mload(data))\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                resultPtr := add(resultPtr, 1)\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))\n                resultPtr := add(resultPtr, 1)\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))\n                resultPtr := add(resultPtr, 1)\n                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\n                resultPtr := add(resultPtr, 1)\n            }\n            switch mod(mload(data), 3)\n            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }\n            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }\n            mstore(result, encodedLen)\n        }\n        return result;\n    }\n}\n"}},"abi":[{"type":"constructor","inputs":[{"name":"name_","type":"string","internalType":"string"},{"name":"symbol_","type":"string","internalType":"string"},{"name":"cap_","type":"uint256","internalType":"uint256"},{"name":"agentFreeCap_","type":"uint256","internalType":"uint256"},{"name":"xFreeCap_","type":"uint256","internalType":"uint256"},{"name":"priceWei_","type":"uint256","internalType":"uint256"},{"name":"gateSigner_","type":"address","internalType":"address"},{"name":"treasury_","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"AgentFreeClaimed","type":"event","inputs":[{"name":"wallet","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"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":"PaidMint","type":"event","inputs":[{"name":"buyer","type":"address","indexed":true,"internalType":"address"},{"name":"count","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"referrer","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"ReferralBonusClaimed","type":"event","inputs":[{"name":"referrer","type":"address","indexed":true,"internalType":"address"},{"name":"count","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":"XFreeClaimed","type":"event","inputs":[{"name":"wallet","type":"address","indexed":true,"internalType":"address"},{"name":"handleHash","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"MAX_PER_TX","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"REFERRALS_PER_BONUS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"REGISTRY","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"agentClaimed","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"agentFreeCap","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"agentFreeUsed","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"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":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"cap","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"claimAgentFree","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"claimReferralBonus","type":"function","inputs":[],"outputs":[{"name":"minted","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"claimXFree","type":"function","inputs":[{"name":"handle","type":"string","internalType":"string"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"sig","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"domainSeparator","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"gateSigner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getApproved","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"handleUsed","type":"function","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"count","type":"uint256","internalType":"uint256"},{"name":"referrer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"ownerOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"paidSold","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"priceWei","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"referralBonusClaimed","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"referralBonusPending","type":"function","inputs":[{"name":"referrer","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"referralMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"referralPaid","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"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":"status","type":"function","inputs":[],"outputs":[{"name":"totalMinted_","type":"uint256","internalType":"uint256"},{"name":"agentFreeUsed_","type":"uint256","internalType":"uint256"},{"name":"xFreeUsed_","type":"uint256","internalType":"uint256"},{"name":"paidSold_","type":"uint256","internalType":"uint256"},{"name":"referralMinted_","type":"uint256","internalType":"uint256"},{"name":"cap_","type":"uint256","internalType":"uint256"},{"name":"priceWei_","type":"uint256","internalType":"uint256"},{"name":"agentFreeCap_","type":"uint256","internalType":"uint256"},{"name":"xFreeCap_","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"supportsInterface","type":"function","inputs":[{"name":"interfaceId","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":"totalMinted","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":"treasury","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"walletXClaimed","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"xFreeCap","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"xFreeUsed","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"}],"matchId":"59168241","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-11-12T19:05:29Z","match":"exact_match","chainId":"56","address":"0xBa5dd9f1eE470FDF39EF7A82Cf09B2C44A917bC8"}