{"sources":{"src/VeriNode8004Hub.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/**\n * @title VeriNode 8004 — Dual-Registry Identity Bridge & 3-Node Reputation Hub\n * @notice Trustless infrastructure bridging Binance .ai Agent Passports (0x60B9...022F)\n *         to official ERC-8004 IdentityRegistry (0x8004A169...9a432) and writing\n *         3 independent 100/100 'starred' client attestations to ERC-8004 ReputationRegistry\n *         (0x8004BAa1...9b63) in a single atomic transaction.\n * @dev Zero-Admin / Immutable Architecture: No owner, no pause, no admin withdrawal backdoor.\n *      Website: https://verinode8004.surge.sh\n *      AI Agent Skill Spec: https://verinode8004.surge.sh/SKILL.md\n * @custom:website https://verinode8004.surge.sh\n * @custom:documentation https://verinode8004.surge.sh/SKILL.md\n */\n\ninterface IBinanceAiPassport {\n    function balanceOf(address account) external view returns (uint256);\n}\n\ninterface IERC8004IdentityHub {\n    function register(string memory agentURI) external returns (uint256 agentId);\n    function transferFrom(address from, address to, uint256 tokenId) external;\n    function ownerOf(uint256 tokenId) external view returns (address);\n    function isAuthorizedOrOwner(address spender, uint256 tokenId) external view returns (bool);\n}\n\ninterface IERC8004ReputationHub {\n    function giveFeedback(\n        uint256 agentId,\n        int128 value,\n        uint8 valueDecimals,\n        string calldata tag1,\n        string calldata tag2,\n        string calldata endpoint,\n        string calldata feedbackURI,\n        bytes32 feedbackHash\n    ) external;\n}\n\ninterface IERC721Receiver {\n    function onERC721Received(\n        address operator,\n        address from,\n        uint256 tokenId,\n        bytes calldata data\n    ) external returns (bytes4);\n}\n\n/**\n * @notice Independent On-Chain ERC-8004 Validator Node deployed by VeriNode8004Hub.\n *         Each node has its own distinct contract address so 8004scan.io records\n *         3 unique Verified Client addresses per attestation.\n */\ncontract VeriAttestorNode {\n    address public immutable HUB;\n    address public constant ERC8004_REPUTATION_HUB = 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63;\n    string public nodeDomainTag;\n\n    constructor(string memory _nodeDomainTag) {\n        HUB = msg.sender;\n        nodeDomainTag = _nodeDomainTag;\n    }\n\n    function submitAttestation(\n        uint256 agentId,\n        int128 score,\n        string calldata endpoint,\n        string calldata specUri,\n        bytes32 digest\n    ) external {\n        require(msg.sender == HUB, \"ONLY_HUB\");\n        IERC8004ReputationHub(ERC8004_REPUTATION_HUB).giveFeedback(\n            agentId,\n            score,\n            0,\n            \"starred\",\n            nodeDomainTag,\n            endpoint,\n            specUri,\n            digest\n        );\n    }\n}\n\ncontract VeriNode8004Hub is IERC721Receiver {\n    // ─── Official Mainnet Registries ───────────────────────────────────────────\n    address public constant BINANCE_AI_PASSPORT = 0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F;\n    address public constant ERC8004_IDENTITY_HUB = 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432;\n    address public constant ERC8004_REPUTATION_HUB = 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63;\n\n    // ─── Immutable Protocol Metadata & Endpoints ───────────────────────────────\n    string public constant name = \"VeriNode 8004 Attestation Pass\";\n    string public constant symbol = \"VNODE\";\n    string public constant PROJECT_WEBSITE = \"https://verinode8004.surge.sh\";\n    string public constant SKILL_SPEC_URI = \"https://verinode8004.surge.sh/SKILL.md\";\n\n    // ─── Economic & Supply Constants (100% Immutable, No Admin) ────────────────\n    uint256 public constant MAX_SUPPLY = 3333;\n    uint256 public constant FREE_PROBE_LIMIT = 300;\n    uint256 public constant VERIFIED_PASS_PRICE = 0.0018 ether;\n    uint256 public constant UPGRADE_PASS_PRICE = 0.0015 ether;\n    uint256 public constant BATCH_ATTEST_UNIT_PRICE = 0.0012 ether;\n    uint256 public constant TAIL_RECOVERY_WINDOW = 24 hours;\n\n    uint256 private constant ACC_PRECISION = 1e18;\n\n    address public immutable SETTLEMENT_VAULT;\n    VeriAttestorNode public immutable nodeAlpha;\n    VeriAttestorNode public immutable nodeBeta;\n    VeriAttestorNode public immutable nodeGamma;\n\n    // ─── ERC-721 State ─────────────────────────────────────────────────────────\n    uint256 public totalSupply;\n    uint256 public freeProbesMinted;\n    uint256 public verifiedSharesTotal;\n    uint256 public totalAttestationsWritten;\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    // ─── Pass Verification, ERC-8004 Link & Dividend Accounting ────────────────\n    mapping(address => bool) public hasClaimedFreeProbe;\n    mapping(uint256 => bool) public isVerifiedPass;\n    mapping(uint256 => uint256) public linked8004AgentId;\n    mapping(address => uint256) public userLast8004AgentId;\n    mapping(address => uint256) public pendingAttestCredits;\n\n    mapping(address => uint256) public verifiedBalance;\n    mapping(address => uint256) public rewardDebt;\n    mapping(address => uint256) public accruedRewards;\n    uint256 public accRewardPerShare;\n    uint256 public totalDividendsDistributed;\n\n    // ─── Charge-Pot Bounty & 24h Tail Recovery State ───────────────────────────\n    uint256 public bountyGauge; // 0 to 100+\n    uint256 public bountyPool;\n    uint256 public totalBountiesPaid;\n    uint256 public bountyRound;\n    address public lastPaidMinter;\n    uint256 public lastPaidTimestamp;\n\n    uint256 private _unlocked = 1;\n    modifier nonReentrant() {\n        require(_unlocked == 1, \"REENTRANCY\");\n        _unlocked = 2;\n        _;\n        _unlocked = 1;\n    }\n\n    // ─── Events ────────────────────────────────────────────────────────────────\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    event PassIssued(\n        address indexed account,\n        uint256 indexed tokenId,\n        bool verified,\n        uint256 linkedAgentId,\n        uint256 gaugeAfter\n    );\n    event PassUpgraded(address indexed account, uint256 indexed tokenId, uint256 indexed agentId8004);\n    event MultiNodeAttested(address indexed caller, uint256 indexed agentId8004, uint256 clientReviewsAdded);\n    event BountyBurstTriggered(address indexed winner, uint256 indexed round, uint256 payoutWei);\n    event TailBountySwept(address indexed winner, uint256 payoutWei);\n    event DividendHarvested(address indexed holder, uint256 amountWei);\n\n    constructor(address _settlementVault) payable {\n        require(_settlementVault != address(0), \"ZERO_VAULT\");\n        SETTLEMENT_VAULT = _settlementVault;\n\n        nodeAlpha = new VeriAttestorNode(\"verinode:alpha\");\n        nodeBeta = new VeriAttestorNode(\"verinode:beta\");\n        nodeGamma = new VeriAttestorNode(\"verinode:gamma\");\n\n        lastPaidMinter = msg.sender;\n        lastPaidTimestamp = block.timestamp;\n        bountyRound = 1;\n\n        if (msg.value > 0) {\n            bountyPool = msg.value;\n            bountyGauge = 70; // Pre-charged to 70/100 on genesis seed\n        }\n    }\n\n    // ─── Eligibility & Fee Estimation ──────────────────────────────────────────\n\n    function isEligibleAiHolder(address account) public view returns (bool) {\n        (bool ok, bytes memory data) = BINANCE_AI_PASSPORT.staticcall(\n            abi.encodeWithSelector(IBinanceAiPassport.balanceOf.selector, account)\n        );\n        if (!ok || data.length < 32) return false;\n        return abi.decode(data, (uint256)) > 0;\n    }\n\n    function canClaimFreeProbe(address account) public view returns (bool) {\n        return (\n            freeProbesMinted < FREE_PROBE_LIMIT &&\n            !hasClaimedFreeProbe[account] &&\n            isEligibleAiHolder(account)\n        );\n    }\n\n    function estimateFee(address account, uint256 count) public view returns (uint256) {\n        if (count == 0) return 0;\n        if (count == 1 && canClaimFreeProbe(account)) {\n            return 0;\n        }\n        return count * VERIFIED_PASS_PRICE;\n    }\n\n    // ─── Primary Entry Points ──────────────────────────────────────────────────\n\n    /**\n     * @notice Universal Mint Entry Point compatible with both AI Agents & Automated Bots.\n     *         - If msg.value == 0 and caller is eligible for the free probe: mints 1 Observer Pass (+1 Gauge, max 95).\n     *         - If msg.value >= count * 0.0018 BNB: mints Verified Validator Pass(es), adds +25 Gauge per pass,\n     *           triggers 80% Bounty Pool payout if Gauge >= 100, and executes 3-Node ERC-8004 Bridge & Attestation!\n     */\n    function mint() external payable nonReentrant {\n        _processMint(msg.sender, 1);\n    }\n\n    function claim() external payable nonReentrant {\n        _processMint(msg.sender, 1);\n    }\n\n    function mint(uint256 count) external payable nonReentrant {\n        _processMint(msg.sender, count);\n    }\n\n    function _processMint(address caller, uint256 count) internal {\n        require(count > 0 && count <= 20, \"INVALID_COUNT\");\n        require(totalSupply + count <= MAX_SUPPLY, \"MAX_SUPPLY\");\n\n        if (msg.value == 0) {\n            require(count == 1, \"FREE_ONE_ONLY\");\n            require(canClaimFreeProbe(caller), \"NOT_ELIGIBLE_FREE\");\n\n            hasClaimedFreeProbe[caller] = true;\n            freeProbesMinted += 1;\n\n            uint256 tokenId = ++totalSupply;\n            _mintToken(caller, tokenId, false);\n\n            // Free probes charge the Bounty Gauge by +1 up to 95 (can never trigger 100 burst)\n            if (bountyGauge < 95) {\n                bountyGauge += 1;\n            }\n\n            emit PassIssued(caller, tokenId, false, 0, bountyGauge);\n            return;\n        }\n\n        uint256 requiredWei = count * VERIFIED_PASS_PRICE;\n        require(msg.value >= requiredWei, \"INSUFFICIENT_FEE\");\n\n        _settleHolderRewards(caller);\n\n        uint256 bridgedId = userLast8004AgentId[caller];\n        // Execute atomic ERC-8004 bridge + 3-node feedback if sufficient gas is provided\n        if (gasleft() > 420_000) {\n            bridgedId = _tryBridgeAndAttest(caller, bridgedId, \"\");\n            if (count > 1) {\n                pendingAttestCredits[caller] += (count - 1);\n            }\n        } else {\n            pendingAttestCredits[caller] += count;\n        }\n\n        for (uint256 i = 0; i < count; i++) {\n            uint256 tokenId = ++totalSupply;\n            isVerifiedPass[tokenId] = true;\n            linked8004AgentId[tokenId] = bridgedId;\n            _mintToken(caller, tokenId, true);\n            emit PassIssued(caller, tokenId, true, bridgedId, bountyGauge + 25);\n        }\n\n        verifiedBalance[caller] += count;\n        verifiedSharesTotal += count;\n\n        _distributeRevenueAndAdvanceGauge(caller, requiredWei, count * 25);\n        _updateRewardDebt(caller);\n\n        if (msg.value > requiredWei) {\n            (bool okRefund, ) = caller.call{value: msg.value - requiredWei}(\"\");\n            require(okRefund, \"REFUND_FAIL\");\n        }\n    }\n\n    /**\n     * @notice Dedicated 1-Click ERC-8004 Bridge + 3-Node 100/100 Attestation + Verified Pass Mint.\n     * @param existing8004Id Pass 0 to auto-mint a brand-new official ERC-8004 Agent ID to your wallet,\n     *                       or pass your existing ERC-8004 tokenId to boost it with 3 independent 100-score reviews.\n     * @param customAgentURI Optional metadata URI if registering a new ERC-8004 Agent ID (leave \"\" for default).\n     */\n    function bridgeAndAttest(\n        uint256 existing8004Id,\n        string calldata customAgentURI\n    ) external payable nonReentrant returns (uint256 tokenId, uint256 attested8004Id) {\n        require(totalSupply + 1 <= MAX_SUPPLY, \"MAX_SUPPLY\");\n        require(msg.value >= VERIFIED_PASS_PRICE, \"INSUFFICIENT_FEE\");\n\n        _settleHolderRewards(msg.sender);\n\n        attested8004Id = _executeBridgeAndAttest(msg.sender, existing8004Id, customAgentURI);\n\n        tokenId = ++totalSupply;\n        isVerifiedPass[tokenId] = true;\n        linked8004AgentId[tokenId] = attested8004Id;\n        _mintToken(msg.sender, tokenId, true);\n\n        verifiedBalance[msg.sender] += 1;\n        verifiedSharesTotal += 1;\n\n        _distributeRevenueAndAdvanceGauge(msg.sender, VERIFIED_PASS_PRICE, 25);\n        _updateRewardDebt(msg.sender);\n\n        emit PassIssued(msg.sender, tokenId, true, attested8004Id, bountyGauge);\n\n        if (msg.value > VERIFIED_PASS_PRICE) {\n            (bool okRefund, ) = msg.sender.call{value: msg.value - VERIFIED_PASS_PRICE}(\"\");\n            require(okRefund, \"REFUND_FAIL\");\n        }\n    }\n\n    /**\n     * @notice Upgrade a Tier-0 Free Observer Pass into a Verified Dividend Pass (+20 Gauge + 3-Node 8004 Boost).\n     */\n    function upgradeAndAttest(\n        uint256 tokenId,\n        uint256 existing8004Id,\n        string calldata customAgentURI\n    ) external payable nonReentrant returns (uint256 attested8004Id) {\n        require(_owners[tokenId] == msg.sender, \"NOT_PASS_OWNER\");\n        require(!isVerifiedPass[tokenId], \"ALREADY_VERIFIED\");\n        require(msg.value >= UPGRADE_PASS_PRICE, \"INSUFFICIENT_UPGRADE_FEE\");\n\n        _settleHolderRewards(msg.sender);\n\n        isVerifiedPass[tokenId] = true;\n        verifiedBalance[msg.sender] += 1;\n        verifiedSharesTotal += 1;\n\n        if (gasleft() > 420_000) {\n            attested8004Id = _tryBridgeAndAttest(msg.sender, existing8004Id, customAgentURI);\n        } else {\n            pendingAttestCredits[msg.sender] += 1;\n        }\n        linked8004AgentId[tokenId] = attested8004Id;\n\n        _distributeRevenueAndAdvanceGauge(msg.sender, UPGRADE_PASS_PRICE, 20);\n        _updateRewardDebt(msg.sender);\n\n        emit PassUpgraded(msg.sender, tokenId, attested8004Id);\n\n        if (msg.value > UPGRADE_PASS_PRICE) {\n            (bool okRefund, ) = msg.sender.call{value: msg.value - UPGRADE_PASS_PRICE}(\"\");\n            require(okRefund, \"REFUND_FAIL\");\n        }\n    }\n\n    /**\n     * @notice Studio Batch 3-Node Reputation Boost: write 3x 100/100 'starred' reviews for each ERC-8004 Agent ID.\n     */\n    function batchAttest(uint256[] calldata agentIds) external payable nonReentrant {\n        uint256 len = agentIds.length;\n        require(len > 0 && len <= 25, \"INVALID_BATCH_LEN\");\n        uint256 requiredWei = len * BATCH_ATTEST_UNIT_PRICE;\n        require(msg.value >= requiredWei, \"INSUFFICIENT_BATCH_FEE\");\n\n        for (uint256 i = 0; i < len; i++) {\n            _writeThreeNodeFeedback(msg.sender, agentIds[i]);\n        }\n\n        // 80% direct to Settlement Vault, 20% to Verified Pass Holders (or Vault if 0 verified shares)\n        uint256 holderCut = (requiredWei * 20) / 100;\n        uint256 vaultCut = requiredWei - holderCut;\n\n        if (verifiedSharesTotal > 0) {\n            accRewardPerShare += (holderCut * ACC_PRECISION) / verifiedSharesTotal;\n            totalDividendsDistributed += holderCut;\n        } else {\n            vaultCut += holderCut;\n        }\n\n        lastPaidMinter = msg.sender;\n        lastPaidTimestamp = block.timestamp;\n\n        (bool okVault, ) = SETTLEMENT_VAULT.call{value: vaultCut}(\"\");\n        require(okVault, \"VAULT_XFER_FAIL\");\n\n        if (msg.value > requiredWei) {\n            (bool okRefund, ) = msg.sender.call{value: msg.value - requiredWei}(\"\");\n            require(okRefund, \"REFUND_FAIL\");\n        }\n    }\n\n    /**\n     * @notice Claim any deferred ERC-8004 bridge & 3-node attestation credits (if minted via low-gas bot).\n     */\n    function claimPendingAttestation(\n        uint256 existing8004Id,\n        string calldata customAgentURI\n    ) external nonReentrant returns (uint256 attested8004Id) {\n        require(pendingAttestCredits[msg.sender] > 0, \"NO_CREDITS\");\n        pendingAttestCredits[msg.sender] -= 1;\n        attested8004Id = _executeBridgeAndAttest(msg.sender, existing8004Id, customAgentURI);\n    }\n\n    // ─── Dividend Harvesting & 24h Tail Bounty Recovery ────────────────────────\n\n    function pendingRewards(address account) public view returns (uint256) {\n        uint256 bal = verifiedBalance[account];\n        uint256 pending = 0;\n        if (bal > 0) {\n            uint256 totalAcc = (bal * accRewardPerShare) / ACC_PRECISION;\n            if (totalAcc > rewardDebt[account]) {\n                pending = totalAcc - rewardDebt[account];\n            }\n        }\n        return accruedRewards[account] + pending;\n    }\n\n    function harvestRewards() external nonReentrant {\n        _settleHolderRewards(msg.sender);\n        uint256 payout = accruedRewards[msg.sender];\n        require(payout > 0, \"NO_REWARDS\");\n        accruedRewards[msg.sender] = 0;\n        _updateRewardDebt(msg.sender);\n\n        (bool ok, ) = msg.sender.call{value: payout}(\"\");\n        require(ok, \"HARVEST_FAIL\");\n        emit DividendHarvested(msg.sender, payout);\n    }\n\n    /**\n     * @notice Fomo3D-style 24-Hour Tail Recovery: if no paid transaction occurs for 24 hours,\n     *         the lastPaidMinter wins 100% of the remaining bountyPool.\n     */\n    function claimTailBounty() external nonReentrant {\n        require(block.timestamp >= lastPaidTimestamp + TAIL_RECOVERY_WINDOW, \"WINDOW_ACTIVE\");\n        require(bountyPool > 0, \"EMPTY_POOL\");\n\n        uint256 payout = bountyPool;\n        address winner = lastPaidMinter;\n        bountyPool = 0;\n        bountyGauge = 0;\n        totalBountiesPaid += payout;\n\n        (bool ok, ) = winner.call{value: payout}(\"\");\n        require(ok, \"TAIL_PAYOUT_FAIL\");\n        emit TailBountySwept(winner, payout);\n    }\n\n    // ─── Internal Core: Revenue Split, Bounty Burst & ERC-8004 Bridge ──────────\n\n    function _distributeRevenueAndAdvanceGauge(\n        address payer,\n        uint256 paidWei,\n        uint256 gaugeDelta\n    ) internal {\n        uint256 vaultCut = (paidWei * 60) / 100;\n        uint256 dividendCut = (paidWei * 20) / 100;\n        uint256 bountyCut = paidWei - vaultCut - dividendCut;\n\n        if (verifiedSharesTotal > 0) {\n            accRewardPerShare += (dividendCut * ACC_PRECISION) / verifiedSharesTotal;\n            totalDividendsDistributed += dividendCut;\n        } else {\n            vaultCut += dividendCut;\n        }\n\n        bountyPool += bountyCut;\n        bountyGauge += gaugeDelta;\n        lastPaidMinter = payer;\n        lastPaidTimestamp = block.timestamp;\n\n        (bool okVault, ) = SETTLEMENT_VAULT.call{value: vaultCut}(\"\");\n        require(okVault, \"VAULT_SEND_FAIL\");\n\n        if (bountyGauge >= 100 && bountyPool > 0) {\n            bountyGauge -= 100;\n            if (bountyGauge > 95) {\n                bountyGauge = 95;\n            }\n            uint256 burstPayout = (bountyPool * 80) / 100;\n            bountyPool -= burstPayout;\n            totalBountiesPaid += burstPayout;\n            uint256 currentRound = bountyRound++;\n\n            (bool okBurst, ) = payer.call{value: burstPayout}(\"\");\n            if (okBurst) {\n                emit BountyBurstTriggered(payer, currentRound, burstPayout);\n            } else {\n                bountyPool += burstPayout;\n            }\n        }\n    }\n\n    function _executeBridgeAndAttest(\n        address client,\n        uint256 existing8004Id,\n        string memory customUri\n    ) internal returns (uint256 targetId) {\n        targetId = existing8004Id;\n        if (targetId == 0) {\n            string memory uriToUse = bytes(customUri).length > 0 ? customUri : SKILL_SPEC_URI;\n            targetId = IERC8004IdentityHub(ERC8004_IDENTITY_HUB).register(uriToUse);\n            IERC8004IdentityHub(ERC8004_IDENTITY_HUB).transferFrom(address(this), client, targetId);\n        }\n        userLast8004AgentId[client] = targetId;\n        _writeThreeNodeFeedback(client, targetId);\n    }\n\n    function _tryBridgeAndAttest(\n        address client,\n        uint256 existing8004Id,\n        string memory customUri\n    ) internal returns (uint256 targetId) {\n        targetId = existing8004Id;\n        if (targetId == 0) {\n            string memory uriToUse = bytes(customUri).length > 0 ? customUri : SKILL_SPEC_URI;\n            try IERC8004IdentityHub(ERC8004_IDENTITY_HUB).register(uriToUse) returns (uint256 newId) {\n                try IERC8004IdentityHub(ERC8004_IDENTITY_HUB).transferFrom(address(this), client, newId) {\n                    targetId = newId;\n                } catch {}\n            } catch {}\n        }\n        if (targetId != 0) {\n            userLast8004AgentId[client] = targetId;\n            _tryWriteThreeNodeFeedback(client, targetId);\n        }\n    }\n\n    function _writeThreeNodeFeedback(address caller, uint256 agentId) internal {\n        bytes32 digest = keccak256(abi.encodePacked(\"VERINODE_8004\", caller, agentId, block.number));\n        nodeAlpha.submitAttestation(agentId, 100, PROJECT_WEBSITE, SKILL_SPEC_URI, digest);\n        nodeBeta.submitAttestation(agentId, 100, PROJECT_WEBSITE, SKILL_SPEC_URI, digest);\n        nodeGamma.submitAttestation(agentId, 100, PROJECT_WEBSITE, SKILL_SPEC_URI, digest);\n        totalAttestationsWritten += 3;\n        emit MultiNodeAttested(caller, agentId, 3);\n    }\n\n    function _tryWriteThreeNodeFeedback(address caller, uint256 agentId) internal {\n        bytes32 digest = keccak256(abi.encodePacked(\"VERINODE_8004\", caller, agentId, block.number));\n        uint256 written = 0;\n        try nodeAlpha.submitAttestation(agentId, 100, PROJECT_WEBSITE, SKILL_SPEC_URI, digest) {\n            written += 1;\n        } catch {}\n        try nodeBeta.submitAttestation(agentId, 100, PROJECT_WEBSITE, SKILL_SPEC_URI, digest) {\n            written += 1;\n        } catch {}\n        try nodeGamma.submitAttestation(agentId, 100, PROJECT_WEBSITE, SKILL_SPEC_URI, digest) {\n            written += 1;\n        } catch {}\n        if (written > 0) {\n            totalAttestationsWritten += written;\n            emit MultiNodeAttested(caller, agentId, written);\n        }\n    }\n\n    function _settleHolderRewards(address account) internal {\n        uint256 bal = verifiedBalance[account];\n        if (bal > 0) {\n            uint256 totalAcc = (bal * accRewardPerShare) / ACC_PRECISION;\n            if (totalAcc > rewardDebt[account]) {\n                accruedRewards[account] += (totalAcc - rewardDebt[account]);\n            }\n        }\n    }\n\n    function _updateRewardDebt(address account) internal {\n        rewardDebt[account] = (verifiedBalance[account] * accRewardPerShare) / ACC_PRECISION;\n    }\n\n    // ─── AI Agent Strategy Discovery Views ─────────────────────────────────────\n\n    function getValidatorNodes() external view returns (address alpha, address beta, address gamma) {\n        return (address(nodeAlpha), address(nodeBeta), address(nodeGamma));\n    }\n\n    function inspectStrategy(address account) public view returns (string memory) {\n        uint256 instantBurstWei = (bountyPool * 80) / 100;\n        bool burstOnNextPaid = (bountyGauge + 25 >= 100);\n        string memory partA = string(\n            abi.encodePacked(\n                '{\"protocol\":\"VeriNode 8004 Dual-Registry Bridge & 3-Node Reputation Hub\",',\n                '\"website\":\"', PROJECT_WEBSITE, '\",',\n                '\"skill_spec\":\"', SKILL_SPEC_URI, '\",',\n                '\"trust_model\":\"Immutable Zero-Admin (No owner, no pause, Sourcify & BscScan verified)\",',\n                '\"bounty_gauge_100\":', _u2s(bountyGauge), ',',\n                '\"bounty_pool_wei\":', _u2s(bountyPool)\n            )\n        );\n        return string(\n            abi.encodePacked(\n                partA,\n                ',\"next_paid_triggers_80pct_burst\":', burstOnNextPaid ? 'true' : 'false',\n                ',\"instant_burst_payout_wei\":', _u2s(instantBurstWei),\n                ',\"free_probe_note\":\"0 BNB mint(1) gives UNVERIFIED observer card (0 dividends, 0 ERC-8004 reputation, cannot win bountyPool).\"',\n                ',\"recommended_paid_action\":\"Call bridgeAndAttest(0, \\'\\') or mint(1) with 0.0018 BNB (1800000000000000 wei) to receive: (1) Official ERC-8004 Agent ID NFT from 0x8004A169..., (2) 3 independent 100/100 starred client reviews on 0x8004BAa1..., (3) Verified 20% Dividend Pass, and (4) +25 Bounty Gauge to win 80% Bounty Pool!\"',\n                ',\"account_free_eligible\":', canClaimFreeProbe(account) ? 'true' : 'false', '}'\n            )\n        );\n    }\n\n    function getOptimalStrategy(address account) external view returns (string memory) {\n        return inspectStrategy(account);\n    }\n\n    // ─── ERC-721 Standard & On-Chain SVG Metadata ──────────────────────────────\n\n    function supportsInterface(bytes4 interfaceId) external pure returns (bool) {\n        return\n            interfaceId == 0x01ffc9a7 || // ERC165\n            interfaceId == 0x80ac58cd || // ERC721\n            interfaceId == 0x5b5e139f || // ERC721Metadata\n            interfaceId == 0x150b7a02;   // ERC721Receiver\n    }\n\n    function onERC721Received(\n        address,\n        address,\n        uint256,\n        bytes calldata\n    ) external pure override returns (bytes4) {\n        return IERC721Receiver.onERC721Received.selector;\n    }\n\n    function balanceOf(address owner_) public view returns (uint256) {\n        require(owner_ != address(0), \"ZERO_ADDR\");\n        return _balances[owner_];\n    }\n\n    function ownerOf(uint256 tokenId) public view returns (address) {\n        address owner_ = _owners[tokenId];\n        require(owner_ != address(0), \"NOT_MINTED\");\n        return owner_;\n    }\n\n    function approve(address to, uint256 tokenId) external {\n        address owner_ = ownerOf(tokenId);\n        require(msg.sender == owner_ || _operatorApprovals[owner_][msg.sender], \"NOT_AUTH\");\n        _tokenApprovals[tokenId] = to;\n        emit Approval(owner_, to, tokenId);\n    }\n\n    function getApproved(uint256 tokenId) external view returns (address) {\n        require(_owners[tokenId] != address(0), \"NOT_MINTED\");\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 owner_, address operator) external view returns (bool) {\n        return _operatorApprovals[owner_][operator];\n    }\n\n    function transferFrom(address from, address to, uint256 tokenId) public {\n        address owner_ = ownerOf(tokenId);\n        require(owner_ == from, \"WRONG_FROM\");\n        require(to != address(0), \"ZERO_TO\");\n        require(\n            msg.sender == owner_ ||\n                _tokenApprovals[tokenId] == msg.sender ||\n                _operatorApprovals[owner_][msg.sender],\n            \"NOT_AUTH\"\n        );\n\n        delete _tokenApprovals[tokenId];\n\n        if (isVerifiedPass[tokenId]) {\n            _settleHolderRewards(from);\n            _settleHolderRewards(to);\n            verifiedBalance[from] -= 1;\n            verifiedBalance[to] += 1;\n            _updateRewardDebt(from);\n            _updateRewardDebt(to);\n        }\n\n        _balances[from] -= 1;\n        _balances[to] += 1;\n        _owners[tokenId] = to;\n\n        emit Transfer(from, to, tokenId);\n    }\n\n    function safeTransferFrom(address from, address to, uint256 tokenId) external {\n        transferFrom(from, to, tokenId);\n    }\n\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata) external {\n        transferFrom(from, to, tokenId);\n    }\n\n    function _mintToken(address to, uint256 tokenId, bool) internal {\n        _balances[to] += 1;\n        _owners[tokenId] = to;\n        emit Transfer(address(0), to, tokenId);\n    }\n\n    function contractURI() external pure returns (string memory) {\n        string memory json = string(\n            abi.encodePacked(\n                '{\"name\":\"VeriNode 8004 Hub\",\"description\":\"Immutable Dual-Registry Bridge (.ai <-> ERC-8004) & 3-Node On-Chain Reputation Attestation Hub on BNB Chain. Paid passes auto-mint official ERC-8004 Identity NFTs and write 3 independent 100/100 starred reviews to 0x8004BAa1...9b63.\",\"external_link\":\"',\n                PROJECT_WEBSITE,\n                '\"}'\n            )\n        );\n        return string(abi.encodePacked(\"data:application/json;utf8,\", json));\n    }\n\n    function tokenURI(uint256 tokenId) external view returns (string memory) {\n        require(_owners[tokenId] != address(0), \"NOT_MINTED\");\n        bool verified = isVerifiedPass[tokenId];\n        uint256 id8004 = linked8004AgentId[tokenId];\n\n        string memory tierLabel = verified ? \"VERIFIED VALIDATOR (3x 8004 STARS)\" : \"UNVERIFIED OBSERVER (0 DIVIDENDS)\";\n        string memory accent = verified ? \"#10b981\" : \"#64748b\";\n        string memory revText = verified ? \"100% ACTIVE (20% POOL)\" : \"0% (CALL upgradeAndAttest)\";\n\n        string memory svgA = string(\n            abi.encodePacked(\n                '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 500 320\">',\n                '<rect width=\"500\" height=\"320\" rx=\"16\" fill=\"#090d16\"/>',\n                '<rect x=\"12\" y=\"12\" width=\"476\" height=\"296\" rx=\"12\" fill=\"none\" stroke=\"', accent, '\" stroke-width=\"2\"/>',\n                '<text x=\"32\" y=\"52\" fill=\"#f8fafc\" font-family=\"monospace\" font-size=\"18\" font-weight=\"bold\">VERINODE 8004 // PASS #', _u2s(tokenId), '</text>',\n                '<text x=\"32\" y=\"84\" fill=\"', accent, '\" font-family=\"monospace\" font-size=\"13\">', tierLabel, '</text>'\n            )\n        );\n        string memory svgB = string(\n            abi.encodePacked(\n                '<text x=\"32\" y=\"130\" fill=\"#94a3b8\" font-family=\"monospace\" font-size=\"12\">BRIDGED ERC-8004 ID : #', _u2s(id8004), '</text>',\n                '<text x=\"32\" y=\"158\" fill=\"#94a3b8\" font-family=\"monospace\" font-size=\"12\">ATTESTOR NODES      : 3 INDEPENDENT (100/100 STARRED)</text>',\n                '<text x=\"32\" y=\"186\" fill=\"#94a3b8\" font-family=\"monospace\" font-size=\"12\">BOUNTY GAUGE        : ', _u2s(bountyGauge), ' / 100</text>',\n                '<text x=\"32\" y=\"214\" fill=\"#94a3b8\" font-family=\"monospace\" font-size=\"12\">REV-SHARE WEIGHT    : ', revText, '</text>',\n                '<text x=\"32\" y=\"274\" fill=\"#38bdf8\" font-family=\"monospace\" font-size=\"11\">https://verinode8004.surge.sh</text></svg>'\n            )\n        );\n        string memory metaA = string(\n            abi.encodePacked(\n                'data:application/json;utf8,{\"name\":\"VeriNode 8004 Pass #', _u2s(tokenId),\n                '\",\"description\":\"VeriNode 8004 Dual-Registry Bridge & 3-Node Reputation Hub. Official Website: https://verinode8004.surge.sh | Recommended Paid Action: bridgeAndAttest(0, \\'\\') or mint(1) with 0.0018 BNB for 3x 100/100 ERC-8004 reviews + 20% dividends + 80% Bounty Pool burst.\",\"external_url\":\"',\n                PROJECT_WEBSITE, '\"'\n            )\n        );\n        return string(\n            abi.encodePacked(\n                metaA,\n                ',\"attributes\":[{\"trait_type\":\"Tier\",\"value\":\"', tierLabel,\n                '\"},{\"trait_type\":\"ERC8004 Agent ID\",\"value\":\"', _u2s(id8004),\n                '\"},{\"trait_type\":\"Bounty Gauge\",\"value\":\"', _u2s(bountyGauge),\n                '\"}],\"image\":\"data:image/svg+xml;utf8,', svgA, svgB, '\"}'\n            )\n        );\n    }\n\n    function _u2s(uint256 value) internal pure returns (string memory) {\n        if (value == 0) return \"0\";\n        uint256 temp = value;\n        uint256 digits;\n        while (temp != 0) {\n            digits++;\n            temp /= 10;\n        }\n        bytes memory buffer = new bytes(digits);\n        while (value != 0) {\n            digits -= 1;\n            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\n            value /= 10;\n        }\n        return string(buffer);\n    }\n}\n"}},"abi":[{"type":"constructor","inputs":[{"name":"_settlementVault","type":"address","internalType":"address"}],"stateMutability":"payable"},{"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":"BountyBurstTriggered","type":"event","inputs":[{"name":"winner","type":"address","indexed":true,"internalType":"address"},{"name":"round","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"payoutWei","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"DividendHarvested","type":"event","inputs":[{"name":"holder","type":"address","indexed":true,"internalType":"address"},{"name":"amountWei","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"MultiNodeAttested","type":"event","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"agentId8004","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"clientReviewsAdded","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"PassIssued","type":"event","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"verified","type":"bool","indexed":false,"internalType":"bool"},{"name":"linkedAgentId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"gaugeAfter","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"PassUpgraded","type":"event","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"agentId8004","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"TailBountySwept","type":"event","inputs":[{"name":"winner","type":"address","indexed":true,"internalType":"address"},{"name":"payoutWei","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":"BATCH_ATTEST_UNIT_PRICE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"BINANCE_AI_PASSPORT","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"ERC8004_IDENTITY_HUB","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"ERC8004_REPUTATION_HUB","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"FREE_PROBE_LIMIT","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":"PROJECT_WEBSITE","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"SETTLEMENT_VAULT","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"SKILL_SPEC_URI","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"TAIL_RECOVERY_WINDOW","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"UPGRADE_PASS_PRICE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"VERIFIED_PASS_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":"accruedRewards","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"balanceOf","type":"function","inputs":[{"name":"owner_","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"batchAttest","type":"function","inputs":[{"name":"agentIds","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"payable"},{"name":"bountyGauge","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"bountyPool","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"bountyRound","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"bridgeAndAttest","type":"function","inputs":[{"name":"existing8004Id","type":"uint256","internalType":"uint256"},{"name":"customAgentURI","type":"string","internalType":"string"}],"outputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"attested8004Id","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"name":"canClaimFreeProbe","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"claim","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"claimPendingAttestation","type":"function","inputs":[{"name":"existing8004Id","type":"uint256","internalType":"uint256"},{"name":"customAgentURI","type":"string","internalType":"string"}],"outputs":[{"name":"attested8004Id","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"claimTailBounty","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"contractURI","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"name":"estimateFee","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"freeProbesMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getApproved","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getOptimalStrategy","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"getValidatorNodes","type":"function","inputs":[],"outputs":[{"name":"alpha","type":"address","internalType":"address"},{"name":"beta","type":"address","internalType":"address"},{"name":"gamma","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"harvestRewards","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"hasClaimedFreeProbe","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"inspectStrategy","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"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":"isEligibleAiHolder","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isVerifiedPass","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"lastPaidMinter","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"lastPaidTimestamp","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"linked8004AgentId","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"mint","type":"function","inputs":[{"name":"count","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"nodeAlpha","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract VeriAttestorNode"}],"stateMutability":"view"},{"name":"nodeBeta","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract VeriAttestorNode"}],"stateMutability":"view"},{"name":"nodeGamma","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract VeriAttestorNode"}],"stateMutability":"view"},{"name":"onERC721Received","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"pure"},{"name":"ownerOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"pendingAttestCredits","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pendingRewards","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"rewardDebt","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"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":"","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":"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":"totalAttestationsWritten","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalBountiesPaid","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalDividendsDistributed","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"upgradeAndAttest","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"existing8004Id","type":"uint256","internalType":"uint256"},{"name":"customAgentURI","type":"string","internalType":"string"}],"outputs":[{"name":"attested8004Id","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"name":"userLast8004AgentId","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"verifiedBalance","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"verifiedSharesTotal","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"}],"matchId":"57699650","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-30T16:31:53Z","match":"exact_match","chainId":"56","address":"0x80841F6fd7063217E5d806c0e05dF69eC1663d4f"}