{"sources":{"gateway.pinata.cloud/ipfs/QmQo72nVPa1XxxkG594dZpXGopteLVVzv67ymCtfR4oJXp/Limitless.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\n/**\n *  LIMITLESS — 10,000 generative infinity loops on BNB Chain.\n *\n *  MINT SCHEDULE\n *    - Hard cap           : 10,000\n *    - Per wallet cap     : 5\n *    - First 2 per wallet : FREE      (only while global supply < 6,000)\n *    - Next 3 per wallet  : $0.36     (only while global supply < 6,000)\n *    - After 6,000 minted : $1.00 ea. — every mint, including a wallet's\n *                           first two\n *\n *  Pricing is USD-denominated and converted at execution via a Chainlink\n *  BNB/USD feed. Overpayment is refunded in the same transaction.\n *\n *  OWNERSHIP\n *    The deployer is the owner and retains full administrative control:\n *    pricing, oracle, gate registry, royalties, withdrawal, mint switch\n *    and ownership transfer. `freezeConfig()` optionally locks the\n *    economic parameters forever.\n *\n *  ART\n *    Every loop is drawn by the contract. The SVG is embedded as a base64\n *    data URI inside on-chain metadata — no external host, no IPFS pin.\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 Limitless {\n    /* ============================ constants ============================ */\n\n    uint256 public constant MAX_SUPPLY = 10_000;\n    uint256 public constant MAX_PER_WALLET = 5;\n    uint256 public constant FREE_PER_WALLET = 2;\n    uint256 public constant FINAL_PHASE_START = 6_000; // 0-based index\n\n    /* ============================ ERC-721 ============================== */\n\n    string public name = \"Limitless\";\n    string public symbol = \"LIMIT\";\n\n    uint256 public totalSupply;\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\n    bool public mintLive;\n    bool public frozen;\n\n    /// USD price in cents for mints 3..5 per wallet, before the 6,000 mark.\n    uint256 public tier2Cents = 36;\n    /// USD price in cents once global supply reaches 6,000.\n    uint256 public finalCents = 100;\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    /// ERC-2981 royalty, basis points (500 = 5%).\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 BadQuantity();\n    error WrongPayment();\n    error NotOwner();\n    error ConfigFrozen();\n    error ZeroAddress();\n    error NoBalance();\n    error TransferFailed();\n    error Reentrant();\n    error BadRoyalty();\n\n    /* ============================ modifiers ============================ */\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    /**\n     * @notice Mint up to MAX_PER_WALLET tokens.\n     * @dev Charged exactly what the schedule dictates; any excess msg.value\n     *      is refunded in the same transaction.\n     */\n    function mint(uint256 qty) external payable nonReentrant returns (uint256 firstTokenId) {\n        if (!mintLive) revert MintNotLive();\n        if (qty == 0 || qty > MAX_PER_WALLET) revert BadQuantity();\n\n        uint256 supply = totalSupply;\n        if (supply + qty > MAX_SUPPLY) revert SoldOut();\n        if (_balances[msg.sender] + qty > MAX_PER_WALLET) revert MaxPerWallet();\n        if (!hasAgentId(msg.sender)) revert NoAgentId();\n\n        uint256 cost;\n        uint256 paidInBatch;\n        uint256 t2 = _usdToWei(tier2Cents, flatTier2Wei);\n        uint256 tf = _usdToWei(finalCents, flatFinalWei);\n        uint256 freeUsed = freeMinted[msg.sender];\n\n        for (uint256 i = 0; i < qty; ++i) {\n            uint256 idx = supply + i; // 0-based position of this token\n            if (idx >= FINAL_PHASE_START) {\n                // final phase: everyone pays, including the free slots\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        if (msg.value < cost) revert WrongPayment();\n\n        firstTokenId = supply + 1;\n        for (uint256 i = 0; i < qty; ++i) {\n            _mint(msg.sender, firstTokenId + i);\n        }\n        unchecked {\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    /* ============================= pricing ============================= */\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        uint256 supply = totalSupply;\n        uint256 t2 = _usdToWei(tier2Cents, flatTier2Wei);\n        uint256 tf = _usdToWei(finalCents, flatFinalWei);\n        uint256 freeUsed = freeMinted[minter];\n        for (uint256 i = 0; i < qty; ++i) {\n            uint256 idx = supply + i;\n            if (idx >= FINAL_PHASE_START) cost += tf;\n            else if (freeUsed < FREE_PER_WALLET) freeUsed++;\n            else cost += t2;\n        }\n    }\n\n    /// @notice True once the 6,000 mark has been reached.\n    function finalPhase() public view returns (bool) {\n        return totalSupply >= FINAL_PHASE_START;\n    }\n\n    /// @notice Free mints still available to `minter` (0 in the final phase).\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 _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        // cents (USD*100) -> wei:  cents * 1e24 / answer(8dp USD/BNB)\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    /* ============================ ERC-721 ============================== */\n\n    function balanceOf(address account) public view returns (uint256) {\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        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, ) = to.call(\n                abi.encodeWithSignature(\"onERC721Received(address,address,uint256,bytes)\", msg.sender, from, tokenId, data)\n            );\n            require(ok, \"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            totalSupply = tokenId;\n        }\n        _owners[tokenId] = to;\n        emit Transfer(address(0), to, 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 // ERC-165\n            || interfaceId == 0x80ac58cd // ERC-721\n            || interfaceId == 0x5b5e139f // ERC-721 Metadata\n            || interfaceId == 0x2a55205a; // ERC-2981\n    }\n\n\n    /* ============================== traits ============================= */\n\n    string[7] private PAL = [\"Ember\", \"Ocean\", \"Venom\", \"Orchid\", \"Gold\", \"Ice\", \"Crimson\"];\n    string[7] private PAL_A = [\"#ff5c39\", \"#2ec5ff\", \"#d9ff41\", \"#ff4fd8\", \"#ffd34d\", \"#f2fbff\", \"#ff2e4d\"];\n    string[7] private PAL_B = [\"#ffd34d\", \"#5b6cff\", \"#38e08a\", \"#8a5cff\", \"#fff1b8\", \"#8fd3ff\", \"#7a0a24\"];\n    string[5] private BG = [\"Void\", \"Ink\", \"Plum\", \"Paper\", \"Ash\"];\n    string[5] private BG_HEX = [\"#0a0b0d\", \"#10142a\", \"#1f1430\", \"#f4f0e4\", \"#2a2b30\"];\n    string[5] private STROKE = [\"Solid\", \"Dashed\", \"Dotted\", \"Double\", \"Flowing\"];\n    string[3] private WEIGHT = [\"Thin\", \"Bold\", \"Heavy\"];\n    string[5] private PATTERN = [\"None\", \"Grid\", \"Rings\", \"Rays\", \"Stars\"];\n    string[4] private CORE = [\"None\", \"Orb\", \"Diamond\", \"Spark\"];\n    string[4] private AURA = [\"None\", \"Glow\", \"Halo\", \"Echo\"];\n\n    /// The figure-eight every token is built on (centred on 256,256).\n    string private constant LOOP =\n        \"M256 256C300 186 424 186 424 256C424 326 300 326 256 256C212 186 88 186 88 256C88 326 212 326 256 256Z\";\n\n    function _seed(uint256 tokenId) private view returns (uint256) {\n        return uint256(keccak256(abi.encodePacked(tokenId, address(this), \"limitless\")));\n    }\n\n    /// @notice Trait indices: palette, background, stroke, weight, pattern, core, aura.\n    function traits(uint256 tokenId) public view returns (uint256[7] memory t) {\n        uint256 s = _seed(tokenId);\n        t[0] = (s % 7);\n        t[1] = (s >> 8) % 5;\n        t[2] = (s >> 16) % 5;\n        t[3] = (s >> 24) % 3;\n        t[4] = (s >> 32) % 5;\n        t[5] = (s >> 40) % 4;\n        t[6] = (s >> 48) % 4;\n    }\n\n    /* ============================= tokenURI ============================ */\n\n    function tokenURI(uint256 tokenId) external view returns (string memory) {\n        ownerOf(tokenId);\n        uint256[7] memory t = traits(tokenId);\n        string memory json = string(\n            abi.encodePacked(\n                '{\"name\":\"Limitless #',\n                _toString(tokenId),\n                '\",\"description\":\"10,000 infinity loops drawn on-chain on BNB Chain, for .ai agents.\",',\n                '\"image\":\"data:image/svg+xml;base64,',\n                _b64(bytes(_svg(tokenId, t))),\n                '\",\"attributes\":[',\n                _attrs(t),\n                \"]}\"\n            )\n        );\n        return string(abi.encodePacked(\"data:application/json;base64,\", _b64(bytes(json))));\n    }\n\n    /// @notice The exact SVG the contract will draw for `tokenId`, even before it is minted.\n    function previewSVG(uint256 tokenId) external view returns (string memory) {\n        require(tokenId >= 1 && tokenId <= MAX_SUPPLY, \"OUT_OF_RANGE\");\n        return _svg(tokenId, traits(tokenId));\n    }\n\n    function _attrs(uint256[7] memory t) private view returns (string memory) {\n        return string(\n            abi.encodePacked(\n                _attr(\"Palette\", PAL[t[0]]),\n                _attr(\"Background\", BG[t[1]]),\n                _attr(\"Stroke\", STROKE[t[2]]),\n                _attr(\"Weight\", WEIGHT[t[3]]),\n                _attr(\"Pattern\", PATTERN[t[4]]),\n                _attr(\"Core\", CORE[t[5]]),\n                _attrLast(\"Aura\", AURA[t[6]])\n            )\n        );\n    }\n\n    function _attr(string memory k, string memory v) private pure returns (string memory) {\n        return string(abi.encodePacked('{\"trait_type\":\"', k, '\",\"value\":\"', v, '\"},'));\n    }\n\n    function _attrLast(string memory k, string memory v) private pure returns (string memory) {\n        return string(abi.encodePacked('{\"trait_type\":\"', k, '\",\"value\":\"', v, '\"}'));\n    }\n\n    /* ============================== drawing ============================ */\n\n    function _svg(uint256 tokenId, uint256[7] memory t) private view returns (string memory) {\n        uint256 s = _seed(tokenId);\n        return string(abi.encodePacked(_svgHead(t), _pattern(t[4], t[1], s), _aura(t[6]), _loop(t), _core(t), _label(tokenId, t[1]), \"</svg>\"));\n    }\n\n    function _ink(uint256 bg) private pure returns (string memory) {\n        return bg == 3 ? \"#0a0b0d\" : \"#ffffff\";\n    }\n\n    function _svgHead(uint256[7] memory t) private view returns (string memory) {\n        return string(\n            abi.encodePacked(\n                '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">',\n                '<defs><linearGradient id=\"g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">',\n                '<stop offset=\"0\" stop-color=\"', PAL_A[t[0]], '\"/>',\n                '<stop offset=\"1\" stop-color=\"', PAL_B[t[0]], '\"/></linearGradient>',\n                '<filter id=\"b\" filterUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"512\" height=\"512\"><feGaussianBlur stdDeviation=\"16\"/></filter></defs>',\n                '<rect width=\"512\" height=\"512\" fill=\"', BG_HEX[t[1]], '\"/>'\n            )\n        );\n    }\n\n    function _w(uint256 weight) private pure returns (string memory) {\n        if (weight == 0) return \"14\";\n        if (weight == 1) return \"26\";\n        return \"40\";\n    }\n\n    function _loop(uint256[7] memory t) private view returns (string memory) {\n        return string(abi.encodePacked(_outline(t), _loopBody(t)));\n    }\n\n    /// On the light Paper background, a dark ink outline keeps pale palettes readable.\n    function _outline(uint256[7] memory t) private pure returns (string memory) {\n        if (t[1] != 3) return \"\";\n        string memory w = t[3] == 0 ? \"22\" : (t[3] == 1 ? \"34\" : \"48\");\n        return string(abi.encodePacked('<path d=\"', LOOP, '\" fill=\"none\" stroke=\"#0a0b0d\" stroke-width=\"', w, '\" stroke-linecap=\"round\" stroke-linejoin=\"round\" opacity=\"0.9\"/>'));\n    }\n\n    function _loopBody(uint256[7] memory t) private view returns (string memory) {\n        string memory w = _w(t[3]);\n        string memory base = string(abi.encodePacked('<path d=\"', LOOP, '\" fill=\"none\" stroke=\"url(#g)\" stroke-width=\"', w, '\" stroke-linecap=\"round\" stroke-linejoin=\"round\"'));\n        uint256 st = t[2];\n        if (st == 0) return string(abi.encodePacked(base, \"/>\"));\n        if (st == 1) return string(abi.encodePacked(base, ' stroke-dasharray=\"34 18\"/>'));\n        if (st == 2) return string(abi.encodePacked(base, ' stroke-dasharray=\"0.1 ', t[3] == 2 ? \"56\" : \"36\", '\"/>'));\n        if (st == 3) {\n            return string(abi.encodePacked(\n                base, \"/>\",\n                '<path d=\"', LOOP, '\" fill=\"none\" stroke=\"', BG_HEX[t[1]], '\" stroke-width=\"', t[3] == 0 ? \"5\" : (t[3] == 1 ? \"9\" : \"14\"), '\" stroke-linejoin=\"round\"/>'\n            ));\n        }\n        // flowing: a dashed loop that travels forever\n        return string(abi.encodePacked(\n            base, ' stroke-dasharray=\"120 40\"><animate attributeName=\"stroke-dashoffset\" from=\"0\" to=\"-160\" dur=\"3s\" repeatCount=\"indefinite\"/></path>'\n        ));\n    }\n\n    function _pattern(uint256 p, uint256 bg, uint256 s) private pure returns (string memory) {\n        if (p == 0) return \"\";\n        string memory ink = _ink(bg);\n        if (p == 1) {\n            return string(abi.encodePacked(\n                '<g stroke=\"', ink, '\" stroke-width=\"1\" opacity=\"0.09\">',\n                '<path d=\"M64 0V512M128 0V512M192 0V512M256 0V512M320 0V512M384 0V512M448 0V512\"/>',\n                '<path d=\"M0 64H512M0 128H512M0 192H512M0 256H512M0 320H512M0 384H512M0 448H512\"/></g>'\n            ));\n        }\n        if (p == 2) {\n            return string(abi.encodePacked(\n                '<g fill=\"none\" stroke=\"', ink, '\" stroke-width=\"1.5\" opacity=\"0.1\">',\n                '<circle cx=\"256\" cy=\"256\" r=\"60\"/><circle cx=\"256\" cy=\"256\" r=\"120\"/><circle cx=\"256\" cy=\"256\" r=\"180\"/>',\n                '<circle cx=\"256\" cy=\"256\" r=\"240\"/><circle cx=\"256\" cy=\"256\" r=\"300\"/></g>'\n            ));\n        }\n        if (p == 3) {\n            return string(abi.encodePacked(\n                '<g stroke=\"', ink, '\" stroke-width=\"2\" opacity=\"0.08\">',\n                '<path d=\"M256 256L256 0M256 256L437 75M256 256L512 256M256 256L437 437M256 256L256 512M256 256L75 437M256 256L0 256M256 256L75 75\"/>',\n                '<path d=\"M256 256L354 19M256 256L493 158M256 256L493 354M256 256L354 493M256 256L158 493M256 256L19 354M256 256L19 158M256 256L158 19\"/></g>'\n            ));\n        }\n        return string(abi.encodePacked(_star(s, 0, ink), _star(s, 1, ink), _star(s, 2, ink), _star(s, 3, ink), _star(s, 4, ink), _star(s, 5, ink), _star(s, 6, ink), _star(s, 7, ink)));\n    }\n\n    function _star(uint256 s, uint256 i, string memory ink) private pure returns (string memory) {\n        uint256 r = uint256(keccak256(abi.encodePacked(s, i)));\n        return string(\n            abi.encodePacked(\n                '<circle cx=\"', _toString((r % 470) + 21),\n                '\" cy=\"', _toString(((r >> 16) % 470) + 21),\n                '\" r=\"', ((r >> 32) % 3 == 0) ? \"3\" : \"1.8\",\n                '\" fill=\"', ink, '\" opacity=\"0.55\"/>'\n            )\n        );\n    }\n\n    function _aura(uint256 a) private pure returns (string memory) {\n        if (a == 0) return \"\";\n        if (a == 1) {\n            return string(abi.encodePacked('<path d=\"', LOOP, '\" fill=\"none\" stroke=\"url(#g)\" stroke-width=\"44\" opacity=\"0.55\" filter=\"url(#b)\"/>'));\n        }\n        if (a == 2) {\n            return '<ellipse cx=\"256\" cy=\"256\" rx=\"214\" ry=\"120\" fill=\"none\" stroke=\"url(#g)\" stroke-width=\"3\" opacity=\"0.45\"/>';\n        }\n        // echo: a faint larger loop behind\n        return string(abi.encodePacked('<path d=\"', LOOP, '\" fill=\"none\" stroke=\"url(#g)\" stroke-width=\"6\" opacity=\"0.3\" transform=\"translate(256 256) scale(1.18) translate(-256 -256)\"/>'));\n    }\n\n    function _core(uint256[7] memory t) private view returns (string memory) {\n        uint256 c = t[5];\n        if (c == 0) return \"\";\n        if (c == 1) {\n            return string(abi.encodePacked('<circle cx=\"256\" cy=\"256\" r=\"15\" fill=\"', PAL_A[t[0]], '\" stroke=\"', BG_HEX[t[1]], '\" stroke-width=\"5\"/>'));\n        }\n        if (c == 2) {\n            return string(abi.encodePacked('<path d=\"M256 234L278 256L256 278L234 256Z\" fill=\"', PAL_B[t[0]], '\" stroke=\"', BG_HEX[t[1]], '\" stroke-width=\"5\"/>'));\n        }\n        return string(abi.encodePacked('<path d=\"M256 226L262 250L286 256L262 262L256 286L250 262L226 256L250 250Z\" fill=\"', _ink(t[1]), '\"/>'));\n    }\n\n    function _label(uint256 tokenId, uint256 bg) private pure returns (string memory) {\n        return string(abi.encodePacked(\n            '<text x=\"32\" y=\"480\" font-family=\"monospace\" font-size=\"18\" fill=\"', _ink(bg), '\" opacity=\"0.55\">LIMITLESS #', _toString(tokenId), '</text>'\n        ));\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    /// @dev Standard base64 with correct '=' padding.\n    function _b64(bytes memory data) private pure returns (string memory) {\n        uint256 len = data.length;\n        if (len == 0) return \"\";\n\n        bytes memory table = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n        uint256 outLen = ((len + 2) / 3) * 4;\n        bytes memory out = new bytes(outLen);\n\n        uint256 i;\n        uint256 j;\n        for (; i + 3 <= len; i += 3) {\n            uint256 n = (uint256(uint8(data[i])) << 16) | (uint256(uint8(data[i + 1])) << 8) | uint256(uint8(data[i + 2]));\n            out[j] = table[(n >> 18) & 0x3F];\n            out[j + 1] = table[(n >> 12) & 0x3F];\n            out[j + 2] = table[(n >> 6) & 0x3F];\n            out[j + 3] = table[n & 0x3F];\n            j += 4;\n        }\n\n        uint256 rem = len - i;\n        if (rem == 1) {\n            uint256 n1 = uint256(uint8(data[i])) << 16;\n            out[j] = table[(n1 >> 18) & 0x3F];\n            out[j + 1] = table[(n1 >> 12) & 0x3F];\n            out[j + 2] = bytes1(0x3d);\n            out[j + 3] = bytes1(0x3d);\n        } else if (rem == 2) {\n            uint256 n2 = (uint256(uint8(data[i])) << 16) | (uint256(uint8(data[i + 1])) << 8);\n            out[j] = table[(n2 >> 18) & 0x3F];\n            out[j + 1] = table[(n2 >> 12) & 0x3F];\n            out[j + 2] = table[(n2 >> 6) & 0x3F];\n            out[j + 3] = bytes1(0x3d);\n        }\n        return string(out);\n    }\n\n    /* ============================ admin ================================ */\n\n    event MintLiveSet(bool live);\n    event PricesSet(uint256 tier2Cents, uint256 finalCents);\n    event OracleSet(address oracle);\n    event AgentIdSet(address registry);\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 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    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 gate configuration.\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":"MaxPerWallet","type":"error","inputs":[]},{"name":"MintNotLive","type":"error","inputs":[]},{"name":"NoAgentId","type":"error","inputs":[]},{"name":"NoBalance","type":"error","inputs":[]},{"name":"NotOwner","type":"error","inputs":[]},{"name":"Reentrant","type":"error","inputs":[]},{"name":"SoldOut","type":"error","inputs":[]},{"name":"TransferFailed","type":"error","inputs":[]},{"name":"WrongPayment","type":"error","inputs":[]},{"name":"ZeroAddress","type":"error","inputs":[]},{"name":"AgentIdSet","type":"event","inputs":[{"name":"registry","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"ApprovalForAll","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"Frozen","type":"event","inputs":[],"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":"finalCents","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"finalPhase","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"flatFinalWei","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"flatTier2Wei","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeMinted","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeRemaining","type":"function","inputs":[{"name":"minter","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freezeConfig","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"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":"mint","type":"function","inputs":[{"name":"qty","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"firstTokenId","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"name":"mintLive","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":"previewSVG","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"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":"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":"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":"traits","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"t","type":"uint256[7]","internalType":"uint256[7]"}],"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":"57816905","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-31T11:09:14Z","match":"exact_match","chainId":"56","address":"0xc7aA008c2369FF00322c49D526F33529bB692a86"}