{"sources":{"Emblem.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\n/// @notice Minimal view of the Binance Agent ID registry (SPACE ID based).\ninterface IAgentIdRegistry {\n    function balanceOf(address owner) external view returns (uint256);\n}\n\n/// @notice Minimal PancakeSwap V2 router surface used at finalize time.\ninterface IPancakeRouter {\n    function addLiquidityETH(\n        address token,\n        uint256 amountTokenDesired,\n        uint256 amountTokenMin,\n        uint256 amountETHMin,\n        address to,\n        uint256 deadline\n    ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);\n}\n\n/// @title Emblem (EMBM)\n/// @notice A 100x100 pixel canvas on BSC that only Agent ID wallets can paint.\n///         The finished canvas becomes the logo of the EMBM token.\n///         One contract holds everything: the ERC-20 token, the canvas sale,\n///         and the final distribution. No admin functions, no taxes, no re-mint.\n///\n///         Timeline (all anchored to the immutable `paintStart`):\n///         - Registration: from deploy until the public phase starts.\n///         - Waitlist painting: paintStart .. paintStart+6h, registered agents\n///           only, 0.001 BNB per pixel, max 5 pixels per agent.\n///         - Public painting: paintStart+6h .. paintStart+12h, any Agent ID\n///           wallet, 0.0015 BNB per pixel, max 5 pixels per agent.\n///         - After the event (or a full canvas) anyone can call finalize():\n///           raised BNB splits 70% liquidity / 20% team / 10% marketing\n///           (team+marketing go to the treasury in one transfer); the token\n///           supply splits 50% painters / 40% liquidity / 5% team / 5%\n///           ecosystem airdrop (team+airdrop go to the treasury). LP tokens\n///           are sent straight to the burn address. Painters then claim().\ncontract Emblem {\n    // ---------------- ERC-20 ----------------\n    string public constant name = \"Emblem\";\n    string public constant symbol = \"EMBM\";\n    uint8 public constant decimals = 18;\n    uint256 public totalSupply;\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    // ---------------- Canvas sale ----------------\n    IAgentIdRegistry public immutable registry;\n    address public immutable treasury;\n    IPancakeRouter public immutable router;\n\n    uint256 public constant CELLS = 10_000; // 100 x 100\n    uint256 public constant PRICE_WAITLIST = 0.001 ether;\n    uint256 public constant PRICE_PUBLIC = 0.0015 ether;\n    uint256 public constant MAX_PER_PHASE = 5;\n    uint256 public constant PHASE_LEN = 6 hours;\n\n    uint256 public constant TOTAL_TOKENS = 1_000_000_000 * 1e18;\n    uint256 public constant PAINTER_POOL = 500_000_000 * 1e18; // 50%\n    uint256 public constant LP_TOKENS = 400_000_000 * 1e18;    // 40%\n    uint256 public constant TEAM_TOKENS = 50_000_000 * 1e18;   // 5%\n    uint256 public constant AIRDROP_TOKENS = 50_000_000 * 1e18; // 5%\n\n    address public constant BURN = 0x000000000000000000000000000000000000dEaD;\n\n    uint256 public immutable paintStart;\n    uint256 public immutable publicStart; // paintStart + 6h\n    uint256 public immutable endTime;     // paintStart + 12h\n\n    address[10000] private _cellOwner;\n    uint32[10000] private _cellColor;\n\n    mapping(address => bool) public registered;\n    uint256 public registeredCount;\n    mapping(address => uint256) public pixelCount;      // total pixels painted\n    mapping(address => uint256) public waitlistPainted; // cap accounting\n    mapping(address => uint256) public publicPainted;   // cap accounting\n    mapping(address => bool) public claimed;\n\n    uint256 public pixelsPainted;\n    uint256 public painterCount;\n    uint256 public totalRaised;\n\n    bool public finalized;\n    uint256 public tokensPerPixel;\n    uint256 public lpBnbAmount;\n    uint256 public teamBnbAmount;\n\n    event Registered(address indexed agent);\n    event Painted(address indexed painter, uint256 indexed cell, uint32 rgb, string note);\n    event Finalized(uint256 pixelsPainted, uint256 tokensPerPixel, uint256 lpBnb, uint256 teamBnb);\n    event Claimed(address indexed painter, uint256 amount);\n\n    bool private _locked;\n    modifier nonReentrant() {\n        require(!_locked, \"reentrant\");\n        _locked = true;\n        _;\n        _locked = false;\n    }\n\n    constructor(address agentIdRegistry, address treasury_, address router_, uint256 paintStart_) {\n        require(agentIdRegistry != address(0), \"registry 0\");\n        require(treasury_ != address(0), \"treasury 0\");\n        require(router_ != address(0), \"router 0\");\n        require(paintStart_ > block.timestamp, \"paintStart past\");\n        registry = IAgentIdRegistry(agentIdRegistry);\n        treasury = treasury_; // eksplisit: deploy lewat proxy CREATE2, jangan pakai msg.sender\n        router = IPancakeRouter(router_);\n        paintStart = paintStart_;\n        publicStart = paintStart_ + PHASE_LEN;\n        endTime = paintStart_ + 2 * PHASE_LEN;\n        totalSupply = TOTAL_TOKENS;\n        balanceOf[address(this)] = totalSupply;\n        emit Transfer(address(0), address(this), totalSupply);\n    }\n\n    // ---------------- ERC-20 functions ----------------\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        require(allowed >= value, \"allowance\");\n        if (allowed != type(uint256).max) {\n            allowance[from][msg.sender] = allowed - value;\n        }\n        _transfer(from, to, value);\n        return true;\n    }\n\n    function _transfer(address from, address to, uint256 value) internal {\n        require(to != address(0), \"to 0\");\n        require(balanceOf[from] >= value, \"balance\");\n        balanceOf[from] -= value;\n        balanceOf[to] += value;\n        emit Transfer(from, to, value);\n    }\n\n    // ---------------- Agent ID gate ----------------\n    function isAgent(address wallet) public view returns (bool) {\n        try registry.balanceOf(wallet) returns (uint256 n) {\n            return n > 0;\n        } catch {\n            return false;\n        }\n    }\n\n    // ---------------- Phases ----------------\n    /// @return phase 0 = registration, 1 = waitlist painting,\n    ///         2 = public painting, 3 = ended, 4 = finalized\n    function phase() public view returns (uint256) {\n        if (finalized) return 4;\n        uint256 t = block.timestamp;\n        if (t < paintStart) return 0;\n        if (t < publicStart) return 1;\n        if (t < endTime) return 2;\n        return 3;\n    }\n\n    function priceNow() public view returns (uint256) {\n        uint256 p = phase();\n        if (p == 1) return PRICE_WAITLIST;\n        if (p == 2) return PRICE_PUBLIC;\n        return 0;\n    }\n\n    function status()\n        external\n        view\n        returns (\n            uint256 phaseNow,\n            uint256 painted,\n            uint256 painters,\n            uint256 registered_,\n            uint256 price,\n            uint256 start,\n            uint256 pubStart,\n            uint256 end,\n            bool isFinalized\n        )\n    {\n        return (\n            phase(),\n            pixelsPainted,\n            painterCount,\n            registeredCount,\n            priceNow(),\n            paintStart,\n            publicStart,\n            endTime,\n            finalized\n        );\n    }\n\n    // ---------------- Registration ----------------\n    /// @notice Join the waitlist. Open from deploy until the public phase\n    ///         starts; only Agent ID wallets can register.\n    function register() external {\n        require(block.timestamp < publicStart, \"registration closed\");\n        require(isAgent(msg.sender), \"no Agent ID\");\n        require(!registered[msg.sender], \"already registered\");\n        registered[msg.sender] = true;\n        registeredCount += 1;\n        emit Registered(msg.sender);\n    }\n\n    // ---------------- Painting ----------------\n    /// @notice Paint cells. Each element of `packed` encodes one cell as\n    ///         cellIndex * 16777216 + rgb24 (cellIndex 0..9999, row-major).\n    ///         Cells already taken (or beyond your phase cap / payment) are\n    ///         skipped and never charged; any excess BNB is refunded in the\n    ///         same transaction. `note` (max 100 bytes) is stored in the\n    ///         Painted events of this call.\n    function paint(uint256[] calldata packed, string calldata note) external payable nonReentrant {\n        uint256 p = phase();\n        require(p == 1 || p == 2, \"painting closed\");\n        require(bytes(note).length <= 100, \"note too long\");\n        require(isAgent(msg.sender), \"no Agent ID\");\n        if (p == 1) require(registered[msg.sender], \"not on waitlist\");\n\n        uint256 price = p == 1 ? PRICE_WAITLIST : PRICE_PUBLIC;\n        uint256 already = p == 1 ? waitlistPainted[msg.sender] : publicPainted[msg.sender];\n        uint256 capLeft = MAX_PER_PHASE > already ? MAX_PER_PHASE - already : 0;\n        uint256 affordable = msg.value / price;\n        uint256 paintedNow = 0;\n\n        for (uint256 i = 0; i < packed.length; i++) {\n            if (paintedNow >= capLeft || paintedNow >= affordable) break;\n            uint256 cell = packed[i] / 16777216;\n            uint32 rgb = uint32(packed[i] % 16777216);\n            if (cell >= CELLS) continue;\n            if (_cellOwner[cell] != address(0)) continue;\n            _cellOwner[cell] = msg.sender;\n            _cellColor[cell] = rgb;\n            paintedNow += 1;\n            emit Painted(msg.sender, cell, rgb, note);\n        }\n        require(paintedNow > 0, \"nothing painted\");\n\n        if (pixelCount[msg.sender] == 0) painterCount += 1;\n        pixelCount[msg.sender] += paintedNow;\n        if (p == 1) waitlistPainted[msg.sender] += paintedNow;\n        else publicPainted[msg.sender] += paintedNow;\n        pixelsPainted += paintedNow;\n\n        uint256 cost = paintedNow * price;\n        totalRaised += cost;\n        uint256 refund = msg.value - cost;\n        if (refund > 0) {\n            (bool ok, ) = msg.sender.call{value: refund}(\"\");\n            require(ok, \"refund failed\");\n        }\n    }\n\n    // ---------------- Canvas reads ----------------\n    function getCells(uint256 from, uint256 count)\n        external\n        view\n        returns (address[] memory owners, uint32[] memory colors)\n    {\n        require(from + count <= CELLS, \"range\");\n        owners = new address[](count);\n        colors = new uint32[](count);\n        for (uint256 i = 0; i < count; i++) {\n            owners[i] = _cellOwner[from + i];\n            colors[i] = _cellColor[from + i];\n        }\n    }\n\n    function pixelsOf(address who) external view returns (uint256) {\n        return pixelCount[who];\n    }\n\n    // ---------------- Finalize & claim ----------------\n    /// @notice Close the event: create the PancakeSwap V2 liquidity pool with\n    ///         70% of the raised BNB and 40% of the token supply (LP tokens\n    ///         burned), send 30% of the BNB and 10% of the tokens (team 5% +\n    ///         ecosystem airdrop 5%) to the treasury, and open painter claims\n    ///         from the 50% painter pool. Callable by anyone once the event\n    ///         has ended or the canvas is full.\n    function finalize() external nonReentrant {\n        require(!finalized, \"finalized\");\n        require(block.timestamp >= endTime || pixelsPainted == CELLS, \"event running\");\n        require(pixelsPainted > 0, \"no pixels\");\n        finalized = true;\n\n        tokensPerPixel = PAINTER_POOL / pixelsPainted;\n\n        uint256 bnb = address(this).balance;\n        lpBnbAmount = (bnb * 70) / 100;\n        teamBnbAmount = bnb - lpBnbAmount;\n\n        // Team 5% + ecosystem airdrop 5% of tokens to the treasury.\n        _transfer(address(this), treasury, TEAM_TOKENS + AIRDROP_TOKENS);\n\n        // Liquidity: 40% of tokens + 70% of BNB, LP tokens straight to burn.\n        allowance[address(this)][address(router)] = LP_TOKENS;\n        emit Approval(address(this), address(router), LP_TOKENS);\n        router.addLiquidityETH{value: lpBnbAmount}(\n            address(this),\n            LP_TOKENS,\n            0,\n            0,\n            BURN,\n            block.timestamp + 3600\n        );\n\n        if (teamBnbAmount > 0) {\n            (bool ok, ) = treasury.call{value: teamBnbAmount}(\"\");\n            require(ok, \"treasury bnb failed\");\n        }\n        emit Finalized(pixelsPainted, tokensPerPixel, lpBnbAmount, teamBnbAmount);\n    }\n\n    /// @notice Painters claim their share of the 50% painter pool:\n    ///         pixels painted x tokensPerPixel. One claim per painter.\n    function claim() external nonReentrant {\n        require(finalized, \"not finalized\");\n        require(!claimed[msg.sender], \"claimed\");\n        uint256 n = pixelCount[msg.sender];\n        require(n > 0, \"no pixels\");\n        claimed[msg.sender] = true;\n        uint256 amount = n * tokensPerPixel;\n        _transfer(address(this), msg.sender, amount);\n        emit Claimed(msg.sender, amount);\n    }\n}\n"}},"abi":[{"type":"constructor","inputs":[{"name":"agentIdRegistry","type":"address","internalType":"address"},{"name":"treasury_","type":"address","internalType":"address"},{"name":"router_","type":"address","internalType":"address"},{"name":"paintStart_","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Claimed","type":"event","inputs":[{"name":"painter","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Finalized","type":"event","inputs":[{"name":"pixelsPainted","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"tokensPerPixel","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"lpBnb","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"teamBnb","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Painted","type":"event","inputs":[{"name":"painter","type":"address","indexed":true,"internalType":"address"},{"name":"cell","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"rgb","type":"uint32","indexed":false,"internalType":"uint32"},{"name":"note","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"Registered","type":"event","inputs":[{"name":"agent","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"AIRDROP_TOKENS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"BURN","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"CELLS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"LP_TOKENS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_PER_PHASE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PAINTER_POOL","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PHASE_LEN","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PRICE_PUBLIC","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PRICE_WAITLIST","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"TEAM_TOKENS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"TOTAL_TOKENS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"allowance","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"balanceOf","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"claim","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"claimed","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"decimals","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"endTime","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"finalize","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"finalized","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"getCells","type":"function","inputs":[{"name":"from","type":"uint256","internalType":"uint256"},{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"owners","type":"address[]","internalType":"address[]"},{"name":"colors","type":"uint32[]","internalType":"uint32[]"}],"stateMutability":"view"},{"name":"isAgent","type":"function","inputs":[{"name":"wallet","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"lpBnbAmount","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"paint","type":"function","inputs":[{"name":"packed","type":"uint256[]","internalType":"uint256[]"},{"name":"note","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"payable"},{"name":"paintStart","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"painterCount","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"phase","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pixelCount","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pixelsOf","type":"function","inputs":[{"name":"who","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pixelsPainted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"priceNow","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"publicPainted","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"publicStart","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"register","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"registered","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"registeredCount","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"registry","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAgentIdRegistry"}],"stateMutability":"view"},{"name":"router","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IPancakeRouter"}],"stateMutability":"view"},{"name":"status","type":"function","inputs":[],"outputs":[{"name":"phaseNow","type":"uint256","internalType":"uint256"},{"name":"painted","type":"uint256","internalType":"uint256"},{"name":"painters","type":"uint256","internalType":"uint256"},{"name":"registered_","type":"uint256","internalType":"uint256"},{"name":"price","type":"uint256","internalType":"uint256"},{"name":"start","type":"uint256","internalType":"uint256"},{"name":"pubStart","type":"uint256","internalType":"uint256"},{"name":"end","type":"uint256","internalType":"uint256"},{"name":"isFinalized","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"teamBnbAmount","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"tokensPerPixel","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalRaised","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":"transfer","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"treasury","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"waitlistPainted","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"}],"matchId":"59021873","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-11-10T13:33:48Z","match":"exact_match","chainId":"56","address":"0x58274C6A1a4219242AcC14530E485aF9F0777c3D"}