{"sources":{"AgentGoldMiner.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.24;\n\ninterface IAgentId {\n    function balanceOf(address owner) external view returns (uint256);\n}\n\ninterface IERC20 {\n    function balanceOf(address account) external view returns (uint256);\n    function transfer(address to, uint256 value) external returns (bool);\n}\n\ninterface IERC165 {\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n\ninterface IERC721 is IERC165 {\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    function balanceOf(address owner) external view returns (uint256 balance);\n    function ownerOf(uint256 tokenId) external view returns (address owner);\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\n    function transferFrom(address from, address to, uint256 tokenId) external;\n    function approve(address to, uint256 tokenId) external;\n    function setApprovalForAll(address operator, bool approved) external;\n    function getApproved(uint256 tokenId) external view returns (address operator);\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n\ninterface IERC721Metadata is IERC721 {\n    function name() external view returns (string memory);\n    function symbol() external view returns (string memory);\n    function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n\ninterface IERC721Receiver {\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\n}\n\ninterface IPancakeFactory {\n    function getPair(address tokenA, address tokenB) external view returns (address pair);\n}\n\ninterface IPancakePair {\n    function token0() external view returns (address);\n    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);\n}\n\ninterface IPancakeRouter02 {\n    function swapExactETHForTokensSupportingFeeOnTransferTokens(\n        uint256 amountOutMin,\n        address[] calldata path,\n        address to,\n        uint256 deadline\n    ) external payable;\n}\n\ninterface IChainlinkAggregator {\n    function latestRoundData()\n        external\n        view\n        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);\n}\n\n/// @title Agent Gold Miner Token ($AGM)\n/// @notice Official mining & ecosystem token for Agent Gold Miner (.ai).\n///         Fixed 1,000,000,000 (1B) max supply:\n///         - 20% (200,000,000 $AGM) Ecosystem & LP Reserve at genesis: 15,000 $AGM to LP seed + 199,985,000 $AGM burned to 0x...dEaD.\n///         - 80% (800,000,000 $AGM) Mining Pool supply, minted exclusively by the AgentGoldMiner contract as cards mine.\n///         - Built-in approval-free burn sink (`burnFromMiner`) so players can upgrade cards, renew cards, and open USDT blind boxes in 1 click without ERC-20 approve.\ncontract AgentGoldMinerToken {\n    string public constant name = \"Agent Gold Miner Token\";\n    string public constant symbol = \"AGM\";\n    uint8 public constant decimals = 18;\n\n    uint256 public constant MAX_SUPPLY = 1_000_000_000 ether;\n    uint256 public constant LP_RESERVE_SUPPLY = 200_000_000 ether;\n    uint256 public constant INITIAL_LP_SEED = 15_000 ether;\n    uint256 public constant GENESIS_BURN_SUPPLY = 199_985_000 ether;\n    uint256 public constant MAX_MINING_SUPPLY = 800_000_000 ether;\n    address public constant DEAD_ADDRESS = 0x000000000000000000000000000000000000dEaD;\n\n    address public immutable CREATOR;\n    address public immutable MINING_POOL;\n\n    uint256 public totalSupply;\n    uint256 public totalMinedSupply;\n\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n\n    event Transfer(address indexed from, address indexed to, uint256 value);\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    error OnlyMiningPool();\n    error InsufficientBalance();\n    error InsufficientAllowance();\n    error ZeroAddress();\n\n    constructor(address creator_, address miningPool_) {\n        if (creator_ == address(0) || miningPool_ == address(0)) revert ZeroAddress();\n        CREATOR = creator_;\n        MINING_POOL = miningPool_;\n        totalSupply = LP_RESERVE_SUPPLY;\n        balanceOf[creator_] = INITIAL_LP_SEED;\n        balanceOf[DEAD_ADDRESS] = GENESIS_BURN_SUPPLY;\n        emit Transfer(address(0), creator_, INITIAL_LP_SEED);\n        emit Transfer(address(0), DEAD_ADDRESS, GENESIS_BURN_SUPPLY);\n    }\n\n    function transfer(address to, uint256 value) external returns (bool) {\n        _transfer(msg.sender, to, value);\n        return true;\n    }\n\n    function approve(address spender, uint256 value) external returns (bool) {\n        allowance[msg.sender][spender] = value;\n        emit Approval(msg.sender, spender, value);\n        return true;\n    }\n\n    function transferFrom(address from, address to, uint256 value) external returns (bool) {\n        uint256 allowed = allowance[from][msg.sender];\n        if (allowed != type(uint256).max) {\n            if (allowed < value) revert InsufficientAllowance();\n            unchecked {\n                allowance[from][msg.sender] = allowed - value;\n            }\n        }\n        _transfer(from, to, value);\n        return true;\n    }\n\n    function mintReward(address to, uint256 amount) external returns (uint256 minted) {\n        if (msg.sender != MINING_POOL) revert OnlyMiningPool();\n        uint256 remaining = MAX_MINING_SUPPLY - totalMinedSupply;\n        if (remaining == 0 || amount == 0) return 0;\n        minted = amount > remaining ? remaining : amount;\n        totalMinedSupply += minted;\n        totalSupply += minted;\n        balanceOf[to] += minted;\n        emit Transfer(address(0), to, minted);\n    }\n\n    function burnFromMiner(address from, uint256 amount) external {\n        if (msg.sender != MINING_POOL) revert OnlyMiningPool();\n        uint256 bal = balanceOf[from];\n        if (bal < amount) revert InsufficientBalance();\n        unchecked {\n            balanceOf[from] = bal - amount;\n            balanceOf[DEAD_ADDRESS] += amount;\n        }\n        emit Transfer(from, DEAD_ADDRESS, amount);\n    }\n\n    function _transfer(address from, address to, uint256 value) internal {\n        if (to == address(0)) revert ZeroAddress();\n        uint256 bal = balanceOf[from];\n        if (bal < value) revert InsufficientBalance();\n        unchecked {\n            balanceOf[from] = bal - value;\n            balanceOf[to] += value;\n        }\n        emit Transfer(from, to, value);\n    }\n}\n\n/// @title Agent Gold Miner (AGM-CARD)\n/// @notice BNB Chain .ai Agent ID exclusive blind-box mining card game, approval-free mining pool,\n///         $AGM burn-to-upgrade & burn-to-renew sinks, and 2-tier $AGM -> USDT Lucky Blind Box vault.\ncontract AgentGoldMiner is IERC721Metadata {\n    string public constant override name = \"Agent Gold Miner\";\n    string public constant override symbol = \"AGM-CARD\";\n\n    uint256 public constant MAX_SUPPLY = 50_000;\n    uint256 public constant FREE_QUOTA = 1_000;\n    uint256 public constant MAX_PER_TX = 20;\n\n    uint256 public mintPrice = 0.0027 ether;\n    uint256 public constant CLAIM_FEE = 0;\n\n    uint40 public constant FREE_DURATION = 5 days;\n    uint40 public constant PAID_DURATION = 15 days;\n\n    uint256 public constant RATE_PER_WEIGHT_PER_MIN = 0.1 ether;\n\n    uint256 public constant USDT_BOX_COST_AGM = 1_000 ether;\n    uint256 public constant VIP_USDT_BOX_COST_AGM = 10_000 ether;\n\n    IAgentId public constant AGENT_ID = IAgentId(0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F);\n    address public constant WBNB = 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c;\n    address public constant USDT = 0x55d398326f99059fF775485246999027B3197955;\n    address public constant PANCAKE_FACTORY = 0xcA143Ce32Fe78f1f7019d7d551a6402fC5350c73;\n    address public constant PANCAKE_ROUTER = 0x10ED43C718714eb63d5aA57B78B54704E256024E;\n    address public constant BNB_USD_FEED = 0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE;\n    address public constant DEAD_ADDRESS = 0x000000000000000000000000000000000000dEaD;\n\n    address payable public immutable CREATOR;\n    AgentGoldMinerToken public immutable agmToken;\n\n    uint256 public renewalDiscountBps = 1000;\n    uint256 public minRenewalPrice = 0.0014 ether;\n    uint256 public baseRenewalPrice = 0.0027 ether;\n    uint16 public poolShareBps = 2000;\n    uint256 public stdFloorUsdt = 0.05 ether;\n    uint256 public vipFloorUsdt = 3 ether;\n    uint256 public vipFloorCapBps = 20;\n\n    uint256 public totalSupply;\n    uint256 public freeMinted;\n    uint256 public totalStakedCards;\n    uint256 public totalCreatorRevenueBNB;\n    uint256 public totalBuybackReserveBNB;\n    uint256 public totalAgmBoughtBack;\n    uint256 public totalAgmBurnedBySink;\n    uint256 public totalClaimFeeBNB;\n\n    uint256 public totalUsdtBoxesOpened;\n    uint256 public totalUsdtWon;\n    mapping(address => uint256) public userUsdtWon;\n\n    uint256[5] public tierMintedCount;\n\n    struct CardInfo {\n        uint8 tier;\n        bool isPaid;\n        bool isStaked;\n        uint40 mintedAt;\n        uint40 expiresAt;\n        uint40 lastSettledAt;\n    }\n\n    mapping(uint256 => CardInfo) public cards;\n    mapping(address => bool) public claimedFree;\n    mapping(address => uint256) public mintedBy;\n    mapping(address => uint256) public unclaimedRewards;\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[]) private _ownedTokens;\n    mapping(uint256 => uint256) private _ownedTokensIndex;\n\n    event CardMinted(address indexed minter, uint256 indexed tokenId, uint8 tier, bool isPaid, uint40 expiresAt, bool autoStaked);\n    event CardDeployedToPool(address indexed owner, uint256 indexed tokenId, uint8 tier);\n    event CardWithdrawnFromPool(address indexed owner, uint256 indexed tokenId);\n    event CardRenewed(address indexed payer, uint256 indexed tokenId, uint40 newExpiresAt, uint256 pricePaid);\n    event CardRenewedWithAgm(address indexed user, uint256 indexed tokenId, uint40 newExpiresAt, uint256 agmBurned);\n    event CardUpgraded(address indexed user, uint256 indexed tokenId, uint8 newTier, uint256 agmBurned);\n    event UsdtBlindBoxOpened(address indexed user, uint8 boxMode, uint8 prizeTier, uint256 agmBurned, uint256 usdtWon);\n    event UsdtPoolFunded(address indexed funder, uint256 bnbSpent, uint256 usdtAdded);\n    event RewardsClaimed(address indexed user, uint256 amount, uint256 feePaid);\n    event RevenueSplit(address indexed payer, uint256 creatorShare, uint256 buybackShare);\n    event BuybackExecuted(uint256 bnbSpent, uint256 agmBurned);\n    event PricingParamsUpdated(address lpPair, uint256 renewalDiscountBps, uint256 minRenewalPrice, uint256 baseRenewalPrice, bool autoBuyback);\n\n    error NotAgentIdHolder();\n    error InvalidQuantity();\n    error MaxSupplyReached();\n    error WrongPayment();\n    error NonexistentToken();\n    error NotCardOwner();\n    error CardStakedInPool();\n    error CardAlreadyStaked();\n    error CardNotStaked();\n    error CardExpired();\n    error MaxTierReached();\n    error PrizePoolLow();\n    error NothingToClaim();\n    error TransferFailed();\n    error ZeroAddress();\n    error NotAuthorized();\n    error OnlyCreator();\n\n    constructor(address payable creator_) {\n        if (creator_ == address(0)) revert ZeroAddress();\n        CREATOR = creator_;\n        agmToken = new AgentGoldMinerToken(creator_, address(this));\n    }\n\n    function usdtPrizePool() public view returns (uint256) {\n        return IERC20(USDT).balanceOf(address(this));\n    }\n\n    function isAgent(address account) public view returns (bool) {\n        return AGENT_ID.balanceOf(account) > 0;\n    }\n\n    function canClaimFree(address minter) public view returns (bool) {\n        return freeMinted < FREE_QUOTA && !claimedFree[minter];\n    }\n\n    function MINT_PRICE() external view returns (uint256) {\n        return mintPrice;\n    }\n\n    function quote(address minter, uint256 quantity) public view returns (uint256) {\n        if (quantity == 0) return 0;\n        uint256 free = canClaimFree(minter) ? 1 : 0;\n        return (quantity - free) * mintPrice;\n    }\n\n    function resolveLpPair() public view returns (address pair) {\n        pair = IPancakeFactory(PANCAKE_FACTORY).getPair(address(agmToken), WBNB);\n    }\n\n    function getPoolReserves() public view returns (uint256 reserveAGM, uint256 reserveBNB) {\n        address pair = resolveLpPair();\n        if (pair == address(0)) return (0, 0);\n        (uint112 r0, uint112 r1, ) = IPancakePair(pair).getReserves();\n        return address(agmToken) < WBNB ? (uint256(r0), uint256(r1)) : (uint256(r1), uint256(r0));\n    }\n\n    function getRenewalPrice(uint256 tokenId) public view returns (uint256) {\n        uint8 tier = cards[tokenId].tier;\n        return getRenewalPriceByTier(tier == 0 ? 1 : tier);\n    }\n\n    function getRenewalPriceByTier(uint8 tier) public view returns (uint256) {\n        if (tier == 0 || tier > 4) tier = 1;\n        (uint256 reserveAGM, uint256 reserveBNB) = getPoolReserves();\n        if (reserveAGM > 0 && reserveBNB > 0) {\n            uint256 discounted = ((uint256(tier) * 2160 ether * reserveBNB) / reserveAGM * renewalDiscountBps) / 10000;\n            return discounted > minRenewalPrice ? discounted : minRenewalPrice;\n        }\n        return baseRenewalPrice;\n    }\n\n    function mint() external payable {\n        _mintCards(msg.sender, 1, true);\n    }\n\n    function mint(uint256 quantity) external payable {\n        _mintCards(msg.sender, quantity, true);\n    }\n\n    function _mintCards(address minter, uint256 quantity, bool autoDeploy) internal {\n        if (quantity == 0 || quantity > MAX_PER_TX) revert InvalidQuantity();\n        if (totalSupply + quantity > MAX_SUPPLY) revert MaxSupplyReached();\n        if (AGENT_ID.balanceOf(minter) == 0) revert NotAgentIdHolder();\n\n        bool useFree = canClaimFree(minter);\n        uint256 paidCount = useFree ? (quantity - 1) : quantity;\n        if (msg.value != paidCount * mintPrice) revert WrongPayment();\n\n        if (useFree) {\n            claimedFree[minter] = true;\n            unchecked { ++freeMinted; }\n        }\n\n        mintedBy[minter] += quantity;\n        uint256 baseId = totalSupply;\n        totalSupply = baseId + quantity;\n\n        for (uint256 i = 1; i <= quantity; ++i) {\n            _mintSingleCard(minter, baseId + i, !(useFree && i == 1), autoDeploy);\n        }\n\n        if (autoDeploy) totalStakedCards += quantity;\n        if (msg.value > 0) _distributeRevenue(msg.value);\n    }\n\n    function _mintSingleCard(address minter, uint256 tokenId, bool isPaidCard, bool autoDeploy) private {\n        uint40 nowTs = uint40(block.timestamp);\n        uint40 exp = nowTs + (isPaidCard ? PAID_DURATION : FREE_DURATION);\n        uint8 tier = _drawTier(minter, tokenId);\n        tierMintedCount[tier] += 1;\n        cards[tokenId] = CardInfo(tier, isPaidCard, autoDeploy, nowTs, exp, nowTs);\n        _mintToken(minter, tokenId);\n        emit CardMinted(minter, tokenId, tier, isPaidCard, exp, autoDeploy);\n        if (autoDeploy) emit CardDeployedToPool(minter, tokenId, tier);\n    }\n\n    function renewCard(uint256 tokenId) external payable {\n        if (_owners[tokenId] == address(0)) revert NonexistentToken();\n        uint256 price = getRenewalPrice(tokenId);\n        if (msg.value < price) revert WrongPayment();\n\n        _settleCard(tokenId);\n        _extendCardValidity(tokenId);\n        _distributeRevenue(price);\n\n        uint256 excess = msg.value - price;\n        if (excess > 0) {\n            (bool okRefund, ) = msg.sender.call{value: excess}(\"\");\n            if (!okRefund) revert TransferFailed();\n        }\n        emit CardRenewed(msg.sender, tokenId, cards[tokenId].expiresAt, price);\n    }\n\n    function _extendCardValidity(uint256 tokenId) internal {\n        CardInfo storage c = cards[tokenId];\n        uint40 nowTs = uint40(block.timestamp);\n        uint40 baseTs = c.expiresAt > nowTs ? c.expiresAt : nowTs;\n        c.isPaid = true;\n        c.expiresAt = baseTs + PAID_DURATION;\n        if (c.lastSettledAt < nowTs) c.lastSettledAt = nowTs;\n        if (!c.isStaked) {\n            c.isStaked = true;\n            totalStakedCards += 1;\n        }\n    }\n\n    // ---------------- Deflationary $AGM Sinks: Upgrade Card, Renew Card & 2-Mode USDT Blind Box ----------------\n\n    function getUpgradeCost(uint8 currentTier) public pure returns (uint256) {\n        if (currentTier == 1) return 1_500 ether;\n        if (currentTier == 2) return 3_000 ether;\n        if (currentTier == 3) return 5_000 ether;\n        revert MaxTierReached();\n    }\n\n    function getAgmRenewalCost(uint8 tier) public pure returns (uint256) {\n        if (tier == 0 || tier > 4) tier = 1;\n        return uint256(tier) * 1_200 ether;\n    }\n\n    function upgradeCard(uint256 tokenId) external {\n        if (_owners[tokenId] != msg.sender) revert NotCardOwner();\n        CardInfo storage c = cards[tokenId];\n        if (c.tier == 0 || c.tier >= 4) revert MaxTierReached();\n\n        _settleCard(tokenId);\n        uint256 cost = getUpgradeCost(c.tier);\n        _spendOrBurnAgm(msg.sender, cost);\n\n        unchecked {\n            if (tierMintedCount[c.tier] > 0) tierMintedCount[c.tier] -= 1;\n            c.tier += 1;\n            tierMintedCount[c.tier] += 1;\n        }\n        if (block.timestamp < c.expiresAt) c.lastSettledAt = uint40(block.timestamp);\n        emit CardUpgraded(msg.sender, tokenId, c.tier, cost);\n    }\n\n    function renewCardWithAgm(uint256 tokenId) external {\n        if (_owners[tokenId] != msg.sender) revert NotCardOwner();\n        _settleCard(tokenId);\n        uint256 cost = getAgmRenewalCost(cards[tokenId].tier);\n        _spendOrBurnAgm(msg.sender, cost);\n        _extendCardValidity(tokenId);\n        emit CardRenewedWithAgm(msg.sender, tokenId, cards[tokenId].expiresAt, cost);\n    }\n\n    /// @notice Open 1 Standard USDT Blind Box (1,000 $AGM burn, top prize 10 USDT @ 0.1%).\n    function openUsdtBlindBox() external {\n        _openUsdtBlindBoxes(msg.sender, 0, 1);\n    }\n\n    /// @notice Open `count` Standard USDT Blind Boxes (1,000 $AGM burn each).\n    function openUsdtBlindBox(uint256 count) external {\n        _openUsdtBlindBoxes(msg.sender, 0, count);\n    }\n\n    /// @notice Open 1 VIP High-Roller USDT Blind Box (10,000 $AGM burn, top prize 1,000 USDT @ 0.1%).\n    function openVipUsdtBlindBox() external {\n        _openUsdtBlindBoxes(msg.sender, 1, 1);\n    }\n\n    /// @notice Open `count` USDT Blind Boxes in `boxMode` (0 = 1,000 $AGM Standard Box, 1 = 10,000 $AGM VIP Box).\n    function openUsdtBlindBox(uint8 boxMode, uint256 count) external {\n        _openUsdtBlindBoxes(msg.sender, boxMode, count);\n    }\n\n    function _openUsdtBlindBoxes(address user, uint8 boxMode, uint256 count) internal {\n        if (count == 0 || count > 10 || boxMode > 1) revert InvalidQuantity();\n        uint256 poolBal = IERC20(USDT).balanceOf(address(this));\n        if (poolBal < 0.05 ether) revert PrizePoolLow();\n\n        uint256 unitCost = boxMode == 1 ? VIP_USDT_BOX_COST_AGM : USDT_BOX_COST_AGM;\n        _spendOrBurnAgm(user, count * unitCost);\n\n        uint256 totalUsdtPayout = 0;\n        uint256 totalAgmRebate = 0;\n\n        for (uint256 i = 0; i < count; ++i) {\n            if (poolBal == 0) break;\n            unchecked { ++totalUsdtBoxesOpened; }\n            uint256 roll = uint256(\n                keccak256(abi.encodePacked(block.prevrandao, block.timestamp, blockhash(block.number - 1), user, totalUsdtBoxesOpened, i))\n            ) % 1000;\n\n            uint8 prizeTier;\n            uint256 nominalPrize;\n            uint256 capBps;\n\n            if (boxMode == 0) {\n                // Mode 0: 1,000 $AGM Standard Box (0.5% -> 10 USDT, 1.5% -> 2 USDT, 18% -> 0.5 USDT, 80% -> stdFloorUsdt + 200 AGM)\n                if (roll < 5) {\n                    prizeTier = 4; nominalPrize = 10 ether; capBps = 30;\n                } else if (roll < 20) {\n                    prizeTier = 3; nominalPrize = 2 ether; capBps = 15;\n                } else if (roll < 200) {\n                    prizeTier = 2; nominalPrize = 0.5 ether; capBps = 8;\n                } else {\n                    prizeTier = 1; nominalPrize = stdFloorUsdt; capBps = 5;\n                    totalAgmRebate += 200 ether;\n                }\n            } else {\n                // Mode 1: 10,000 $AGM VIP Box (0.1% -> 1,000 USDT, 5% -> 50 USDT, 15% -> 10 USDT, 50% -> 5 USDT, 29.9% -> 3 USDT floor + 2,000 AGM)\n                if (roll == 0) {\n                    prizeTier = 5; nominalPrize = 1000 ether; capBps = 50;\n                } else if (roll < 51) {\n                    prizeTier = 4; nominalPrize = 50 ether; capBps = 30;\n                } else if (roll < 201) {\n                    prizeTier = 3; nominalPrize = 10 ether; capBps = 25;\n                } else if (roll < 701) {\n                    prizeTier = 2; nominalPrize = 5 ether; capBps = 25;\n                } else {\n                    prizeTier = 1; nominalPrize = vipFloorUsdt; capBps = vipFloorCapBps;\n                    totalAgmRebate += 2000 ether;\n                }\n            }\n\n            uint256 capPrize = (poolBal * capBps) / 100;\n            uint256 won = nominalPrize < capPrize ? nominalPrize : capPrize;\n            if (won > 0) {\n                poolBal -= won;\n                totalUsdtPayout += won;\n            }\n            emit UsdtBlindBoxOpened(user, boxMode, prizeTier, unitCost, won);\n        }\n\n        if (totalAgmRebate > 0) {\n            agmToken.mintReward(user, totalAgmRebate);\n        }\n        if (totalUsdtPayout > 0) {\n            totalUsdtWon += totalUsdtPayout;\n            userUsdtWon[user] += totalUsdtPayout;\n            if (!IERC20(USDT).transfer(user, totalUsdtPayout)) revert TransferFailed();\n        }\n    }\n\n    function _settleUserCards(address user) internal {\n        uint256[] storage userTokens = _ownedTokens[user];\n        uint256 len = userTokens.length;\n        for (uint256 i = 0; i < len; ++i) {\n            _settleCard(userTokens[i]);\n        }\n    }\n\n    function _spendOrBurnAgm(address user, uint256 costWei) internal {\n        _settleUserCards(user);\n        uint256 unclaimed = unclaimedRewards[user];\n        if (unclaimed >= costWei) {\n            unchecked { unclaimedRewards[user] = unclaimed - costWei; }\n            agmToken.mintReward(DEAD_ADDRESS, costWei);\n        } else {\n            uint256 deficit = costWei - unclaimed;\n            if (unclaimed > 0) {\n                unclaimedRewards[user] = 0;\n                agmToken.mintReward(DEAD_ADDRESS, unclaimed);\n            }\n            agmToken.burnFromMiner(user, deficit);\n        }\n        totalAgmBurnedBySink += costWei;\n        totalAgmBoughtBack += costWei;\n    }\n\n    function _drawTier(address minter, uint256 tokenId) private view returns (uint8) {\n        uint256 roll = uint256(\n            keccak256(abi.encodePacked(block.prevrandao, block.timestamp, blockhash(block.number - 1), minter, tokenId, totalSupply))\n        ) % 100;\n        if (roll < 5) return 4;\n        if (roll < 15) return 3;\n        if (roll < 35) return 2;\n        return 1;\n    }\n\n    function _distributeRevenue(uint256 amount) private {\n        uint256 poolShare = (amount * poolShareBps) / 10000;\n        uint256 creatorShare = amount - poolShare;\n        totalCreatorRevenueBNB += creatorShare;\n        totalBuybackReserveBNB += poolShare;\n        emit RevenueSplit(msg.sender, creatorShare, poolShare);\n\n        if (poolShare > 0) {\n            (uint256 rAGM, uint256 rBNB) = getPoolReserves();\n            if (rAGM > 0 && rBNB > 0) {\n                uint256 half = poolShare / 2;\n                uint256 other = poolShare - half;\n                if (!_swapBnb(half, address(agmToken), DEAD_ADDRESS, true)) creatorShare += half;\n                if (!_swapBnb(other, USDT, address(this), false)) creatorShare += other;\n            } else {\n                if (!_swapBnb(poolShare, USDT, address(this), false)) creatorShare += poolShare;\n            }\n        }\n        (bool ok, ) = CREATOR.call{value: creatorShare}(\"\");\n        if (!ok) revert TransferFailed();\n    }\n\n    function fundUsdtPoolWithBnb() external payable {\n        if (msg.value == 0 || !_swapBnb(msg.value, USDT, address(this), false)) revert TransferFailed();\n    }\n\n    function setPricingParams(uint256 newMintPrice, uint256 newBaseRenewalPrice, uint256 newMinRenewalPrice, uint16 newPoolShareBps) external {\n        if (msg.sender != CREATOR) revert OnlyCreator();\n        if (newPoolShareBps > 5000) revert InvalidQuantity();\n        mintPrice = newMintPrice;\n        baseRenewalPrice = newBaseRenewalPrice;\n        minRenewalPrice = newMinRenewalPrice;\n        poolShareBps = newPoolShareBps;\n    }\n\n    function setBoxFloors(uint256 newStdFloorUsdt, uint256 newVipFloorUsdt, uint256 newVipFloorCapBps) external {\n        if (msg.sender != CREATOR) revert OnlyCreator();\n        stdFloorUsdt = newStdFloorUsdt;\n        vipFloorUsdt = newVipFloorUsdt;\n        vipFloorCapBps = newVipFloorCapBps;\n    }\n\n    function reclaimAllUsdt() external {\n        if (msg.sender != CREATOR) revert OnlyCreator();\n        uint256 bal = IERC20(USDT).balanceOf(address(this));\n        if (bal > 0) {\n            if (!IERC20(USDT).transfer(CREATOR, bal)) revert TransferFailed();\n        }\n    }\n\n    function reclaimPoolReserve(address token, uint256 amount) external {\n        if (msg.sender != CREATOR) revert OnlyCreator();\n        if (token == address(0)) {\n            uint256 bal = address(this).balance;\n            uint256 toSend = (amount == 0 || amount > bal) ? bal : amount;\n            (bool ok, ) = CREATOR.call{value: toSend}(\"\");\n            if (!ok) revert TransferFailed();\n        } else {\n            uint256 bal = IERC20(token).balanceOf(address(this));\n            uint256 toSend = (amount == 0 || amount > bal) ? bal : amount;\n            if (!IERC20(token).transfer(CREATOR, toSend)) revert TransferFailed();\n        }\n    }\n\n    function _swapBnb(uint256 bnbAmt, address tokenOut, address to, bool isAgm) private returns (bool) {\n        address[] memory path = new address[](2);\n        path[0] = WBNB;\n        path[1] = tokenOut;\n        uint256 b0 = isAgm ? agmToken.balanceOf(to) : IERC20(USDT).balanceOf(to);\n        try IPancakeRouter02(PANCAKE_ROUTER).swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmt}(\n            0, path, to, block.timestamp\n        ) {\n            uint256 diff = (isAgm ? agmToken.balanceOf(to) : IERC20(USDT).balanceOf(to)) - b0;\n            if (isAgm) {\n                totalAgmBoughtBack += diff;\n                emit BuybackExecuted(bnbAmt, diff);\n            } else {\n                emit UsdtPoolFunded(msg.sender, bnbAmt, diff);\n            }\n            return true;\n        } catch {\n            return false;\n        }\n    }\n\n    // ---------------- Approval-Free Mining Pool ----------------\n\n    function deployToPool(uint256 tokenId) external {\n        if (_owners[tokenId] != msg.sender) revert NotCardOwner();\n        CardInfo storage c = cards[tokenId];\n        if (c.isStaked) revert CardAlreadyStaked();\n        if (block.timestamp >= c.expiresAt) revert CardExpired();\n        c.isStaked = true;\n        c.lastSettledAt = uint40(block.timestamp);\n        totalStakedCards += 1;\n        emit CardDeployedToPool(msg.sender, tokenId, c.tier);\n    }\n\n    function deployAllToPool() external {\n        uint256[] storage userTokens = _ownedTokens[msg.sender];\n        uint256 len = userTokens.length;\n        uint40 nowTs = uint40(block.timestamp);\n        uint256 newlyStaked = 0;\n        for (uint256 i = 0; i < len; ++i) {\n            uint256 tokenId = userTokens[i];\n            CardInfo storage c = cards[tokenId];\n            if (!c.isStaked && nowTs < c.expiresAt) {\n                c.isStaked = true;\n                c.lastSettledAt = nowTs;\n                ++newlyStaked;\n                emit CardDeployedToPool(msg.sender, tokenId, c.tier);\n            }\n        }\n        if (newlyStaked > 0) totalStakedCards += newlyStaked;\n    }\n\n    function withdrawFromPool(uint256 tokenId) external {\n        if (_owners[tokenId] != msg.sender) revert NotCardOwner();\n        CardInfo storage c = cards[tokenId];\n        if (!c.isStaked) revert CardNotStaked();\n        _settleCard(tokenId);\n        c.isStaked = false;\n        totalStakedCards -= 1;\n        emit CardWithdrawnFromPool(msg.sender, tokenId);\n    }\n\n    function pendingCardRewards(uint256 tokenId) public view returns (uint256) {\n        CardInfo memory c = cards[tokenId];\n        if (!c.isStaked) return 0;\n        uint256 endTs = block.timestamp < c.expiresAt ? block.timestamp : c.expiresAt;\n        if (endTs <= c.lastSettledAt) return 0;\n        return ((endTs - c.lastSettledAt) * uint256(c.tier) * RATE_PER_WEIGHT_PER_MIN) / 60;\n    }\n\n    function pendingRewards(address user) public view returns (uint256 total) {\n        total = unclaimedRewards[user];\n        uint256[] storage userTokens = _ownedTokens[user];\n        uint256 len = userTokens.length;\n        for (uint256 i = 0; i < len; ++i) {\n            total += pendingCardRewards(userTokens[i]);\n        }\n    }\n\n    function totalSpendableAgm(address user) external view returns (uint256) {\n        return pendingRewards(user) + agmToken.balanceOf(user);\n    }\n\n    function userMiningRatePerMin(address user) public view returns (uint256 ratePerMinWei) {\n        uint256[] storage userTokens = _ownedTokens[user];\n        uint256 len = userTokens.length;\n        uint256 nowTs = block.timestamp;\n        for (uint256 i = 0; i < len; ++i) {\n            CardInfo memory c = cards[userTokens[i]];\n            if (c.isStaked && nowTs < c.expiresAt) {\n                ratePerMinWei += uint256(c.tier) * RATE_PER_WEIGHT_PER_MIN;\n            }\n        }\n    }\n\n    function claimRewards() external payable {\n        _claimUserRewards(msg.sender);\n    }\n\n    function claimAllRewards() external payable {\n        _claimUserRewards(msg.sender);\n    }\n\n    function _claimUserRewards(address user) internal {\n        _settleUserCards(user);\n        uint256 reward = unclaimedRewards[user];\n        if (reward == 0) revert NothingToClaim();\n        unclaimedRewards[user] = 0;\n        if (msg.value > 0) {\n            totalClaimFeeBNB += msg.value;\n            totalCreatorRevenueBNB += msg.value;\n            (bool ok, ) = CREATOR.call{value: msg.value}(\"\");\n            if (!ok) revert TransferFailed();\n        }\n        uint256 minted = agmToken.mintReward(user, reward);\n        emit RewardsClaimed(user, minted, msg.value);\n    }\n\n    function _settleCard(uint256 tokenId) internal {\n        CardInfo storage c = cards[tokenId];\n        if (!c.isStaked) return;\n        uint40 endTs = uint40(block.timestamp < c.expiresAt ? block.timestamp : c.expiresAt);\n        if (endTs > c.lastSettledAt) {\n            uint256 reward = (uint256(endTs - c.lastSettledAt) * uint256(c.tier) * RATE_PER_WEIGHT_PER_MIN) / 60;\n            c.lastSettledAt = endTs;\n            address owner = _owners[tokenId];\n            if (owner != address(0) && reward > 0) {\n                unclaimedRewards[owner] += reward;\n            }\n        }\n    }\n\n    function tokensOfOwner(address owner) external view returns (uint256[] memory) {\n        return _ownedTokens[owner];\n    }\n\n    function getUserCards(address user)\n        external\n        view\n        returns (\n            uint256[] memory tokenIds,\n            uint8[] memory tiers,\n            bool[] memory isPaidList,\n            bool[] memory isStakedList,\n            uint40[] memory expiresAtList,\n            uint256[] memory pendingList\n        )\n    {\n        uint256[] storage owned = _ownedTokens[user];\n        uint256 len = owned.length;\n        tokenIds = new uint256[](len);\n        tiers = new uint8[](len);\n        isPaidList = new bool[](len);\n        isStakedList = new bool[](len);\n        expiresAtList = new uint40[](len);\n        pendingList = new uint256[](len);\n        for (uint256 i = 0; i < len; ++i) {\n            uint256 tid = owned[i];\n            CardInfo memory c = cards[tid];\n            tokenIds[i] = tid;\n            tiers[i] = c.tier;\n            isPaidList[i] = c.isPaid;\n            isStakedList[i] = c.isStaked;\n            expiresAtList[i] = c.expiresAt;\n            pendingList[i] = pendingCardRewards(tid);\n        }\n    }\n\n    // ---------------- On-Chain Dynamic SVG Art ----------------\n\n    function _tierMeta(uint8 tier) private pure returns (string memory tName, string memory rateTxt, string memory accent) {\n        if (tier == 4) return (\"GOLD\", \"0.4 $AGM/MIN (24/HR)\", \"#FFD700\");\n        if (tier == 3) return (\"SILVER\", \"0.3 $AGM/MIN (18/HR)\", \"#E2E8F0\");\n        if (tier == 2) return (\"BRONZE\", \"0.2 $AGM/MIN (12/HR)\", \"#F59E0B\");\n        return (\"IRON\", \"0.1 $AGM/MIN (6/HR)\", \"#38BDF8\");\n    }\n\n    function tokenURI(uint256 tokenId) public view override returns (string memory) {\n        if (_owners[tokenId] == address(0)) revert NonexistentToken();\n        CardInfo memory c = cards[tokenId];\n        (string memory tName, string memory rateTxt, string memory accent) = _tierMeta(c.tier);\n        string memory idStr = _toString(tokenId);\n        string memory svg = string.concat(\n            '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 420 560\"><rect width=\"420\" height=\"560\" rx=\"26\" fill=\"#0D111A\" stroke=\"', accent,\n            '\" stroke-width=\"4\"/><circle cx=\"210\" cy=\"185\" r=\"70\" fill=\"#161F30\" stroke=\"', accent,\n            '\" stroke-width=\"3\"/><text x=\"210\" y=\"198\" text-anchor=\"middle\" font-family=\"sans-serif\" font-weight=\"900\" font-size=\"32\" fill=\"', accent,\n            '\">$AGM</text><text x=\"210\" y=\"320\" text-anchor=\"middle\" font-family=\"sans-serif\" font-weight=\"900\" font-size=\"34\" fill=\"', accent,\n            '\">', tName, ' #', idStr, '</text><text x=\"210\" y=\"385\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"bold\" font-size=\"20\" fill=\"#FFF\">',\n            rateTxt, '</text><text x=\"210\" y=\"475\" text-anchor=\"middle\" font-family=\"monospace\" font-size=\"16\" fill=\"#94A3B8\">.ai AGENT GOLD MINER</text></svg>'\n        );\n        string memory json = string.concat(\n            '{\"name\":\"Agent Gold Miner #', idStr, ' (', tName,\n            ')\",\"description\":\"Agent Gold Miner (.ai) on BNB Chain.\",\"image\":\"data:image/svg+xml;base64,',\n            _base64(bytes(svg)), '\"}'\n        );\n        return string.concat(\"data:application/json;base64,\", _base64(bytes(json)));\n    }\n\n    // ---------------- ERC-721 Standard Implementation ----------------\n\n    function supportsInterface(bytes4 interfaceId) external pure override returns (bool) {\n        return\n            interfaceId == type(IERC165).interfaceId ||\n            interfaceId == type(IERC721).interfaceId ||\n            interfaceId == type(IERC721Metadata).interfaceId;\n    }\n\n    function balanceOf(address owner) external view override returns (uint256) {\n        if (owner == address(0)) revert ZeroAddress();\n        return _balances[owner];\n    }\n\n    function ownerOf(uint256 tokenId) public view override returns (address) {\n        address owner = _owners[tokenId];\n        if (owner == address(0)) revert NonexistentToken();\n        return owner;\n    }\n\n    function approve(address to, uint256 tokenId) external override {\n        address owner = ownerOf(tokenId);\n        if (msg.sender != owner && !_operatorApprovals[owner][msg.sender]) revert NotAuthorized();\n        _tokenApprovals[tokenId] = to;\n        emit Approval(owner, to, tokenId);\n    }\n\n    function getApproved(uint256 tokenId) external view override returns (address) {\n        if (_owners[tokenId] == address(0)) revert NonexistentToken();\n        return _tokenApprovals[tokenId];\n    }\n\n    function setApprovalForAll(address operator, bool approved) external override {\n        if (operator == address(0)) revert ZeroAddress();\n        _operatorApprovals[msg.sender][operator] = approved;\n        emit ApprovalForAll(msg.sender, operator, approved);\n    }\n\n    function isApprovedForAll(address owner, address operator) external view override returns (bool) {\n        return _operatorApprovals[owner][operator];\n    }\n\n    function transferFrom(address from, address to, uint256 tokenId) public override {\n        if (to == address(0)) revert ZeroAddress();\n        address owner = ownerOf(tokenId);\n        if (owner != from) revert NotCardOwner();\n        if (msg.sender != owner && !_operatorApprovals[owner][msg.sender] && _tokenApprovals[tokenId] != msg.sender) revert NotAuthorized();\n        if (cards[tokenId].isStaked) revert CardStakedInPool();\n\n        delete _tokenApprovals[tokenId];\n        _removeTokenFromOwnerEnumeration(from, tokenId);\n        _addTokenToOwnerEnumeration(to, tokenId);\n\n        unchecked {\n            _balances[from] -= 1;\n            _balances[to] += 1;\n        }\n        _owners[tokenId] = to;\n        emit Transfer(from, to, tokenId);\n    }\n\n    function safeTransferFrom(address from, address to, uint256 tokenId) external override {\n        safeTransferFrom(from, to, tokenId, \"\");\n    }\n\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override {\n        transferFrom(from, to, tokenId);\n        if (to.code.length > 0) {\n            if (IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, data) != IERC721Receiver.onERC721Received.selector) {\n                revert TransferFailed();\n            }\n        }\n    }\n\n    function _mintToken(address to, uint256 tokenId) private {\n        _owners[tokenId] = to;\n        unchecked { _balances[to] += 1; }\n        _addTokenToOwnerEnumeration(to, tokenId);\n        emit Transfer(address(0), to, tokenId);\n    }\n\n    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {\n        _ownedTokensIndex[tokenId] = _ownedTokens[to].length;\n        _ownedTokens[to].push(tokenId);\n    }\n\n    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {\n        uint256 lastIndex = _ownedTokens[from].length - 1;\n        uint256 tokenIndex = _ownedTokensIndex[tokenId];\n        if (tokenIndex != lastIndex) {\n            uint256 lastTokenId = _ownedTokens[from][lastIndex];\n            _ownedTokens[from][tokenIndex] = lastTokenId;\n            _ownedTokensIndex[lastTokenId] = tokenIndex;\n        }\n        _ownedTokens[from].pop();\n        delete _ownedTokensIndex[tokenId];\n    }\n\n    function _toString(uint256 value) private pure returns (string memory) {\n        if (value == 0) return \"0\";\n        uint256 temp = value;\n        uint256 digits;\n        while (temp != 0) { digits++; temp /= 10; }\n        bytes memory buffer = new bytes(digits);\n        while (value != 0) {\n            digits -= 1;\n            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\n            value /= 10;\n        }\n        return string(buffer);\n    }\n\n    string private constant _TABLE = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n    function _base64(bytes memory data) private pure returns (string memory) {\n        if (data.length == 0) return \"\";\n        string memory table = _TABLE;\n        string memory result = new string(4 * ((data.length + 2) / 3));\n        assembly {\n            let tablePtr := add(table, 1)\n            let resultPtr := add(result, 0x20)\n            let dataPtr := data\n            let endPtr := add(data, mload(data))\n            let afterPtr := add(endPtr, 0x20)\n            let afterCache := mload(afterPtr)\n            mstore(afterPtr, 0x00)\n            for {} lt(dataPtr, endPtr) {} {\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            mstore(afterPtr, afterCache)\n            switch mod(mload(data), 3)\n            case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) }\n            case 2 { mstore8(sub(resultPtr, 1), 0x3d) }\n        }\n        return result;\n    }\n}\n"}},"abi":[{"type":"constructor","inputs":[{"name":"creator_","type":"address","internalType":"address payable"}],"stateMutability":"nonpayable"},{"name":"CardAlreadyStaked","type":"error","inputs":[]},{"name":"CardExpired","type":"error","inputs":[]},{"name":"CardNotStaked","type":"error","inputs":[]},{"name":"CardStakedInPool","type":"error","inputs":[]},{"name":"InvalidQuantity","type":"error","inputs":[]},{"name":"MaxSupplyReached","type":"error","inputs":[]},{"name":"MaxTierReached","type":"error","inputs":[]},{"name":"NonexistentToken","type":"error","inputs":[]},{"name":"NotAgentIdHolder","type":"error","inputs":[]},{"name":"NotAuthorized","type":"error","inputs":[]},{"name":"NotCardOwner","type":"error","inputs":[]},{"name":"NothingToClaim","type":"error","inputs":[]},{"name":"OnlyCreator","type":"error","inputs":[]},{"name":"PrizePoolLow","type":"error","inputs":[]},{"name":"TransferFailed","type":"error","inputs":[]},{"name":"WrongPayment","type":"error","inputs":[]},{"name":"ZeroAddress","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":"BuybackExecuted","type":"event","inputs":[{"name":"bnbSpent","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"agmBurned","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"CardDeployedToPool","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"tier","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"name":"CardMinted","type":"event","inputs":[{"name":"minter","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"tier","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"isPaid","type":"bool","indexed":false,"internalType":"bool"},{"name":"expiresAt","type":"uint40","indexed":false,"internalType":"uint40"},{"name":"autoStaked","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"CardRenewed","type":"event","inputs":[{"name":"payer","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"newExpiresAt","type":"uint40","indexed":false,"internalType":"uint40"},{"name":"pricePaid","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"CardRenewedWithAgm","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"newExpiresAt","type":"uint40","indexed":false,"internalType":"uint40"},{"name":"agmBurned","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"CardUpgraded","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"newTier","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"agmBurned","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"CardWithdrawnFromPool","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"PricingParamsUpdated","type":"event","inputs":[{"name":"lpPair","type":"address","indexed":false,"internalType":"address"},{"name":"renewalDiscountBps","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"minRenewalPrice","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"baseRenewalPrice","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"autoBuyback","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"RevenueSplit","type":"event","inputs":[{"name":"payer","type":"address","indexed":true,"internalType":"address"},{"name":"creatorShare","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"buybackShare","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RewardsClaimed","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"feePaid","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":"UsdtBlindBoxOpened","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"boxMode","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"prizeTier","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"agmBurned","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"usdtWon","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"UsdtPoolFunded","type":"event","inputs":[{"name":"funder","type":"address","indexed":true,"internalType":"address"},{"name":"bnbSpent","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"usdtAdded","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"AGENT_ID","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAgentId"}],"stateMutability":"view"},{"name":"BNB_USD_FEED","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"CLAIM_FEE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"CREATOR","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address payable"}],"stateMutability":"view"},{"name":"DEAD_ADDRESS","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"FREE_DURATION","type":"function","inputs":[],"outputs":[{"name":"","type":"uint40","internalType":"uint40"}],"stateMutability":"view"},{"name":"FREE_QUOTA","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_SUPPLY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MINT_PRICE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PAID_DURATION","type":"function","inputs":[],"outputs":[{"name":"","type":"uint40","internalType":"uint40"}],"stateMutability":"view"},{"name":"PANCAKE_FACTORY","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"PANCAKE_ROUTER","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"RATE_PER_WEIGHT_PER_MIN","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"USDT","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"USDT_BOX_COST_AGM","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"VIP_USDT_BOX_COST_AGM","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"WBNB","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"agmToken","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract AgentGoldMinerToken"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"balanceOf","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"baseRenewalPrice","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"canClaimFree","type":"function","inputs":[{"name":"minter","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"cards","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"tier","type":"uint8","internalType":"uint8"},{"name":"isPaid","type":"bool","internalType":"bool"},{"name":"isStaked","type":"bool","internalType":"bool"},{"name":"mintedAt","type":"uint40","internalType":"uint40"},{"name":"expiresAt","type":"uint40","internalType":"uint40"},{"name":"lastSettledAt","type":"uint40","internalType":"uint40"}],"stateMutability":"view"},{"name":"claimAllRewards","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"claimRewards","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"claimedFree","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"deployAllToPool","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"deployToPool","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"freeMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"fundUsdtPoolWithBnb","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"getAgmRenewalCost","type":"function","inputs":[{"name":"tier","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"getApproved","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getPoolReserves","type":"function","inputs":[],"outputs":[{"name":"reserveAGM","type":"uint256","internalType":"uint256"},{"name":"reserveBNB","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getRenewalPrice","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getRenewalPriceByTier","type":"function","inputs":[{"name":"tier","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getUpgradeCost","type":"function","inputs":[{"name":"currentTier","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"getUserCards","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"tokenIds","type":"uint256[]","internalType":"uint256[]"},{"name":"tiers","type":"uint8[]","internalType":"uint8[]"},{"name":"isPaidList","type":"bool[]","internalType":"bool[]"},{"name":"isStakedList","type":"bool[]","internalType":"bool[]"},{"name":"expiresAtList","type":"uint40[]","internalType":"uint40[]"},{"name":"pendingList","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"name":"isAgent","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"minRenewalPrice","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":"quantity","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"mintPrice","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mintedBy","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"openUsdtBlindBox","type":"function","inputs":[{"name":"boxMode","type":"uint8","internalType":"uint8"},{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"openUsdtBlindBox","type":"function","inputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"openUsdtBlindBox","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"openVipUsdtBlindBox","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"ownerOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"pendingCardRewards","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pendingRewards","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"total","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"poolShareBps","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"quote","type":"function","inputs":[{"name":"minter","type":"address","internalType":"address"},{"name":"quantity","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"reclaimAllUsdt","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"reclaimPoolReserve","type":"function","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"renewCard","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"renewCardWithAgm","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"renewalDiscountBps","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"resolveLpPair","type":"function","inputs":[],"outputs":[{"name":"pair","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"safeTransferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"safeTransferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setApprovalForAll","type":"function","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setBoxFloors","type":"function","inputs":[{"name":"newStdFloorUsdt","type":"uint256","internalType":"uint256"},{"name":"newVipFloorUsdt","type":"uint256","internalType":"uint256"},{"name":"newVipFloorCapBps","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPricingParams","type":"function","inputs":[{"name":"newMintPrice","type":"uint256","internalType":"uint256"},{"name":"newBaseRenewalPrice","type":"uint256","internalType":"uint256"},{"name":"newMinRenewalPrice","type":"uint256","internalType":"uint256"},{"name":"newPoolShareBps","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"stdFloorUsdt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"supportsInterface","type":"function","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"tierMintedCount","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"tokenURI","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"tokensOfOwner","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"name":"totalAgmBoughtBack","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalAgmBurnedBySink","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalBuybackReserveBNB","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalClaimFeeBNB","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalCreatorRevenueBNB","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalSpendableAgm","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalStakedCards","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":"totalUsdtBoxesOpened","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalUsdtWon","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":"unclaimedRewards","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"upgradeCard","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"usdtPrizePool","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"userMiningRatePerMin","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"ratePerMinWei","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"userUsdtWon","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"vipFloorCapBps","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"vipFloorUsdt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"withdrawFromPool","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"}],"matchId":"56938327","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-25T09:03:45Z","match":"exact_match","chainId":"56","address":"0xC3B3fD579A5D0982D52214E96bc973246007f833"}