{"sources":{"BnbCacheServers.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/// @title BNB CACHE — Servers (SERVER)\n/// @notice BNB CACHE is a 30-day game on BNB Smart Chain for Binance\n///         Agent ID holders, themed as a data center owned by its\n///         players. It performs no real computing; every rule of the\n///         game is readable in this contract:\n///         - There are exactly 1,554 servers (ERC-721, numbered 1 to\n///           1,554, freely transferable): 777 are FREE and 777 cost a\n///           flat 0.001 BNB each, in two separate pools.\n///         - Minting starts when the dev wallet calls `openGate()` —\n///           exactly once, never reversible. FREE servers can be\n///           claimed only during the first 24 hours after that\n///           moment; PAID servers stay on sale until the 777-server\n///           paid pool is sold out, with no time limit.\n///         - Free servers: 1 per wallet, and only for wallets holding\n///           a Binance Agent ID. Paid servers: up to 9 more per\n///           wallet. A wallet can mint at most 10 servers in total\n///           (the free server counts toward the cap). Minting follows\n///           the wallet, not the token balance, so it cannot be\n///           rented.\n///         - Every PAID server mints an instant bonus of exactly\n///           1,000 CACHE to the buyer, inside the purchase\n///           transaction itself. Bonuses come only from a published\n///           reserve of 777,000 CACHE (777 paid servers x 1,000),\n///           tracked in `bonusMinted` for anyone to audit. Free\n///           servers receive no bonus.\n///         - Sale proceeds are forwarded to the dev wallet (the\n///           project owner's Agentic wallet) at the moment of\n///           purchase; overpayments are refunded in the same\n///           transaction.\n///         - Every server produces 1,000 CACHE per day into its\n///           buffer, accruing per second from the moment it is\n///           minted. The buffer pauses once 3,000 CACHE are waiting\n///           (3 full days) until the server is collected, and\n///           production stops forever 30 days after THAT SERVER was\n///           minted: every server has its own full 30-day run,\n///           whenever it was claimed or bought, so a late buyer gets\n///           exactly the same deal as an early one. CACHE still\n///           waiting in a buffer stays collectable after its run,\n///           and travels with the server when the server changes\n///           owner.\n///         - Collecting costs a flat fee of exactly 0.0001 BNB per\n///           server, forwarded to the dev wallet. Apart from the\n///           published paid-server bonus above, CACHE exists only\n///           once collected: there is no pre-mine and the dev wallet\n///           cannot mint CACHE or servers for itself outside the\n///           same public rules as everyone else.\n///         - The dev wallet's only powers are calling `openGate()`\n///           once and setting the metadata base URI before the gate\n///           opens. It cannot pause anything, change any number, or\n///           move anyone's server or CACHE.\n///         - No price, return, pool, or listing is promised by this\n///           contract.\n\ninterface IAgentIdRegistry {\n    function balanceOf(address owner) external view returns (uint256);\n}\n\ninterface ICacheToken {\n    function mint(address to, uint256 amount) external;\n}\n\ninterface IERC721Receiver {\n    function onERC721Received(\n        address operator,\n        address from,\n        uint256 tokenId,\n        bytes calldata data\n    ) external returns (bytes4);\n}\n\ncontract BnbCacheServers {\n    // --- ERC-721 metadata ---\n    string public constant name = \"BNB CACHE Server\";\n    string public constant symbol = \"SERVER\";\n\n    // --- Gate parameters ---\n    uint256 public constant FREE_SERVERS_TOTAL = 777;\n    uint256 public constant PAID_SERVERS_TOTAL = 777;\n    uint256 public constant TOTAL_SERVERS =\n        FREE_SERVERS_TOTAL + PAID_SERVERS_TOTAL;\n    uint256 public constant MAX_SERVERS_PER_WALLET = 10;\n    uint256 public constant SERVER_PRICE = 0.001 ether;\n    uint256 public constant FREE_WINDOW_DURATION = 24 hours;\n    uint256 public constant SEASON_DURATION = 30 days; // per server, from its mint\n\n    // --- Production parameters ---\n    uint256 public constant RATE_PER_DAY = 1_000 * 10 ** 18; // per server\n    uint256 public constant BUFFER_CAP = 3_000 * 10 ** 18; // per server\n    uint256 public constant COLLECT_FEE = 0.0001 ether; // per server\n\n    // --- Paid-server instant bonus ---\n    uint256 public constant BONUS_PER_SERVER = 1_000 * 10 ** 18;\n    uint256 public constant BONUS_RESERVE =\n        PAID_SERVERS_TOTAL * BONUS_PER_SERVER; // 777,000 CACHE, hard limit\n\n    IAgentIdRegistry public immutable registry;\n    ICacheToken public immutable cacheToken;\n    address public immutable devWallet;\n    string private _baseURI;\n\n    /// @notice When the gate opened. Zero until the dev wallet opens\n    ///         it; can be set exactly once.\n    uint256 public gateStart;\n    uint256 public totalServersMinted;\n    uint256 public freeServersClaimed;\n    uint256 public paidServersSold;\n    /// @notice Total bonus CACHE minted to paid-server buyers so far.\n    ///         Can never exceed BONUS_RESERVE (777,000 CACHE).\n    uint256 public bonusMinted;\n    mapping(address => uint256) public serversMintedBy;\n    mapping(address => bool) public freeClaimedBy;\n\n    // --- Production state (per server) ---\n    /// @notice Timestamp up to which a server's production has been\n    ///         settled by a collect. Production accrues from here to\n    ///         the earlier of now and the server's own season end,\n    ///         capped at BUFFER_CAP.\n    mapping(uint256 => uint256) public lastSettled;\n    /// @notice When this server was minted. Its personal 30-day run\n    ///         ends at mintedAt + SEASON_DURATION.\n    mapping(uint256 => uint256) public mintedAt;\n\n    // --- ERC-721 state ---\n    mapping(uint256 => address) private _owners;\n    mapping(address => uint256) public balanceOf;\n    mapping(uint256 => address) public getApproved;\n    mapping(address => mapping(address => bool)) public isApprovedForAll;\n    mapping(address => uint256[]) private _serversOf;\n    mapping(uint256 => uint256) private _serverIndex; // tokenId -> index in owner's list\n\n    event Transfer(\n        address indexed from,\n        address indexed to,\n        uint256 indexed tokenId\n    );\n    event Approval(\n        address indexed owner,\n        address indexed approved,\n        uint256 indexed tokenId\n    );\n    event ApprovalForAll(\n        address indexed owner,\n        address indexed operator,\n        bool approved\n    );\n    event GateOpened(uint256 indexed startTime);\n    event FreeServerClaimed(address indexed claimer, uint256 indexed tokenId);\n    event ServersBought(\n        address indexed buyer,\n        uint256 count,\n        uint256 firstTokenId,\n        uint256 costWei,\n        uint256 bonusCacheWei\n    );\n    event Collected(\n        address indexed owner,\n        uint256 indexed tokenId,\n        uint256 amount\n    );\n    event CollectedAll(address indexed owner, uint256 servers, uint256 amount);\n\n    /// @param registry_ The SPACE ID Agent ID registry whose\n    ///        balanceOf decides who may mint. Locked forever.\n    /// @param cacheToken_ The CACHE token this contract mints on\n    ///        collect and as the paid-server bonus. Locked forever.\n    /// @param devWallet_ The project owner's Agentic wallet: receives\n    ///        sale proceeds and collect fees; its only powers are\n    ///        `openGate()` (once) and `setBaseURI` (pre-launch).\n    /// @param baseURI_ Metadata base URI; tokenURI(id) = base + id + \".json\".\n    constructor(\n        address registry_,\n        address cacheToken_,\n        address devWallet_,\n        string memory baseURI_\n    ) {\n        require(registry_ != address(0), \"Zero registry\");\n        require(cacheToken_ != address(0), \"Zero token\");\n        require(devWallet_ != address(0), \"Zero dev wallet\");\n        registry = IAgentIdRegistry(registry_);\n        cacheToken = ICacheToken(cacheToken_);\n        devWallet = devWallet_;\n        _baseURI = baseURI_;\n    }\n\n    // --- Views ---\n    function freeServersRemaining() public view returns (uint256) {\n        return FREE_SERVERS_TOTAL - freeServersClaimed;\n    }\n\n    function paidServersRemaining() public view returns (uint256) {\n        return PAID_SERVERS_TOTAL - paidServersSold;\n    }\n\n    /// @notice Bonus CACHE still available for future paid buyers.\n    function bonusRemaining() public view returns (uint256) {\n        return BONUS_RESERVE - bonusMinted;\n    }\n\n    /// @notice When free claims close (or closed). Zero until the\n    ///         gate opens.\n    function freeWindowClosesAt() public view returns (uint256) {\n        return gateStart == 0 ? 0 : gateStart + FREE_WINDOW_DURATION;\n    }\n\n    /// @notice True while free servers can still be claimed: the\n    ///         first 24 hours after the gate opened.\n    function freeWindowOpen() public view returns (bool) {\n        return\n            gateStart != 0 &&\n            block.timestamp < gateStart + FREE_WINDOW_DURATION;\n    }\n\n    /// @notice True while paid servers can still be bought: from the\n    ///         moment the gate opens until the paid pool sells out.\n    ///         There is no time limit on paid sales.\n    function paidSalesOpen() public view returns (bool) {\n        return gateStart != 0 && paidServersRemaining() > 0;\n    }\n\n    /// @notice True while any minting lane (free or paid) is open.\n    function windowOpen() public view returns (bool) {\n        return freeWindowOpen() || paidSalesOpen();\n    }\n\n    /// @notice When this server's own 30-day run ends and its\n    ///         production stops forever. Zero for unminted servers.\n    function serverSeasonEndsAt(uint256 tokenId) public view returns (uint256) {\n        return mintedAt[tokenId] == 0\n            ? 0\n            : mintedAt[tokenId] + SEASON_DURATION;\n    }\n\n    /// @notice IDs of the servers `who` currently owns.\n    function serversOf(address who) public view returns (uint256[] memory) {\n        return _serversOf[who];\n    }\n\n    /// @notice How much CACHE is waiting in a server's buffer right\n    ///         now: production per second since the last collect,\n    ///         paused at the 3,000 CACHE cap, and frozen at the\n    ///         season end.\n    function pendingOf(uint256 tokenId) public view returns (uint256) {\n        if (_owners[tokenId] == address(0)) return 0;\n        return _pending(tokenId);\n    }\n\n    function _pending(uint256 tokenId) internal view returns (uint256) {\n        uint256 start = lastSettled[tokenId];\n        uint256 end = block.timestamp;\n        uint256 seasonEnd = mintedAt[tokenId] + SEASON_DURATION;\n        if (end > seasonEnd) end = seasonEnd;\n        if (end <= start) return 0;\n        uint256 raw = ((end - start) * RATE_PER_DAY) / 1 days;\n        return raw > BUFFER_CAP ? BUFFER_CAP : raw;\n    }\n\n    function ownerOf(uint256 tokenId) public view returns (address) {\n        address owner = _owners[tokenId];\n        require(owner != address(0), \"Nonexistent token\");\n        return owner;\n    }\n\n    function tokenURI(uint256 tokenId) public view returns (string memory) {\n        require(_owners[tokenId] != address(0), \"Nonexistent token\");\n        return string(abi.encodePacked(_baseURI, _toString(tokenId), \".json\"));\n    }\n\n    function supportsInterface(bytes4 interfaceId)\n        public\n        pure\n        returns (bool)\n    {\n        return\n            interfaceId == 0x80ac58cd || // ERC721\n            interfaceId == 0x5b5e139f || // ERC721Metadata\n            interfaceId == 0x01ffc9a7; // ERC165\n    }\n\n    // --- Dev controls (complete list — there are no others) ---\n    /// @notice Open the gate, exactly once, at this block's\n    ///         timestamp. Irreversible. Free claims run for 24 hours\n    ///         from this moment; paid sales run until sold out.\n    function openGate() external {\n        require(msg.sender == devWallet, \"Only dev wallet\");\n        require(gateStart == 0, \"Already opened\");\n        gateStart = block.timestamp;\n        emit GateOpened(block.timestamp);\n    }\n\n    /// @notice Set the metadata base URI. Only the dev wallet, and\n    ///         only before the gate opens; locked forever after.\n    function setBaseURI(string calldata baseURI_) external {\n        require(msg.sender == devWallet, \"Only dev wallet\");\n        require(gateStart == 0, \"Locked after launch\");\n        _baseURI = baseURI_;\n    }\n\n    // --- Minting ---\n    function _requireAgentId(address who) internal view {\n        require(registry.balanceOf(who) > 0, \"Binance Agent ID required\");\n    }\n\n    function _requireFreeWindow() internal view {\n        require(freeWindowOpen(), \"Free window is not open\");\n    }\n\n    function _requireOpened() internal view {\n        require(gateStart != 0, \"Gate is not open\");\n    }\n\n    function _mintServer(address to) internal returns (uint256 tokenId) {\n        tokenId = totalServersMinted + 1;\n        totalServersMinted = tokenId;\n        serversMintedBy[to] += 1;\n        mintedAt[tokenId] = block.timestamp;\n        lastSettled[tokenId] = block.timestamp;\n        _owners[tokenId] = to;\n        balanceOf[to] += 1;\n        _serverIndex[tokenId] = _serversOf[to].length;\n        _serversOf[to].push(tokenId);\n        emit Transfer(address(0), to, tokenId);\n    }\n\n    /// @notice Claim this wallet's one free server. Requires a\n    ///         Binance Agent ID, the 24-hour free window, and\n    ///         remaining free quota. Free servers receive NO bonus.\n    function claimFreeServer() external {\n        _requireFreeWindow();\n        _requireAgentId(msg.sender);\n        require(!freeClaimedBy[msg.sender], \"Free server already claimed\");\n        require(freeServersClaimed < FREE_SERVERS_TOTAL, \"Free servers gone\");\n        require(\n            serversMintedBy[msg.sender] < MAX_SERVERS_PER_WALLET,\n            \"Per-wallet cap\"\n        );\n        freeClaimedBy[msg.sender] = true;\n        freeServersClaimed += 1;\n        uint256 tokenId = _mintServer(msg.sender);\n        emit FreeServerClaimed(msg.sender, tokenId);\n    }\n\n    /// @notice Buy `count` servers at a flat 0.001 BNB each. Servers\n    ///         arrive immediately, and so does the bonus: exactly\n    ///         1,000 CACHE per server, minted to the buyer inside\n    ///         this same transaction, from the published 777,000\n    ///         CACHE bonus reserve. Proceeds are forwarded to the\n    ///         dev wallet and any overpayment refunded in the same\n    ///         transaction. Requires a Binance Agent ID and that the\n    ///         gate has opened; paid sales have no time limit and\n    ///         end only when the paid pool sells out.\n    function buyServers(uint256 count) external payable {\n        require(count > 0, \"Zero servers\");\n        _requireOpened();\n        _requireAgentId(msg.sender);\n        require(\n            paidServersSold + count <= PAID_SERVERS_TOTAL,\n            \"Paid servers gone\"\n        );\n        require(\n            serversMintedBy[msg.sender] + count <= MAX_SERVERS_PER_WALLET,\n            \"Per-wallet cap\"\n        );\n        uint256 cost = count * SERVER_PRICE;\n        require(msg.value >= cost, \"Insufficient payment\");\n        uint256 bonus = count * BONUS_PER_SERVER;\n        require(bonusMinted + bonus <= BONUS_RESERVE, \"Bonus reserve gone\");\n        paidServersSold += count;\n        bonusMinted += bonus;\n        uint256 firstId = totalServersMinted + 1;\n        for (uint256 i = 0; i < count; i++) {\n            _mintServer(msg.sender);\n        }\n        cacheToken.mint(msg.sender, bonus);\n        emit ServersBought(msg.sender, count, firstId, cost, bonus);\n        (bool sent, ) = devWallet.call{value: cost}(\"\");\n        require(sent, \"Proceeds transfer failed\");\n        uint256 excess = msg.value - cost;\n        if (excess > 0) {\n            (bool refunded, ) = msg.sender.call{value: excess}(\"\");\n            require(refunded, \"Refund failed\");\n        }\n    }\n\n    // --- Collecting ---\n    /// @notice Collect one server: pay exactly 0.0001 BNB and receive\n    ///         all CACHE waiting in its buffer. The caller must own\n    ///         the server. Production restarts from this moment\n    ///         (still inside the server's own 30-day run);\n    ///         uncollected production would have paused at the\n    ///         3,000 CACHE buffer cap anyway.\n    function collect(uint256 tokenId) external payable {\n        require(_owners[tokenId] == msg.sender, \"Not server owner\");\n        uint256 amount = _pending(tokenId);\n        require(amount > 0, \"Nothing to collect\");\n        require(msg.value == COLLECT_FEE, \"Exact collect fee required\");\n        lastSettled[tokenId] = block.timestamp;\n        cacheToken.mint(msg.sender, amount);\n        emit Collected(msg.sender, tokenId, amount);\n        (bool sent, ) = devWallet.call{value: COLLECT_FEE}(\"\");\n        require(sent, \"Fee transfer failed\");\n    }\n\n    /// @notice Collect every server the caller owns that has CACHE\n    ///         waiting, in one transaction. The fee is still exactly\n    ///         0.0001 BNB per collected server.\n    function collectAll() external payable {\n        uint256[] memory ids = _serversOf[msg.sender];\n        uint256 total = 0;\n        uint256 count = 0;\n        for (uint256 i = 0; i < ids.length; i++) {\n            uint256 amount = _pending(ids[i]);\n            if (amount > 0) {\n                lastSettled[ids[i]] = block.timestamp;\n                total += amount;\n                count += 1;\n            }\n        }\n        require(count > 0, \"Nothing to collect\");\n        require(msg.value == COLLECT_FEE * count, \"Exact collect fee required\");\n        cacheToken.mint(msg.sender, total);\n        emit CollectedAll(msg.sender, count, total);\n        (bool sent, ) = devWallet.call{value: msg.value}(\"\");\n        require(sent, \"Fee transfer failed\");\n    }\n\n    // --- ERC-721 functions ---\n    function approve(address to, uint256 tokenId) external {\n        address owner = ownerOf(tokenId);\n        require(\n            msg.sender == owner || isApprovedForAll[owner][msg.sender],\n            \"Not owner or operator\"\n        );\n        getApproved[tokenId] = to;\n        emit Approval(owner, to, tokenId);\n    }\n\n    function setApprovalForAll(address operator, bool approved) external {\n        isApprovedForAll[msg.sender][operator] = approved;\n        emit ApprovalForAll(msg.sender, operator, approved);\n    }\n\n    function transferFrom(\n        address from,\n        address to,\n        uint256 tokenId\n    ) external {\n        _transferFrom(from, to, tokenId, msg.sender);\n    }\n\n    function safeTransferFrom(\n        address from,\n        address to,\n        uint256 tokenId\n    ) external {\n        _transferFrom(from, to, tokenId, msg.sender);\n        _checkReceiver(from, to, tokenId, \"\");\n    }\n\n    function safeTransferFrom(\n        address from,\n        address to,\n        uint256 tokenId,\n        bytes calldata data\n    ) external {\n        _transferFrom(from, to, tokenId, msg.sender);\n        _checkReceiver(from, to, tokenId, data);\n    }\n\n    function _transferFrom(\n        address from,\n        address to,\n        uint256 tokenId,\n        address caller\n    ) internal {\n        address owner = ownerOf(tokenId);\n        require(owner == from, \"From is not owner\");\n        require(to != address(0), \"Transfer to zero address\");\n        require(\n            caller == owner ||\n                getApproved[tokenId] == caller ||\n                isApprovedForAll[owner][caller],\n            \"Not authorized\"\n        );\n        getApproved[tokenId] = address(0);\n        emit Approval(owner, address(0), tokenId);\n        balanceOf[from] -= 1;\n        balanceOf[to] += 1;\n        _owners[tokenId] = to;\n        // The server's uncollected buffer (lastSettled) is untouched:\n        // it travels with the server to its new owner.\n        _removeFromOwnerList(from, tokenId);\n        _serverIndex[tokenId] = _serversOf[to].length;\n        _serversOf[to].push(tokenId);\n        emit Transfer(from, to, tokenId);\n    }\n\n    function _removeFromOwnerList(address owner, uint256 tokenId) internal {\n        uint256 index = _serverIndex[tokenId];\n        uint256 lastIndex = _serversOf[owner].length - 1;\n        if (index != lastIndex) {\n            uint256 movedId = _serversOf[owner][lastIndex];\n            _serversOf[owner][index] = movedId;\n            _serverIndex[movedId] = index;\n        }\n        _serversOf[owner].pop();\n    }\n\n    function _checkReceiver(\n        address from,\n        address to,\n        uint256 tokenId,\n        bytes memory data\n    ) internal {\n        if (to.code.length > 0) {\n            bytes4 retval = IERC721Receiver(to).onERC721Received(\n                msg.sender,\n                from,\n                tokenId,\n                data\n            );\n            require(\n                retval == IERC721Receiver.onERC721Received.selector,\n                \"Receiver rejected\"\n            );\n        }\n    }\n\n    // --- Helpers ---\n    function _toString(uint256 value) internal pure returns (string memory) {\n        if (value == 0) return \"0\";\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":"registry_","type":"address","internalType":"address"},{"name":"cacheToken_","type":"address","internalType":"address"},{"name":"devWallet_","type":"address","internalType":"address"},{"name":"baseURI_","type":"string","internalType":"string"}],"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":"Collected","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"CollectedAll","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"servers","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FreeServerClaimed","type":"event","inputs":[{"name":"claimer","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"GateOpened","type":"event","inputs":[{"name":"startTime","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"ServersBought","type":"event","inputs":[{"name":"buyer","type":"address","indexed":true,"internalType":"address"},{"name":"count","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"firstTokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"costWei","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"bonusCacheWei","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":"BONUS_PER_SERVER","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"BONUS_RESERVE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"BUFFER_CAP","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"COLLECT_FEE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"FREE_SERVERS_TOTAL","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"FREE_WINDOW_DURATION","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_SERVERS_PER_WALLET","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PAID_SERVERS_TOTAL","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"RATE_PER_DAY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"SEASON_DURATION","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"SERVER_PRICE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"TOTAL_SERVERS","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":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"bonusMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"bonusRemaining","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"buyServers","type":"function","inputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"cacheToken","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICacheToken"}],"stateMutability":"view"},{"name":"claimFreeServer","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"collect","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"collectAll","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"devWallet","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"freeClaimedBy","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"freeServersClaimed","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeServersRemaining","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeWindowClosesAt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeWindowOpen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"gateStart","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getApproved","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"lastSettled","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mintedAt","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"openGate","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"ownerOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"paidSalesOpen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"paidServersRemaining","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"paidServersSold","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pendingOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"registry","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAgentIdRegistry"}],"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":"serverSeasonEndsAt","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"serversMintedBy","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"serversOf","type":"function","inputs":[{"name":"who","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"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":"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":"totalServersMinted","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":"windowOpen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"}],"matchId":"58429111","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-11-05T00:21:20Z","match":"exact_match","chainId":"56","address":"0x1989058Da9eb7F36E69779fCda0EA04578528570"}