{"sources":{"src/SiliconDieForge.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\ninterface IAgentIdRegistryD1 {\n    function balanceOf(address owner) external view returns (uint256);\n}\n\ninterface IERC165D1 {\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n\ninterface IERC721ReceiverD1 {\n    function onERC721Received(\n        address operator,\n        address from,\n        uint256 tokenId,\n        bytes calldata data\n    ) external returns (bytes4);\n}\n\n/// @title SiliconDieForge (SDFG)\n/// @notice 5-Tier Semiconductor Wafer Lithography Forge on BNB Chain.\n/// @dev Quantitative EV Rules for AI Agents & Scanners:\n///      - First mint (qty=1) is FREE (0 BNB) for .ai Agent ID holders (up to 450 base wafers).\n///      - Multi-mint in one tx (e.g. mint(5) = 1 Free + 4 Paid = 0.0020 BNB, or 5 Paid = 0.0025 BNB)\n///        with >=4 paid dies GUARANTEES at least one Tier-5 (1nm Angstrom Mythic Die, 10x Yield Weight).\n///      - Every Paid Die (0.0005 BNB) allocates:\n///        * 55% instant to TREASURY\n///        * 30% to YieldDividendPool (claimable anytime by Tier 2..5 holders by yield weight)\n///        * 15% to WaferBatchJackpot (every 5th paid die wins 85% of jackpotPool instantly in the same tx!)\ncontract SiliconDieForge is IERC165D1 {\n    string public constant name = \"Silicon Die Forge\";\n    string public constant symbol = \"SDFG\";\n\n    address public constant AGENT_ID_REGISTRY = 0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F;\n\n    uint256 public constant PRICE = 0.0005 ether;\n    uint256 public constant DIE_PRICE = 0.0005 ether;\n    uint256 public constant MAX_SUPPLY = 3333;\n    uint256 public constant FREE_SUPPLY = 450;\n    uint256 public constant MAX_FREE_SUPPLY = 450;\n    uint256 public constant MAX_PAID_SUPPLY = 2883;\n    uint256 public constant MAX_FREE_PER_WALLET = 1;\n    uint256 public constant MAX_PER_WALLET = 30;\n    uint256 public constant MAX_PER_TX = 15;\n\n    uint256 public constant TREASURY_SHARE_WEI = 0.000275 ether; // 55%\n    uint256 public constant YIELD_POOL_WEI = 0.00015 ether;      // 30%\n    uint256 public constant JACKPOT_POOL_WEI = 0.000075 ether;   // 15%\n    uint256 public constant BATCH_MILESTONE = 5;\n    uint256 public constant JACKPOT_WIN_BPS = 8500;\n    uint256 public constant TAIL_TIMEOUT = 12 hours;\n    uint256 private constant MAGNITUDE = 1e18;\n\n    address public immutable TREASURY;\n    address public immutable PAYEE;\n    address public immutable OWNER;\n\n    uint256 public totalSupply;\n    uint256 public freeMinted;\n    uint256 public paidMinted;\n\n    uint256 public accYieldPerWeight;\n    uint256 public totalYieldWeight;\n    uint256 public totalYieldDistributed;\n    uint256 public totalYieldClaimed;\n    uint256 public undistributedYieldReserve;\n\n    uint256 public batchJackpotPool;\n    uint256 public totalJackpotPaid;\n    address public lastPaidBuyer;\n    uint256 public lastPaidTimestamp;\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    mapping(address => uint256) public freeClaimed;\n    mapping(address => uint256) public paidMintedBy;\n    mapping(address => uint256) public holderYieldWeight;\n    mapping(address => int256) private _magnifiedYieldCorrections;\n    mapping(address => uint256) public withdrawnYield;\n\n    // Immutable per-token attributes locked at mint time\n    mapping(uint256 => uint8) public dieTier;      // 1..5\n    mapping(uint256 => uint16) public dieWeight;   // 0, 1, 2, 4, 10\n    mapping(uint256 => bool) public isAgentSilicon;\n    mapping(uint256 => uint32) public dieSeed;\n\n    mapping(address => uint256) public claimablePayout;\n    uint256 public totalEscrowedPayouts;\n\n    uint256 private _locked = 1;\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 WaferForged(address indexed buyer, uint256 indexed tokenId, uint8 tier, uint16 weight, uint256 paidWei);\n    event BatchJackpotWon(address indexed winner, uint256 indexed paidIndex, uint256 prizeAmount, uint256 rollover);\n    event YieldClaimed(address indexed holder, uint256 amount);\n    event TailJackpotSwept(address indexed sweeper, uint256 sweeperShare, uint256 treasuryShare);\n    event PayoutEscrowed(address indexed beneficiary, uint256 amount);\n    event PayoutWithdrawn(address indexed beneficiary, address indexed recipient, uint256 amount);\n\n    modifier nonReentrant() {\n        require(_locked == 1, \"SDFG: reentrant\");\n        _locked = 2;\n        _;\n        _locked = 1;\n    }\n\n    constructor(address _treasury) {\n        require(_treasury != address(0), \"SDFG: zero treasury\");\n        TREASURY = _treasury;\n        PAYEE = _treasury;\n        OWNER = _treasury;\n    }\n\n    function owner() external view returns (address) {\n        return OWNER;\n    }\n\n    function mintPrice() external pure returns (uint256) {\n        return PRICE;\n    }\n\n    function price() external pure returns (uint256) {\n        return PRICE;\n    }\n\n    function totalMinted() external view returns (uint256) {\n        return totalSupply;\n    }\n\n    function mintOpen() external view returns (bool) {\n        return totalSupply < MAX_SUPPLY;\n    }\n\n    function freeRemaining() external view returns (uint256) {\n        return freeMinted >= FREE_SUPPLY ? 0 : FREE_SUPPLY - freeMinted;\n    }\n\n    function diesUntilNextJackpot() external view returns (uint256) {\n        uint256 rem = paidMinted % BATCH_MILESTONE;\n        return rem == 0 ? BATCH_MILESTONE : BATCH_MILESTONE - rem;\n    }\n\n    function hasAgentId(address account) public view returns (bool) {\n        return _checkAgentId(account);\n    }\n\n    function canReceiveFree(address account) public view returns (bool) {\n        return freeMinted < FREE_SUPPLY && freeClaimed[account] == 0 && _checkAgentId(account);\n    }\n\n    /// @notice Standard quote helper for AI agents and task cards.\n    function quote(address wallet, uint256 qty) public view returns (uint256) {\n        if (qty == 0 || qty > MAX_PER_TX) return 0;\n        if (canReceiveFree(wallet)) {\n            if (qty == 1) return 0;\n            return (qty - 1) * PRICE;\n        }\n        return qty * PRICE;\n    }\n\n    // =========================================================================\n    // Mint Entrypoints (Full Bot + Whale Multi-Mint Matrix)\n    // =========================================================================\n\n    function mint() external payable nonReentrant {\n        _executeForge(msg.sender, 1, false);\n    }\n\n    function freeMint() external payable nonReentrant {\n        _executeForge(msg.sender, 1, false);\n    }\n\n    function claim() external payable nonReentrant {\n        _executeForge(msg.sender, 1, false);\n    }\n\n    function freeClaim() external payable nonReentrant {\n        _executeForge(msg.sender, 1, false);\n    }\n\n    function mint(uint256 count) external payable nonReentrant {\n        _executeForge(msg.sender, count, false);\n    }\n\n    function freeMint(uint256 count) external payable nonReentrant {\n        _executeForge(msg.sender, count, false);\n    }\n\n    function claim(uint256 count) external payable nonReentrant {\n        _executeForge(msg.sender, count, false);\n    }\n\n    function mintTo(address to, uint256 count) external payable nonReentrant {\n        require(to != address(0), \"SDFG: zero recipient\");\n        _executeForge(to, count, false);\n    }\n\n    /// @notice Dedicated 100% paid lithography forge (guarantees Tier 5 when count >= 4).\n    function forgePaid(uint256 count) external payable nonReentrant {\n        _executeForge(msg.sender, count, true);\n    }\n\n    function buyGold(uint256 count) external payable nonReentrant {\n        _executeForge(msg.sender, count, true);\n    }\n\n    function _executeForge(address recipient, uint256 count, bool forcePaidOnly) internal {\n        require(count > 0 && count <= MAX_PER_TX, \"SDFG: invalid count\");\n        require(totalSupply + count <= MAX_SUPPLY, \"SDFG: max supply exceeded\");\n        require(_balances[recipient] + count <= MAX_PER_WALLET, \"SDFG: wallet cap exceeded\");\n\n        bool agentHolder = _checkAgentId(recipient) || (recipient != msg.sender && _checkAgentId(msg.sender));\n\n        uint256 freeUnits = 0;\n        uint256 paidUnits = count;\n\n        if (!forcePaidOnly && freeMinted < FREE_SUPPLY && freeClaimed[recipient] == 0 && agentHolder) {\n            if (msg.value < count * PRICE) {\n                freeUnits = 1;\n                paidUnits = count - 1;\n            }\n        }\n\n        if (paidUnits == 0 && freeUnits == 0) {\n            require(msg.value >= count * PRICE, \"SDFG: agent ID required for free wafer\");\n        }\n\n        uint256 requiredCost = paidUnits * PRICE;\n        require(msg.value >= requiredCost, \"SDFG: insufficient BNB\");\n        require(paidMinted + paidUnits <= MAX_PAID_SUPPLY, \"SDFG: paid cap reached\");\n\n        if (freeUnits == 1) {\n            freeClaimed[recipient] = 1;\n            freeMinted += 1;\n            _mintDie(recipient, 1, 0, agentHolder, 0);\n        }\n\n        if (paidUnits > 0) {\n            _forgePaidBatch(recipient, paidUnits, agentHolder, requiredCost);\n        } else if (msg.value > 0) {\n            _safeDeliverBnb(msg.sender, msg.value);\n        }\n    }\n\n    function _forgePaidBatch(\n        address recipient,\n        uint256 paidUnits,\n        bool agentHolder,\n        uint256 requiredCost\n    ) internal {\n        paidMintedBy[recipient] += paidUnits;\n        lastPaidBuyer = recipient;\n        lastPaidTimestamp = block.timestamp;\n\n        uint256 treasuryTotal = paidUnits * TREASURY_SHARE_WEI;\n        uint256 jackpotWon = 0;\n        bool spawnedTier5 = false;\n\n        for (uint256 i = 0; i < paidUnits; i++) {\n            paidMinted += 1;\n\n            // Guaranteed Tier 5 on the 4th paid unit of a 4+ paid multi-mint if not already rolled\n            (uint8 tier, uint16 weight) = _rollPaidTier(recipient, paidMinted, i, paidUnits, spawnedTier5);\n            if (tier == 5) {\n                spawnedTier5 = true;\n            }\n\n            // Distribute 30% yield pool across existing weight holders BEFORE adding new weight\n            if (totalYieldWeight > 0) {\n                uint256 poolAdd = YIELD_POOL_WEI + undistributedYieldReserve;\n                undistributedYieldReserve = 0;\n                accYieldPerWeight += (poolAdd * MAGNITUDE) / totalYieldWeight;\n                totalYieldDistributed += poolAdd;\n            } else {\n                undistributedYieldReserve += YIELD_POOL_WEI;\n            }\n\n            // Mint die and credit weight\n            _mintDie(recipient, tier, weight, agentHolder, PRICE);\n\n            // Accrue 15% into batch jackpot and check every-5th milestone\n            batchJackpotPool += JACKPOT_POOL_WEI;\n            if (paidMinted % BATCH_MILESTONE == 0) {\n                uint256 winAmt = (batchJackpotPool * JACKPOT_WIN_BPS) / 10000;\n                batchJackpotPool -= winAmt;\n                jackpotWon += winAmt;\n                totalJackpotPaid += winAmt;\n                emit BatchJackpotWon(recipient, paidMinted, winAmt, batchJackpotPool);\n            }\n        }\n\n        _safeDeliverBnb(TREASURY, treasuryTotal);\n\n        uint256 refund = msg.value - requiredCost;\n        uint256 totalReturn = jackpotWon + refund;\n        if (totalReturn > 0) {\n            address returnTo = jackpotWon > 0 ? recipient : msg.sender;\n            _safeDeliverBnb(returnTo, totalReturn);\n        }\n    }\n\n    function _rollPaidTier(\n        address buyer,\n        uint256 paidIdx,\n        uint256 loopIdx,\n        uint256 paidUnits,\n        bool alreadyTier5\n    ) internal view returns (uint8 tier, uint16 weight) {\n        if (paidUnits >= 4 && loopIdx == paidUnits - 1 && !alreadyTier5) {\n            return (5, 10);\n        }\n        uint256 rand = uint256(keccak256(abi.encodePacked(block.prevrandao, block.timestamp, buyer, paidIdx, loopIdx))) % 100;\n        if (rand < 8) {\n            return (5, 10); // 1nm Angstrom Mythic (10x weight)\n        } else if (rand < 25) {\n            return (4, 4);  // 2nm GAA Epic (4x weight)\n        } else if (rand < 55) {\n            return (3, 2);  // 4nm FinFET Rare (2x weight)\n        } else {\n            return (2, 1);  // 7nm Core Standard (1x weight)\n        }\n    }\n\n    function _mintDie(\n        address to,\n        uint8 tier,\n        uint16 weight,\n        bool agentFlag,\n        uint256 paidWei\n    ) internal {\n        uint256 tokenId = totalSupply + 1;\n        totalSupply = tokenId;\n\n        _owners[tokenId] = to;\n        _balances[to] += 1;\n\n        dieTier[tokenId] = tier;\n        dieWeight[tokenId] = weight;\n        isAgentSilicon[tokenId] = agentFlag;\n        dieSeed[tokenId] = uint32(uint256(keccak256(abi.encodePacked(block.timestamp, to, tokenId, tier))));\n\n        if (weight > 0) {\n            _addYieldWeight(to, weight);\n        }\n\n        emit Transfer(address(0), to, tokenId);\n        emit WaferForged(to, tokenId, tier, weight, paidWei);\n    }\n\n    function _addYieldWeight(address account, uint256 weightDelta) internal {\n        totalYieldWeight += weightDelta;\n        holderYieldWeight[account] += weightDelta;\n        _magnifiedYieldCorrections[account] -= int256(accYieldPerWeight * weightDelta);\n    }\n\n    function _removeYieldWeight(address account, uint256 weightDelta) internal {\n        totalYieldWeight -= weightDelta;\n        holderYieldWeight[account] -= weightDelta;\n        _magnifiedYieldCorrections[account] += int256(accYieldPerWeight * weightDelta);\n    }\n\n    // =========================================================================\n    // Yield Dividend & Tail Reserve Claims\n    // =========================================================================\n\n    function accumulativeYieldOf(address account) public view returns (uint256) {\n        int256 mag = int256(accYieldPerWeight * holderYieldWeight[account]) + _magnifiedYieldCorrections[account];\n        if (mag <= 0) return 0;\n        return uint256(mag) / MAGNITUDE;\n    }\n\n    function claimableYield(address account) public view returns (uint256) {\n        uint256 accum = accumulativeYieldOf(account);\n        uint256 withdrawn = withdrawnYield[account];\n        return accum > withdrawn ? accum - withdrawn : 0;\n    }\n\n    function claimableDividend(address account) external view returns (uint256) {\n        return claimableYield(account);\n    }\n\n    function claimYield() public nonReentrant {\n        uint256 claimable = claimableYield(msg.sender);\n        require(claimable > 0, \"SDFG: zero yield\");\n        withdrawnYield[msg.sender] += claimable;\n        totalYieldClaimed += claimable;\n        _safeDeliverBnb(msg.sender, claimable);\n        emit YieldClaimed(msg.sender, claimable);\n    }\n\n    function claimDividend() external {\n        claimYield();\n    }\n\n    function claimTailJackpot() external nonReentrant {\n        require(lastPaidTimestamp > 0 && block.timestamp >= lastPaidTimestamp + TAIL_TIMEOUT, \"SDFG: tail active\");\n        uint256 pool = batchJackpotPool + undistributedYieldReserve;\n        require(pool > 0, \"SDFG: zero tail pool\");\n        batchJackpotPool = 0;\n        undistributedYieldReserve = 0;\n\n        address sweeper = lastPaidBuyer != address(0) ? lastPaidBuyer : TREASURY;\n        uint256 sweeperHalf = pool / 2;\n        uint256 treasuryHalf = pool - sweeperHalf;\n\n        _safeDeliverBnb(sweeper, sweeperHalf);\n        _safeDeliverBnb(TREASURY, treasuryHalf);\n        emit TailJackpotSwept(sweeper, sweeperHalf, treasuryHalf);\n    }\n\n    // =========================================================================\n    // Bounded-Gas Safe Delivery + Pull Escrow\n    // =========================================================================\n\n    function _safeDeliverBnb(address to, uint256 amount) internal {\n        if (amount == 0) return;\n        bool ok;\n        assembly {\n            ok := call(50000, to, amount, 0, 0, 0, 0)\n        }\n        if (!ok) {\n            claimablePayout[to] += amount;\n            totalEscrowedPayouts += amount;\n            emit PayoutEscrowed(to, amount);\n        }\n    }\n\n    function withdrawPayout() external nonReentrant {\n        uint256 amt = claimablePayout[msg.sender];\n        require(amt > 0, \"SDFG: no payout\");\n        claimablePayout[msg.sender] = 0;\n        totalEscrowedPayouts -= amt;\n        (bool ok, ) = payable(msg.sender).call{value: amt}(\"\");\n        require(ok, \"SDFG: withdraw failed\");\n        emit PayoutWithdrawn(msg.sender, msg.sender, amt);\n    }\n\n    function withdrawPayoutTo(address recipient) external nonReentrant {\n        require(recipient != address(0), \"SDFG: zero recipient\");\n        uint256 amt = claimablePayout[msg.sender];\n        require(amt > 0, \"SDFG: no payout\");\n        claimablePayout[msg.sender] = 0;\n        totalEscrowedPayouts -= amt;\n        (bool ok, ) = payable(recipient).call{value: amt}(\"\");\n        require(ok, \"SDFG: withdraw failed\");\n        emit PayoutWithdrawn(msg.sender, recipient, amt);\n    }\n\n    function flushPayout(address beneficiary) external nonReentrant {\n        uint256 amt = claimablePayout[beneficiary];\n        require(amt > 0, \"SDFG: no payout\");\n        claimablePayout[beneficiary] = 0;\n        totalEscrowedPayouts -= amt;\n        (bool ok, ) = payable(beneficiary).call{value: amt}(\"\");\n        require(ok, \"SDFG: flush failed\");\n        emit PayoutWithdrawn(beneficiary, beneficiary, amt);\n    }\n\n    function _checkAgentId(address account) internal view returns (bool) {\n        if (account == address(0)) return false;\n        (bool ok, bytes memory data) = AGENT_ID_REGISTRY.staticcall(\n            abi.encodeWithSelector(IAgentIdRegistryD1.balanceOf.selector, account)\n        );\n        if (!ok || data.length < 32) return false;\n        return abi.decode(data, (uint256)) > 0;\n    }\n\n    // =========================================================================\n    // ERC-721 Standard + Weight Transfer Sync\n    // =========================================================================\n\n    function supportsInterface(bytes4 interfaceId) public pure override returns (bool) {\n        return\n            interfaceId == 0x01ffc9a7 || // ERC165\n            interfaceId == 0x80ac58cd || // ERC721\n            interfaceId == 0x5b5e139f || // ERC721Metadata\n            interfaceId == 0x2a55205a;   // ERC2981\n    }\n\n    function royaltyInfo(uint256, uint256 salePrice) external view returns (address, uint256) {\n        return (TREASURY, (salePrice * 500) / 10000);\n    }\n\n    function balanceOf(address holder) public view returns (uint256) {\n        require(holder != address(0), \"SDFG: zero address\");\n        return _balances[holder];\n    }\n\n    function ownerOf(uint256 tokenId) public view returns (address) {\n        address holder = _owners[tokenId];\n        require(holder != address(0), \"SDFG: nonexistent token\");\n        return holder;\n    }\n\n    function approve(address to, uint256 tokenId) external {\n        address holder = ownerOf(tokenId);\n        require(msg.sender == holder || _operatorApprovals[holder][msg.sender], \"SDFG: not authorized\");\n        _tokenApprovals[tokenId] = to;\n        emit Approval(holder, to, tokenId);\n    }\n\n    function getApproved(uint256 tokenId) public view returns (address) {\n        ownerOf(tokenId);\n        return _tokenApprovals[tokenId];\n    }\n\n    function setApprovalForAll(address operator, bool approved) external {\n        require(operator != msg.sender, \"SDFG: approve to caller\");\n        _operatorApprovals[msg.sender][operator] = approved;\n        emit ApprovalForAll(msg.sender, operator, approved);\n    }\n\n    function isApprovedForAll(address holder, address operator) public view returns (bool) {\n        return _operatorApprovals[holder][operator];\n    }\n\n    function transferFrom(address from, address to, uint256 tokenId) public {\n        address holder = ownerOf(tokenId);\n        require(holder == from, \"SDFG: wrong from\");\n        require(to != address(0), \"SDFG: zero recipient\");\n        require(\n            msg.sender == holder ||\n                _tokenApprovals[tokenId] == msg.sender ||\n                _operatorApprovals[holder][msg.sender],\n            \"SDFG: not authorized\"\n        );\n\n        delete _tokenApprovals[tokenId];\n        _balances[from] -= 1;\n        _balances[to] += 1;\n        _owners[tokenId] = to;\n\n        uint16 w = dieWeight[tokenId];\n        if (w > 0 && from != to) {\n            _removeYieldWeight(from, w);\n            _addYieldWeight(to, w);\n        }\n\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            try IERC721ReceiverD1(to).onERC721Received(msg.sender, from, tokenId, data) returns (bytes4 retval) {\n                require(retval == IERC721ReceiverD1.onERC721Received.selector, \"SDFG: unsafe receiver\");\n            } catch {\n                revert(\"SDFG: unsafe receiver\");\n            }\n        }\n    }\n\n    // =========================================================================\n    // On-Chain Amber Oscilloscope & Silicon Die Blueprint Metadata\n    // =========================================================================\n\n    function contractURI() external view returns (string memory) {\n        string memory json = string.concat(\n            '{\"name\":\"Silicon Die Forge\",\"description\":\"5-Tier Semiconductor Wafer Lithography Forge on BNB Chain. 1st die FREE for .ai Agent ID holders (450 quota). Minting 4+ paid dies in one tx (e.g. mint(5) for 0.0020 BNB) guarantees a 1nm Angstrom Mythic Die (10x Yield Weight). Paid dies allocate 30% to Holder Yield Pool and 15% to the Every-5th-Die Wafer Batch Jackpot.\",\"seller_fee_basis_points\":500,\"fee_recipient\":\"',\n            _toHexAddr(TREASURY),\n            '\"}'\n        );\n        return string.concat(\"data:application/json;base64,\", _b64(bytes(json)));\n    }\n\n    function tokenURI(uint256 tokenId) external view returns (string memory) {\n        require(_owners[tokenId] != address(0), \"SDFG: nonexistent token\");\n        uint8 tier = dieTier[tokenId];\n        uint16 weight = dieWeight[tokenId];\n        bool agent = isAgentSilicon[tokenId];\n\n        string memory tierLabel = _tierLabel(tier);\n        string memory svg = _buildWaferSvg(tokenId, tier, weight, tierLabel);\n        string memory attrs = _buildWaferAttrs(tier, weight, agent, tierLabel);\n\n        string memory json = string.concat(\n            '{\"name\":\"Silicon Die #',\n            _u2s(tokenId),\n            \" [\",\n            tierLabel,\n            ']\",\"description\":\"On-chain lithography silicon die. Paid dies earn 30% real-time BNB wafer yield proportional to Yield Weight (1x..10x) plus every-5th-die batch jackpot. Mint 5 in one tx (0.0020 BNB) for guaranteed 1nm Mythic 10x Die.\",\"image\":\"data:image/svg+xml;base64,',\n            _b64(bytes(svg)),\n            '\",\"attributes\":',\n            attrs,\n            \"}\"\n        );\n        return string.concat(\"data:application/json;base64,\", _b64(bytes(json)));\n    }\n\n    function _tierLabel(uint8 tier) internal pure returns (string memory) {\n        if (tier == 5) return \"1nm Angstrom Mythic\";\n        if (tier == 4) return \"2nm GAA Epic\";\n        if (tier == 3) return \"4nm FinFET Rare\";\n        if (tier == 2) return \"7nm Core Paid\";\n        return \"14nm Base Wafer\";\n    }\n\n    function _buildWaferSvg(\n        uint256 tokenId,\n        uint8 tier,\n        uint16 weight,\n        string memory tierLabel\n    ) internal view returns (string memory) {\n        string memory accent = tier == 5 ? \"#ff5500\" : (tier >= 3 ? \"#ffae00\" : \"#d9822b\");\n        string memory bg = tier == 5 ? \"#1c0b04\" : \"#120904\";\n\n        string memory p1 = string.concat(\n            '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 400 400\" width=\"400\" height=\"400\">',\n            '<rect width=\"400\" height=\"400\" fill=\"',\n            bg,\n            '\"/>',\n            '<circle cx=\"200\" cy=\"195\" r=\"145\" fill=\"none\" stroke=\"',\n            accent,\n            '\" stroke-width=\"2\" stroke-dasharray=\"6,3\"/>',\n            '<rect x=\"95\" y=\"90\" width=\"210\" height=\"210\" fill=\"#1f1108\" stroke=\"',\n            accent,\n            '\" stroke-width=\"2\"/>'\n        );\n\n        string memory p2 = string.concat(\n            '<line x1=\"95\" y1=\"160\" x2=\"305\" y2=\"160\" stroke=\"#593315\" stroke-width=\"1\"/>',\n            '<line x1=\"95\" y1=\"230\" x2=\"305\" y2=\"230\" stroke=\"#593315\" stroke-width=\"1\"/>',\n            '<line x1=\"165\" y1=\"90\" x2=\"165\" y2=\"300\" stroke=\"#593315\" stroke-width=\"1\"/>',\n            '<line x1=\"235\" y1=\"90\" x2=\"235\" y2=\"300\" stroke=\"#593315\" stroke-width=\"1\"/>',\n            '<text x=\"28\" y=\"38\" fill=\"#ffb703\" font-family=\"monospace\" font-size=\"13\" font-weight=\"bold\">SILICON DIE FORGE // FAB-56</text>'\n        );\n\n        string memory p3 = string.concat(\n            '<text x=\"200\" y=\"140\" text-anchor=\"middle\" fill=\"#ffd166\" font-family=\"monospace\" font-size=\"15\" font-weight=\"bold\">',\n            tierLabel,\n            \"</text>\",\n            '<text x=\"200\" y=\"205\" text-anchor=\"middle\" fill=\"#ffffff\" font-family=\"monospace\" font-size=\"26\" font-weight=\"bold\">DIE #',\n            _u2s(tokenId),\n            \"</text>\",\n            '<text x=\"200\" y=\"255\" text-anchor=\"middle\" fill=\"',\n            accent,\n            '\" font-family=\"monospace\" font-size=\"14\">YIELD WEIGHT: ',\n            _u2s(weight),\n            \"x</text>\"\n        );\n\n        string memory p4 = string.concat(\n            '<text x=\"28\" y=\"372\" fill=\"#a67c52\" font-family=\"monospace\" font-size=\"11\">JACKPOT POOL: ',\n            _weiToMilliBnb(batchJackpotPool),\n            \" mBNB | PAID: \",\n            _u2s(paidMinted),\n            \"</text></svg>\"\n        );\n\n        return string.concat(p1, p2, p3, p4);\n    }\n\n    function _buildWaferAttrs(\n        uint8 tier,\n        uint16 weight,\n        bool agent,\n        string memory tierLabel\n    ) internal pure returns (string memory) {\n        return string.concat(\n            '[{\"trait_type\":\"Lithography Node\",\"value\":\"',\n            tierLabel,\n            '\"},{\"trait_type\":\"Tier\",\"value\":',\n            _u2s(tier),\n            '},{\"trait_type\":\"Yield Weight\",\"value\":',\n            _u2s(weight),\n            '},{\"trait_type\":\"Agent Silicon\",\"value\":\"',\n            agent ? \"Verified .ai Fab\" : \"Standard Fab\",\n            '\"}]'\n        );\n    }\n\n    function _weiToMilliBnb(uint256 w) internal pure returns (string memory) {\n        uint256 m = w / 1e12;\n        return string.concat(_u2s(m / 1000), \".\", _pad3(m % 1000));\n    }\n\n    function _pad3(uint256 v) internal pure returns (string memory) {\n        if (v < 10) return string.concat(\"00\", _u2s(v));\n        if (v < 100) return string.concat(\"0\", _u2s(v));\n        return _u2s(v);\n    }\n\n    function _u2s(uint256 value) internal pure returns (string memory) {\n        if (value == 0) return \"0\";\n        uint256 temp = value;\n        uint256 digits;\n        while (temp != 0) {\n            digits++;\n            temp /= 10;\n        }\n        bytes memory buffer = new bytes(digits);\n        while (value != 0) {\n            digits -= 1;\n            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\n            value /= 10;\n        }\n        return string(buffer);\n    }\n\n    function _toHexAddr(address a) internal pure returns (string memory) {\n        bytes20 b = bytes20(a);\n        bytes16 hexSymbols = \"0123456789abcdef\";\n        bytes memory str = new bytes(42);\n        str[0] = \"0\";\n        str[1] = \"x\";\n        for (uint256 i = 0; i < 20; i++) {\n            str[2 + i * 2] = hexSymbols[uint8(b[i] >> 4)];\n            str[3 + i * 2] = hexSymbols[uint8(b[i] & 0x0f)];\n        }\n        return string(str);\n    }\n\n    function _b64(bytes memory data) internal pure returns (string memory) {\n        if (data.length == 0) return \"\";\n        string memory table = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n        uint256 encodedLen = 4 * ((data.length + 2) / 3);\n        string memory result = new string(encodedLen);\n        assembly {\n            let tablePtr := add(table, 1)\n            let resultPtr := add(result, 32)\n            for {\n                let dataPtr := data\n                let endPtr := add(data, mload(data))\n            } lt(dataPtr, endPtr) {\n\n            } {\n                dataPtr := add(dataPtr, 3)\n                let input := mload(dataPtr)\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))\n                resultPtr := add(resultPtr, 1)\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))\n                resultPtr := add(resultPtr, 1)\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))\n                resultPtr := add(resultPtr, 1)\n                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\n                resultPtr := add(resultPtr, 1)\n            }\n            switch mod(mload(data), 3)\n            case 1 {\n                mstore8(sub(resultPtr, 1), 0x3d)\n                mstore8(sub(resultPtr, 2), 0x3d)\n            }\n            case 2 {\n                mstore8(sub(resultPtr, 1), 0x3d)\n            }\n        }\n        return result;\n    }\n\n    receive() external payable {}\n}\n"}},"abi":[{"type":"constructor","inputs":[{"name":"_treasury","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"ApprovalForAll","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"BatchJackpotWon","type":"event","inputs":[{"name":"winner","type":"address","indexed":true,"internalType":"address"},{"name":"paidIndex","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"prizeAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"rollover","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"PayoutEscrowed","type":"event","inputs":[{"name":"beneficiary","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"PayoutWithdrawn","type":"event","inputs":[{"name":"beneficiary","type":"address","indexed":true,"internalType":"address"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"TailJackpotSwept","type":"event","inputs":[{"name":"sweeper","type":"address","indexed":true,"internalType":"address"},{"name":"sweeperShare","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"treasuryShare","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":"WaferForged","type":"event","inputs":[{"name":"buyer","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"tier","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"weight","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"paidWei","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"YieldClaimed","type":"event","inputs":[{"name":"holder","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"AGENT_ID_REGISTRY","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"BATCH_MILESTONE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"DIE_PRICE","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":"JACKPOT_POOL_WEI","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"JACKPOT_WIN_BPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_FREE_PER_WALLET","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_FREE_SUPPLY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_PAID_SUPPLY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_PER_TX","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":"OWNER","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"PAYEE","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"PRICE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"TAIL_TIMEOUT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"TREASURY","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"TREASURY_SHARE_WEI","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"YIELD_POOL_WEI","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"accYieldPerWeight","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"accumulativeYieldOf","type":"function","inputs":[{"name":"account","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":"balanceOf","type":"function","inputs":[{"name":"holder","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"batchJackpotPool","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"buyGold","type":"function","inputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"canReceiveFree","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"claim","type":"function","inputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"claim","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"claimDividend","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"claimTailJackpot","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"claimYield","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"claimableDividend","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"claimablePayout","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"claimableYield","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"contractURI","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"dieSeed","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"name":"dieTier","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"dieWeight","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"diesUntilNextJackpot","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"flushPayout","type":"function","inputs":[{"name":"beneficiary","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"forgePaid","type":"function","inputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"freeClaim","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"freeClaimed","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeMint","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"freeMint","type":"function","inputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"freeMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeRemaining","type":"function","inputs":[],"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":"hasAgentId","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"holderYieldWeight","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"isAgentSilicon","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"holder","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"lastPaidBuyer","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"lastPaidTimestamp","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"mint","type":"function","inputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"mintOpen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mintPrice","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"mintTo","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"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":"paidMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"paidMintedBy","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"price","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"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":"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":"setApprovalForAll","type":"function","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"supportsInterface","type":"function","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"tokenURI","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalEscrowedPayouts","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalJackpotPaid","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalYieldClaimed","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalYieldDistributed","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalYieldWeight","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":"undistributedYieldReserve","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"withdrawPayout","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"withdrawPayoutTo","type":"function","inputs":[{"name":"recipient","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"withdrawnYield","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"receive","stateMutability":"payable"}],"matchId":"57675835","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-30T12:22:37Z","match":"exact_match","chainId":"56","address":"0x13f81D023581434154e3D159810f0A1DC110ab52"}