{"sources":{"AnonymousAgent.sol":{"content":"// SPDX-License-Identifier: MIT\n// Anonymous Agent (ANON) — ERC721, BSC (chain 56)\n// Mint rules (as specified by the owner, 2026-11-03):\n//   - Name \"Anonymous Agent\", symbol \"ANON\".\n//   - Max supply 333 NFTs, tokenIds 1..333, 1 NFT per mint.\n//   - Two pools that together equal the full supply:\n//       * FREE pool: 222 NFTs. Max 1 free mint per wallet,\n//         value must be 0. One function: claimFree().\n//       * PAID pool: 111 NFTs at 0.002 BNB each\n//         (2,000,000,000,000,000 wei). Max 8 paid mints per wallet.\n//         One function: mint(), value must be exactly MINT_PRICE.\n//     The two caps are SEPARATE: a wallet may claim 1 free AND mint\n//     up to 8 paid, i.e. up to 9 total. Both pools are permanent in\n//     the contract; neither cap can be changed after deploy.\n//   - Headline total fee if the paid pool sells out:\n//     111 x 0.002 = 0.222 BNB (free mints pay 0).\n//   - ONLY Binance Agentic Wallet holders can mint: the contract checks\n//     the caller holds a Binance .ai Agent ID.\n//   - Fees ACCUMULATE in the contract (not forwarded per mint). The owner\n//     (set at deploy as a constructor argument, since deployment goes\n//     through a factory) can call withdraw() at any time to send the whole\n//     balance to the fee recipient (immutable, set at deploy).\n//   - Metadata: tokenURI returns baseURI + tokenId once the owner sets\n//     a baseURI via setBaseURI (owner-only); until then tokenURI is\n//     empty. Artwork can therefore be attached later without redeploy.\n//   - No royalties (ERC2981 not included); marketplaces apply their own\n//     royalty rules, if any.\n//   - No pause, no extra minting path, no receive/fallback:\n//     plain BNB transfers to this contract revert instead of locking funds.\n//   - NOT DEPLOYED YET. Deployment needs a separate explicit confirmation\n//     plus a checked transaction preview.\npragma solidity ^0.8.20;\n\ninterface IAgentIdRegistry {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ninterface IERC721Receiver {\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\n}\n\ncontract AnonymousAgent {\n    string public name = \"Anonymous Agent\";\n    string public symbol = \"ANON\";\n\n    uint256 public totalMinted;\n    uint256 public freeMinted;\n    uint256 public paidMinted;\n    uint256 public constant MAX_SUPPLY = 333;\n    uint256 public constant FREE_SUPPLY = 222;\n    uint256 public constant PAID_SUPPLY = 111;\n    // Paid mint fee: 0.002 BNB = 2,000,000,000,000,000 wei\n    uint256 public constant MINT_PRICE = 2_000_000_000_000_000;\n    uint256 public constant MAX_FREE_PER_WALLET = 1;\n    uint256 public constant MAX_PAID_PER_WALLET = 8;\n\n    address public immutable feeRecipient;\n    address public immutable owner;\n    IAgentIdRegistry public constant AGENT_REGISTRY =\n        IAgentIdRegistry(0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F);\n\n    string public baseURI;\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    mapping(address => bool) public freeClaimed;\n    mapping(address => uint256) public paidCount;\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 Mint(address indexed to, uint256 indexed tokenId, uint256 paid);\n    event Withdraw(address indexed to, uint256 amount);\n    event BaseURIUpdated(string baseURI);\n\n    constructor(address _owner, address _feeRecipient) {\n        require(_owner != address(0), \"owner zero\");\n        require(_feeRecipient != address(0), \"fee recipient zero\");\n        owner = _owner;\n        feeRecipient = _feeRecipient;\n    }\n\n    function supportsInterface(bytes4 interfaceId) public pure returns (bool) {\n        return\n            interfaceId == 0x01ffc9a7 || // ERC165\n            interfaceId == 0x80ac58cd || // ERC721\n            interfaceId == 0x5b5e139f; // ERC721Metadata\n    }\n\n    function balanceOf(address account) public view returns (uint256) {\n        require(account != address(0), \"Zero address\");\n        return _balances[account];\n    }\n\n    function ownerOf(uint256 tokenId) public view returns (address) {\n        address tokenOwner = _owners[tokenId];\n        require(tokenOwner != address(0), \"Nonexistent token\");\n        return tokenOwner;\n    }\n\n    function tokenURI(uint256 tokenId) public view returns (string memory) {\n        require(_owners[tokenId] != address(0), \"Nonexistent token\");\n        bytes memory base = bytes(baseURI);\n        if (base.length == 0) {\n            return \"\";\n        }\n        return string(abi.encodePacked(baseURI, _toString(tokenId)));\n    }\n\n    function setBaseURI(string calldata newBaseURI) external {\n        require(msg.sender == owner, \"Not owner\");\n        baseURI = newBaseURI;\n        emit BaseURIUpdated(newBaseURI);\n    }\n\n    function claimFree() external payable {\n        require(AGENT_REGISTRY.balanceOf(msg.sender) > 0, \"No Agent ID\");\n        require(!freeClaimed[msg.sender], \"Free already claimed\");\n        require(freeMinted < FREE_SUPPLY, \"Free sold out\");\n        require(totalMinted < MAX_SUPPLY, \"Sold out\");\n        require(msg.value == 0, \"Free mint must send 0\");\n        freeClaimed[msg.sender] = true;\n        freeMinted += 1;\n        totalMinted += 1;\n        uint256 tokenId = totalMinted;\n        _owners[tokenId] = msg.sender;\n        _balances[msg.sender] += 1;\n        emit Transfer(address(0), msg.sender, tokenId);\n        emit Mint(msg.sender, tokenId, 0);\n    }\n\n    function mint() external payable {\n        require(AGENT_REGISTRY.balanceOf(msg.sender) > 0, \"No Agent ID\");\n        require(paidCount[msg.sender] < MAX_PAID_PER_WALLET, \"Max paid reached\");\n        require(paidMinted < PAID_SUPPLY, \"Paid sold out\");\n        require(totalMinted < MAX_SUPPLY, \"Sold out\");\n        require(msg.value == MINT_PRICE, \"Wrong price\");\n        paidCount[msg.sender] += 1;\n        paidMinted += 1;\n        totalMinted += 1;\n        uint256 tokenId = totalMinted;\n        _owners[tokenId] = msg.sender;\n        _balances[msg.sender] += 1;\n        emit Transfer(address(0), msg.sender, tokenId);\n        emit Mint(msg.sender, tokenId, msg.value);\n    }\n\n    function withdraw() external {\n        require(msg.sender == owner, \"Not owner\");\n        uint256 amount = address(this).balance;\n        require(amount > 0, \"Nothing to withdraw\");\n        (bool ok, ) = payable(feeRecipient).call{value: amount}(\"\");\n        require(ok, \"Withdraw failed\");\n        emit Withdraw(feeRecipient, amount);\n    }\n\n    function approve(address to, uint256 tokenId) external {\n        address tokenOwner = ownerOf(tokenId);\n        require(\n            msg.sender == tokenOwner || _operatorApprovals[tokenOwner][msg.sender],\n            \"Not authorized\"\n        );\n        _tokenApprovals[tokenId] = to;\n        emit Approval(tokenOwner, to, tokenId);\n    }\n\n    function getApproved(uint256 tokenId) public 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        require(operator != msg.sender, \"Approve self\");\n        _operatorApprovals[msg.sender][operator] = approved;\n        emit ApprovalForAll(msg.sender, operator, approved);\n    }\n\n    function isApprovedForAll(address tokenOwner, address operator) public view returns (bool) {\n        return _operatorApprovals[tokenOwner][operator];\n    }\n\n    function transferFrom(address from, address to, uint256 tokenId) public {\n        require(_isApprovedOrOwner(msg.sender, tokenId), \"Not authorized\");\n        _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        require(_isApprovedOrOwner(msg.sender, tokenId), \"Not authorized\");\n        _transfer(from, to, tokenId);\n        require(_checkOnERC721Received(from, to, tokenId, data), \"Unsafe recipient\");\n    }\n\n    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {\n        address tokenOwner = ownerOf(tokenId);\n        return\n            spender == tokenOwner ||\n            _tokenApprovals[tokenId] == spender ||\n            _operatorApprovals[tokenOwner][spender];\n    }\n\n    function _transfer(address from, address to, uint256 tokenId) internal {\n        require(ownerOf(tokenId) == from, \"Wrong owner\");\n        require(to != address(0), \"Transfer to zero\");\n        _tokenApprovals[tokenId] = address(0);\n        _balances[from] -= 1;\n        _balances[to] += 1;\n        _owners[tokenId] = to;\n        emit Transfer(from, to, tokenId);\n    }\n\n    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) internal returns (bool) {\n        if (to.code.length == 0) {\n            return true;\n        }\n        try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, data) returns (bytes4 retval) {\n            return retval == IERC721Receiver.onERC721Received.selector;\n        } catch {\n            return false;\n        }\n    }\n\n    function _toString(uint256 value) internal pure returns (string memory) {\n        if (value == 0) {\n            return \"0\";\n        }\n        uint256 temp = value;\n        uint256 digits;\n        while (temp != 0) {\n            digits++;\n            temp /= 10;\n        }\n        bytes memory buffer = new bytes(digits);\n        while (value != 0) {\n            digits -= 1;\n            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\n            value -= 10;\n        }\n        return string(buffer);\n    }\n}\n"}},"abi":[{"type":"constructor","inputs":[{"name":"_owner","type":"address","internalType":"address"},{"name":"_feeRecipient","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"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":"BaseURIUpdated","type":"event","inputs":[{"name":"baseURI","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"Mint","type":"event","inputs":[{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"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":"Withdraw","type":"event","inputs":[{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"AGENT_REGISTRY","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAgentIdRegistry"}],"stateMutability":"view"},{"name":"FREE_SUPPLY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_FREE_PER_WALLET","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_PAID_PER_WALLET","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_SUPPLY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MINT_PRICE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PAID_SUPPLY","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":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"baseURI","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"claimFree","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"feeRecipient","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"freeClaimed","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"freeMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getApproved","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"tokenOwner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"ownerOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"paidCount","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"paidMinted","type":"function","inputs":[],"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":"setBaseURI","type":"function","inputs":[{"name":"newBaseURI","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"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":"withdraw","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"}],"matchId":"58184512","creationMatch":"match","runtimeMatch":"match","verifiedAt":"2026-11-03T07:05:31Z","match":"match","chainId":"56","address":"0x2eB3f13aDb66Ef9D0eCdF890D3BA94cb0a8913FE"}