{"sources":{"PocketMoons.sol":{"content":"// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.24;\r\n\r\n/**\r\n *  POCKET MOONS — 5,555 tiny moon-worlds on BNB Chain, for .ai Agent ID holders.\r\n *  Images and metadata are hosted at https://pocket-moons-art.pages.dev (Cloudflare Pages).\r\n *\r\n *  MINT\r\n *    - Mint supply        : 5,555 (ids 1..5,555)\r\n *    - Per wallet cap     : 5 mints\r\n *    - While fewer than 2,500 are minted: a wallet's first 2 are FREE,\r\n *      its mints 3..5 cost $0.30 each.\r\n *    - From mint #2,501 on : the free mint ends and every mint costs $0.55.\r\n *  Prices are USD and converted at execution via the Chainlink BNB/USD feed.\r\n *  Overpayment is refunded in the same transaction.\r\n *  No deadline by default (mintEnd = max); the owner can set one with setMintEnd.\r\n *\r\n *  METADATA\r\n *    tokenURI(id) = baseURI + id + \".json\"\r\n *    The owner can change baseURI until freezeMetadata() locks it forever.\r\n */\r\n\r\ninterface IERC721Balance {\r\n    function balanceOf(address owner) external view returns (uint256);\r\n}\r\n\r\ninterface AggregatorV3Interface {\r\n    function latestRoundData()\r\n        external\r\n        view\r\n        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);\r\n}\r\n\r\ncontract PocketMoons {\r\n    /* ============================ constants ============================ */\r\n\r\n    uint256 public constant MAX_SUPPLY = 5_555;\r\n    uint256 public constant MAX_PER_WALLET = 5;\r\n    uint256 public constant FREE_PER_WALLET = 2;\r\n    uint256 public constant FINAL_PHASE_START = 2_500; // 0-based mint index\r\n\r\n    /* ============================ ERC-721 ============================== */\r\n\r\n    string public constant name = \"Pocket Moons\";\r\n    string public constant symbol = \"MOONS\";\r\n\r\n    uint256 public totalMinted;\r\n    uint256 public totalBurned;\r\n\r\n    mapping(uint256 => address) private _owners;\r\n    mapping(address => uint256) private _balances;\r\n    mapping(uint256 => address) private _tokenApprovals;\r\n    mapping(address => mapping(address => bool)) private _operatorApprovals;\r\n\r\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\r\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\r\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\r\n\r\n    /* ============================ mint state =========================== */\r\n\r\n    address public owner;\r\n    address public pendingOwner;\r\n    /// Metadata folder (ends with \"/\"). Default: Cloudflare Pages. Changeable via setBaseURI until freezeMetadata().\r\n    string public baseURI = \"https://pocket-moons-art.pages.dev/metadata/\";\r\n    bool public metadataFrozen;\r\n\r\n    bool public mintLive;\r\n    bool public frozen;\r\n\r\n    /// Mint closes after this unix time (default: never).\r\n    uint256 public mintEnd = type(uint256).max;\r\n\r\n    /// USD cents for a wallet's mints 3..5 before the 2,500 mark.\r\n    uint256 public tier2Cents = 30;\r\n    /// USD cents for every mint from the 2,500 mark on.\r\n    uint256 public finalCents = 55;\r\n\r\n    /// Fallbacks used only if `priceOracle` is unset.\r\n    uint256 public flatTier2Wei;\r\n    uint256 public flatFinalWei;\r\n\r\n    address public priceOracle;\r\n    uint256 public oracleMaxAge = 1 hours;\r\n\r\n    /// SPACE ID Agent ID registry (ERC-721). Zero disables the gate.\r\n    address public agentIdContract;\r\n\r\n    uint256 public royaltyBps = 500;\r\n    address public royaltyReceiver;\r\n\r\n    mapping(address => uint256) public freeMinted;\r\n    mapping(address => uint256) public paidMinted;\r\n    mapping(address => uint256) public totalMintedBy;\r\n\r\n    uint256 private _lock;\r\n\r\n    /* ============================== errors ============================= */\r\n\r\n    error NoAgentId();\r\n    error SoldOut();\r\n    error MaxPerWallet();\r\n    error MintNotLive();\r\n    error MintClosed();\r\n    error BadQuantity();\r\n    error WrongPayment();\r\n    error NotOwner();\r\n    error ConfigFrozen();\r\n    error ZeroAddress();\r\n    error NoBalance();\r\n    error TransferFailed();\r\n    error Reentrant();\r\n    error BadRoyalty();\r\n\r\n    modifier onlyOwner() {\r\n        if (msg.sender != owner) revert NotOwner();\r\n        _;\r\n    }\r\n\r\n    modifier notFrozen() {\r\n        if (frozen) revert ConfigFrozen();\r\n        _;\r\n    }\r\n\r\n    modifier nonReentrant() {\r\n        if (_lock == 1) revert Reentrant();\r\n        _lock = 1;\r\n        _;\r\n        _lock = 0;\r\n    }\r\n\r\n    constructor(address agentIdContract_, address priceOracle_) {\r\n        owner = msg.sender;\r\n        royaltyReceiver = msg.sender;\r\n        agentIdContract = agentIdContract_;\r\n        priceOracle = priceOracle_;\r\n    }\r\n\r\n    /* ============================== mint =============================== */\r\n\r\n    function mint(uint256 qty) external payable nonReentrant returns (uint256 firstTokenId) {\r\n        if (!mintLive) revert MintNotLive();\r\n        if (block.timestamp > mintEnd) revert MintClosed();\r\n        if (qty == 0 || qty > MAX_PER_WALLET) revert BadQuantity();\r\n\r\n        uint256 minted = totalMinted;\r\n        if (minted + qty > MAX_SUPPLY) revert SoldOut();\r\n        if (totalMintedBy[msg.sender] + qty > MAX_PER_WALLET) revert MaxPerWallet();\r\n        if (!hasAgentId(msg.sender)) revert NoAgentId();\r\n\r\n        (uint256 cost, uint256 freeUsed, uint256 paidInBatch) = _price(msg.sender, qty, minted);\r\n        if (msg.value < cost) revert WrongPayment();\r\n\r\n        firstTokenId = minted + 1;\r\n        for (uint256 i = 0; i < qty; ++i) {\r\n            _mint(msg.sender, firstTokenId + i);\r\n        }\r\n        unchecked {\r\n            totalMinted = minted + qty;\r\n            totalMintedBy[msg.sender] += qty;\r\n            paidMinted[msg.sender] += paidInBatch;\r\n        }\r\n        freeMinted[msg.sender] = freeUsed;\r\n\r\n        uint256 excess = msg.value - cost;\r\n        if (excess > 0) {\r\n            (bool ok, ) = payable(msg.sender).call{value: excess}(\"\");\r\n            if (!ok) revert TransferFailed();\r\n        }\r\n    }\r\n\r\n    function _price(address minter, uint256 qty, uint256 minted)\r\n        private\r\n        view\r\n        returns (uint256 cost, uint256 freeUsed, uint256 paidInBatch)\r\n    {\r\n        uint256 t2 = _usdToWei(tier2Cents, flatTier2Wei);\r\n        uint256 tf = _usdToWei(finalCents, flatFinalWei);\r\n        freeUsed = freeMinted[minter];\r\n        for (uint256 i = 0; i < qty; ++i) {\r\n            if (minted + i >= FINAL_PHASE_START) {\r\n                cost += tf;\r\n                paidInBatch++;\r\n            } else if (freeUsed < FREE_PER_WALLET) {\r\n                freeUsed++;\r\n            } else {\r\n                cost += t2;\r\n                paidInBatch++;\r\n            }\r\n        }\r\n    }\r\n\r\n    /// @notice Cost in wei to mint `qty` right now for `minter`.\r\n    function quote(address minter, uint256 qty) external view returns (uint256 cost) {\r\n        (cost, , ) = _price(minter, qty, totalMinted);\r\n    }\r\n\r\n    function finalPhase() public view returns (bool) {\r\n        return totalMinted >= FINAL_PHASE_START;\r\n    }\r\n\r\n    function freeRemaining(address minter) public view returns (uint256) {\r\n        if (finalPhase()) return 0;\r\n        uint256 used = freeMinted[minter];\r\n        return used >= FREE_PER_WALLET ? 0 : FREE_PER_WALLET - used;\r\n    }\r\n\r\n    function mintOpen() external view returns (bool) {\r\n        return mintLive && block.timestamp <= mintEnd && totalMinted < MAX_SUPPLY;\r\n    }\r\n\r\n    function _usdToWei(uint256 cents, uint256 flat) private view returns (uint256) {\r\n        address oracle = priceOracle;\r\n        if (oracle == address(0) || cents == 0) return flat;\r\n        (, int256 answer, , uint256 updatedAt, ) = AggregatorV3Interface(oracle).latestRoundData();\r\n        require(answer > 0, \"BAD_ORACLE\");\r\n        require(block.timestamp - updatedAt <= oracleMaxAge, \"STALE_ORACLE\");\r\n        return (cents * 1e24) / uint256(answer);\r\n    }\r\n\r\n    function hasAgentId(address account) public view returns (bool) {\r\n        address registry = agentIdContract;\r\n        if (registry == address(0)) return true;\r\n        try IERC721Balance(registry).balanceOf(account) returns (uint256 bal) {\r\n            return bal > 0;\r\n        } catch {\r\n            return false;\r\n        }\r\n    }\r\n\r\n    /* ============================ metadata ============================= */\r\n\r\n    function totalSupply() external view returns (uint256) {\r\n        return totalMinted - totalBurned;\r\n    }\r\n\r\n    function tokenURI(uint256 tokenId) external view returns (string memory) {\r\n        ownerOf(tokenId);\r\n        string memory b = baseURI;\r\n        if (bytes(b).length == 0) return \"\";\r\n        return string(abi.encodePacked(b, _toString(tokenId), \".json\"));\r\n    }\r\n\r\n    /* ============================ ERC-721 ============================== */\r\n\r\n    function balanceOf(address account) public view returns (uint256) {\r\n        if (account == address(0)) revert ZeroAddress();\r\n        return _balances[account];\r\n    }\r\n\r\n    function ownerOf(uint256 tokenId) public view returns (address o) {\r\n        o = _owners[tokenId];\r\n        require(o != address(0), \"NONEXISTENT\");\r\n    }\r\n\r\n    function getApproved(uint256 tokenId) external view returns (address) {\r\n        ownerOf(tokenId);\r\n        return _tokenApprovals[tokenId];\r\n    }\r\n\r\n    function isApprovedForAll(address account, address operator) external view returns (bool) {\r\n        return _operatorApprovals[account][operator];\r\n    }\r\n\r\n    function approve(address to, uint256 tokenId) external {\r\n        address o = ownerOf(tokenId);\r\n        require(msg.sender == o || _operatorApprovals[o][msg.sender], \"NOT_AUTHORIZED\");\r\n        _tokenApprovals[tokenId] = to;\r\n        emit Approval(o, to, tokenId);\r\n    }\r\n\r\n    function setApprovalForAll(address operator, bool approved) external {\r\n        _operatorApprovals[msg.sender][operator] = approved;\r\n        emit ApprovalForAll(msg.sender, operator, approved);\r\n    }\r\n\r\n    function transferFrom(address from, address to, uint256 tokenId) public {\r\n        if (from != ownerOf(tokenId)) revert NotOwner();\r\n        if (to == address(0)) revert ZeroAddress();\r\n        require(\r\n            msg.sender == from || _operatorApprovals[from][msg.sender] || msg.sender == _tokenApprovals[tokenId],\r\n            \"NOT_AUTHORIZED\"\r\n        );\r\n        delete _tokenApprovals[tokenId];\r\n        unchecked {\r\n            _balances[from] -= 1;\r\n            _balances[to] += 1;\r\n        }\r\n        _owners[tokenId] = to;\r\n        emit Transfer(from, to, tokenId);\r\n    }\r\n\r\n    function safeTransferFrom(address from, address to, uint256 tokenId) external {\r\n        safeTransferFrom(from, to, tokenId, \"\");\r\n    }\r\n\r\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public {\r\n        transferFrom(from, to, tokenId);\r\n        if (to.code.length > 0) {\r\n            (bool ok, bytes memory ret) = to.call(\r\n                abi.encodeWithSelector(0x150b7a02, msg.sender, from, tokenId, data)\r\n            );\r\n            require(ok && ret.length >= 32 && abi.decode(ret, (bytes4)) == bytes4(0x150b7a02), \"UNSAFE_RECIPIENT\");\r\n        }\r\n    }\r\n\r\n    function _mint(address to, uint256 tokenId) private {\r\n        if (_owners[tokenId] != address(0)) revert SoldOut();\r\n        unchecked {\r\n            _balances[to] += 1;\r\n        }\r\n        _owners[tokenId] = to;\r\n        emit Transfer(address(0), to, tokenId);\r\n    }\r\n\r\n    function _burn(uint256 tokenId) private {\r\n        address o = _owners[tokenId];\r\n        delete _tokenApprovals[tokenId];\r\n        unchecked {\r\n            _balances[o] -= 1;\r\n        }\r\n        delete _owners[tokenId];\r\n        emit Transfer(o, address(0), tokenId);\r\n    }\r\n\r\n    /* ============================ ERC-2981 ============================= */\r\n\r\n    function royaltyInfo(uint256, uint256 salePrice) external view returns (address, uint256) {\r\n        return (royaltyReceiver, (salePrice * royaltyBps) / 10_000);\r\n    }\r\n\r\n    function supportsInterface(bytes4 interfaceId) external pure returns (bool) {\r\n        return interfaceId == 0x01ffc9a7 || interfaceId == 0x80ac58cd || interfaceId == 0x5b5e139f\r\n            || interfaceId == 0x2a55205a || interfaceId == 0x49064906;\r\n    }\r\n\r\n    /* ============================= utils =============================== */\r\n\r\n    function _toString(uint256 v) private pure returns (string memory) {\r\n        if (v == 0) return \"0\";\r\n        uint256 tmp = v;\r\n        uint256 digits;\r\n        while (tmp != 0) {\r\n            digits++;\r\n            tmp /= 10;\r\n        }\r\n        bytes memory buf = new bytes(digits);\r\n        while (v != 0) {\r\n            digits--;\r\n            buf[digits] = bytes1(uint8(48 + (v % 10)));\r\n            v /= 10;\r\n        }\r\n        return string(buf);\r\n    }\r\n\r\n    /* ============================ admin ================================ */\r\n\r\n    event MintLiveSet(bool live);\r\n    event MintEndSet(uint256 mintEnd);\r\n    event PricesSet(uint256 tier2Cents, uint256 finalCents);\r\n    event OracleSet(address oracle);\r\n    event AgentIdSet(address registry);\r\n    event BaseURISet(string baseURI);\r\n    event MetadataFrozen();\r\n    /// ERC-4906: tells marketplaces to refresh metadata.\r\n    event BatchMetadataUpdate(uint256 fromTokenId, uint256 toTokenId);\r\n    event RoyaltySet(address receiver, uint256 bps);\r\n    event Withdrawn(address to, uint256 amount);\r\n    event OwnershipTransferStarted(address indexed from, address indexed to);\r\n    event OwnershipTransferred(address indexed from, address indexed to);\r\n    event Frozen();\r\n\r\n    function setMintLive(bool live) external onlyOwner {\r\n        mintLive = live;\r\n        emit MintLiveSet(live);\r\n    }\r\n\r\n    /// @notice Change or extend the mint deadline (unix seconds).\r\n    function setMintEnd(uint256 end_) external onlyOwner {\r\n        mintEnd = end_;\r\n        emit MintEndSet(end_);\r\n    }\r\n\r\n    function setPrices(uint256 tier2Cents_, uint256 finalCents_, uint256 flatTier2Wei_, uint256 flatFinalWei_)\r\n        external\r\n        onlyOwner\r\n        notFrozen\r\n    {\r\n        tier2Cents = tier2Cents_;\r\n        finalCents = finalCents_;\r\n        flatTier2Wei = flatTier2Wei_;\r\n        flatFinalWei = flatFinalWei_;\r\n        emit PricesSet(tier2Cents_, finalCents_);\r\n    }\r\n\r\n    function setPriceOracle(address oracle) external onlyOwner notFrozen {\r\n        priceOracle = oracle;\r\n        emit OracleSet(oracle);\r\n    }\r\n\r\n    function setOracleMaxAge(uint256 seconds_) external onlyOwner {\r\n        oracleMaxAge = seconds_;\r\n    }\r\n\r\n    function setAgentIdContract(address registry) external onlyOwner notFrozen {\r\n        agentIdContract = registry;\r\n        emit AgentIdSet(registry);\r\n    }\r\n\r\n    /// @notice Point metadata at a new folder (must end with \"/\"). Locked forever by freezeMetadata().\r\n    function setBaseURI(string calldata baseURI_) external onlyOwner {\r\n        if (metadataFrozen) revert ConfigFrozen();\r\n        baseURI = baseURI_;\r\n        emit BaseURISet(baseURI_);\r\n        emit BatchMetadataUpdate(1, type(uint256).max);\r\n    }\r\n\r\n    /// @notice Irreversibly lock baseURI.\r\n    function freezeMetadata() external onlyOwner {\r\n        metadataFrozen = true;\r\n        emit MetadataFrozen();\r\n    }\r\n\r\n    function setRoyalty(address receiver, uint256 bps) external onlyOwner {\r\n        if (receiver == address(0)) revert ZeroAddress();\r\n        if (bps > 1000) revert BadRoyalty();\r\n        royaltyReceiver = receiver;\r\n        royaltyBps = bps;\r\n        emit RoyaltySet(receiver, bps);\r\n    }\r\n\r\n    /// @notice Irreversibly lock prices, oracle and Agent ID gate.\r\n    function freezeConfig() external onlyOwner {\r\n        frozen = true;\r\n        emit Frozen();\r\n    }\r\n\r\n    function withdraw(address to) external onlyOwner nonReentrant {\r\n        if (to == address(0)) revert ZeroAddress();\r\n        uint256 bal = address(this).balance;\r\n        if (bal == 0) revert NoBalance();\r\n        (bool ok, ) = payable(to).call{value: bal}(\"\");\r\n        if (!ok) revert TransferFailed();\r\n        emit Withdrawn(to, bal);\r\n    }\r\n\r\n    function transferOwnership(address newOwner) external onlyOwner {\r\n        if (newOwner == address(0)) revert ZeroAddress();\r\n        pendingOwner = newOwner;\r\n        emit OwnershipTransferStarted(owner, newOwner);\r\n    }\r\n\r\n    function acceptOwnership() external {\r\n        require(msg.sender == pendingOwner, \"NOT_PENDING\");\r\n        emit OwnershipTransferred(owner, msg.sender);\r\n        owner = msg.sender;\r\n        pendingOwner = address(0);\r\n    }\r\n\r\n    receive() external payable {}\r\n}"}},"abi":[{"type":"constructor","inputs":[{"name":"agentIdContract_","type":"address","internalType":"address"},{"name":"priceOracle_","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"BadQuantity","type":"error","inputs":[]},{"name":"BadRoyalty","type":"error","inputs":[]},{"name":"ConfigFrozen","type":"error","inputs":[]},{"name":"MaxPerWallet","type":"error","inputs":[]},{"name":"MintClosed","type":"error","inputs":[]},{"name":"MintNotLive","type":"error","inputs":[]},{"name":"NoAgentId","type":"error","inputs":[]},{"name":"NoBalance","type":"error","inputs":[]},{"name":"NotOwner","type":"error","inputs":[]},{"name":"Reentrant","type":"error","inputs":[]},{"name":"SoldOut","type":"error","inputs":[]},{"name":"TransferFailed","type":"error","inputs":[]},{"name":"WrongPayment","type":"error","inputs":[]},{"name":"ZeroAddress","type":"error","inputs":[]},{"name":"AgentIdSet","type":"event","inputs":[{"name":"registry","type":"address","indexed":false,"internalType":"address"}],"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":"BaseURISet","type":"event","inputs":[{"name":"baseURI","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"BatchMetadataUpdate","type":"event","inputs":[{"name":"fromTokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"toTokenId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Frozen","type":"event","inputs":[],"anonymous":false},{"name":"MetadataFrozen","type":"event","inputs":[],"anonymous":false},{"name":"MintEndSet","type":"event","inputs":[{"name":"mintEnd","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"MintLiveSet","type":"event","inputs":[{"name":"live","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"OracleSet","type":"event","inputs":[{"name":"oracle","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"OwnershipTransferStarted","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"PricesSet","type":"event","inputs":[{"name":"tier2Cents","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"finalCents","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RoyaltySet","type":"event","inputs":[{"name":"receiver","type":"address","indexed":false,"internalType":"address"},{"name":"bps","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":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FINAL_PHASE_START","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"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":"acceptOwnership","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"agentIdContract","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"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":"finalCents","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"finalPhase","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"flatFinalWei","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"flatTier2Wei","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeMinted","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeRemaining","type":"function","inputs":[{"name":"minter","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freezeConfig","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"freezeMetadata","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"frozen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"getApproved","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"hasAgentId","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"metadataFrozen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"qty","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"firstTokenId","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"name":"mintEnd","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mintLive","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mintOpen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"oracleMaxAge","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"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":"o","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"paidMinted","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pendingOwner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"priceOracle","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"quote","type":"function","inputs":[{"name":"minter","type":"address","internalType":"address"},{"name":"qty","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"cost","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"royaltyBps","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"royaltyInfo","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"salePrice","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"royaltyReceiver","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"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":"setAgentIdContract","type":"function","inputs":[{"name":"registry","type":"address","internalType":"address"}],"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":"baseURI_","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setMintEnd","type":"function","inputs":[{"name":"end_","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setMintLive","type":"function","inputs":[{"name":"live","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setOracleMaxAge","type":"function","inputs":[{"name":"seconds_","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPriceOracle","type":"function","inputs":[{"name":"oracle","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPrices","type":"function","inputs":[{"name":"tier2Cents_","type":"uint256","internalType":"uint256"},{"name":"finalCents_","type":"uint256","internalType":"uint256"},{"name":"flatTier2Wei_","type":"uint256","internalType":"uint256"},{"name":"flatFinalWei_","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setRoyalty","type":"function","inputs":[{"name":"receiver","type":"address","internalType":"address"},{"name":"bps","type":"uint256","internalType":"uint256"}],"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":"tier2Cents","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"tokenURI","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalBurned","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalMintedBy","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalSupply","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":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"withdraw","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"}],"matchId":"59015263","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-11-10T12:31:31Z","match":"exact_match","chainId":"56","address":"0xd088e5aA3c9B15D129846488E9ae5712ce7Bf6B6"}