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