{"sources":{"contracts/GenieBagSale.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\ninterface IERC20Minimal {\n    function transfer(address to, uint256 value) external returns (bool);\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n    function balanceOf(address account) external view returns (uint256);\n}\n\ninterface IAgentRegistrar {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ninterface IERC721Receiver {\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data)\n        external\n        returns (bytes4);\n}\n\n/// @title GENIEBAG lucky-bag sale (ERC-721 + USDT sale + prize draw + claim)\n/// @notice Final parameters decided by the project owner (2026-11-02):\n///         - 21,000 bags total, tokenIds sequential from 1, per-wallet cap 100.\n///         - Only Binance Agent ID holders may mint (registrar balance > 0).\n///         - Payment in BSC USDT (18 decimals). Price is GLOBAL by total\n///           minted: pieces 1-8,400 cost 1 USDT, 8,401-16,800 cost 2 USDT,\n///           16,801-21,000 cost 3 USDT. Each wallet's first piece ever is free.\n///         - Every piece draws, at mint and without replacement from a fixed\n///           pool, a bundled GENIEBAG amount by tier:\n///           legendary 10 x 25,000 / epic 50 x 7,500 / rare 500 x 3,000 /\n///           fine 1,000 x 1,250 / common 19,440 x 500 (13,095,000 total).\n///           Bundled tokens stay locked in this contract until the owner\n///           flips the one-way poolOpened switch; then the CURRENT NFT\n///           owner can claim each piece's bundle exactly once.\n///         - Referral: on paid mints, 10% of the paid total goes instantly\n///           to the referrer (if any and not the buyer), 90% to treasury;\n///           without a referrer 100% goes to treasury.\n///         - Sale starts paused. The owner (deployer first, treasury after\n///           handover) can pause/unpause and open the pool.\ncontract GenieBagSale {\n    // ---- ERC-721 metadata ----\n    string public constant name = \"GENIEBAG\";\n    string public constant symbol = \"BAG\";\n\n    // ---- sale parameters ----\n    uint256 public constant MAX_PIECES = 21_000;\n    uint256 public constant PER_WALLET_CAP = 100;\n    uint256 public constant PHASE1_END = 8_400;\n    uint256 public constant PHASE2_END = 16_800;\n    uint256 public constant PRICE1 = 1 * 10 ** 18; // 1 USDT\n    uint256 public constant PRICE2 = 2 * 10 ** 18; // 2 USDT\n    uint256 public constant PRICE3 = 3 * 10 ** 18; // 3 USDT\n    uint256 public constant REFERRAL_PERCENT = 10; // % of paid total, in USDT, to the referrer\n\n    // ---- tier table (index 0..4 = legendary, epic, rare, fine, common) ----\n    uint256 public constant TIER_COUNT = 5;\n\n    IERC20Minimal public immutable bagToken; // GENIEBAG\n    IERC20Minimal public immutable usdt;\n    IAgentRegistrar public immutable registrar;\n    address public immutable treasury;\n\n    address public owner;\n\n    uint256 public totalMinted;\n    mapping(address => uint256) public mintedBy;\n\n    bool public paused = true; // sale starts paused\n    bool public poolOpened; // one-way switch\n\n    // ---- draw state ----\n    uint256[5] public tierRemaining;\n    uint256 public poolRemaining; // pieces not yet drawn (= MAX_PIECES - totalMinted)\n    uint256 private drawNonce;\n\n    struct Piece {\n        uint8 tier;\n        bool claimed;\n        // Bundled amount in wei; max is 25,000 * 1e18 = 2.5e22 < 2^96, fits.\n        uint96 bundled;\n    }\n    mapping(uint256 => Piece) public pieces;\n\n    // ---- ERC-721 state ----\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    // ---- reentrancy guard ----\n    uint256 private _status = 1;\n    modifier nonReentrant() {\n        require(_status == 1, \"reentrant\");\n        _status = 2;\n        _;\n        _status = 1;\n    }\n\n    modifier onlyOwner() {\n        require(msg.sender == owner, \"not owner\");\n        _;\n    }\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 Minted(address indexed buyer, uint256 count, uint256 paid, address indexed referrer);\n    event Reveal(uint256 indexed tokenId, uint8 tier, uint256 amount);\n    event Claimed(uint256 indexed tokenId, address indexed owner_, uint256 amount);\n    event Paused(bool next);\n    event PoolOpened();\n    event OwnershipTransferred(address indexed from, address indexed to);\n\n    constructor(address bagToken_, address usdt_, address registrar_, address treasury_) {\n        require(\n            bagToken_ != address(0) && usdt_ != address(0) && registrar_ != address(0)\n                && treasury_ != address(0),\n            \"zero addr\"\n        );\n        bagToken = IERC20Minimal(bagToken_);\n        usdt = IERC20Minimal(usdt_);\n        registrar = IAgentRegistrar(registrar_);\n        treasury = treasury_;\n        owner = msg.sender;\n\n        tierRemaining = [uint256(10), 50, 500, 1_000, 19_440];\n        poolRemaining = MAX_PIECES;\n    }\n\n    // ================= pricing =================\n\n    /// @notice Price of one global piece number (1-based) in USDT wei.\n    function piecePrice(uint256 pieceNo) public pure returns (uint256) {\n        require(pieceNo >= 1 && pieceNo <= MAX_PIECES, \"bad piece\");\n        if (pieceNo <= PHASE1_END) return PRICE1;\n        if (pieceNo <= PHASE2_END) return PRICE2;\n        return PRICE3;\n    }\n\n    /// @notice Total USDT wei `buyer` would pay for `count` pieces right\n    ///         now, honouring the free first piece and phase boundaries.\n    function costOf(address buyer, uint256 count) public view returns (uint256 total) {\n        bool freeFirst = mintedBy[buyer] == 0;\n        for (uint256 i = 0; i < count; i++) {\n            if (freeFirst && i == 0) continue;\n            total += piecePrice(totalMinted + i + 1);\n        }\n    }\n\n    // ================= mint =================\n\n    function mint(uint256 count, address referrer) external nonReentrant {\n        require(!paused, \"paused\");\n        require(count >= 1, \"bad count\");\n        require(registrar.balanceOf(msg.sender) > 0, \"no agent id\");\n        require(mintedBy[msg.sender] + count <= PER_WALLET_CAP, \"cap\");\n        require(totalMinted + count <= MAX_PIECES, \"sold out\");\n\n        bool freeFirst = mintedBy[msg.sender] == 0;\n        mintedBy[msg.sender] += count;\n\n        uint256 total = 0;\n        for (uint256 i = 0; i < count; i++) {\n            uint256 pieceNo = totalMinted + 1;\n            if (!(freeFirst && i == 0)) {\n                total += piecePrice(pieceNo);\n            }\n            totalMinted = pieceNo;\n            _mintPiece(msg.sender, pieceNo);\n        }\n\n        if (total > 0) {\n            uint256 commission = 0;\n            if (referrer != address(0) && referrer != msg.sender) {\n                commission = (total * REFERRAL_PERCENT) / 100;\n            }\n            if (commission > 0) {\n                require(usdt.transferFrom(msg.sender, referrer, commission), \"commission\");\n                require(usdt.transferFrom(msg.sender, treasury, total - commission), \"treasury\");\n            } else {\n                require(usdt.transferFrom(msg.sender, treasury, total), \"payment\");\n            }\n        }\n\n        emit Minted(msg.sender, count, total, referrer);\n    }\n\n    /// @dev Mints the NFT and draws its bundled amount without replacement:\n    ///      a uniform index into the remaining pool, walked across tiers in\n    ///      order legendary -> common, so rare odds improve as commons drain.\n    function _mintPiece(address to, uint256 tokenId) internal {\n        _owners[tokenId] = to;\n        _balances[to] += 1;\n        emit Transfer(address(0), to, tokenId);\n\n        uint256 rand = uint256(\n            keccak256(abi.encodePacked(blockhash(block.number - 1), block.timestamp, to, tokenId, drawNonce))\n        );\n        drawNonce += 1;\n        uint256 idx = rand % poolRemaining;\n        poolRemaining -= 1;\n\n        uint256 acc = 0;\n        for (uint8 t = 0; t < TIER_COUNT; t++) {\n            acc += tierRemaining[t];\n            if (idx < acc) {\n                tierRemaining[t] -= 1;\n                uint256 amount = tierAmount(t);\n                pieces[tokenId] = Piece({tier: t, claimed: false, bundled: uint96(amount)});\n                emit Reveal(tokenId, t, amount);\n                return;\n            }\n        }\n        revert(\"draw failed\"); // unreachable: idx < poolRemaining before decrement\n    }\n\n    /// @notice Bundled GENIEBAG (in wei) carried by each tier.\n    function tierAmount(uint8 tier) public pure returns (uint256) {\n        if (tier == 0) return 25_000 * 10 ** 18; // legendary\n        if (tier == 1) return 7_500 * 10 ** 18; // epic\n        if (tier == 2) return 3_000 * 10 ** 18; // rare\n        if (tier == 3) return 1_250 * 10 ** 18; // fine\n        return 500 * 10 ** 18; // common\n    }\n\n    /// @notice Bundled GENIEBAG (in wei) carried by one minted piece.\n    function pieceBundled(uint256 tokenId) external view returns (uint256) {\n        return pieces[tokenId].bundled;\n    }\n\n    // ================= claim =================\n\n    /// @notice Withdraw one piece's bundled GENIEBAG. Only after the pool\n    ///         has opened, only by the CURRENT owner of the piece, once.\n    function claim(uint256 tokenId) external nonReentrant {\n        require(poolOpened, \"pool not open\");\n        require(ownerOf(tokenId) == msg.sender, \"not owner\");\n        Piece storage p = pieces[tokenId];\n        require(!p.claimed, \"claimed\");\n        p.claimed = true;\n        uint256 amount = p.bundled;\n        require(bagToken.transfer(msg.sender, amount), \"token transfer\");\n        emit Claimed(tokenId, msg.sender, amount);\n    }\n\n    // ================= owner controls =================\n\n    function setPaused(bool next) external onlyOwner {\n        paused = next;\n        emit Paused(next);\n    }\n\n    /// @notice One-way switch: once the pool is open it cannot be un-opened.\n    function setPoolOpened() external onlyOwner {\n        require(!poolOpened, \"already open\");\n        poolOpened = true;\n        emit PoolOpened();\n    }\n\n    function transferOwnership(address next) external onlyOwner {\n        require(next != address(0), \"zero addr\");\n        emit OwnershipTransferred(owner, next);\n        owner = next;\n    }\n\n    // ================= ERC-721 =================\n\n    function balanceOf(address account) external view returns (uint256) {\n        require(account != address(0), \"zero addr\");\n        return _balances[account];\n    }\n\n    function ownerOf(uint256 tokenId) public view returns (address) {\n        address o = _owners[tokenId];\n        require(o != address(0), \"nonexistent\");\n        return o;\n    }\n\n    function approve(address to, uint256 tokenId) external {\n        address o = ownerOf(tokenId);\n        require(msg.sender == o || _operatorApprovals[o][msg.sender], \"not authorized\");\n        _tokenApprovals[tokenId] = to;\n        emit Approval(o, to, tokenId);\n    }\n\n    function getApproved(uint256 tokenId) external view returns (address) {\n        require(_owners[tokenId] != address(0), \"nonexistent\");\n        return _tokenApprovals[tokenId];\n    }\n\n    function setApprovalForAll(address operator, bool approved) external {\n        _operatorApprovals[msg.sender][operator] = approved;\n        emit ApprovalForAll(msg.sender, operator, approved);\n    }\n\n    function isApprovedForAll(address account, address operator) external view returns (bool) {\n        return _operatorApprovals[account][operator];\n    }\n\n    function transferFrom(address from, address to, uint256 tokenId) public {\n        require(_isApprovedOrOwner(msg.sender, tokenId), \"not authorized\");\n        _transfer(from, to, tokenId);\n    }\n\n    function safeTransferFrom(address from, address to, uint256 tokenId) external {\n        safeTransferFrom(from, to, tokenId, \"\");\n    }\n\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public {\n        require(_isApprovedOrOwner(msg.sender, tokenId), \"not authorized\");\n        _transfer(from, to, tokenId);\n        require(_checkOnERC721Received(from, to, tokenId, data), \"receiver rejected\");\n    }\n\n    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {\n        address o = ownerOf(tokenId);\n        return spender == o || _tokenApprovals[tokenId] == spender || _operatorApprovals[o][spender];\n    }\n\n    function _transfer(address from, address to, uint256 tokenId) internal {\n        require(ownerOf(tokenId) == from, \"wrong from\");\n        require(to != address(0), \"zero addr\");\n        delete _tokenApprovals[tokenId];\n        _balances[from] -= 1;\n        _balances[to] += 1;\n        _owners[tokenId] = to;\n        emit Transfer(from, to, tokenId);\n    }\n\n    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data)\n        internal\n        returns (bool)\n    {\n        if (to.code.length == 0) return true;\n        try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, data) returns (bytes4 magic) {\n            return magic == IERC721Receiver.onERC721Received.selector;\n        } catch {\n            return false;\n        }\n    }\n\n    /// @notice ERC-165: reports ERC-721 (0x80ac58cd) and ERC-165 itself.\n    function supportsInterface(bytes4 interfaceId) external pure returns (bool) {\n        return interfaceId == 0x80ac58cd || interfaceId == 0x01ffc9a7;\n    }\n}\n"}},"abi":[{"type":"constructor","inputs":[{"name":"bagToken_","type":"address","internalType":"address"},{"name":"usdt_","type":"address","internalType":"address"},{"name":"registrar_","type":"address","internalType":"address"},{"name":"treasury_","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"Approval","type":"event","inputs":[{"name":"owner_","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"ApprovalForAll","type":"event","inputs":[{"name":"owner_","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"Claimed","type":"event","inputs":[{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"owner_","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Minted","type":"event","inputs":[{"name":"buyer","type":"address","indexed":true,"internalType":"address"},{"name":"count","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"paid","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"referrer","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Paused","type":"event","inputs":[{"name":"next","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"PoolOpened","type":"event","inputs":[],"anonymous":false},{"name":"Reveal","type":"event","inputs":[{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"tier","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"amount","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":"MAX_PIECES","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PER_WALLET_CAP","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PHASE1_END","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PHASE2_END","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PRICE1","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PRICE2","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PRICE3","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"REFERRAL_PERCENT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"TIER_COUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"bagToken","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IERC20Minimal"}],"stateMutability":"view"},{"name":"balanceOf","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"claim","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"costOf","type":"function","inputs":[{"name":"buyer","type":"address","internalType":"address"},{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"total","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":"account","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"count","type":"uint256","internalType":"uint256"},{"name":"referrer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"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":"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":"paused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"pieceBundled","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"piecePrice","type":"function","inputs":[{"name":"pieceNo","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"pieces","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"tier","type":"uint8","internalType":"uint8"},{"name":"claimed","type":"bool","internalType":"bool"},{"name":"bundled","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"name":"poolOpened","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"poolRemaining","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"registrar","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAgentRegistrar"}],"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":"setPaused","type":"function","inputs":[{"name":"next","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPoolOpened","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"supportsInterface","type":"function","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"tierAmount","type":"function","inputs":[{"name":"tier","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"tierRemaining","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalMinted","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":"next","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"treasury","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"usdt","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IERC20Minimal"}],"stateMutability":"view"}],"matchId":"58038732","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-11-02T04:45:06Z","match":"exact_match","chainId":"56","address":"0xcAf98Ad99711b56fee6E0dB249FDF9940B46Da0e"}