{"sources":{"AgentAcres.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/// @title Agent Acres — Plots (ACRES)\n/// @notice Agent Acres is a 30-day farming season on BNB Smart Chain\n///         for Binance Agent ID holders. Every rule is readable in\n///         this contract:\n///         - There are exactly 1,500 plots (ERC-721, numbered 1 to\n///           1,500, freely transferable): 750 are FREE and 750 cost a\n///           flat 0.001 BNB each, in two separate pools.\n///         - Minting starts when the dev wallet calls\n///           `openLandGrab()` — exactly once, never reversible. FREE\n///           plots can be claimed only during the first 48 hours\n///           after that moment; PAID plots stay on sale until the\n///           750-plot paid pool is sold out, with no time limit.\n///         - Free plots: 1 per wallet, and only for wallets holding a\n///           Binance Agent ID. Paid plots: up to 9 more per wallet.\n///           A wallet can mint at most 10 plots in total (the free\n///           plot counts toward the cap). Minting follows the wallet,\n///           not the token balance, so it cannot be rented.\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 plot grows 1,000 ACRE per day, accruing per second\n///           from the moment it is minted. Accrual pauses once 3,000\n///           ACRE are waiting (3 full days) until the plot is\n///           harvested, and stops forever 30 days after THAT PLOT was\n///           minted: every plot has its own full 30-day season,\n///           whenever it was claimed or bought, so a late buyer gets\n///           exactly the same deal as an early one. ACRE still\n///           waiting on a plot stays harvestable after its season,\n///           and travels with the plot when the plot changes owner.\n///         - Harvesting costs a flat fee of exactly 0.0001 BNB per\n///           plot, forwarded to the dev wallet. ACRE exists only\n///           once harvested: there is no pre-mine and the dev wallet\n///           cannot mint ACRE or plots for itself outside the same\n///           public rules as everyone else.\n///         - The dev wallet's only powers are calling `openLandGrab()`\n///           once and setting the metadata base URI before the window\n///           opens. It cannot pause anything, change any number, or\n///           move anyone's plot or ACRE.\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 IAcreToken {\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 AgentAcres {\n    // --- ERC-721 metadata ---\n    string public constant name = \"Agent Acres Plot\";\n    string public constant symbol = \"ACRES\";\n\n    // --- Land-grab parameters ---\n    uint256 public constant FREE_PLOTS_TOTAL = 750;\n    uint256 public constant PAID_PLOTS_TOTAL = 750;\n    uint256 public constant TOTAL_PLOTS = FREE_PLOTS_TOTAL + PAID_PLOTS_TOTAL;\n    uint256 public constant MAX_PLOTS_PER_WALLET = 10;\n    uint256 public constant PLOT_PRICE = 0.001 ether;\n    uint256 public constant FREE_WINDOW_DURATION = 48 hours;\n    uint256 public constant SEASON_DURATION = 30 days; // per plot, from its mint\n\n    // --- Farming parameters ---\n    uint256 public constant RATE_PER_DAY = 1_000 * 10 ** 18; // per plot\n    uint256 public constant PENDING_CAP = 3_000 * 10 ** 18; // per plot\n    uint256 public constant HARVEST_FEE = 0.0001 ether; // per plot\n\n    IAgentIdRegistry public immutable registry;\n    IAcreToken public immutable acreToken;\n    address public immutable devWallet;\n    string private _baseURI;\n\n    /// @notice When the land-grab window opened. Zero until the dev\n    ///         wallet opens it; can be set exactly once.\n    uint256 public landGrabStart;\n    uint256 public totalPlotsMinted;\n    uint256 public freePlotsClaimed;\n    uint256 public paidPlotsSold;\n    mapping(address => uint256) public plotsMintedBy;\n    mapping(address => bool) public freeClaimedBy;\n\n    // --- Farming state (per plot) ---\n    /// @notice Timestamp up to which a plot's growth has been settled\n    ///         by a harvest. Growth accrues from here to the earlier\n    ///         of now and the plot's own season end, capped at\n    ///         PENDING_CAP.\n    mapping(uint256 => uint256) public lastSettled;\n    /// @notice When this plot was minted. Its personal 30-day season\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 _plotsOf;\n    mapping(uint256 => uint256) private _plotIndex; // 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 LandGrabOpened(uint256 indexed startTime);\n    event FreePlotClaimed(address indexed claimer, uint256 indexed tokenId);\n    event PlotsBought(\n        address indexed buyer,\n        uint256 count,\n        uint256 firstTokenId,\n        uint256 costWei\n    );\n    event Harvested(\n        address indexed owner,\n        uint256 indexed tokenId,\n        uint256 amount\n    );\n    event HarvestedAll(address indexed owner, uint256 plots, uint256 amount);\n\n    /// @param registry_ The SPACE ID Agent ID registry whose\n    ///        balanceOf decides who may mint. Locked forever.\n    /// @param acreToken_ The ACRE token this contract mints on\n    ///        harvest. Locked forever.\n    /// @param devWallet_ The project owner's Agentic wallet: receives\n    ///        sale proceeds and harvest fees; its only powers are\n    ///        `openLandGrab()` (once) and `setBaseURI` (pre-launch).\n    /// @param baseURI_ Metadata base URI; tokenURI(id) = base + id + \".json\".\n    constructor(\n        address registry_,\n        address acreToken_,\n        address devWallet_,\n        string memory baseURI_\n    ) {\n        require(registry_ != address(0), \"Zero registry\");\n        require(acreToken_ != address(0), \"Zero token\");\n        require(devWallet_ != address(0), \"Zero dev wallet\");\n        registry = IAgentIdRegistry(registry_);\n        acreToken = IAcreToken(acreToken_);\n        devWallet = devWallet_;\n        _baseURI = baseURI_;\n    }\n\n    // --- Views ---\n    function freePlotsRemaining() public view returns (uint256) {\n        return FREE_PLOTS_TOTAL - freePlotsClaimed;\n    }\n\n    function paidPlotsRemaining() public view returns (uint256) {\n        return PAID_PLOTS_TOTAL - paidPlotsSold;\n    }\n\n    /// @notice When free claims close (or closed). Zero until the\n    ///         land grab opens.\n    function freeWindowClosesAt() public view returns (uint256) {\n        return landGrabStart == 0 ? 0 : landGrabStart + FREE_WINDOW_DURATION;\n    }\n\n    /// @notice True while free plots can still be claimed: the first\n    ///         48 hours after the land grab opened.\n    function freeWindowOpen() public view returns (bool) {\n        return\n            landGrabStart != 0 &&\n            block.timestamp < landGrabStart + FREE_WINDOW_DURATION;\n    }\n\n    /// @notice True while paid plots can still be bought: from the\n    ///         moment the land grab opens until the paid pool sells\n    ///         out. There is no time limit on paid sales.\n    function paidSalesOpen() public view returns (bool) {\n        return landGrabStart != 0 && paidPlotsRemaining() > 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 plot's own 30-day season ends and its\n    ///         growth stops forever. Zero for unminted plots.\n    function plotSeasonEndsAt(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 plots `who` currently owns.\n    function plotsOf(address who) public view returns (uint256[] memory) {\n        return _plotsOf[who];\n    }\n\n    /// @notice How much ACRE is waiting on a plot right now: growth\n    ///         per second since the last harvest, paused at the\n    ///         3,000 ACRE cap, and frozen at the 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 > PENDING_CAP ? PENDING_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 land grab, exactly once, at this block's\n    ///         timestamp. Irreversible. Free claims run for 48 hours\n    ///         from this moment; paid sales run until sold out.\n    function openLandGrab() external {\n        require(msg.sender == devWallet, \"Only dev wallet\");\n        require(landGrabStart == 0, \"Already opened\");\n        landGrabStart = block.timestamp;\n        emit LandGrabOpened(block.timestamp);\n    }\n\n    /// @notice Set the metadata base URI. Only the dev wallet, and\n    ///         only before the window opens; locked forever after.\n    function setBaseURI(string calldata baseURI_) external {\n        require(msg.sender == devWallet, \"Only dev wallet\");\n        require(landGrabStart == 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(landGrabStart != 0, \"Land grab is not open\");\n    }\n\n    function _mintPlot(address to) internal returns (uint256 tokenId) {\n        tokenId = totalPlotsMinted + 1;\n        totalPlotsMinted = tokenId;\n        plotsMintedBy[to] += 1;\n        mintedAt[tokenId] = block.timestamp;\n        lastSettled[tokenId] = block.timestamp;\n        _owners[tokenId] = to;\n        balanceOf[to] += 1;\n        _plotIndex[tokenId] = _plotsOf[to].length;\n        _plotsOf[to].push(tokenId);\n        emit Transfer(address(0), to, tokenId);\n    }\n\n    /// @notice Claim this wallet's one free plot. Requires a Binance\n    ///         Agent ID, the 48-hour free window, and remaining free\n    ///         quota.\n    function claimFreePlot() external {\n        _requireFreeWindow();\n        _requireAgentId(msg.sender);\n        require(!freeClaimedBy[msg.sender], \"Free plot already claimed\");\n        require(freePlotsClaimed < FREE_PLOTS_TOTAL, \"Free plots gone\");\n        require(\n            plotsMintedBy[msg.sender] < MAX_PLOTS_PER_WALLET,\n            \"Per-wallet cap\"\n        );\n        freeClaimedBy[msg.sender] = true;\n        freePlotsClaimed += 1;\n        uint256 tokenId = _mintPlot(msg.sender);\n        emit FreePlotClaimed(msg.sender, tokenId);\n    }\n\n    /// @notice Buy `count` plots at a flat 0.001 BNB each. Plots\n    ///         arrive immediately; proceeds are forwarded to the dev\n    ///         wallet and any overpayment refunded in the same\n    ///         transaction. Requires a Binance Agent ID and that the\n    ///         land grab has opened; paid sales have no time limit\n    ///         and end only when the paid pool sells out.\n    function buyPlots(uint256 count) external payable {\n        require(count > 0, \"Zero plots\");\n        _requireOpened();\n        _requireAgentId(msg.sender);\n        require(paidPlotsSold + count <= PAID_PLOTS_TOTAL, \"Paid plots gone\");\n        require(\n            plotsMintedBy[msg.sender] + count <= MAX_PLOTS_PER_WALLET,\n            \"Per-wallet cap\"\n        );\n        uint256 cost = count * PLOT_PRICE;\n        require(msg.value >= cost, \"Insufficient payment\");\n        paidPlotsSold += count;\n        uint256 firstId = totalPlotsMinted + 1;\n        for (uint256 i = 0; i < count; i++) {\n            _mintPlot(msg.sender);\n        }\n        emit PlotsBought(msg.sender, count, firstId, cost);\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    // --- Harvesting ---\n    /// @notice Harvest one plot: pay exactly 0.0001 BNB and receive\n    ///         all ACRE waiting on it. The caller must own the plot.\n    ///         Growth restarts from this moment (still inside the\n    ///         plot's own 30-day season); unharvested growth would\n    ///         have paused at the 3,000 ACRE cap anyway.\n    function harvest(uint256 tokenId) external payable {\n        require(_owners[tokenId] == msg.sender, \"Not plot owner\");\n        uint256 amount = _pending(tokenId);\n        require(amount > 0, \"Nothing to harvest\");\n        require(msg.value == HARVEST_FEE, \"Exact harvest fee required\");\n        lastSettled[tokenId] = block.timestamp;\n        acreToken.mint(msg.sender, amount);\n        emit Harvested(msg.sender, tokenId, amount);\n        (bool sent, ) = devWallet.call{value: HARVEST_FEE}(\"\");\n        require(sent, \"Fee transfer failed\");\n    }\n\n    /// @notice Harvest every plot the caller owns that has ACRE\n    ///         waiting, in one transaction. The fee is still exactly\n    ///         0.0001 BNB per harvested plot.\n    function harvestAll() external payable {\n        uint256[] memory ids = _plotsOf[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 harvest\");\n        require(\n            msg.value == HARVEST_FEE * count,\n            \"Exact harvest fee required\"\n        );\n        acreToken.mint(msg.sender, total);\n        emit HarvestedAll(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 plot's unharvested growth (lastSettled) is untouched:\n        // it travels with the plot to its new owner.\n        _removeFromOwnerList(from, tokenId);\n        _plotIndex[tokenId] = _plotsOf[to].length;\n        _plotsOf[to].push(tokenId);\n        emit Transfer(from, to, tokenId);\n    }\n\n    function _removeFromOwnerList(address owner, uint256 tokenId) internal {\n        uint256 index = _plotIndex[tokenId];\n        uint256 lastIndex = _plotsOf[owner].length - 1;\n        if (index != lastIndex) {\n            uint256 movedId = _plotsOf[owner][lastIndex];\n            _plotsOf[owner][index] = movedId;\n            _plotIndex[movedId] = index;\n        }\n        _plotsOf[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":"acreToken_","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":"FreePlotClaimed","type":"event","inputs":[{"name":"claimer","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"Harvested","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":"HarvestedAll","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"plots","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"LandGrabOpened","type":"event","inputs":[{"name":"startTime","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"PlotsBought","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"}],"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":"FREE_PLOTS_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":"HARVEST_FEE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_PLOTS_PER_WALLET","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PAID_PLOTS_TOTAL","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PENDING_CAP","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PLOT_PRICE","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":"TOTAL_PLOTS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"acreToken","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAcreToken"}],"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":"buyPlots","type":"function","inputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"claimFreePlot","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"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":"freePlotsClaimed","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freePlotsRemaining","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":"getApproved","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"harvest","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"harvestAll","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"landGrabStart","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"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":"openLandGrab","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":"paidPlotsRemaining","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"paidPlotsSold","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"paidSalesOpen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"pendingOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"plotSeasonEndsAt","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"plotsMintedBy","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"plotsOf","type":"function","inputs":[{"name":"who","type":"address","internalType":"address"}],"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":"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":"totalPlotsMinted","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":"58283689","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-11-04T00:23:04Z","match":"exact_match","chainId":"56","address":"0x7a582f91fc6fED51C77b5199585F8050926d8bE0"}