{"sources":{"src/SkyweAgents.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/// @notice Minimal ERC-721 + Agent-ID-gated mint with a free first mint.\n/// Owner and treasury are set at deployment (Tzy's Agentic Wallet):\n/// every paid mint forwards its BNB straight to the treasury.\ninterface IAgentRegistry {\n    function balanceOf(address owner) external view returns (uint256);\n}\n\ncontract SkyweAgents {\n    // ---- ERC-721 metadata ----\n    string public name;\n    string public symbol;\n    string private _baseURI;\n\n    // ---- Ownership / treasury ----\n    address public owner;\n    address public treasury;\n\n    // ---- Sale config ----\n    IAgentRegistry public constant REGISTRY =\n        IAgentRegistry(0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F); // .ai Agent ID registry (BSC)\n    uint256 public maxSupply = 5555;\n    uint256 public maxPerWallet = 10;\n    uint256 public paidPrice = 0.0005 ether; // price of mints #2..N per wallet\n    bool public mintOpen = true;\n    bool public agentGate = true; // require a .ai Agent ID to mint\n\n    // ---- State ----\n    uint256 public totalMinted;\n    mapping(uint256 => address) private _owners;\n    mapping(address => uint256) private _balances;\n    mapping(address => uint256) public mintedBy;\n    mapping(uint256 => address) private _tokenApprovals;\n    mapping(address => mapping(address => bool)) private _operatorApprovals;\n    bool private _locked;\n\n    // ---- Events ----\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 paidWei);\n    event PriceChanged(uint256 newPrice);\n    event Withdrawn(address indexed to, uint256 amount);\n\n    modifier onlyOwner() {\n        require(msg.sender == owner, \"not owner\");\n        _;\n    }\n    modifier nonReentrant() {\n        require(!_locked, \"reentrant\");\n        _locked = true;\n        _;\n        _locked = false;\n    }\n\n    constructor(string memory name_, string memory symbol_, address owner_, address treasury_) {\n        require(owner_ != address(0) && treasury_ != address(0), \"zero addr\");\n        name = name_;\n        symbol = symbol_;\n        owner = owner_;\n        treasury = treasury_;\n    }\n\n    // ---- Mint ----\n    /// @notice First mint per wallet is free; later mints cost paidPrice.\n    ///         All mints require a .ai Agent ID while agentGate is on.\n    function mint() external payable nonReentrant returns (uint256 tokenId) {\n        require(mintOpen, \"mint closed\");\n        require(totalMinted < maxSupply, \"sold out\");\n        require(mintedBy[msg.sender] < maxPerWallet, \"wallet limit\");\n        if (agentGate) {\n            require(REGISTRY.balanceOf(msg.sender) > 0, \"Agent ID required\");\n        }\n        bool isFree = mintedBy[msg.sender] == 0;\n        uint256 cost = isFree ? 0 : paidPrice;\n        require(msg.value == cost, isFree ? \"first mint is free\" : \"wrong value\");\n\n        tokenId = ++totalMinted;\n        mintedBy[msg.sender] += 1;\n        _owners[tokenId] = msg.sender;\n        _balances[msg.sender] += 1;\n        emit Transfer(address(0), msg.sender, tokenId);\n        emit Mint(msg.sender, tokenId, cost);\n\n        if (cost > 0) {\n            (bool ok, ) = payable(treasury).call{value: cost}(\"\");\n            require(ok, \"treasury transfer failed\");\n        }\n    }\n\n    /// @notice What the next mint would cost this wallet (0 = free).\n    function costOf(address wallet) external view returns (uint256) {\n        return mintedBy[wallet] == 0 ? 0 : paidPrice;\n    }\n\n    // ---- Owner controls ----\n    function setPaidPrice(uint256 newPrice) external onlyOwner {\n        paidPrice = newPrice;\n        emit PriceChanged(newPrice);\n    }\n    function setMintOpen(bool open_) external onlyOwner { mintOpen = open_; }\n    function setAgentGate(bool on_) external onlyOwner { agentGate = on_; }\n    function setMaxPerWallet(uint256 n) external onlyOwner { maxPerWallet = n; }\n    function setTreasury(address t) external onlyOwner {\n        require(t != address(0), \"zero addr\");\n        treasury = t;\n    }\n    function setBaseURI(string calldata uri) external onlyOwner { _baseURI = uri; }\n    /// @notice Rescue anything that ever lands in the contract (fees are\n    ///         forwarded at mint time, so this should normally be empty).\n    function withdraw() external onlyOwner nonReentrant {\n        uint256 bal = address(this).balance;\n        require(bal > 0, \"empty\");\n        (bool ok, ) = payable(treasury).call{value: bal}(\"\");\n        require(ok, \"withdraw failed\");\n        emit Withdrawn(treasury, bal);\n    }\n\n    // ---- ERC-721 ----\n    function balanceOf(address a) external view returns (uint256) {\n        require(a != address(0), \"zero addr\");\n        return _balances[a];\n    }\n    function ownerOf(uint256 tokenId) public view returns (address) {\n        address o = _owners[tokenId];\n        require(o != address(0), \"nonexistent\");\n        return o;\n    }\n    function tokenURI(uint256 tokenId) external view returns (string memory) {\n        ownerOf(tokenId);\n        return string(abi.encodePacked(_baseURI, _toString(tokenId), \".json\"));\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    function getApproved(uint256 tokenId) external view returns (address) {\n        ownerOf(tokenId);\n        return _tokenApprovals[tokenId];\n    }\n    function setApprovalForAll(address operator, bool approved) external {\n        _operatorApprovals[msg.sender][operator] = approved;\n        emit ApprovalForAll(msg.sender, operator, approved);\n    }\n    function isApprovedForAll(address o, address operator) external view returns (bool) {\n        return _operatorApprovals[o][operator];\n    }\n    function transferFrom(address from, address to, uint256 tokenId) public {\n        require(ownerOf(tokenId) == from, \"wrong from\");\n        require(\n            msg.sender == from || msg.sender == _tokenApprovals[tokenId] || _operatorApprovals[from][msg.sender],\n            \"not authorized\"\n        );\n        require(to != address(0), \"zero addr\");\n        delete _tokenApprovals[tokenId];\n        _balances[from] -= 1;\n        _balances[to] += 1;\n        _owners[tokenId] = to;\n        emit Transfer(from, to, tokenId);\n    }\n    function safeTransferFrom(address from, address to, uint256 tokenId) external {\n        safeTransferFrom(from, to, tokenId, \"\");\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    function supportsInterface(bytes4 id) external pure returns (bool) {\n        return id == 0x01ffc9a7 || id == 0x80ac58cd || id == 0x5b5e139f;\n    }\n\n    function _toString(uint256 v) internal pure returns (string memory) {\n        if (v == 0) return \"0\";\n        uint256 len;\n        for (uint256 t = v; t > 0; t /= 10) len++;\n        bytes memory b = new bytes(len);\n        for (uint256 t = v; t > 0; t /= 10) b[--len] = bytes1(uint8(48 + (t % 10)));\n        return string(b);\n    }\n}\n"}},"abi":[{"type":"constructor","inputs":[{"name":"name_","type":"string","internalType":"string"},{"name":"symbol_","type":"string","internalType":"string"},{"name":"owner_","type":"address","internalType":"address"},{"name":"treasury_","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":"Mint","type":"event","inputs":[{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"paidWei","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"PriceChanged","type":"event","inputs":[{"name":"newPrice","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":"Withdrawn","type":"event","inputs":[{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"REGISTRY","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAgentRegistry"}],"stateMutability":"view"},{"name":"agentGate","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"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":"a","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"costOf","type":"function","inputs":[{"name":"wallet","type":"address","internalType":"address"}],"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":"o","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"maxPerWallet","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[],"outputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"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":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"paidPrice","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":"setAgentGate","type":"function","inputs":[{"name":"on_","type":"bool","internalType":"bool"}],"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":"uri","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setMaxPerWallet","type":"function","inputs":[{"name":"n","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setMintOpen","type":"function","inputs":[{"name":"open_","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPaidPrice","type":"function","inputs":[{"name":"newPrice","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setTreasury","type":"function","inputs":[{"name":"t","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"supportsInterface","type":"function","inputs":[{"name":"id","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":"withdraw","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"}],"matchId":"59053885","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-11-10T18:27:49Z","match":"exact_match","chainId":"56","address":"0x7256F522e8867de57EA747eeAf83D604D08c47C2"}