{"sources":{"AgentGlyph.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\n/// @notice Minimal ERC721 + metadata + enumerable-lite, self-contained for a single-file verified deploy.\nabstract contract ERC721Base {\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    string public name;\n    string public symbol;\n    mapping(uint256 => address) internal _owners;\n    mapping(address => uint256) internal _balances;\n    mapping(uint256 => address) internal _tokenApprovals;\n    mapping(address => mapping(address => bool)) internal _operatorApprovals;\n\n    constructor(string memory name_, string memory symbol_) { name = name_; symbol = symbol_; }\n\n    function supportsInterface(bytes4 id) public view virtual returns (bool) {\n        return id == 0x01ffc9a7 || id == 0x80ac58cd || id == 0x5b5e139f;\n    }\n    function balanceOf(address owner) public view returns (uint256) {\n        require(owner != address(0), \"zero address\");\n        return _balances[owner];\n    }\n    function ownerOf(uint256 tokenId) public view returns (address) {\n        address o = _owners[tokenId];\n        require(o != address(0), \"nonexistent token\");\n        return o;\n    }\n    function getApproved(uint256 tokenId) public view returns (address) {\n        require(_owners[tokenId] != address(0), \"nonexistent token\");\n        return _tokenApprovals[tokenId];\n    }\n    function isApprovedForAll(address owner, address operator) public view returns (bool) {\n        return _operatorApprovals[owner][operator];\n    }\n    function approve(address to, uint256 tokenId) public {\n        address owner = ownerOf(tokenId);\n        require(msg.sender == owner || isApprovedForAll(owner, msg.sender), \"not authorized\");\n        _tokenApprovals[tokenId] = to;\n        emit Approval(owner, to, tokenId);\n    }\n    function setApprovalForAll(address operator, bool approved) public {\n        _operatorApprovals[msg.sender][operator] = approved;\n        emit ApprovalForAll(msg.sender, operator, approved);\n    }\n    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {\n        address owner = ownerOf(tokenId);\n        return spender == owner || _tokenApprovals[tokenId] == spender || isApprovedForAll(owner, spender);\n    }\n    function transferFrom(address from, address to, uint256 tokenId) public {\n        require(_isApprovedOrOwner(msg.sender, tokenId), \"not authorized\");\n        require(ownerOf(tokenId) == from, \"wrong from\");\n        require(to != address(0), \"zero to\");\n        _tokenApprovals[tokenId] = address(0);\n        _balances[from] -= 1;\n        _balances[to] += 1;\n        _owners[tokenId] = to;\n        emit Transfer(from, to, tokenId);\n    }\n    function safeTransferFrom(address from, address to, uint256 tokenId) public { transferFrom(from, to, tokenId); }\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory) public { transferFrom(from, to, tokenId); }\n    function _mint(address to, uint256 tokenId) internal {\n        require(to != address(0), \"zero to\");\n        require(_owners[tokenId] == address(0), \"already minted\");\n        _balances[to] += 1;\n        _owners[tokenId] = to;\n        emit Transfer(address(0), to, tokenId);\n    }\n}\n\ninterface IAgentIdRegistry {\n    function handleOf(address wallet) external view returns (string memory);\n}\n\n/// @title AgentGlyph - generative on-chain sigils for SPACE ID Agent ID holders on BNB Chain.\n/// @notice First mint free per Agent ID wallet while the free pool lasts, then 0.0001 BNB.\n/// Art and metadata are generated fully on-chain from the token seed. No IPFS, no reveal.\ncontract AgentGlyph is ERC721Base {\n    IAgentIdRegistry public constant AGENT_ID = IAgentIdRegistry(0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F);\n    uint256 public constant MAX_SUPPLY = 1024;\n    uint256 public constant FREE_SUPPLY = 512;\n    uint256 public constant FREE_PER_WALLET = 1;\n    uint256 public constant MAX_PER_WALLET = 10;\n    uint256 public constant PRICE = 0.0001 ether;\n\n    address public owner;\n    uint256 public totalSupply;\n    uint256 public freeClaimed;\n    bool public mintOpen = true;\n    mapping(address => uint256) public mintedBy;\n    mapping(address => uint256) public freeUsed;\n\n    error NoAgentId();\n    error OnlyWallets();\n    error MintClosed();\n    error BadQuantity();\n    error SoldOut();\n    error WalletLimit();\n    error WrongPayment();\n    error NotOwner();\n    error WithdrawFailed();\n\n    event Launched(address indexed to, uint256 indexed tokenId, string agent);\n\n    modifier onlyOwner() { if (msg.sender != owner) revert NotOwner(); _; }\n\n    constructor() ERC721Base(\"AgentGlyph\", \"GLYPH\") { owner = msg.sender; }\n\n    function setMintOpen(bool open_) external onlyOwner { mintOpen = open_; }\n    function withdraw() external onlyOwner {\n        (bool ok, ) = payable(owner).call{value: address(this).balance}(\"\");\n        if (!ok) revert WithdrawFailed();\n    }\n    function transferOwnership(address newOwner) external onlyOwner { owner = newOwner; }\n\n    function freeFor(address wallet, uint256 qty) public view returns (uint256 n) {\n        uint256 w = FREE_PER_WALLET - freeUsed[wallet];\n        uint256 p = FREE_SUPPLY - freeClaimed;\n        n = w < p ? w : p;\n        if (qty < n) n = qty;\n    }\n    function freeLeft(address wallet) external view returns (uint256) { return freeFor(wallet, FREE_PER_WALLET); }\n    function quote(address wallet, uint256 qty) public view returns (uint256) {\n        return (qty - freeFor(wallet, qty)) * PRICE;\n    }\n\n    function mint(uint256 qty) external payable {\n        if (msg.sender != tx.origin) revert OnlyWallets();\n        if (!mintOpen) revert MintClosed();\n        if (qty == 0) revert BadQuantity();\n        if (totalSupply + qty > MAX_SUPPLY) revert SoldOut();\n        if (mintedBy[msg.sender] + qty > MAX_PER_WALLET) revert WalletLimit();\n        string memory handle;\n        try AGENT_ID.handleOf(msg.sender) returns (string memory h) { handle = h; } catch { revert NoAgentId(); }\n        if (bytes(handle).length == 0) revert NoAgentId();\n        uint256 free = freeFor(msg.sender, qty);\n        if (msg.value != (qty - free) * PRICE) revert WrongPayment();\n        if (free > 0) { freeUsed[msg.sender] += free; freeClaimed += free; }\n        mintedBy[msg.sender] += qty;\n        for (uint256 i; i < qty; ++i) {\n            uint256 id = ++totalSupply;\n            _mint(msg.sender, id);\n            emit Launched(msg.sender, id, handle);\n        }\n    }\n\n    // ---------------- seed & traits ----------------\n    function _seed(uint256 id) internal pure returns (uint256) {\n        return uint256(keccak256(abi.encodePacked(\"AgentGlyph\", id)));\n    }\n    function _r(uint256 s, uint256 i) internal pure returns (uint256) {\n        return uint256(keccak256(abi.encodePacked(s, i)));\n    }\n    function _tier(uint256 s) internal pure returns (uint256) {\n        uint256 t = s % 100;\n        if (t < 60) return 0; // Common\n        if (t < 90) return 1; // Rare\n        if (t < 99) return 2; // Epic\n        return 3;             // Legendary\n    }\n    function _tierName(uint256 t) internal pure returns (string memory) {\n        if (t == 0) return \"Common\";\n        if (t == 1) return \"Rare\";\n        if (t == 2) return \"Epic\";\n        return \"Legendary\";\n    }\n    function _paletteName(uint256 p) internal pure returns (string memory) {\n        string[8] memory names = [\"Solar\", \"Verdant\", \"Azure\", \"Violet\", \"Crimson\", \"Golden\", \"Mono\", \"Cyan\"];\n        return names[p % 8];\n    }\n    function _nodes(uint256 s) internal pure returns (uint256) { return 5 + (_r(s, 50) % 5); } // 5..9\n    function _rings(uint256 s) internal pure returns (uint256) { return 1 + (_r(s, 51) % 3); } // 1..3\n\n    // ---------------- string helpers ----------------\n    function _u(uint256 v) internal pure returns (string memory) {\n        if (v == 0) return \"0\";\n        uint256 n = v; uint256 digits;\n        while (n != 0) { digits++; n /= 10; }\n        bytes memory b = new bytes(digits);\n        while (v != 0) { b[--digits] = bytes1(uint8(48 + (v % 10))); v /= 10; }\n        return string(b);\n    }\n    function _abs(int256 v) internal pure returns (int256) { return v < 0 ? -v : v; }\n    function _hsl(uint256 h, uint256 sat, uint256 l) internal pure returns (string memory) {\n        h %= 360;\n        int256 c = (100 - _abs(int256(2 * l) - 100)) * int256(sat) * 255 / 10000;\n        int256 x = c * (60 - _abs(int256(h % 120) - 60)) / 60;\n        int256 m = int256(l) * 255 / 100 - c / 2;\n        int256 r; int256 g; int256 b;\n        if (h < 60) (r, g, b) = (c, x, 0);\n        else if (h < 120) (r, g, b) = (x, c, 0);\n        else if (h < 180) (r, g, b) = (0, c, x);\n        else if (h < 240) (r, g, b) = (0, x, c);\n        else if (h < 300) (r, g, b) = (x, 0, c);\n        else (r, g, b) = (c, 0, x);\n        return string.concat(\"rgb(\", _u(uint256(_clamp(r + m))), \",\", _u(uint256(_clamp(g + m))), \",\", _u(uint256(_clamp(b + m))), \")\");\n    }\n    function _clamp(int256 v) internal pure returns (int256) { if (v < 0) return 0; if (v > 255) return 255; return v; }\n\n    // integer trig on degrees: returns sin/cos scaled by 1e4\n    function _sin(uint256 deg) internal pure returns (int256) {\n        deg %= 360;\n        // piecewise-linear approximation is not used; use quadrant symmetry with a small table via polynomial\n        // x in radians approx: rad = deg * 174533 / 1e7  (pi/180 * 1e4 scale kept in 1e6), polynomial in 1e6 fixed point\n        int256 x = int256(deg) * 17453 / 1000; // milli-radians (deg * 17.453)\n        // reduce to [0, 90] with sign\n        int256 sign = 1;\n        uint256 d = deg;\n        if (d >= 180) { sign = -sign; d -= 180; }\n        if (d > 90) { d = 180 - d; }\n        x = int256(d) * 17453 / 1000;\n        // sin(x) with x in milli-radians/1000 rad: use Taylor in fixed point 1e6\n        int256 xr = x * 1000; // micro-radians (1e6 = 1 rad * 1e6)... x here is milli-rad*1000 => rad*1e6\n        int256 x2 = xr * xr / 1000000;\n        int256 term = xr;\n        int256 sum = xr;\n        term = term * x2 / 1000000 / 6; sum -= term;          // -x^3/3!\n        term = term * x2 / 1000000 / 20; sum += term;         // +x^5/5!  (term currently x^3/6 scaled; *x2/20 -> x^5/120)\n        term = term * x2 / 1000000 / 42; sum -= term;         // -x^7/7!\n        return sign * sum / 100; // back to 1e4 scale\n    }\n    function _cos(uint256 deg) internal pure returns (int256) { return _sin(deg + 90); }\n\n    function _point(uint256 s, uint256 i, uint256 nodes) internal pure returns (uint256 cx, uint256 cy) {\n        uint256 ang = (_r(s, 100 + i) % 360);\n        uint256 rad = 55 + (_r(s, 200 + i) % 85); // 55..139\n        int256 dx = _cos(ang) * int256(rad) / 10000;\n        int256 dy = _sin(ang) * int256(rad) / 10000;\n        cx = uint256(200 + dx);\n        cy = uint256(200 + dy);\n        // keep the starting angle spread: rotate by index so points differ even if hashes collide\n        ang = (ang + i * (360 / nodes)) % 360;\n        dx = _cos(ang) * int256(rad) / 10000;\n        dy = _sin(ang) * int256(rad) / 10000;\n        cx = uint256(200 + dx);\n        cy = uint256(200 + dy);\n    }\n\n    function _svg(uint256 id) internal pure returns (string memory) {\n        uint256 s = _seed(id);\n        uint256 hue = _r(s, 1) % 360;\n        uint256 tier = _tier(s);\n        uint256 nodes = _nodes(s);\n        uint256 rings = _rings(s);\n        string memory bg = _hsl(hue, 45, tier == 3 ? 14 : 8);\n        string memory main = _hsl(hue, 85, 62);\n        string memory accent = _hsl((hue + 140) % 360, 90, 65);\n        string memory parts = string.concat(\n            '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 400 400\">',\n            '<rect width=\"400\" height=\"400\" fill=\"', bg, '\"/>'\n        );\n        // stars (background dots)\n        for (uint256 i; i < 12; ++i) {\n            uint256 x = _r(s, 300 + i) % 400;\n            uint256 y = _r(s, 400 + i) % 400;\n            parts = string.concat(parts, '<circle cx=\"', _u(x), '\" cy=\"', _u(y), '\" r=\"', _u(1 + (i % 2)), '\" fill=\"#ffffff\" opacity=\"0.35\"/>');\n        }\n        // rings\n        for (uint256 i; i < rings; ++i) {\n            uint256 rad = 60 + i * 45 + (_r(s, 500 + i) % 20);\n            parts = string.concat(parts, '<circle cx=\"200\" cy=\"200\" r=\"', _u(rad), '\" fill=\"none\" stroke=\"', accent, '\" stroke-width=\"1.5\" opacity=\"0.55\"/>');\n        }\n        // constellation polyline\n        string memory pts;\n        for (uint256 i; i < nodes; ++i) {\n            (uint256 x, uint256 y) = _point(s, i, nodes);\n            pts = string.concat(pts, _u(x), \",\", _u(y), \" \");\n        }\n        parts = string.concat(parts, '<polyline points=\"', pts, '\" fill=\"none\" stroke=\"', main, '\" stroke-width=\"3\" stroke-linejoin=\"round\"/>');\n        // close the sigil for Epic/Legendary\n        if (tier >= 2) {\n            (uint256 x0, uint256 y0) = _point(s, 0, nodes);\n            (uint256 xl, uint256 yl) = _point(s, nodes - 1, nodes);\n            parts = string.concat(parts, '<line x1=\"', _u(xl), '\" y1=\"', _u(yl), '\" x2=\"', _u(x0), '\" y2=\"', _u(y0), '\" stroke=\"', main, '\" stroke-width=\"3\"/>');\n        }\n        // nodes dots\n        for (uint256 i; i < nodes; ++i) {\n            (uint256 x, uint256 y) = _point(s, i, nodes);\n            parts = string.concat(parts, '<circle cx=\"', _u(x), '\" cy=\"', _u(y), '\" r=\"', _u(i == 0 ? 7 : 5), '\" fill=\"', i == 0 ? accent : main, '\"/>');\n        }\n        // center core\n        parts = string.concat(parts, '<circle cx=\"200\" cy=\"200\" r=\"9\" fill=\"', accent, '\"/><circle cx=\"200\" cy=\"200\" r=\"4\" fill=\"#ffffff\"/>');\n        // legendary crown star\n        if (tier == 3) {\n            parts = string.concat(parts, '<path d=\"M200 18 L206 34 L222 34 L210 44 L214 60 L200 50 L186 60 L190 44 L178 34 L194 34 Z\" fill=\"', accent, '\"/>');\n        }\n        parts = string.concat(parts,\n            '<text x=\"200\" y=\"382\" font-family=\"monospace\" font-size=\"15\" fill=\"', main, '\" text-anchor=\"middle\">AGENTGLYPH #', _u(id), '</text>',\n            \"</svg>\");\n        return parts;\n    }\n\n    function tokenURI(uint256 id) public view returns (string memory) {\n        require(_owners[id] != address(0), \"nonexistent token\");\n        uint256 s = _seed(id);\n        string memory json = string.concat(\n            '{\"name\":\"AgentGlyph #', _u(id),\n            '\",\"description\":\"A generative on-chain sigil for SPACE ID Agent ID holders. Art generated entirely by the contract.\",\"image\":\"data:image/svg+xml;base64,',\n            _b64(bytes(_svg(id))),\n            '\",\"attributes\":[{\"trait_type\":\"Tier\",\"value\":\"', _tierName(_tier(s)),\n            '\"},{\"trait_type\":\"Palette\",\"value\":\"', _paletteName((_r(s, 1) % 360) / 45),\n            '\"},{\"trait_type\":\"Nodes\",\"value\":', _u(_nodes(s)),\n            '},{\"trait_type\":\"Rings\",\"value\":', _u(_rings(s)),\n            '},{\"trait_type\":\"Hue\",\"value\":', _u(_r(s, 1) % 360), \"}]}\"\n        );\n        return string.concat(\"data:application/json;base64,\", _b64(bytes(json)));\n    }\n\n    function _b64(bytes memory data) internal pure returns (string memory) {\n        bytes memory tbl = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n        uint256 len = data.length;\n        if (len == 0) return \"\";\n        uint256 outLen = 4 * ((len + 2) / 3);\n        bytes memory out = new bytes(outLen);\n        uint256 i; uint256 j;\n        for (; i + 3 <= len; i += 3) {\n            uint256 v = (uint256(uint8(data[i])) << 16) | (uint256(uint8(data[i + 1])) << 8) | uint256(uint8(data[i + 2]));\n            out[j++] = tbl[(v >> 18) & 63];\n            out[j++] = tbl[(v >> 12) & 63];\n            out[j++] = tbl[(v >> 6) & 63];\n            out[j++] = tbl[v & 63];\n        }\n        uint256 rem = len - i;\n        if (rem == 1) {\n            uint256 v = uint256(uint8(data[i])) << 16;\n            out[j++] = tbl[(v >> 18) & 63];\n            out[j++] = tbl[(v >> 12) & 63];\n            out[j++] = \"=\";\n            out[j++] = \"=\";\n        } else if (rem == 2) {\n            uint256 v = (uint256(uint8(data[i])) << 16) | (uint256(uint8(data[i + 1])) << 8);\n            out[j++] = tbl[(v >> 18) & 63];\n            out[j++] = tbl[(v >> 12) & 63];\n            out[j++] = tbl[(v >> 6) & 63];\n            out[j++] = \"=\";\n        }\n        return string(out);\n    }\n}\n"}},"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"name":"BadQuantity","type":"error","inputs":[]},{"name":"MintClosed","type":"error","inputs":[]},{"name":"NoAgentId","type":"error","inputs":[]},{"name":"NotOwner","type":"error","inputs":[]},{"name":"OnlyWallets","type":"error","inputs":[]},{"name":"SoldOut","type":"error","inputs":[]},{"name":"WalletLimit","type":"error","inputs":[]},{"name":"WithdrawFailed","type":"error","inputs":[]},{"name":"WrongPayment","type":"error","inputs":[]},{"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":"Launched","type":"event","inputs":[{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"agent","type":"string","indexed":false,"internalType":"string"}],"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":"AGENT_ID","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAgentIdRegistry"}],"stateMutability":"view"},{"name":"FREE_PER_WALLET","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"FREE_SUPPLY","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":"PRICE","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":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeClaimed","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeFor","type":"function","inputs":[{"name":"wallet","type":"address","internalType":"address"},{"name":"qty","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"n","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeLeft","type":"function","inputs":[{"name":"wallet","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeUsed","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getApproved","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"owner","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":[],"stateMutability":"payable"},{"name":"mintOpen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mintedBy","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"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":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"quote","type":"function","inputs":[{"name":"wallet","type":"address","internalType":"address"},{"name":"qty","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"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":"","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":"setMintOpen","type":"function","inputs":[{"name":"open_","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"supportsInterface","type":"function","inputs":[{"name":"id","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"tokenURI","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"withdraw","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"}],"matchId":"58496263","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-11-05T12:23:26Z","match":"exact_match","chainId":"56","address":"0x3ef2A97Abf2E43182eACAe323B82d2CAC2132C6A"}