{"sources":{"contracts/Shenlong.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\ninterface IAgentRegistry {\n    function balanceOf(address owner) external view returns (uint256);\n}\n\n/// @title Shenlong (神龙) — Agent-gated blind-box star-orb NFT on BSC\n/// @notice Economics (locked):\n///   - Supply 20_000; stars 1–7 with quotas 2000/3540/3540/300/3540/3540/3540\n///   - Equal equity for ALL tokens (stake weight = 1)\n///   - Mint: first 4 FREE per .ai Agent wallet, then 0.002 BNB; max 50/wallet\n///   - Fee split on paid mints: 15% treasury / 60% staked dividends / 25% prize pool\n///   - tokenURI = baseURI + star + \".json\" (not tokenId)\n///   - Summon: burn one each of stars 1–7 → share of current prize pool\n///   - Mint & stake require verified .ai Agent ID\ncontract Shenlong {\n    string public constant name = \"Shenlong\";\n    string public constant symbol = \"SHENLONG\";\n\n    uint256 public constant MAX_SUPPLY = 20_000;\n    uint256 public constant MAX_PER_ADDRESS = 50;\n    uint256 public constant FREE_MINTS = 4;\n    uint256 public constant MINT_PRICE = 0.002 ether;\n    uint256 private constant ACC_SCALE = 1e18;\n\n    // Exact star caps (sum = 20000)\n    uint16 public constant CAP_STAR1 = 2000;\n    uint16 public constant CAP_STAR2 = 3540;\n    uint16 public constant CAP_STAR3 = 3540;\n    uint16 public constant CAP_STAR4 = 300;\n    uint16 public constant CAP_STAR5 = 3540;\n    uint16 public constant CAP_STAR6 = 3540;\n    uint16 public constant CAP_STAR7 = 3540;\n\n    /// @dev Max summons bottlenecked by rarest star (4★ = 300)\n    uint16 public constant MAX_SUMMONS = CAP_STAR4;\n\n    IAgentRegistry public immutable agentRegistry;\n    address public immutable treasury;\n\n    address public owner;\n    uint256 public totalMinted;\n    uint256 public totalStaked;\n    /// @dev equal weight: each staked NFT contributes 1\n    uint256 public totalStakedWeight;\n    uint256 public accRewardPerShare;\n    uint256 public pendingStakerPool;\n    uint256 public prizePool;\n    uint256 public summonCount;\n\n    uint16 public remainingStar1 = CAP_STAR1;\n    uint16 public remainingStar2 = CAP_STAR2;\n    uint16 public remainingStar3 = CAP_STAR3;\n    uint16 public remainingStar4 = CAP_STAR4;\n    uint16 public remainingStar5 = CAP_STAR5;\n    uint16 public remainingStar6 = CAP_STAR6;\n    uint16 public remainingStar7 = CAP_STAR7;\n\n    string private _baseTokenURI;\n\n    mapping(uint256 => address) private _ownerOf;\n    mapping(address => uint256) private _balanceOf;\n    mapping(uint256 => address) private _tokenApprovals;\n    mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n    mapping(address => uint256) public mintedCount;\n    mapping(address => uint256) public stakedCount;\n    mapping(uint256 => bool) public staked;\n    /// @dev star of tokenId (1..7); only valid if token exists\n    mapping(uint256 => uint8) public starOf;\n    mapping(uint256 => uint256) public stakeWeight;\n    mapping(uint256 => uint256) public rewardDebt;\n    mapping(address => uint256[]) private _stakedTokens;\n\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n    event Minted(address indexed to, uint256 indexed tokenId, uint8 star, uint256 price);\n    event Staked(address indexed user, uint256 indexed tokenId, uint256 weight);\n    event Unstaked(address indexed user, uint256 indexed tokenId);\n    event Claimed(address indexed user, uint256 indexed tokenId, uint256 amount);\n    event BaseURISet(string baseURI);\n    event Summoned(address indexed user, uint256[7] burnedIds, uint256 prizeShare, uint256 summonIndex);\n    event Burned(address indexed from, uint256 indexed tokenId, uint8 star);\n\n    modifier onlyOwner() {\n        require(msg.sender == owner, \"NOT_OWNER\");\n        _;\n    }\n\n    constructor(address agentRegistry_, address treasury_, address owner_, string memory baseURI_) {\n        require(agentRegistry_ != address(0) && treasury_ != address(0) && owner_ != address(0), \"ZERO\");\n        agentRegistry = IAgentRegistry(agentRegistry_);\n        treasury = treasury_;\n        owner = owner_;\n        _baseTokenURI = baseURI_;\n        emit OwnershipTransferred(address(0), owner_);\n        if (bytes(baseURI_).length != 0) emit BaseURISet(baseURI_);\n    }\n\n    function mintPrice() public pure returns (uint256) {\n        return MINT_PRICE;\n    }\n\n    /// @notice Price for next mint by wallet (0 if under FREE_MINTS)\n    function nextMintPrice(address wallet) public view returns (uint256) {\n        return mintedCount[wallet] < FREE_MINTS ? 0 : MINT_PRICE;\n    }\n\n    function freeMintsLeft(address wallet) external view returns (uint256) {\n        uint256 n = mintedCount[wallet];\n        return n >= FREE_MINTS ? 0 : FREE_MINTS - n;\n    }\n\n    function balanceOf(address a) external view returns (uint256) {\n        require(a != address(0), \"ZERO\");\n        return _balanceOf[a];\n    }\n\n    function ownerOf(uint256 tokenId) public view returns (address) {\n        address o = _ownerOf[tokenId];\n        require(o != address(0), \"NO_TOKEN\");\n        return o;\n    }\n\n    /// @dev baseURI + \"{star}.json\" — shared metadata per star, not per tokenId\n    function tokenURI(uint256 tokenId) external view returns (string memory) {\n        require(_ownerOf[tokenId] != address(0), \"NO_TOKEN\");\n        string memory base = _baseTokenURI;\n        if (bytes(base).length == 0) return \"\";\n        return string(abi.encodePacked(base, _toString(starOf[tokenId]), \".json\"));\n    }\n\n    function baseURI() external view returns (string memory) {\n        return _baseTokenURI;\n    }\n\n    function stakedTokensOf(address user) external view returns (uint256[] memory) {\n        return _stakedTokens[user];\n    }\n\n    function remainingSummons() public view returns (uint256) {\n        return uint256(MAX_SUMMONS) - summonCount;\n    }\n\n    /// @notice Current payout if you summon now (= prizePool / remainingSummons)\n    function nextSummonShare() external view returns (uint256) {\n        uint256 rem = remainingSummons();\n        if (rem == 0) return 0;\n        return prizePool / rem;\n    }\n\n    function pendingReward(uint256 tokenId) public view returns (uint256) {\n        if (!staked[tokenId] || _ownerOf[tokenId] == address(0)) return 0;\n        uint256 weight = stakeWeight[tokenId];\n        uint256 accumulated = (weight * accRewardPerShare) / ACC_SCALE;\n        if (accumulated <= rewardDebt[tokenId]) return 0;\n        return accumulated - rewardDebt[tokenId];\n    }\n\n    function mint() external payable {\n        require(agentRegistry.balanceOf(msg.sender) > 0, \"NO_AGENT\");\n        require(totalMinted < MAX_SUPPLY, \"SOLD_OUT\");\n        require(mintedCount[msg.sender] < MAX_PER_ADDRESS, \"MAX_MINT\");\n\n        uint256 price = nextMintPrice(msg.sender);\n        require(msg.value >= price, \"PRICE\");\n\n        unchecked {\n            totalMinted += 1;\n            mintedCount[msg.sender] += 1;\n        }\n        uint256 tokenId = totalMinted;\n        uint8 star = _assignStar(tokenId);\n        starOf[tokenId] = star;\n        _mint(msg.sender, tokenId);\n\n        if (price > 0) {\n            // 15% treasury / 60% stakers / 25% prize\n            uint256 toTreasury = (price * 15) / 100;\n            uint256 toStakers = (price * 60) / 100;\n            uint256 toPrize = price - toTreasury - toStakers; // 25%\n\n            _send(treasury, toTreasury);\n            _distributeToStakers(toStakers);\n            prizePool += toPrize;\n        }\n\n        if (msg.value > price) _send(msg.sender, msg.value - price);\n        emit Minted(msg.sender, tokenId, star, price);\n    }\n\n    function stake(uint256 tokenId) external {\n        require(agentRegistry.balanceOf(msg.sender) > 0, \"NO_AGENT\");\n        require(ownerOf(tokenId) == msg.sender, \"NOT_OWNER\");\n        require(!staked[tokenId], \"STAKED\");\n        require(stakedCount[msg.sender] < MAX_PER_ADDRESS, \"MAX_STAKE\");\n\n        uint256 weight = 1; // equal equity\n        staked[tokenId] = true;\n        stakeWeight[tokenId] = weight;\n        rewardDebt[tokenId] = (weight * accRewardPerShare) / ACC_SCALE;\n        _stakedTokens[msg.sender].push(tokenId);\n\n        unchecked {\n            stakedCount[msg.sender] += 1;\n            totalStaked += 1;\n            totalStakedWeight += weight;\n        }\n        emit Staked(msg.sender, tokenId, weight);\n    }\n\n    function unstake(uint256 tokenId) external {\n        require(ownerOf(tokenId) == msg.sender, \"NOT_OWNER\");\n        require(staked[tokenId], \"NOT_STAKED\");\n        _claim(tokenId, msg.sender);\n        _removeStake(msg.sender, tokenId);\n        emit Unstaked(msg.sender, tokenId);\n    }\n\n    function claim(uint256 tokenId) external {\n        require(ownerOf(tokenId) == msg.sender, \"NOT_OWNER\");\n        require(staked[tokenId], \"NOT_STAKED\");\n        _claim(tokenId, msg.sender);\n    }\n\n    function claimAll() external {\n        uint256[] storage ids = _stakedTokens[msg.sender];\n        uint256 n = ids.length;\n        for (uint256 i = 0; i < n; ) {\n            _claim(ids[i], msg.sender);\n            unchecked {\n                ++i;\n            }\n        }\n    }\n\n    /// @notice Burn one each of stars 1–7 (owned, unstaked) to summon and claim equal share of current prize pool\n    function summon(uint256[7] calldata tokenIds) external {\n        require(agentRegistry.balanceOf(msg.sender) > 0, \"NO_AGENT\");\n        uint256 rem = remainingSummons();\n        require(rem > 0, \"NO_SUMMONS\");\n\n        bool[8] memory seen; // index by star 1..7\n        for (uint256 i = 0; i < 7; ) {\n            uint256 tokenId = tokenIds[i];\n            require(ownerOf(tokenId) == msg.sender, \"NOT_OWNER\");\n            require(!staked[tokenId], \"STAKED\");\n            uint8 star = starOf[tokenId];\n            require(star >= 1 && star <= 7, \"STAR\");\n            require(!seen[star], \"DUP_STAR\");\n            seen[star] = true;\n            unchecked {\n                ++i;\n            }\n        }\n        // ensure all 1..7 present\n        for (uint8 s = 1; s <= 7; ) {\n            require(seen[s], \"NEED_ALL\");\n            unchecked {\n                ++s;\n            }\n        }\n\n        for (uint256 i = 0; i < 7; ) {\n            _burn(msg.sender, tokenIds[i]);\n            unchecked {\n                ++i;\n            }\n        }\n\n        uint256 share = prizePool / rem;\n        prizePool -= share;\n        unchecked {\n            summonCount += 1;\n        }\n\n        if (share > 0) _send(msg.sender, share);\n        emit Summoned(msg.sender, tokenIds, share, summonCount);\n    }\n\n    function setBaseURI(string calldata newBase) external onlyOwner {\n        _baseTokenURI = newBase;\n        emit BaseURISet(newBase);\n    }\n\n    function transferOwnership(address newOwner) external onlyOwner {\n        require(newOwner != address(0), \"ZERO\");\n        emit OwnershipTransferred(owner, newOwner);\n        owner = newOwner;\n    }\n\n    function approve(address spender, uint256 tokenId) external {\n        address o = ownerOf(tokenId);\n        require(msg.sender == o || _operatorApprovals[o][msg.sender], \"AUTH\");\n        _tokenApprovals[tokenId] = spender;\n        emit Approval(o, spender, tokenId);\n    }\n\n    function setApprovalForAll(address operator, bool approved) external {\n        _operatorApprovals[msg.sender][operator] = approved;\n        emit ApprovalForAll(msg.sender, operator, approved);\n    }\n\n    function getApproved(uint256 tokenId) external view returns (address) {\n        require(_ownerOf[tokenId] != address(0), \"NO_TOKEN\");\n        return _tokenApprovals[tokenId];\n    }\n\n    function isApprovedForAll(address o, address op) external view returns (bool) {\n        return _operatorApprovals[o][op];\n    }\n\n    function transferFrom(address from, address to, uint256 tokenId) public {\n        require(to != address(0), \"ZERO\");\n        address o = ownerOf(tokenId);\n        require(o == from, \"FROM\");\n        require(\n            msg.sender == o || _operatorApprovals[o][msg.sender] || _tokenApprovals[tokenId] == msg.sender,\n            \"AUTH\"\n        );\n        require(!staked[tokenId], \"STAKED\");\n        unchecked {\n            _balanceOf[from] -= 1;\n            _balanceOf[to] += 1;\n        }\n        _ownerOf[tokenId] = to;\n        delete _tokenApprovals[tokenId];\n        emit Transfer(from, to, tokenId);\n    }\n\n    function safeTransferFrom(address from, address to, uint256 tokenId) external {\n        transferFrom(from, to, tokenId);\n        require(_checkOnERC721Received(from, to, tokenId, \"\"), \"SAFE\");\n    }\n\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external {\n        transferFrom(from, to, tokenId);\n        require(_checkOnERC721Received(from, to, tokenId, data), \"SAFE\");\n    }\n\n    function supportsInterface(bytes4 interfaceId) external pure returns (bool) {\n        return interfaceId == 0x80ac58cd || interfaceId == 0x5b5e139f || interfaceId == 0x01ffc9a7;\n    }\n\n    // ─── internals ───────────────────────────────────────────────\n\n    function _distributeToStakers(uint256 amount) internal {\n        uint256 pool = amount + pendingStakerPool;\n        pendingStakerPool = 0;\n        if (pool == 0) return;\n        if (totalStakedWeight > 0) {\n            accRewardPerShare += (pool * ACC_SCALE) / totalStakedWeight;\n        } else {\n            pendingStakerPool = pool;\n        }\n    }\n\n    function _removeStake(address user, uint256 tokenId) internal {\n        uint256 weight = stakeWeight[tokenId];\n        staked[tokenId] = false;\n        stakeWeight[tokenId] = 0;\n        rewardDebt[tokenId] = 0;\n\n        uint256[] storage ids = _stakedTokens[user];\n        uint256 n = ids.length;\n        for (uint256 i = 0; i < n; ) {\n            if (ids[i] == tokenId) {\n                ids[i] = ids[n - 1];\n                ids.pop();\n                break;\n            }\n            unchecked {\n                ++i;\n            }\n        }\n\n        unchecked {\n            stakedCount[user] -= 1;\n            totalStaked -= 1;\n            totalStakedWeight -= weight;\n        }\n    }\n\n    function _claim(uint256 tokenId, address to) internal {\n        uint256 due = pendingReward(tokenId);\n        rewardDebt[tokenId] = (stakeWeight[tokenId] * accRewardPerShare) / ACC_SCALE;\n        if (due > 0) {\n            _send(to, due);\n            emit Claimed(to, tokenId, due);\n        }\n    }\n\n    /// @dev Remaining-quota weighted pick; entropy from tokenId + prevrandao + sender\n    function _assignStar(uint256 tokenId) internal returns (uint8) {\n        uint256 total = uint256(remainingStar1) + remainingStar2 + remainingStar3 + remainingStar4\n            + remainingStar5 + remainingStar6 + remainingStar7;\n        require(total > 0, \"NO_STAR\");\n        uint256 roll = uint256(keccak256(abi.encodePacked(tokenId, block.prevrandao, msg.sender, totalMinted))) % total;\n\n        if (roll < remainingStar1) {\n            unchecked { remainingStar1 -= 1; }\n            return 1;\n        }\n        roll -= remainingStar1;\n        if (roll < remainingStar2) {\n            unchecked { remainingStar2 -= 1; }\n            return 2;\n        }\n        roll -= remainingStar2;\n        if (roll < remainingStar3) {\n            unchecked { remainingStar3 -= 1; }\n            return 3;\n        }\n        roll -= remainingStar3;\n        if (roll < remainingStar4) {\n            unchecked { remainingStar4 -= 1; }\n            return 4;\n        }\n        roll -= remainingStar4;\n        if (roll < remainingStar5) {\n            unchecked { remainingStar5 -= 1; }\n            return 5;\n        }\n        roll -= remainingStar5;\n        if (roll < remainingStar6) {\n            unchecked { remainingStar6 -= 1; }\n            return 6;\n        }\n        unchecked { remainingStar7 -= 1; }\n        return 7;\n    }\n\n    function _mint(address to, uint256 tokenId) internal {\n        require(_ownerOf[tokenId] == address(0), \"EXISTS\");\n        unchecked {\n            _balanceOf[to] += 1;\n        }\n        _ownerOf[tokenId] = to;\n        emit Transfer(address(0), to, tokenId);\n    }\n\n    function _burn(address from, uint256 tokenId) internal {\n        require(_ownerOf[tokenId] == from, \"FROM\");\n        require(!staked[tokenId], \"STAKED\");\n        uint8 star = starOf[tokenId];\n        unchecked {\n            _balanceOf[from] -= 1;\n        }\n        delete _ownerOf[tokenId];\n        delete _tokenApprovals[tokenId];\n        delete starOf[tokenId];\n        emit Burned(from, tokenId, star);\n        emit Transfer(from, address(0), tokenId);\n    }\n\n    function _send(address to, uint256 amount) internal {\n        if (amount == 0) return;\n        (bool ok, ) = to.call{value: amount}(\"\");\n        require(ok, \"BNB\");\n    }\n\n    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data)\n        private\n        returns (bool)\n    {\n        if (to.code.length == 0) return true;\n        (bool success, bytes memory ret) = to.call(\n            abi.encodeWithSignature(\n                \"onERC721Received(address,address,uint256,bytes)\",\n                msg.sender,\n                from,\n                tokenId,\n                data\n            )\n        );\n        return success && ret.length >= 32 && abi.decode(ret, (bytes4)) == 0x150b7a02;\n    }\n\n    function _toString(uint256 value) internal pure returns (string memory) {\n        if (value == 0) return \"0\";\n        uint256 temp = value;\n        uint256 digits;\n        while (temp != 0) {\n            unchecked {\n                digits++;\n                temp /= 10;\n            }\n        }\n        bytes memory buffer = new bytes(digits);\n        while (value != 0) {\n            unchecked {\n                digits -= 1;\n                buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\n                value /= 10;\n            }\n        }\n        return string(buffer);\n    }\n\n    receive() external payable {}\n}\n"}},"abi":[{"type":"constructor","inputs":[{"name":"agentRegistry_","type":"address","internalType":"address"},{"name":"treasury_","type":"address","internalType":"address"},{"name":"owner_","type":"address","internalType":"address"},{"name":"baseURI_","type":"string","internalType":"string"}],"stateMutability":"nonpayable"},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"ApprovalForAll","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"BaseURISet","type":"event","inputs":[{"name":"baseURI","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"Burned","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"star","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"name":"Claimed","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Minted","type":"event","inputs":[{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"star","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"price","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":"Staked","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"weight","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Summoned","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"burnedIds","type":"uint256[7]","indexed":false,"internalType":"uint256[7]"},{"name":"prizeShare","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"summonIndex","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":"Unstaked","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"CAP_STAR1","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"CAP_STAR2","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"CAP_STAR3","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"CAP_STAR4","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"CAP_STAR5","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"CAP_STAR6","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"CAP_STAR7","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"FREE_MINTS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_PER_ADDRESS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_SUMMONS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"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":"accRewardPerShare","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"agentRegistry","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAgentRegistry"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"balanceOf","type":"function","inputs":[{"name":"a","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"baseURI","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"claim","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"claimAll","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"freeMintsLeft","type":"function","inputs":[{"name":"wallet","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getApproved","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"o","type":"address","internalType":"address"},{"name":"op","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"mintPrice","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"mintedCount","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":"nextMintPrice","type":"function","inputs":[{"name":"wallet","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"nextSummonShare","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"ownerOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"pendingReward","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pendingStakerPool","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"prizePool","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"remainingStar1","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"remainingStar2","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"remainingStar3","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"remainingStar4","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"remainingStar5","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"remainingStar6","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"remainingStar7","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"remainingSummons","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"rewardDebt","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"safeTransferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"safeTransferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"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":"setBaseURI","type":"function","inputs":[{"name":"newBase","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"stake","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"stakeWeight","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"staked","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"stakedCount","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"stakedTokensOf","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"name":"starOf","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"summon","type":"function","inputs":[{"name":"tokenIds","type":"uint256[7]","internalType":"uint256[7]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"summonCount","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":"tokenURI","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalStaked","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalStakedWeight","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"treasury","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"unstake","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"}],"matchId":"56911602","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-25T03:24:38Z","match":"exact_match","chainId":"56","address":"0xd823a14507Af2507a670FaC4eD08316Db7dCA553"}