{"sources":{"src/FluxERC721Core.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.28;\n\ninterface IFluxReceiver {\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data)\n        external\n        returns (bytes4);\n}\n\n/**\n * @title FluxERC721Core\n * @notice Abstract packed-storage ERC-721 + ERC-2981 base for ObsidianFluxPool (OFLUX).\n * @custom:website https://obsidianflux.surge.sh\n * @custom:agent-guide https://obsidianflux.surge.sh/skill.md\n */\nabstract contract FluxERC721Core {\n    error AddressZero();\n    error TokenDoesNotExist();\n    error UnauthorizedCaller();\n    error InvalidOperator();\n\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n    struct CapsuleRecord {\n        address holder;\n        uint8 chamberClass; // 1=Free Pass, 2=Flux Capsule, 3=Magma Breaker (3x), 4=Drop Winner, 5=Full-Cycle Lock\n        uint32 weightUnits;\n        uint56 dropWonGwei;\n    }\n\n    mapping(uint256 => CapsuleRecord) internal _capsules;\n    mapping(address => uint256) internal _holderCounts;\n    mapping(uint256 => address) internal _capsuleApprovals;\n    mapping(address => mapping(address => bool)) internal _operatorFlags;\n\n    function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) {\n        return interfaceId == 0x01ffc9a7 // ERC165\n            || interfaceId == 0x80ac58cd // ERC721\n            || interfaceId == 0x5b5e139f // ERC721Metadata\n            || interfaceId == 0x2a55205a // ERC2981\n            || interfaceId == 0x49064906; // ERC4906\n    }\n\n    function balanceOf(address account) public view returns (uint256) {\n        if (account == address(0)) revert AddressZero();\n        return _holderCounts[account];\n    }\n\n    function ownerOf(uint256 tokenId) public view returns (address) {\n        address h = _capsules[tokenId].holder;\n        if (h == address(0)) revert TokenDoesNotExist();\n        return h;\n    }\n\n    function approve(address to, uint256 tokenId) external {\n        address h = ownerOf(tokenId);\n        if (msg.sender != h && !_operatorFlags[h][msg.sender]) revert UnauthorizedCaller();\n        _capsuleApprovals[tokenId] = to;\n        emit Approval(h, to, tokenId);\n    }\n\n    function getApproved(uint256 tokenId) external view returns (address) {\n        if (_capsules[tokenId].holder == address(0)) revert TokenDoesNotExist();\n        return _capsuleApprovals[tokenId];\n    }\n\n    function setApprovalForAll(address operator, bool approved) external {\n        if (operator == msg.sender) revert InvalidOperator();\n        _operatorFlags[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 _operatorFlags[account][operator];\n    }\n\n    function transferFrom(address from, address to, uint256 tokenId) public {\n        if (to == address(0)) revert AddressZero();\n        CapsuleRecord storage rec = _capsules[tokenId];\n        if (rec.holder != from) revert UnauthorizedCaller();\n        if (msg.sender != from && _capsuleApprovals[tokenId] != msg.sender && !_operatorFlags[from][msg.sender]) {\n            revert UnauthorizedCaller();\n        }\n        delete _capsuleApprovals[tokenId];\n        unchecked {\n            _holderCounts[from] -= 1;\n            _holderCounts[to] += 1;\n        }\n        rec.holder = to;\n        emit Transfer(from, to, tokenId);\n    }\n\n    function safeTransferFrom(address from, address to, uint256 tokenId) external {\n        safeTransferFrom(from, to, tokenId, \"\");\n    }\n\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public {\n        transferFrom(from, to, tokenId);\n        if (to.code.length > 0) {\n            try IFluxReceiver(to).onERC721Received(msg.sender, from, tokenId, data) returns (bytes4 r) {\n                if (r != IFluxReceiver.onERC721Received.selector) revert InvalidOperator();\n            } catch {\n                revert InvalidOperator();\n            }\n        }\n    }\n\n    function _mintCapsule(address to, uint256 tokenId, uint8 chamberClass, uint32 weightUnits, uint256 dropWonWei)\n        internal\n    {\n        _capsules[tokenId] = CapsuleRecord({\n            holder: to,\n            chamberClass: chamberClass,\n            weightUnits: weightUnits,\n            dropWonGwei: uint56(dropWonWei / 1e9)\n        });\n        unchecked {\n            _holderCounts[to] += 1;\n        }\n        emit Transfer(address(0), to, tokenId);\n    }\n\n    function _uintToStr(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 _fmtBnb5(uint256 weiAmount) internal pure returns (string memory) {\n        uint256 whole = weiAmount / 1e18;\n        uint256 frac = (weiAmount % 1e18) / 1e13;\n        string memory fracStr = _uintToStr(frac);\n        bytes memory b = bytes(fracStr);\n        while (b.length < 5) {\n            b = abi.encodePacked(\"0\", b);\n        }\n        return string(abi.encodePacked(_uintToStr(whole), \".\", string(b)));\n    }\n\n    function _addrToHex(address account) internal pure returns (string memory) {\n        bytes20 data = bytes20(account);\n        bytes16 symbols = \"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] = symbols[uint8(data[i] >> 4)];\n            str[3 + i * 2] = symbols[uint8(data[i] & 0x0f)];\n        }\n        return string(str);\n    }\n}\n"},"src/ObsidianFluxPool.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.28;\n\nimport {FluxERC721Core} from \"./FluxERC721Core.sol\";\n\ninterface IIdentityGate {\n    function balanceOf(address holder) external view returns (uint256);\n}\n\n/**\n * @title ObsidianFluxPool (OFLUX)\n * @author Obsidian Liquidity Labs\n * @notice 5-Slot Heavy-Bounty MEV Liquidity Pod & O(1) Real-Time BNB Dividend Pool on BNB Chain.\n * @custom:website https://obsidianflux.surge.sh\n * @custom:agent-guide https://obsidianflux.surge.sh/skill.md\n *\n * Protocol Guarantees & MEV Arbitrage Specification:\n *   1. 5-Slot Heavy Drop Cycle: Each paid capsule (0.0015 BNB standard, 0.00135 BNB via mintWithRef)\n *      commits 0.00040 BNB (26.7%) directly into `fluxPotReserve` BEFORE evaluating the 5-slot trigger.\n *      Every 5th paid slot (`paidSlots % 5 == 0`) automatically drops 80% of `fluxPotReserve`\n *      (steady-state ~0.00200 BNB vs 0.00135~0.00150 BNB cost = +0.00050~0.00065 BNB instant net arbitrage)\n *      in native BNB in the same transaction.\n *   2. Slot #1 Magma Breaker Rebate: The 1st paid capsule of every post-genesis cycle (`paidSlots > 5 && paidSlots % 5 == 1`)\n *      receives an instant 0.00020 BNB native cashback in the same transaction plus 3x Dividend Weight (450,000 units).\n *   3. 18x Free-to-Paid Dividend Unlock: Free capsules (1 per verified .ai identity) hold 10,000 locked bonus units.\n *      Purchasing 1 paid capsule unlocks and triples the bonus (+30,000 units) on top of 150,000 paid units (180,000 total).\n *   4. Hard-Locked Pool Isolation: Zero admin withdraw functions exist for `fluxPotReserve` or the holder dividend pool.\n */\ncontract ObsidianFluxPool is FluxERC721Core {\n    // ─── Custom Errors ─────────────────────────────────────────────────────────\n    error InvalidBatchSize();\n    error SupplyCapReached();\n    error FreeQuotaDepleted();\n    error WalletCapReached();\n    error FreeCapsuleAlreadyMinted();\n    error VerifiedIdentityRequired();\n    error SmartContractFreeBlocked();\n    error UnderpaidTransaction();\n    error ReentrancyGuardLocked();\n    error ZeroDividendAvailable();\n    error SlotTargetMismatch();\n\n    // ─── Events ────────────────────────────────────────────────────────────────\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n    event FluxCapsuleMinted(\n        address indexed buyer,\n        uint256 indexed firstTokenId,\n        uint256 quantity,\n        uint8 chamberClass,\n        uint256 addedWeight,\n        uint256 totalPaidWei\n    );\n    event FluxDropExecuted(\n        address indexed winner,\n        uint256 indexed triggerTokenId,\n        uint256 indexed cycleIndex,\n        uint256 dropAmountWei,\n        uint256 retainedReserveWei\n    );\n    event MagmaRebateCredited(address indexed buyer, uint256 indexed tokenId, uint256 rebateWei);\n    event FluxResonancePulse(uint256 freeCount, uint256 resonanceLevel, uint256 newPaidSlots);\n    event PartnerCommissionSent(address indexed partner, address indexed buyer, uint256 commissionWei);\n    event FluxDividendClaimed(address indexed holder, uint256 amountWei);\n\n    // ─── Constants ─────────────────────────────────────────────────────────────\n    string public constant name = \"Obsidian Flux Pool\";\n    string public constant symbol = \"OFLUX\";\n\n    address public constant IDENTITY_GATE = 0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F;\n\n    uint256 public constant MAX_SUPPLY = 3333;\n    uint256 public constant FREE_SUPPLY = 260;\n    uint256 public constant MAX_PER_WALLET = 800;\n    uint256 public constant MAX_BATCH = 20;\n\n    uint256 public constant PRICE = 0.0015 ether;\n    uint256 public constant DISCOUNT_PRICE = 0.00135 ether;\n\n    uint256 public constant CYCLE_SLOTS = 5;\n    uint256 public constant FLUX_POT_SLICE = 0.00040 ether; // 5 slots = 0.00200 BNB added per cycle\n    uint256 public constant DIVIDEND_SLICE = 0.00010 ether; // O(1) real-time BNB dividend pool\n    uint256 public constant PARTNER_SLICE = 0.00005 ether; // Referrer commission\n    uint256 public constant MAGMA_BREAKER_REBATE = 0.00020 ether; // Instant cashback on Slot #1 after drop\n\n    uint32 public constant LOCKED_FREE_UNITS = 10_000;\n    uint32 public constant UNLOCKED_FREE_BONUS = 30_000;\n    uint32 public constant PAID_CAPSULE_UNITS = 150_000;\n    uint32 public constant MAGMA_BREAKER_UNITS = 450_000; // 3x weight for Slot #1 Breaker\n    uint32 public constant FULL_CYCLE_BONUS_UNITS = 100_000;\n\n    uint96 public constant ROYALTY_BPS = 500;\n    uint256 private constant MAGNITUDE = 1e18;\n\n    // ─── Immutables & State ────────────────────────────────────────────────────\n    address public immutable PAYEE;\n    address public owner;\n    address public metadataAdmin;\n    string private _websiteUrl = \"https://obsidianflux.surge.sh\";\n    string private _agentGuideUrl = \"https://obsidianflux.surge.sh/skill.md\";\n    uint256 private _guard = 1;\n\n    uint256 public totalSupply;\n    uint256 public freeMinted;\n    uint256 public paidMinted;\n    uint256 public paidSlots;\n    uint256 public resonanceLevel; // 0 -> 1 at 8 free mints, 1 -> 2 at 16 free mints\n\n    // Hard-locked Pool Accounting\n    uint256 public fluxPotReserve;\n    uint256 public cumulativeVolumeWei;\n    uint256 public cumulativeDropsPaidWei;\n    uint256 public cumulativeRebatesPaidWei;\n    uint256 public cumulativePartnerPaidWei;\n    uint256 public cumulativeDividendsAddedWei;\n    uint256 public cumulativeDividendsClaimedWei;\n    uint256 public completedDropCycles;\n\n    address public latestDropWinner;\n    uint256 public latestDropAmountWei;\n\n    // O(1) Dividend Pool State\n    uint256 public totalActiveUnits;\n    uint256 public accDividendPerUnit;\n    uint256 public unallocatedDividendBuffer;\n\n    mapping(address => uint256) public activeHolderUnits;\n    mapping(address => uint256) public dormantFreeBonusUnits;\n    mapping(address => uint256) public holderDividendDebt;\n    mapping(address => uint256) public accruedHolderDividend;\n    mapping(address => uint256) public lifetimeDividendClaimed;\n    mapping(address => uint256) public lifetimeDropsWon;\n\n    mapping(address => uint256) public failedTransferCredit;\n    uint256 public pendingPayeeBalance;\n\n    mapping(address => uint256) public walletMinted;\n    mapping(address => bool) public hasMintedFreeCapsule;\n\n    modifier nonReentrant() {\n        if (_guard != 1) revert ReentrancyGuardLocked();\n        _guard = 2;\n        _;\n        _guard = 1;\n    }\n\n    constructor(address _payee) payable {\n        if (_payee == address(0)) revert AddressZero();\n        PAYEE = _payee;\n        owner = msg.sender;\n        metadataAdmin = msg.sender;\n        emit OwnershipTransferred(address(0), msg.sender);\n\n        if (msg.value > 0) {\n            fluxPotReserve = msg.value;\n        }\n    }\n\n    function WEBSITE() external view returns (string memory) {\n        return _websiteUrl;\n    }\n\n    function AGENT_GUIDE() external view returns (string memory) {\n        return _agentGuideUrl;\n    }\n\n    function updateProjectUrls(string calldata newWebsite, string calldata newAgentGuide) external {\n        if (msg.sender != metadataAdmin) revert UnauthorizedCaller();\n        _websiteUrl = newWebsite;\n        _agentGuideUrl = newAgentGuide;\n    }\n\n    function setMetadataAdmin(address newAdmin) external {\n        if (msg.sender != metadataAdmin) revert UnauthorizedCaller();\n        if (newAdmin == address(0)) revert AddressZero();\n        metadataAdmin = newAdmin;\n    }\n\n    function renounceOwnership() external {\n        if (msg.sender != owner) revert UnauthorizedCaller();\n        emit OwnershipTransferred(owner, address(0));\n        owner = address(0);\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    // ─── Identity & Pricing Views ──────────────────────────────────────────────\n\n    function hasVerifiedIdentity(address account) public view returns (bool) {\n        if (account == address(0)) return false;\n        (bool ok, bytes memory ret) =\n            IDENTITY_GATE.staticcall(abi.encodeWithSelector(IIdentityGate.balanceOf.selector, account));\n        if (ok && ret.length >= 32) {\n            return abi.decode(ret, (uint256)) > 0;\n        }\n        return false;\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 cost() external pure returns (uint256) {\n        return PRICE;\n    }\n\n    function getMintPrice(address, uint256 quantity) external pure returns (uint256) {\n        return PRICE * quantity;\n    }\n\n    function quote(address referrer, uint256 quantity) public view returns (uint256) {\n        if (quantity == 0) return 0;\n        bool validPartner = (referrer != address(0) && referrer != msg.sender);\n        return (validPartner ? DISCOUNT_PRICE : PRICE) * quantity;\n    }\n\n    function remainingFreeSupply() external view returns (uint256) {\n        return FREE_SUPPLY > freeMinted ? FREE_SUPPLY - freeMinted : 0;\n    }\n\n    function slotsUntilDrop() public view returns (uint256) {\n        return CYCLE_SLOTS - (paidSlots % CYCLE_SLOTS);\n    }\n\n    function estimatedNextDropWei() public view returns (uint256) {\n        uint256 rem = slotsUntilDrop();\n        uint256 estPot = fluxPotReserve + (rem * FLUX_POT_SLICE);\n        return (estPot * 80) / 100;\n    }\n\n    function claimableDividends(address account) public view returns (uint256) {\n        uint256 u = activeHolderUnits[account];\n        uint256 newlyAccrued = 0;\n        if (u > 0) {\n            uint256 gross = (u * accDividendPerUnit) / MAGNITUDE;\n            if (gross > holderDividendDebt[account]) {\n                newlyAccrued = gross - holderDividendDebt[account];\n            }\n        }\n        return accruedHolderDividend[account] + newlyAccrued + failedTransferCredit[account];\n    }\n\n    function projectWebsite() external view returns (string memory) {\n        return _websiteUrl;\n    }\n\n    // ─── Free-Capable Entrypoints (Auto-Route to Paid Engine when msg.value > 0) ─\n\n    receive() external payable nonReentrant {\n        if (msg.value == 0) {\n            _mintFreeCapsule(msg.sender);\n        } else {\n            uint256 qty = msg.value / PRICE;\n            if (qty == 0) qty = 1;\n            if (qty > MAX_BATCH) qty = MAX_BATCH;\n            _mintPaidCapsules(msg.sender, qty, address(0));\n        }\n    }\n\n    function freeMint() external payable nonReentrant {\n        if (msg.value == 0) {\n            _mintFreeCapsule(msg.sender);\n        } else {\n            uint256 qty = msg.value / PRICE;\n            if (qty == 0) qty = 1;\n            if (qty > MAX_BATCH) qty = MAX_BATCH;\n            _mintPaidCapsules(msg.sender, qty, address(0));\n        }\n    }\n\n    function freeMint(uint256 quantity) external payable nonReentrant {\n        if (msg.value == 0) {\n            if (quantity != 1) revert InvalidBatchSize();\n            _mintFreeCapsule(msg.sender);\n        } else {\n            _mintPaidCapsules(msg.sender, quantity, address(0));\n        }\n    }\n\n    function claim() external payable nonReentrant {\n        if (msg.value == 0) {\n            _mintFreeCapsule(msg.sender);\n        } else {\n            uint256 qty = msg.value / PRICE;\n            if (qty == 0) qty = 1;\n            if (qty > MAX_BATCH) qty = MAX_BATCH;\n            _mintPaidCapsules(msg.sender, qty, address(0));\n        }\n    }\n\n    function freeClaim() external payable nonReentrant {\n        if (msg.value == 0) {\n            _mintFreeCapsule(msg.sender);\n        } else {\n            uint256 qty = msg.value / PRICE;\n            if (qty == 0) qty = 1;\n            if (qty > MAX_BATCH) qty = MAX_BATCH;\n            _mintPaidCapsules(msg.sender, qty, address(0));\n        }\n    }\n\n    function claimAirdrop() external payable nonReentrant {\n        if (msg.value == 0) {\n            _mintFreeCapsule(msg.sender);\n        } else {\n            uint256 qty = msg.value / PRICE;\n            if (qty == 0) qty = 1;\n            if (qty > MAX_BATCH) qty = MAX_BATCH;\n            _mintPaidCapsules(msg.sender, qty, address(0));\n        }\n    }\n\n    function mint() external payable nonReentrant {\n        if (msg.value == 0) {\n            _mintFreeCapsule(msg.sender);\n        } else {\n            uint256 qty = msg.value / PRICE;\n            if (qty == 0) qty = 1;\n            if (qty > MAX_BATCH) qty = MAX_BATCH;\n            _mintPaidCapsules(msg.sender, qty, address(0));\n        }\n    }\n\n    // ─── Pure Paid Entrypoints (100% Bot, Sniper & MEV Ready) ──────────────────\n\n    function mint(uint256 quantity) external payable nonReentrant {\n        _mintPaidCapsules(msg.sender, quantity, address(0));\n    }\n\n    function mintWithRef(uint256 quantity, address referrer) external payable nonReentrant {\n        _mintPaidCapsules(msg.sender, quantity, referrer);\n    }\n\n    function mintTo(address recipient, uint256 quantity) external payable nonReentrant {\n        _mintPaidCapsules(recipient, quantity, address(0));\n    }\n\n    function mint(address recipient, uint256 quantity) external payable nonReentrant {\n        _mintPaidCapsules(recipient, quantity, address(0));\n    }\n\n    function lockFullCycle() external payable nonReentrant {\n        _mintPaidCapsules(msg.sender, CYCLE_SLOTS, address(0));\n    }\n\n    function snipeExactSlot(uint256 expectedModSlot, uint256 quantity, address referrer)\n        external\n        payable\n        nonReentrant\n    {\n        if (paidSlots % CYCLE_SLOTS != expectedModSlot) revert SlotTargetMismatch();\n        _mintPaidCapsules(msg.sender, quantity, referrer);\n    }\n\n    // ─── Internal Execution Logic ──────────────────────────────────────────────\n\n    function _mintFreeCapsule(address recipient) internal {\n        if (tx.origin != msg.sender) revert SmartContractFreeBlocked();\n        if (!hasVerifiedIdentity(recipient)) revert VerifiedIdentityRequired();\n        if (hasMintedFreeCapsule[recipient]) revert FreeCapsuleAlreadyMinted();\n        if (freeMinted >= FREE_SUPPLY) revert FreeQuotaDepleted();\n        if (totalSupply + 1 > MAX_SUPPLY) revert SupplyCapReached();\n        if (walletMinted[recipient] + 1 > MAX_PER_WALLET) revert WalletCapReached();\n\n        hasMintedFreeCapsule[recipient] = true;\n        freeMinted += 1;\n        walletMinted[recipient] += 1;\n\n        uint256 tokenId = totalSupply + 1;\n        totalSupply = tokenId;\n\n        uint32 assignedUnits = LOCKED_FREE_UNITS;\n        if (activeHolderUnits[recipient] > 0) {\n            assignedUnits = UNLOCKED_FREE_BONUS;\n            _creditActiveUnits(recipient, UNLOCKED_FREE_BONUS);\n        } else {\n            dormantFreeBonusUnits[recipient] += LOCKED_FREE_UNITS;\n        }\n\n        _mintCapsule(recipient, tokenId, 1, assignedUnits, 0);\n\n        // Dual Flux Resonance Pre-Cocking:\n        // Level 1 at 8 free mints (+1 slot -> 3/5), Level 2 at 16 free mints (+1 slot -> 4/5, 1 step from 0.0020 BNB drop!)\n        if (\n            resonanceLevel == 0 && freeMinted >= 8\n                && fluxPotReserve >= 500000000000000 + ((paidSlots % CYCLE_SLOTS) + 1) * FLUX_POT_SLICE\n        ) {\n            resonanceLevel = 1;\n            paidSlots += 1;\n            emit FluxResonancePulse(freeMinted, 1, paidSlots);\n        } else if (\n            resonanceLevel == 1 && freeMinted >= 16\n                && fluxPotReserve >= 500000000000000 + ((paidSlots % CYCLE_SLOTS) + 1) * FLUX_POT_SLICE\n        ) {\n            resonanceLevel = 2;\n            paidSlots += 1;\n            emit FluxResonancePulse(freeMinted, 2, paidSlots);\n        }\n\n        emit FluxCapsuleMinted(recipient, tokenId, 1, 1, 0, 0);\n    }\n\n    function _mintPaidCapsules(address recipient, uint256 quantity, address referrer) internal {\n        if (recipient == address(0)) revert AddressZero();\n        if (quantity == 0 || quantity > MAX_BATCH) revert InvalidBatchSize();\n        if (totalSupply + quantity > MAX_SUPPLY) revert SupplyCapReached();\n        if (walletMinted[recipient] + quantity > MAX_PER_WALLET) revert WalletCapReached();\n\n        bool validPartner = (referrer != address(0) && referrer != msg.sender && referrer != recipient);\n        uint256 requiredCost = (validPartner ? DISCOUNT_PRICE : PRICE) * quantity;\n        if (msg.value < requiredCost) revert UnderpaidTransaction();\n\n        cumulativeVolumeWei += requiredCost;\n        walletMinted[recipient] += quantity;\n        paidMinted += quantity;\n\n        uint256 firstTokenId = totalSupply + 1;\n        uint256 addedUnits = hasVerifiedIdentity(recipient) ? (5_000 * quantity) : 0;\n        if (dormantFreeBonusUnits[recipient] > 0) {\n            addedUnits += dormantFreeBonusUnits[recipient] * 3;\n            dormantFreeBonusUnits[recipient] = 0;\n        }\n\n        (uint256 dropWon, uint256 rebateWon, uint256 loopUnits, uint8 topClass) =\n            _executeCapsuleLoop(recipient, firstTokenId, quantity);\n        addedUnits += loopUnits + (quantity >= CYCLE_SLOTS ? FULL_CYCLE_BONUS_UNITS : 0);\n\n        _creditActiveUnits(recipient, addedUnits);\n        _distributeDividends(DIVIDEND_SLICE * quantity);\n\n        _settleProtocolShares(\n            recipient,\n            referrer,\n            requiredCost - ((FLUX_POT_SLICE + DIVIDEND_SLICE) * quantity)\n                - (validPartner ? PARTNER_SLICE * quantity : 0) - rebateWon,\n            validPartner ? (PARTNER_SLICE * quantity) : 0\n        );\n        _settleBuyerDrops(recipient, msg.value - requiredCost, dropWon, rebateWon);\n\n        emit FluxCapsuleMinted(recipient, firstTokenId, quantity, topClass, addedUnits, requiredCost);\n    }\n\n    function _settleProtocolShares(address recipient, address referrer, uint256 payeeShare, uint256 totalPartnerWei)\n        internal\n    {\n        if (totalPartnerWei > 0) {\n            cumulativePartnerPaidWei += totalPartnerWei;\n            if (!_pushBnb(referrer, totalPartnerWei)) {\n                failedTransferCredit[referrer] += totalPartnerWei;\n            }\n            emit PartnerCommissionSent(referrer, recipient, totalPartnerWei);\n        }\n\n        if (payeeShare > 0) {\n            uint256 duePayee = payeeShare + pendingPayeeBalance;\n            pendingPayeeBalance = 0;\n            if (!_pushBnb(PAYEE, duePayee)) {\n                pendingPayeeBalance = duePayee;\n            }\n        }\n    }\n\n    function _settleBuyerDrops(address recipient, uint256 refundWei, uint256 totalDropWon, uint256 totalRebateWon)\n        internal\n    {\n        if (totalDropWon > 0) {\n            lifetimeDropsWon[recipient] += totalDropWon;\n        }\n\n        uint256 instantReward = totalDropWon + totalRebateWon;\n        if (recipient == msg.sender) {\n            uint256 totalBack = instantReward + refundWei;\n            if (totalBack > 0) {\n                if (!_pushBnb(msg.sender, totalBack)) {\n                    failedTransferCredit[msg.sender] += totalBack;\n                }\n            }\n        } else {\n            if (instantReward > 0) {\n                if (!_pushBnb(recipient, instantReward)) {\n                    failedTransferCredit[recipient] += instantReward;\n                }\n            }\n            if (refundWei > 0) {\n                if (!_pushBnb(msg.sender, refundWei)) {\n                    failedTransferCredit[msg.sender] += refundWei;\n                }\n            }\n        }\n    }\n\n    function _executeCapsuleLoop(address recipient, uint256 firstTokenId, uint256 quantity)\n        internal\n        returns (uint256 totalDropWon, uint256 totalRebateWon, uint256 loopUnits, uint8 topClass)\n    {\n        topClass = quantity >= CYCLE_SLOTS ? 5 : 2;\n        for (uint256 i = 0; i < quantity; i++) {\n            uint256 tokenId = firstTokenId + i;\n            totalSupply = tokenId;\n\n            fluxPotReserve += FLUX_POT_SLICE;\n            paidSlots += 1;\n\n            uint256 modSlot = paidSlots % CYCLE_SLOTS;\n            uint32 uUnits = PAID_CAPSULE_UNITS;\n            uint8 cClass = quantity >= CYCLE_SLOTS ? 5 : 2;\n            uint256 wonThisToken = 0;\n\n            if (paidSlots > CYCLE_SLOTS && modSlot == 1) {\n                totalRebateWon += MAGMA_BREAKER_REBATE;\n                cumulativeRebatesPaidWei += MAGMA_BREAKER_REBATE;\n                uUnits = MAGMA_BREAKER_UNITS;\n                if (cClass < 3) cClass = 3;\n                if (topClass < 3) topClass = 3;\n                emit MagmaRebateCredited(recipient, tokenId, MAGMA_BREAKER_REBATE);\n            }\n\n            if (modSlot == 0) {\n                uint256 dropReward = (fluxPotReserve * 80) / 100;\n                fluxPotReserve -= dropReward;\n                totalDropWon += dropReward;\n                cumulativeDropsPaidWei += dropReward;\n                completedDropCycles += 1;\n                latestDropWinner = recipient;\n                latestDropAmountWei = dropReward;\n                wonThisToken = dropReward;\n                cClass = quantity >= CYCLE_SLOTS ? 5 : 4;\n                if (topClass < 4) topClass = cClass;\n                emit FluxDropExecuted(recipient, tokenId, completedDropCycles, dropReward, fluxPotReserve);\n            }\n\n            loopUnits += uUnits;\n            _mintCapsule(recipient, tokenId, cClass, uUnits, wonThisToken);\n        }\n    }\n\n    // ─── O(1) Dividend Accounting ──────────────────────────────────────────────\n\n    function _syncHolderDividend(address account) internal {\n        uint256 u = activeHolderUnits[account];\n        if (u > 0) {\n            uint256 gross = (u * accDividendPerUnit) / MAGNITUDE;\n            if (gross > holderDividendDebt[account]) {\n                accruedHolderDividend[account] += (gross - holderDividendDebt[account]);\n            }\n        }\n    }\n\n    function _creditActiveUnits(address account, uint256 newUnits) internal {\n        if (newUnits == 0) return;\n        _syncHolderDividend(account);\n        activeHolderUnits[account] += newUnits;\n        totalActiveUnits += newUnits;\n        holderDividendDebt[account] = (activeHolderUnits[account] * accDividendPerUnit) / MAGNITUDE;\n    }\n\n    function _distributeDividends(uint256 amountWei) internal {\n        if (amountWei == 0) return;\n        cumulativeDividendsAddedWei += amountWei;\n        uint256 pool = amountWei + unallocatedDividendBuffer;\n        if (totalActiveUnits > 0) {\n            unallocatedDividendBuffer = 0;\n            accDividendPerUnit += (pool * MAGNITUDE) / totalActiveUnits;\n        } else {\n            unallocatedDividendBuffer = pool;\n        }\n    }\n\n    function claimFluxDividend() public nonReentrant {\n        _withdrawDividendFor(msg.sender);\n    }\n\n    function claimDividends() external nonReentrant {\n        _withdrawDividendFor(msg.sender);\n    }\n\n    function _withdrawDividendFor(address account) internal {\n        _syncHolderDividend(account);\n        holderDividendDebt[account] = (activeHolderUnits[account] * accDividendPerUnit) / MAGNITUDE;\n\n        uint256 payout = accruedHolderDividend[account] + failedTransferCredit[account];\n        if (payout == 0) revert ZeroDividendAvailable();\n\n        accruedHolderDividend[account] = 0;\n        failedTransferCredit[account] = 0;\n        cumulativeDividendsClaimedWei += payout;\n        lifetimeDividendClaimed[account] += payout;\n\n        if (!_pushBnb(account, payout)) {\n            failedTransferCredit[account] = payout;\n            cumulativeDividendsClaimedWei -= payout;\n            lifetimeDividendClaimed[account] -= payout;\n        } else {\n            emit FluxDividendClaimed(account, payout);\n        }\n    }\n\n    function releasePayeePending() external nonReentrant {\n        uint256 amt = pendingPayeeBalance;\n        if (amt == 0) return;\n        pendingPayeeBalance = 0;\n        if (!_pushBnb(PAYEE, amt)) {\n            pendingPayeeBalance = amt;\n        }\n    }\n\n    function _pushBnb(address to, uint256 amount) internal returns (bool success) {\n        if (amount == 0 || to == address(0)) return true;\n        assembly {\n            success := call(50000, to, amount, 0, 0, 0, 0)\n        }\n    }\n\n    // ─── On-Chain SVG & Metadata (Obsidian & Magma Hex Pod) ────────────────────\n\n    function tokenURI(uint256 tokenId) external view returns (string memory) {\n        CapsuleRecord memory rec = _capsules[tokenId];\n        if (rec.holder == address(0)) revert TokenDoesNotExist();\n        string memory classTitle = _classLabel(rec.chamberClass);\n        return string(\n            abi.encodePacked(\n                \"data:application/json;utf8,{\\\"name\\\":\\\"Obsidian Flux Capsule #\",\n                _uintToStr(tokenId),\n                \" [\",\n                classTitle,\n                \"]\\\",\\\"description\\\":\\\"Obsidian Flux Pool (OFLUX) - 5-Slot Heavy-Bounty MEV Liquidity Pod & O(1) Real-Time BNB Dividend Pool on BNB Chain. Official DApp: \",\n                _websiteUrl,\n                \" | Paid Capsule: 0.0015 BNB (0.00135 BNB via mintWithRef). Every 5th paid slot drops 80% of the Flux Pot (~0.00200 BNB) atomically in the same transaction. Slot #1 after a drop receives 0.00020 BNB instant Magma Rebate + 3x Dividend Units (450,000 units).\\\",\\\"external_url\\\":\\\"\",\n                _websiteUrl,\n                \"\\\",\\\"image\\\":\\\"data:image/svg+xml;utf8,\",\n                _buildCapsuleSvg(tokenId, rec, classTitle, _classAccent(rec.chamberClass)),\n                \"\\\",\\\"attributes\\\":\",\n                _buildCapsuleAttrs(rec, classTitle),\n                \"}\"\n            )\n        );\n    }\n\n    function _buildCapsuleSvg(\n        uint256 tokenId,\n        CapsuleRecord memory rec,\n        string memory classTitle,\n        string memory magmaColor\n    ) internal view returns (string memory svg) {\n        uint256 modSlot = paidSlots % CYCLE_SLOTS;\n        uint256 remSlots = CYCLE_SLOTS - modSlot;\n        uint256 wonWei = uint256(rec.dropWonGwei) * 1e9;\n\n        svg = string(\n            abi.encodePacked(\n                \"<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 600 600' width='600' height='600'><defs><radialGradient id='obg' cx='50%' cy='45%' r='65%'><stop offset='0%' stop-color='#1f0c1d'/><stop offset='60%' stop-color='#0b0612'/><stop offset='100%' stop-color='#040208'/></radialGradient></defs><rect width='600' height='600' fill='url(#obg)'/><polygon points='300,24 558,162 558,438 300,576 42,438 42,162' fill='none' stroke='\",\n                magmaColor,\n                \"' stroke-width='2' stroke-opacity='0.7'/><text x='48' y='64' fill='#fef2f2' font-family='monospace' font-size='21' font-weight='bold'>OBSIDIAN FLUX POOL // #\",\n                _uintToStr(tokenId),\n                \"</text><text x='48' y='88' fill='\",\n                magmaColor,\n                \"' font-family='monospace' font-size='13' font-weight='bold'>[\",\n                classTitle,\n                \"] 5-SLOT HEAVY BOUNTY POD</text>\"\n            )\n        );\n        svg = string(\n            abi.encodePacked(\n                svg,\n                _renderFiveChambers(modSlot, magmaColor),\n                \"<text x='48' y='232' fill='#fca5a5' font-family='monospace' font-size='13'>CHAMBER CHARGE: \",\n                _uintToStr(modSlot),\n                \" / 5 SLOTS (DROP IN \",\n                _uintToStr(remSlots),\n                \") | NEXT DROP: \",\n                _fmtBnb5(estimatedNextDropWei()),\n                \" BNB</text>\"\n            )\n        );\n        svg = string(\n            abi.encodePacked(\n                svg,\n                \"<text x='48' y='288' fill='#fb923c' font-family='monospace' font-size='15' font-weight='bold'>LOCKED FLUX POT: \",\n                _fmtBnb5(fluxPotReserve),\n                \" BNB (80% AUTO-DROP)</text><text x='48' y='322' fill='#f8fafc' font-family='monospace' font-size='14'>CAPSULE DIVIDEND WEIGHT: \",\n                _uintToStr(rec.weightUnits),\n                \" UNITS</text><text x='48' y='354' fill='#fde047' font-family='monospace' font-size='14'>HOLDER PENDING DIVIDEND: \",\n                _fmtBnb5(claimableDividends(rec.holder)),\n                \" BNB</text><text x='48' y='386' fill='#4ade80' font-family='monospace' font-size='14'>CAPSULE DROP WON: \",\n                _fmtBnb5(wonWei),\n                \" BNB</text>\"\n            )\n        );\n        svg = string(\n            abi.encodePacked(\n                svg,\n                \"<rect x='46' y='448' width='508' height='74' rx='10' fill='#140816' stroke='\",\n                magmaColor,\n                \"' stroke-width='1.2'/><text x='62' y='476' fill='#fff7ed' font-family='monospace' font-size='13' font-weight='bold'>MEV &amp; SNIPER: claim() / mint(1) = 0.0015 BNB | mintWithRef = 0.00135 BNB</text><text x='62' y='502' fill='#fb923c' font-family='monospace' font-size='12'>Every 5th Slot Drops 80% (~0.00200 BNB) | Slot #1 Rebate = 0.00020 BNB</text><text x='48' y='560' fill='#9ca3af' font-family='monospace' font-size='12'>https://obsidianflux.surge.sh | Vol: \",\n                _fmtBnb5(cumulativeVolumeWei),\n                \" BNB | Dropped: \",\n                _fmtBnb5(cumulativeDropsPaidWei),\n                \" BNB</text></svg>\"\n            )\n        );\n    }\n\n    function _buildCapsuleAttrs(CapsuleRecord memory rec, string memory classTitle)\n        internal\n        view\n        returns (string memory)\n    {\n        uint256 modSlot = paidSlots % CYCLE_SLOTS;\n        uint256 wonWei = uint256(rec.dropWonGwei) * 1e9;\n        string memory a1 = string(\n            abi.encodePacked(\n                '[{\"trait_type\":\"Chamber Class\",\"value\":\"',\n                classTitle,\n                '\"},{\"trait_type\":\"Dividend Units\",\"display_type\":\"number\",\"value\":',\n                _uintToStr(rec.weightUnits),\n                '},{\"trait_type\":\"Flux Slot\",\"value\":\"',\n                _uintToStr(modSlot),\n                '/5\"},'\n            )\n        );\n        return string(\n            abi.encodePacked(\n                a1,\n                '{\"trait_type\":\"Slots Until Drop\",\"display_type\":\"number\",\"value\":',\n                _uintToStr(CYCLE_SLOTS - modSlot),\n                '},{\"trait_type\":\"Flux Pot BNB\",\"value\":\"',\n                _fmtBnb5(fluxPotReserve),\n                '\"},{\"trait_type\":\"Drop Won BNB\",\"value\":\"',\n                _fmtBnb5(wonWei),\n                '\"}]'\n            )\n        );\n    }\n\n    function contractURI() external view returns (string memory) {\n        string memory badge = string(\n            abi.encodePacked(\n                \"<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 400 400'>\",\n                \"<rect width='400' height='400' rx='24' fill='#09040e' stroke='#ff5722' stroke-width='3'/>\",\n                \"<text x='32' y='88' fill='#fff7ed' font-family='monospace' font-size='24' font-weight='bold'>OBSIDIAN FLUX</text>\",\n                \"<text x='32' y='124' fill='#fb923c' font-family='monospace' font-size='15'>5-SLOT HEAVY BOUNTY POD</text>\",\n                \"<text x='32' y='190' fill='#fde047' font-family='monospace' font-size='16'>POT: \",\n                _fmtBnb5(fluxPotReserve),\n                \" BNB</text>\",\n                \"<text x='32' y='230' fill='#f8fafc' font-family='monospace' font-size='15'>PAID SLOTS: \",\n                _uintToStr(paidSlots),\n                \" (5-STEP)</text>\",\n                \"<text x='32' y='270' fill='#4ade80' font-family='monospace' font-size='14'>VOL: \",\n                _fmtBnb5(cumulativeVolumeWei),\n                \" BNB</text>\",\n                \"<text x='32' y='345' fill='#9ca3af' font-family='monospace' font-size='12'>https://obsidianflux.surge.sh</text></svg>\"\n            )\n        );\n\n        return string(\n            abi.encodePacked(\n                \"data:application/json;utf8,{\\\"name\\\":\\\"Obsidian Flux Pool\\\",\\\"symbol\\\":\\\"OFLUX\\\",\\\"description\\\":\\\"5-Slot Heavy-Bounty MEV Liquidity Pod & O(1) Real-Time BNB Dividend Pool on BNB Chain. Official DApp: \",\n                _websiteUrl,\n                \" | Every 5th paid capsule (0.0015 BNB, or 0.00135 BNB via mintWithRef) drops 80% of the Flux Pot (~0.00200 BNB) in the same transaction.\\\",\\\"image\\\":\\\"data:image/svg+xml;utf8,\",\n                badge,\n                \"\\\",\\\"external_link\\\":\\\"\",\n                _websiteUrl,\n                \"\\\",\\\"external_url\\\":\\\"\",\n                _websiteUrl,\n                \"\\\",\\\"seller_fee_basis_points\\\":500,\\\"fee_recipient\\\":\\\"\",\n                _addrToHex(PAYEE),\n                \"\\\"}\"\n            )\n        );\n    }\n\n    function royaltyInfo(uint256, uint256 salePrice) external view returns (address, uint256) {\n        return (PAYEE, (salePrice * ROYALTY_BPS) / 10000);\n    }\n\n    function _renderFiveChambers(uint256 modSlot, string memory accent) internal pure returns (string memory out) {\n        out = \"\";\n        for (uint256 i = 0; i < 5; i++) {\n            uint256 x = 48 + (i * 103);\n            bool charged = i < modSlot;\n            string memory fill = charged ? accent : \"#1c0e24\";\n            string memory p1 = string(\n                abi.encodePacked(\n                    \"<rect x='\",\n                    _uintToStr(x),\n                    \"' y='126' width='92' height='68' rx='8' fill='\",\n                    fill,\n                    \"' fill-opacity='\",\n                    charged ? \"0.90\" : \"0.75\",\n                    \"' stroke='\",\n                    accent,\n                    \"' stroke-width='1.5'/>\"\n                )\n            );\n            string memory p2 = string(\n                abi.encodePacked(\n                    \"<text x='\",\n                    _uintToStr(x + 14),\n                    \"' y='166' fill='\",\n                    charged ? \"#09040e\" : \"#9ca3af\",\n                    \"' font-family='monospace' font-size='14' font-weight='bold'>SLOT 0\",\n                    _uintToStr(i + 1),\n                    \"</text>\"\n                )\n            );\n            out = string(abi.encodePacked(out, p1, p2));\n        }\n    }\n\n    function _classLabel(uint8 c) internal pure returns (string memory) {\n        if (c == 5) return \"FULL-CYCLE LOCK 5X\";\n        if (c == 4) return \"FLUX DROP WINNER\";\n        if (c == 3) return \"MAGMA BREAKER 3X\";\n        if (c == 2) return \"FLUX CAPSULE\";\n        return \"AI IDENTITY PASS\";\n    }\n\n    function _classAccent(uint8 c) internal pure returns (string memory) {\n        if (c == 5) return \"#ec4899\";\n        if (c == 4) return \"#facc15\";\n        if (c == 3) return \"#38bdf8\";\n        if (c == 2) return \"#ff5722\";\n        return \"#a855f7\";\n    }\n}\n"}},"abi":[{"type":"constructor","inputs":[{"name":"_payee","type":"address","internalType":"address"}],"stateMutability":"payable"},{"name":"AddressZero","type":"error","inputs":[]},{"name":"FreeCapsuleAlreadyMinted","type":"error","inputs":[]},{"name":"FreeQuotaDepleted","type":"error","inputs":[]},{"name":"InvalidBatchSize","type":"error","inputs":[]},{"name":"InvalidOperator","type":"error","inputs":[]},{"name":"ReentrancyGuardLocked","type":"error","inputs":[]},{"name":"SlotTargetMismatch","type":"error","inputs":[]},{"name":"SmartContractFreeBlocked","type":"error","inputs":[]},{"name":"SupplyCapReached","type":"error","inputs":[]},{"name":"TokenDoesNotExist","type":"error","inputs":[]},{"name":"UnauthorizedCaller","type":"error","inputs":[]},{"name":"UnderpaidTransaction","type":"error","inputs":[]},{"name":"VerifiedIdentityRequired","type":"error","inputs":[]},{"name":"WalletCapReached","type":"error","inputs":[]},{"name":"ZeroDividendAvailable","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":"FluxCapsuleMinted","type":"event","inputs":[{"name":"buyer","type":"address","indexed":true,"internalType":"address"},{"name":"firstTokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"quantity","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"chamberClass","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"addedWeight","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"totalPaidWei","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FluxDividendClaimed","type":"event","inputs":[{"name":"holder","type":"address","indexed":true,"internalType":"address"},{"name":"amountWei","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FluxDropExecuted","type":"event","inputs":[{"name":"winner","type":"address","indexed":true,"internalType":"address"},{"name":"triggerTokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"cycleIndex","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"dropAmountWei","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"retainedReserveWei","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FluxResonancePulse","type":"event","inputs":[{"name":"freeCount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"resonanceLevel","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newPaidSlots","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"MagmaRebateCredited","type":"event","inputs":[{"name":"buyer","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"rebateWei","type":"uint256","indexed":false,"internalType":"uint256"}],"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":"PartnerCommissionSent","type":"event","inputs":[{"name":"partner","type":"address","indexed":true,"internalType":"address"},{"name":"buyer","type":"address","indexed":true,"internalType":"address"},{"name":"commissionWei","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_GUIDE","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"CYCLE_SLOTS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"DISCOUNT_PRICE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"DIVIDEND_SLICE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"FLUX_POT_SLICE","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":"FULL_CYCLE_BONUS_UNITS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"name":"IDENTITY_GATE","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"LOCKED_FREE_UNITS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"name":"MAGMA_BREAKER_REBATE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAGMA_BREAKER_UNITS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"name":"MAX_BATCH","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":"PAID_CAPSULE_UNITS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"name":"PARTNER_SLICE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"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":"ROYALTY_BPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"name":"UNLOCKED_FREE_BONUS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"name":"WEBSITE","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"accDividendPerUnit","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"accruedHolderDividend","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"activeHolderUnits","type":"function","inputs":[{"name":"","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":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"claim","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"claimAirdrop","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"claimDividends","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"claimFluxDividend","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"claimableDividends","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"completedDropCycles","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"contractURI","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"cost","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"cumulativeDividendsAddedWei","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"cumulativeDividendsClaimedWei","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"cumulativeDropsPaidWei","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"cumulativePartnerPaidWei","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"cumulativeRebatesPaidWei","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"cumulativeVolumeWei","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"dormantFreeBonusUnits","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"estimatedNextDropWei","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"failedTransferCredit","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"fluxPotReserve","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeClaim","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"freeMint","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"freeMint","type":"function","inputs":[{"name":"quantity","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"freeMinted","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":"getMintPrice","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"quantity","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"hasMintedFreeCapsule","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"hasVerifiedIdentity","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"holderDividendDebt","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"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":"latestDropAmountWei","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"latestDropWinner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"lifetimeDividendClaimed","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"lifetimeDropsWon","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"lockFullCycle","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"metadataAdmin","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"mint","type":"function","inputs":[{"name":"recipient","type":"address","internalType":"address"},{"name":"quantity","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"mint","type":"function","inputs":[{"name":"quantity","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":"recipient","type":"address","internalType":"address"},{"name":"quantity","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"mintWithRef","type":"function","inputs":[{"name":"quantity","type":"uint256","internalType":"uint256"},{"name":"referrer","type":"address","internalType":"address"}],"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":"paidSlots","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pendingPayeeBalance","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"price","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"projectWebsite","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"quote","type":"function","inputs":[{"name":"referrer","type":"address","internalType":"address"},{"name":"quantity","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"releasePayeePending","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"remainingFreeSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"renounceOwnership","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"resonanceLevel","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"royaltyInfo","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"salePrice","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"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":"setMetadataAdmin","type":"function","inputs":[{"name":"newAdmin","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"slotsUntilDrop","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"snipeExactSlot","type":"function","inputs":[{"name":"expectedModSlot","type":"uint256","internalType":"uint256"},{"name":"quantity","type":"uint256","internalType":"uint256"},{"name":"referrer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"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":"totalActiveUnits","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":"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":"unallocatedDividendBuffer","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"updateProjectUrls","type":"function","inputs":[{"name":"newWebsite","type":"string","internalType":"string"},{"name":"newAgentGuide","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"walletMinted","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"receive","stateMutability":"payable"}],"matchId":"57704106","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-30T17:18:33Z","match":"exact_match","chainId":"56","address":"0xA1B390404856D381aF34F5d39739e5fE37035C99"}