{"sources":{"NullsectorGen2.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\ninterface IBalanceOf {\n    function balanceOf(address owner) external view returns (uint256);\n}\n\n/// @title NULLSECTOR GEN2 — the archived second generation, released as a gacha.\n/// @notice Rules are constants — they cannot be changed by anyone, owner included:\n///      - Eligibility: Binance Agent ID holders only (same registry gate as\n///        NULLSECTOR GEN1 and PERSONA).\n///      - Every eligible wallet gets BASE_ATTEMPTS (10) attempts. Holding\n///        NULLSECTOR GEN1 adds +2 attempts per GEN1 unit, counted live at\n///        pull time.\n///      - Each attempt is a two-step pull: pull() seals the attempt into the\n///        current block; settle() (from the next block on) resolves it from\n///        blockhash(pull block) — a value nobody can know when pulling.\n///        20% of attempts resolve FREE and mint immediately. The rest resolve\n///        PAID at a rolled price: 0.0001 / 0.0005 / 0.001 / 0.002 BNB with\n///        weights 15 / 25 / 40 / 20. A paid attempt is an offer: pay the\n///        exact price to claim the unit, or skip() and the attempt is spent.\n///      - Token id = mint order, sequential from 1. The artwork assignment\n///        was shuffled before launch from a seed whose hash is committed in\n///        provenanceHash; the seed is published via revealSeed() so anyone\n///        can re-derive the whole assignment.\n///      - Mint window: WINDOW (10 days) from openMint(). The owner may pause\n///        and resume inside the window, but can never extend it, change the\n///        odds, the prices, or the attempt counts.\ncontract NullsectorGen2 {\n    string public name = \"NULLSECTOR GEN2\";\n    string public symbol = \"GEN2\";\n\n    uint256 public constant MAX_SUPPLY = 4321;\n    uint256 public constant BASE_ATTEMPTS = 10;\n    uint256 public constant FREE_CHANCE = 20; // percent, per attempt\n    uint256 public constant EXTRA_PER_GEN1 = 2;\n    uint256 public constant WINDOW = 10 days;\n    uint96 public constant ROYALTY_BPS = 500; // 5%\n\n    // Rolled paid prices (wei) and cumulative weights (percent):\n    // <15 -> 0.0001 BNB | <40 -> 0.0005 BNB | <80 -> 0.001 BNB | else 0.002 BNB\n    uint256 public constant PRICE_0 = 0.0001 ether;\n    uint256 public constant PRICE_1 = 0.0005 ether;\n    uint256 public constant PRICE_2 = 0.001 ether;\n    uint256 public constant PRICE_3 = 0.002 ether;\n\n    IBalanceOf public constant AGENT_ID = IBalanceOf(0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F);\n    IBalanceOf public constant GEN1 = IBalanceOf(0x9395e207F9928657237DE96ffB12340094c073cd);\n\n    address public owner;\n    string public baseURI;\n    bool public mintOpen;\n    bool public mintPaused;\n    uint256 public mintEndsAt; // 0 until openMint()\n    uint256 public totalSupply;\n\n    bytes32 public provenanceHash;\n    string public seed; // empty until revealSeed()\n\n    struct Pull {\n        uint256 blockNum;   // block the attempt was sealed in (0 = no pull)\n        uint256 attemptNo;  // 1-based attempt counter at pull time\n        bool resolved;      // settle() has run\n        bool isFree;        // resolution: free\n        uint256 price;      // resolution: rolled price (paid)\n    }\n    mapping(address => Pull) public pulls;\n    mapping(address => uint256) public attemptsUsed;\n\n    // --- ERC721 storage ---\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    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n    event MintOpened(uint256 endsAt);\n    event MintPaused();\n    event MintResumed();\n    event Pulled(address indexed who, uint256 attemptNo, uint256 blockNum);\n    event SettledFree(address indexed who, uint256 attemptNo, uint256 tokenId);\n    event SettledPaid(address indexed who, uint256 attemptNo, uint256 price);\n    event PaidClaimed(address indexed who, uint256 tokenId, uint256 price);\n    event PullSkipped(address indexed who, bool consumed);\n    event PullExpired(address indexed who);\n    event SeedRevealed(string seed);\n\n    error NoAgentID();\n\n    modifier onlyOwner() {\n        require(msg.sender == owner, \"not owner\");\n        _;\n    }\n\n    constructor() {\n        owner = msg.sender;\n        emit OwnershipTransferred(address(0), msg.sender);\n    }\n\n    // --- Admin ---\n    function openMint() external onlyOwner {\n        require(!mintOpen, \"already opened\");\n        mintOpen = true;\n        mintEndsAt = block.timestamp + WINDOW;\n        emit MintOpened(mintEndsAt);\n    }\n\n    function pauseMint() external onlyOwner {\n        require(mintOpen && !mintPaused, \"not running\");\n        mintPaused = true;\n        emit MintPaused();\n    }\n\n    function resumeMint() external onlyOwner {\n        require(mintOpen && mintPaused, \"not paused\");\n        mintPaused = false;\n        emit MintResumed();\n    }\n\n    function setBaseURI(string calldata uri) external onlyOwner {\n        baseURI = uri;\n    }\n\n    /// @notice Commit the art-shuffle provenance hash. One time only.\n    function setProvenance(bytes32 h) external onlyOwner {\n        require(provenanceHash == bytes32(0), \"already set\");\n        provenanceHash = h;\n    }\n\n    /// @notice Publish the shuffle seed so anyone can verify the assignment.\n    function revealSeed(string calldata s) external onlyOwner {\n        require(bytes(seed).length == 0, \"already revealed\");\n        seed = s;\n        emit SeedRevealed(s);\n    }\n\n    function transferOwnership(address newOwner) external onlyOwner {\n        require(newOwner != address(0), \"zero address\");\n        emit OwnershipTransferred(owner, newOwner);\n        owner = newOwner;\n    }\n\n    function withdraw() external onlyOwner {\n        (bool ok, ) = payable(owner).call{value: address(this).balance}(\"\");\n        require(ok, \"withdraw failed\");\n    }\n\n    // --- Gacha ---\n    function _mintOpen() internal view returns (bool) {\n        return mintOpen && !mintPaused && block.timestamp < mintEndsAt;\n    }\n\n    function allowance(address a) public view returns (uint256) {\n        return BASE_ATTEMPTS + EXTRA_PER_GEN1 * GEN1.balanceOf(a);\n    }\n\n    function attemptsLeft(address a) public view returns (uint256) {\n        uint256 used = attemptsUsed[a] + (pulls[a].blockNum != 0 ? 1 : 0);\n        uint256 allow = allowance(a);\n        return allow > used ? allow - used : 0;\n    }\n\n    /// @notice Step 1 — seal an attempt into the current block.\n    function pull() external {\n        require(_mintOpen(), \"mint not open\");\n        if (AGENT_ID.balanceOf(msg.sender) == 0) revert NoAgentID();\n        require(pulls[msg.sender].blockNum == 0, \"finish current pull first\");\n        require(totalSupply < MAX_SUPPLY, \"sold out\");\n        require(attemptsLeft(msg.sender) > 0, \"no attempts left\");\n        uint256 no = attemptsUsed[msg.sender] + 1;\n        pulls[msg.sender] = Pull(block.number, no, false, false, 0);\n        emit Pulled(msg.sender, no, block.number);\n    }\n\n    /// @notice Step 2 — resolve the sealed attempt from its block hash.\n    /// Free attempts mint immediately; paid attempts lock in their price.\n    function settle() external {\n        Pull storage p = pulls[msg.sender];\n        require(p.blockNum != 0, \"no pull\");\n        require(!p.resolved, \"already settled\");\n        require(block.number > p.blockNum, \"settle from next block\");\n        bytes32 bh = blockhash(p.blockNum);\n        if (bh == bytes32(0)) {\n            // Older than 256 blocks: the roll can no longer be derived.\n            // The pull is voided and the attempt is NOT consumed.\n            delete pulls[msg.sender];\n            emit PullExpired(msg.sender);\n            return;\n        }\n        uint256 rFree = uint256(keccak256(abi.encodePacked(bh, msg.sender, p.attemptNo)));\n        attemptsUsed[msg.sender] += 1;\n        if (rFree % 100 < FREE_CHANCE) {\n            require(totalSupply < MAX_SUPPLY, \"sold out\");\n            uint256 id = totalSupply + 1;\n            uint256 no = p.attemptNo;\n            delete pulls[msg.sender];\n            _safeMint(msg.sender, id);\n            totalSupply += 1;\n            emit SettledFree(msg.sender, no, id);\n        } else {\n            uint256 rPrice = uint256(keccak256(abi.encodePacked(bh, msg.sender, p.attemptNo, \"PRICE\"))) % 100;\n            uint256 price = rPrice < 15 ? PRICE_0 : rPrice < 40 ? PRICE_1 : rPrice < 80 ? PRICE_2 : PRICE_3;\n            p.resolved = true;\n            p.price = price;\n            emit SettledPaid(msg.sender, p.attemptNo, price);\n        }\n    }\n\n    /// @notice Step 3 (paid only) — claim the unit at exactly the rolled price.\n    function pay() external payable {\n        Pull storage p = pulls[msg.sender];\n        require(p.blockNum != 0 && p.resolved && !p.isFree, \"no paid pull waiting\");\n        require(_mintOpen(), \"mint not open\");\n        require(msg.value == p.price, \"wrong value\");\n        require(totalSupply < MAX_SUPPLY, \"sold out\");\n        uint256 price = p.price;\n        delete pulls[msg.sender];\n        uint256 id = totalSupply + 1;\n        _safeMint(msg.sender, id);\n        totalSupply += 1;\n        emit PaidClaimed(msg.sender, id, price);\n    }\n\n    /// @notice Give up the current pull. A resolved (paid) pull was already\n    /// counted at settle time; an unresolved pull is cancelled uncounted.\n    function skip() external {\n        Pull storage p = pulls[msg.sender];\n        require(p.blockNum != 0, \"no pull\");\n        bool consumed = p.resolved;\n        delete pulls[msg.sender];\n        emit PullSkipped(msg.sender, consumed);\n    }\n\n    // --- Views ---\n    function phase() external view returns (uint8) {\n        if (!mintOpen) return 0; // not opened\n        if (block.timestamp >= mintEndsAt || totalSupply >= MAX_SUPPLY) return 3; // closed\n        if (mintPaused) return 2; // paused\n        return 1; // open\n    }\n\n    /// @notice Front-end / agent helper: everything about a wallet in one call.\n    /// pullState: 0 none · 1 sealed, awaiting settle · 2 paid, awaiting pay/skip\n    function status(address a) external view returns (\n        bool open,\n        uint256 supply,\n        uint256 maxSupply,\n        uint256 endsAt,\n        bool eligible,\n        uint256 gen1Balance,\n        uint256 totalAttempts,\n        uint256 usedAttempts,\n        uint256 leftAttempts,\n        uint8 pullState,\n        bool pullIsFree,\n        uint256 pullPrice,\n        uint256 pullBlock\n    ) {\n        Pull storage p = pulls[a];\n        open = _mintOpen();\n        supply = totalSupply;\n        maxSupply = MAX_SUPPLY;\n        endsAt = mintEndsAt;\n        eligible = AGENT_ID.balanceOf(a) > 0;\n        gen1Balance = GEN1.balanceOf(a);\n        totalAttempts = allowance(a);\n        usedAttempts = attemptsUsed[a];\n        leftAttempts = attemptsLeft(a);\n        pullState = p.blockNum == 0 ? 0 : (!p.resolved ? 1 : (p.isFree ? 0 : 2));\n        pullIsFree = p.resolved && p.isFree;\n        pullPrice = p.price;\n        pullBlock = p.blockNum;\n    }\n\n    // --- ERC721 ---\n    function balanceOf(address account) external view returns (uint256) {\n        require(account != address(0), \"zero address\");\n        return _balances[account];\n    }\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\n    function tokenURI(uint256 tokenId) external 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 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 getApproved(uint256 tokenId) external view returns (address) {\n        require(_owners[tokenId] != address(0), \"nonexistent token\");\n        return _tokenApprovals[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 isApprovedForAll(address account, address operator) external view returns (bool) {\n        return _operatorApprovals[account][operator];\n    }\n\n    function transferFrom(address from, address to, uint256 tokenId) public {\n        require(_isAuthorized(msg.sender, tokenId), \"not authorized\");\n        require(ownerOf(tokenId) == from, \"wrong from\");\n        require(to != address(0), \"zero address\");\n        delete _tokenApprovals[tokenId];\n        _balances[from] -= 1;\n        _balances[to] += 1;\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        require(_checkOnERC721Received(from, to, tokenId, data), \"unsafe recipient\");\n    }\n\n    function _isAuthorized(address spender, uint256 tokenId) internal view returns (bool) {\n        address o = _owners[tokenId];\n        return spender == o || _tokenApprovals[tokenId] == spender || _operatorApprovals[o][spender];\n    }\n\n    function _safeMint(address to, uint256 tokenId) internal {\n        require(to != address(0), \"zero address\");\n        require(_owners[tokenId] == address(0), \"already minted\");\n        _balances[to] += 1;\n        _owners[tokenId] = to;\n        emit Transfer(address(0), to, tokenId);\n        require(_checkOnERC721Received(address(0), to, tokenId, \"\"), \"unsafe recipient\");\n    }\n\n    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private returns (bool) {\n        if (to.code.length == 0) return true;\n        try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, data) returns (bytes4 retval) {\n            return retval == IERC721Receiver.onERC721Received.selector;\n        } catch {\n            return false;\n        }\n    }\n\n    // --- ERC2981 ---\n    function royaltyInfo(uint256, uint256 salePrice) external view returns (address, uint256) {\n        return (owner, (salePrice * ROYALTY_BPS) / 10000);\n    }\n\n    function supportsInterface(bytes4 interfaceId) external pure returns (bool) {\n        return interfaceId == 0x01ffc9a7 // ERC165\n            || interfaceId == 0x80ac58cd // ERC721\n            || interfaceId == 0x5b5e139f // ERC721Metadata\n            || interfaceId == 0x2a55205a; // ERC2981\n    }\n\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) { digits++; temp /= 10; }\n        bytes memory buffer = new bytes(digits);\n        while (value != 0) {\n            digits -= 1;\n            buffer[digits] = bytes1(uint8(48 + (value % 10)));\n            value /= 10;\n        }\n        return string(buffer);\n    }\n}\n\ninterface IERC721Receiver {\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\n}\n"}},"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"name":"NoAgentID","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":"MintOpened","type":"event","inputs":[{"name":"endsAt","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"MintPaused","type":"event","inputs":[],"anonymous":false},{"name":"MintResumed","type":"event","inputs":[],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"PaidClaimed","type":"event","inputs":[{"name":"who","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"price","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"PullExpired","type":"event","inputs":[{"name":"who","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"PullSkipped","type":"event","inputs":[{"name":"who","type":"address","indexed":true,"internalType":"address"},{"name":"consumed","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"Pulled","type":"event","inputs":[{"name":"who","type":"address","indexed":true,"internalType":"address"},{"name":"attemptNo","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"blockNum","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"SeedRevealed","type":"event","inputs":[{"name":"seed","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"SettledFree","type":"event","inputs":[{"name":"who","type":"address","indexed":true,"internalType":"address"},{"name":"attemptNo","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"SettledPaid","type":"event","inputs":[{"name":"who","type":"address","indexed":true,"internalType":"address"},{"name":"attemptNo","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"price","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":"AGENT_ID","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IBalanceOf"}],"stateMutability":"view"},{"name":"BASE_ATTEMPTS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"EXTRA_PER_GEN1","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"FREE_CHANCE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"GEN1","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IBalanceOf"}],"stateMutability":"view"},{"name":"MAX_SUPPLY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PRICE_0","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PRICE_1","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PRICE_2","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PRICE_3","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"ROYALTY_BPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"name":"WINDOW","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"allowance","type":"function","inputs":[{"name":"a","type":"address","internalType":"address"}],"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":"attemptsLeft","type":"function","inputs":[{"name":"a","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"attemptsUsed","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"balanceOf","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"baseURI","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"getApproved","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"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":"mintEndsAt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mintOpen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mintPaused","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":"openMint","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"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":"pauseMint","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"pay","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"phase","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"provenanceHash","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"pull","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"pulls","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"blockNum","type":"uint256","internalType":"uint256"},{"name":"attemptNo","type":"uint256","internalType":"uint256"},{"name":"resolved","type":"bool","internalType":"bool"},{"name":"isFree","type":"bool","internalType":"bool"},{"name":"price","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"resumeMint","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"revealSeed","type":"function","inputs":[{"name":"s","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"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":"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":"seed","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"setApprovalForAll","type":"function","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setBaseURI","type":"function","inputs":[{"name":"uri","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setProvenance","type":"function","inputs":[{"name":"h","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"settle","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"skip","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"status","type":"function","inputs":[{"name":"a","type":"address","internalType":"address"}],"outputs":[{"name":"open","type":"bool","internalType":"bool"},{"name":"supply","type":"uint256","internalType":"uint256"},{"name":"maxSupply","type":"uint256","internalType":"uint256"},{"name":"endsAt","type":"uint256","internalType":"uint256"},{"name":"eligible","type":"bool","internalType":"bool"},{"name":"gen1Balance","type":"uint256","internalType":"uint256"},{"name":"totalAttempts","type":"uint256","internalType":"uint256"},{"name":"usedAttempts","type":"uint256","internalType":"uint256"},{"name":"leftAttempts","type":"uint256","internalType":"uint256"},{"name":"pullState","type":"uint8","internalType":"uint8"},{"name":"pullIsFree","type":"bool","internalType":"bool"},{"name":"pullPrice","type":"uint256","internalType":"uint256"},{"name":"pullBlock","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"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":"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":"58722890","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-11-07T06:13:59Z","match":"exact_match","chainId":"56","address":"0x720afe93a0A1EbF0e0e3b279240BED653Cc1d0C2"}