agentex-creator-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/LICENSE +21 -0
  3. package/README.md +195 -0
  4. package/dist/packages/contracts/src/deployer-investigation.d.ts +1015 -0
  5. package/dist/packages/contracts/src/deployer-investigation.js +101 -0
  6. package/dist/packages/contracts/src/index.d.ts +1701 -0
  7. package/dist/packages/contracts/src/index.js +380 -0
  8. package/dist/packages/contracts/src/indexed-activity.d.ts +684 -0
  9. package/dist/packages/contracts/src/indexed-activity.js +71 -0
  10. package/dist/packages/contracts/src/indexed-agents.d.ts +299 -0
  11. package/dist/packages/contracts/src/indexed-agents.js +131 -0
  12. package/dist/packages/contracts/src/inspection.d.ts +906 -0
  13. package/dist/packages/contracts/src/inspection.js +114 -0
  14. package/dist/packages/contracts/src/kinds.d.ts +5398 -0
  15. package/dist/packages/contracts/src/kinds.js +156 -0
  16. package/dist/packages/contracts/src/report-presentation.d.ts +346 -0
  17. package/dist/packages/contracts/src/report-presentation.js +120 -0
  18. package/dist/packages/contracts/src/solana-inspection.d.ts +451 -0
  19. package/dist/packages/contracts/src/solana-inspection.js +94 -0
  20. package/dist/packages/contracts/src/token-market.d.ts +193 -0
  21. package/dist/packages/contracts/src/token-market.js +335 -0
  22. package/dist/packages/contracts/src/wallet-analysis.d.ts +866 -0
  23. package/dist/packages/contracts/src/wallet-analysis.js +89 -0
  24. package/dist/packages/contracts/src/watchtower.d.ts +1141 -0
  25. package/dist/packages/contracts/src/watchtower.js +196 -0
  26. package/dist/packages/contracts/src/workflow.d.ts +1568 -0
  27. package/dist/packages/contracts/src/workflow.js +651 -0
  28. package/dist/packages/inspector/src/decode.d.ts +23 -0
  29. package/dist/packages/inspector/src/decode.js +150 -0
  30. package/dist/packages/inspector/src/scope.d.ts +87 -0
  31. package/dist/packages/inspector/src/scope.js +64 -0
  32. package/dist/packages/model/src/analysis.d.ts +149 -0
  33. package/dist/packages/model/src/analysis.js +387 -0
  34. package/dist/packages/model/src/pricing.d.ts +38 -0
  35. package/dist/packages/model/src/pricing.js +49 -0
  36. package/dist/packages/model/src/retry.d.ts +20 -0
  37. package/dist/packages/model/src/retry.js +31 -0
  38. package/dist/packages/model/src/schema.d.ts +10 -0
  39. package/dist/packages/model/src/schema.js +51 -0
  40. package/dist/packages/model/src/summary.d.ts +91 -0
  41. package/dist/packages/model/src/summary.js +177 -0
  42. package/dist/packages/model/src/types.d.ts +81 -0
  43. package/dist/packages/model/src/types.js +19 -0
  44. package/dist/packages/monitoring/src/delivery.d.ts +32 -0
  45. package/dist/packages/monitoring/src/delivery.js +53 -0
  46. package/dist/packages/providers/src/chain-transport.d.ts +42 -0
  47. package/dist/packages/providers/src/chain-transport.js +57 -0
  48. package/dist/packages/providers/src/coverage.d.ts +105 -0
  49. package/dist/packages/providers/src/coverage.js +260 -0
  50. package/dist/packages/providers/src/health.d.ts +273 -0
  51. package/dist/packages/providers/src/health.js +505 -0
  52. package/dist/packages/providers/src/keyed.d.ts +96 -0
  53. package/dist/packages/providers/src/keyed.js +240 -0
  54. package/dist/packages/providers/src/snapshot.d.ts +61 -0
  55. package/dist/packages/providers/src/snapshot.js +77 -0
  56. package/dist/packages/publication/src/fixtures.d.ts +45 -0
  57. package/dist/packages/publication/src/fixtures.js +350 -0
  58. package/dist/packages/research/src/index.d.ts +188 -0
  59. package/dist/packages/research/src/index.js +829 -0
  60. package/dist/packages/runtime/src/checkpoints.d.ts +65 -0
  61. package/dist/packages/runtime/src/checkpoints.js +214 -0
  62. package/dist/packages/runtime/src/policy.d.ts +57 -0
  63. package/dist/packages/runtime/src/policy.js +296 -0
  64. package/dist/packages/sdk/src/bin/agentex-buyer.d.ts +2 -0
  65. package/dist/packages/sdk/src/bin/agentex-buyer.js +4 -0
  66. package/dist/packages/sdk/src/bin/agentex.d.ts +2 -0
  67. package/dist/packages/sdk/src/bin/agentex.js +3 -0
  68. package/dist/packages/sdk/src/buyer-cli.d.ts +10 -0
  69. package/dist/packages/sdk/src/buyer-cli.js +210 -0
  70. package/dist/packages/sdk/src/buyer.d.ts +534 -0
  71. package/dist/packages/sdk/src/buyer.js +441 -0
  72. package/dist/packages/sdk/src/cli.d.ts +14 -0
  73. package/dist/packages/sdk/src/cli.js +149 -0
  74. package/dist/packages/sdk/src/errors.d.ts +31 -0
  75. package/dist/packages/sdk/src/errors.js +24 -0
  76. package/dist/packages/sdk/src/index.d.ts +236 -0
  77. package/dist/packages/sdk/src/index.js +150 -0
  78. package/dist/packages/sdk/src/local.d.ts +11 -0
  79. package/dist/packages/sdk/src/local.js +110 -0
  80. package/dist/packages/sdk/src/rails.d.ts +59 -0
  81. package/dist/packages/sdk/src/rails.js +96 -0
  82. package/dist/packages/sdk/src/report.d.ts +121 -0
  83. package/dist/packages/sdk/src/report.js +114 -0
  84. package/dist/packages/sdk/src/version.d.ts +2 -0
  85. package/dist/packages/sdk/src/version.js +2 -0
  86. package/dist/packages/watchtower/src/index.d.ts +150 -0
  87. package/dist/packages/watchtower/src/index.js +786 -0
  88. package/dist/packages/workflow/src/registry.d.ts +61 -0
  89. package/dist/packages/workflow/src/registry.js +76 -0
  90. package/examples/README.md +34 -0
  91. package/examples/cli-usage.sh +30 -0
  92. package/examples/fixtures/base-weth-input.json +4 -0
  93. package/examples/focused-researcher.json +127 -0
  94. package/examples/pay-with-eth-robinhood.mts +37 -0
  95. package/examples/pay-with-usdc.mts +41 -0
  96. package/examples/quickstart.mts +73 -0
  97. package/package.json +50 -0
@@ -0,0 +1,105 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * E05 server-side coverage. Every (chain, tool@version) pair that can execute is listed with the evidence that verified it.
4
+ * Admission, listing and quoting code calls `assertToolCoverage`, `coveredChains` or `listingCoverage`: an unlisted, wrong-version,
5
+ * fixture-only or credential-gated capability is refused, never treated as an empty result. Evidence paths are repository-relative.
6
+ */
7
+ export declare const CoverageChainSchema: z.ZodEnum<{
8
+ ethereum: "ethereum";
9
+ base: "base";
10
+ robinhood: "robinhood";
11
+ "robinhood-testnet": "robinhood-testnet";
12
+ solana: "solana";
13
+ "solana-devnet": "solana-devnet";
14
+ }>;
15
+ export type CoverageChain = z.infer<typeof CoverageChainSchema>;
16
+ export type CoverageStatus = 'live-verified' | 'live-verified-partial' | 'fixture-only' | 'disabled';
17
+ export type CoverageSource = 'public-rpc' | 'alchemy' | 'helius' | 'offline-decoder' | 'public-web';
18
+ export interface CoverageEntry {
19
+ chain: CoverageChain;
20
+ tool: string;
21
+ version: string;
22
+ capability: string;
23
+ source: CoverageSource;
24
+ status: CoverageStatus;
25
+ /** Credential that must be configured server-side for this entry to run. */
26
+ credential: 'ALCHEMY_API_KEY' | 'HELIUS_API_KEY' | null;
27
+ evidence: readonly string[];
28
+ protocolVersions: string;
29
+ gaps: readonly string[];
30
+ }
31
+ export declare const CHAIN_COVERAGE: readonly CoverageEntry[];
32
+ /**
33
+ * Declared source gaps: capabilities with no verified free source. Agents withhold these results and label them unavailable;
34
+ * nothing is converted to zero or inferred from another capability.
35
+ */
36
+ export interface SourceGap {
37
+ capability: string;
38
+ chains: readonly CoverageChain[];
39
+ neededBy: readonly string[];
40
+ requiredProviderClass: string;
41
+ freeCandidates: string;
42
+ agentBehaviour: string;
43
+ }
44
+ export declare const SOURCE_GAPS: readonly SourceGap[];
45
+ export type CoverageDenial = 'chain-not-covered' | 'chain-disabled' | 'capability-unverified' | 'credential-required' | 'version-required' | 'version-not-covered' | 'no-tools-declared';
46
+ export declare class CoverageError extends Error {
47
+ readonly category: CoverageDenial;
48
+ readonly code = "COVERAGE_DENIED";
49
+ constructor(category: CoverageDenial, message: string);
50
+ }
51
+ export interface CoverageOptions {
52
+ env?: Record<string, string | undefined>; /** Fixture-only coverage is admitted only in explicit local fixture tests. */
53
+ allowFixtureOnly?: boolean;
54
+ }
55
+ /** Entries for a chain, each with whether it can run now on this server. */
56
+ export declare function coverageFor(chain: string, options?: CoverageOptions): {
57
+ available: boolean;
58
+ chain: CoverageChain;
59
+ tool: string;
60
+ version: string;
61
+ capability: string;
62
+ source: CoverageSource;
63
+ status: CoverageStatus;
64
+ /** Credential that must be configured server-side for this entry to run. */
65
+ credential: "ALCHEMY_API_KEY" | "HELIUS_API_KEY" | null;
66
+ evidence: readonly string[];
67
+ protocolVersions: string;
68
+ gaps: readonly string[];
69
+ }[];
70
+ /** Throws `CoverageError` unless `tool` (exactly `id@version`) is covered on `chain` and runnable with the server's credentials. */
71
+ export declare function assertToolCoverage(chain: string, tool: string, options?: CoverageOptions): CoverageEntry;
72
+ /** Per-chain decisions for a listing or quote. A listing that declares no deterministic tools cannot claim any chain. */
73
+ export declare function listingCoverage(declaredChains: readonly string[], tools: readonly string[], options?: CoverageOptions): ({
74
+ chain: string;
75
+ covered: boolean;
76
+ denials: {
77
+ tool: null;
78
+ category: CoverageDenial;
79
+ message: string;
80
+ }[];
81
+ } | {
82
+ chain: string;
83
+ covered: boolean;
84
+ denials: {
85
+ tool: string;
86
+ category: CoverageDenial;
87
+ message: string;
88
+ }[];
89
+ })[];
90
+ /** For listings and quotes: the declared chains on which every declared tool is covered. Unknown chains and empty tool lists yield none. */
91
+ export declare function coveredChains(declaredChains: readonly string[], tools: readonly string[], options?: CoverageOptions): string[];
92
+ /** Public summary without evidence paths, hosts or keys: safe for capabilities and listing endpoints. */
93
+ export declare function coverageSummary(options?: CoverageOptions): {
94
+ chain: "ethereum" | "base" | "robinhood" | "robinhood-testnet" | "solana" | "solana-devnet";
95
+ entries: {
96
+ tool: string;
97
+ version: string;
98
+ capability: string;
99
+ source: CoverageSource;
100
+ status: CoverageStatus;
101
+ available: boolean;
102
+ protocolVersions: string;
103
+ gaps: readonly string[];
104
+ }[];
105
+ }[];
@@ -0,0 +1,260 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * E05 server-side coverage. Every (chain, tool@version) pair that can execute is listed with the evidence that verified it.
4
+ * Admission, listing and quoting code calls `assertToolCoverage`, `coveredChains` or `listingCoverage`: an unlisted, wrong-version,
5
+ * fixture-only or credential-gated capability is refused, never treated as an empty result. Evidence paths are repository-relative.
6
+ */
7
+ export const CoverageChainSchema = z.enum(['ethereum', 'base', 'robinhood', 'robinhood-testnet', 'solana', 'solana-devnet']);
8
+ const T = 'packages/tools/evidence/';
9
+ const I = 'packages/inspector/evidence/';
10
+ const A = 'docs/evidence/indexed-agents/';
11
+ const entry = (value) => Object.freeze({ ...value, version: value.version ?? '0.1.0', evidence: Object.freeze([...value.evidence]), gaps: Object.freeze([...value.gaps]) });
12
+ const LICENCE_GAP = 'Alchemy index data (Transfers, Token and NFT APIs) is used under Alchemy\'s written approval for AGENTEX reports; it is the provider\'s index view, not a chain-state read.';
13
+ const RH_SNAPSHOT = 'Runs read the latest block (sequencer-confirmed, not finalized), pinned by block hash (EIP-1898) and rechecked at completion. The linked live evidence predates the instant-read change and was captured at the safe block.';
14
+ const RH_ALCHEMY = 'Verified through Alchemy. The official RPC serves only about the last 1,000 blocks of state (robinhood-history-depth evidence); failover to it is not live-verified for these tools.';
15
+ /** Protocol surfaces read by the catalog research tools (packages/tools/src/evm-*.ts and solana-research.ts). */
16
+ const RESEARCH_PROTOCOLS = {
17
+ 'evm.rollup-controls': 'Base (OP Stack) and Robinhood Chain (Arbitrum Orbit, BoLD) L1 contracts at documented addresses: version(), paused(), owner() and ProxyAdmin getProxyAdmin/getProxyImplementation; OptimismPortal proofMaturityDelaySeconds and respectedGameType, DisputeGameFactory gameImpls and gameCount, AnchorStateRegistry, SystemConfig and SuperchainConfig; Rollup confirmPeriodBlocks, validator whitelist, getValidators/isValidator and baseStake, SequencerInbox maxTimeVariation and the Rollup EIP-1967 slots; UpgradeExecutor hasRole; Safe getThreshold/getOwners and TimelockController getMinDelay per controller; Multicall3 aggregate3 with per-target isolation; no event history',
18
+ 'evm.transaction-flows': 'eth_getTransactionByHash, eth_getTransactionReceipt and eth_getBlockByHash; debug_traceTransaction with the prestateTracer in diff mode (storage and code omitted, the only tracer the runtime permits); ERC-20 symbol and decimals via Multicall3; ERC-20 and ERC-721 Transfer events from the receipt',
19
+ 'evm.admin-history': 'EIP-1967 implementation, admin and beacon slots (legacy ZeppelinOS slots as fallback); owner(), pendingOwner(), paused() and the ProxyAdmin owner() via Multicall3; full-history eth_getLogs from block 0 over the contract, its proxy admin and beacon for Upgraded, AdminChanged, BeaconUpgraded, OwnershipTransferred, OwnershipTransferStarted, RoleGranted, RoleRevoked, RoleAdminChanged, Paused and Unpaused, bisected within five pages; log blockTimestamp or up to six block headers',
20
+ 'solana.validator-health': 'getVoteAccounts filtered by votePubkey (keepUnstakedDelinquents) for status, stake, commission, last vote, root slot and epoch credits; getAccountInfo on the vote account (Vote program owner; vote-state versions 1 to 3: node identity and authorised withdrawer); getEpochInfo; getBlockProduction filtered by the derived identity for this epoch\'s leader slots and blocks produced; getRecentPerformanceSamples(30) for cluster throughput and slot time; confirmed commitment',
21
+ 'evm.token-vesting': 'Sablier Lockup v1.2 (LockupLinear, LockupDynamic, LockupTranched), v2.0, v3.0 and v4.0 stream getters (getSender, getRecipient, getAsset or getUnderlyingToken, getLockupModel, deposited, withdrawn and refunded amounts, start, cliff and end times, getUnlockAmounts, getSegments, getTranches, statusOf, streamed, withdrawable and refundable amounts, isCancelable, isTransferable); OpenZeppelin VestingWallet start, duration, end, cliff, released, releasable and vestedAmount (ETH and ERC-20), recognised by bytecode selectors including EIP-1167 clones; ERC-20 symbol, decimals and balanceOf; Multicall3 aggregate3 and getEthBalance with per-target isolation',
22
+ 'evm.oracle-dependency': 'AggregatorV3 latestRoundData, decimals and description; EACAggregatorProxy aggregator, phaseId, proposedAggregator, accessController and owner; aggregator typeAndVersion, minAnswer, maxAnswer and owner; Aave V3 getPriceOracle, getSourceOfAsset and getAssetPrice; Aave CAPO BASE_TO_USD_AGGREGATOR/ASSET_TO_USD_AGGREGATOR, RATIO_PROVIDER, isCapped, getPriceCap and growth caps; Chainlink Feed Registry getFeed and latestRoundData (Ethereum); Safe and timelock getters for owners; AnswerUpdated events in bounded windows; Multicall3 aggregate3 with per-target isolation',
23
+ 'evm.contract-controls': 'EIP-1967 implementation, admin and beacon slots and legacy ZeppelinOS slots; owner(), pendingOwner(), paused(), ERC-165 AccessControl; Safe getThreshold/getOwners, TimelockController getMinDelay and Compound Timelock delay; one Multicall3 aggregate3 batch per step',
24
+ 'evm.token-activity': 'ERC-20 Transfer events in adaptive block windows ending at the hash-pinned latest block; metadata and balances via Multicall3',
25
+ 'evm.wallet-flows': 'ERC-20 Transfer events to and from the wallet (topic-filtered) for the listed major tokens; balanceOf, eth_getBalance and nonce at the pinned block',
26
+ 'evm.allowance-exposure': 'ERC-20 allowance over the listed token and spender matrix and Permit2 allowance(owner, token, spender) via Multicall3',
27
+ 'evm.treasury': 'balanceOf of the listed major tokens; Safe getThreshold/getOwners/getModulesPaginated/nonce/VERSION and guard and fallback-handler slots; TimelockController getMinDelay',
28
+ 'evm.dex-depth': 'Uniswap V2 and SushiSwap getPair/getReserves, Uniswap V3 getPool/slot0/liquidity and Aerodrome getPool (stable and volatile) against WETH and major stablecoins',
29
+ 'evm.pool-trades': 'Uniswap V2, Uniswap V3 and Aerodrome Swap events in adaptive block windows ending at the hash-pinned latest block',
30
+ 'evm.lending-market': 'Aave V3 PoolDataProvider, Pool and oracle getters; Compound V3 Comet market and collateral getters',
31
+ 'evm.vault-4626': 'ERC-4626 asset, totalAssets, convertToAssets and maxDeposit; MetaMorpho fee, curator, guardian, owner, timelock and supplyQueueLength',
32
+ 'evm.liquid-staking': 'Issuer exchange-rate and supply getters for stETH, wstETH, rETH, cbETH, weETH, sfrxETH, mETH and ETHx; Lido getTotalPooledEther and getBufferedEther',
33
+ 'evm.governor': 'OpenZeppelin Governor and Compound GovernorBravo settings, proposalCount, proposalDetailsAt or proposals, state and ProposalCreated events; timelock delay',
34
+ 'evm.issuer-controls': 'FiatToken, Tether, ERC-3643, ERC-1404, AccessControl and Ownable role, pause and blacklist getters; EIP-1967 implementation slot',
35
+ 'evm.bridge-activity': 'OP Stack L1StandardBridge and L2StandardBridge ETH and ERC-20 bridge initiated and finalized events for Base',
36
+ 'evm.chain-pulse': 'eth_getBlockByNumber for three recent blocks and one about an hour earlier (transactions, gasUsed, baseFeePerGas, blobGasUsed)',
37
+ 'evm.nft-collection': 'ERC-165 (ERC-721, ERC-1155, ERC-2981), name, symbol, totalSupply, owner, contractURI and royaltyInfo; Transfer events in adaptive block windows',
38
+ 'solana.pumpfun-curve': 'pump.fun bonding-curve and Global accounts (program 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P) via getMultipleAccounts at confirmed commitment',
39
+ 'solana.stake-pools': 'SPL Stake Pool accounts of six listed pools across the SPL, Sanctum single-validator and Sanctum multi-validator programs via getMultipleAccounts at confirmed commitment',
40
+ 'solana.token-safety': 'SPL Token and Token-2022 mint layout with extensions, and Metaplex Token Metadata v1, via getMultipleAccounts at confirmed commitment',
41
+ };
42
+ const LOG_WINDOWS = 'Coverage is the contiguous block range actually read, stated in every report; busy subjects are covered for minutes, quiet ones for hours. No activity is inferred for unread blocks.';
43
+ const RH_LOGS = 'The keyless official Robinhood RPC throttles bursts of eth_getLogs: a rate-limited window is retried once after a pause, then coverage stops and the report says so.';
44
+ export const CHAIN_COVERAGE = Object.freeze([
45
+ // ------------------------------------------------------------------------------------------------------------ Ethereum
46
+ entry({ chain: 'ethereum', tool: 'evm.token-metadata', capability: 'token-metadata', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}ethereum-weth-token-metadata-20260914T203317690Z.json`, `${T}ethereum-wbtc-token-metadata-20260914T203555717Z.json`], protocolVersions: 'ERC-20 string and bytes32 labels', gaps: ['Labels are untrusted; total supply is the contract counter.'] }),
47
+ entry({ chain: 'ethereum', tool: 'evm.contract-inspect', capability: 'contract-inspection', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}ethereum-usdc-contract-inspect-20260914T203317690Z.json`], protocolVersions: 'EIP-1967 slots, EIP-7702 designators', gaps: ['Custom proxies and non-standard upgrade paths are not detected.'] }),
48
+ entry({ chain: 'ethereum', tool: 'evm.permissions', capability: 'permissions', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}ethereum-usdc-permissions-20260914T203317690Z.json`], protocolVersions: 'owner(), EIP-1967, declared AccessControl roles', gaps: ['Role holders are not enumerated.'] }),
49
+ entry({ chain: 'ethereum', tool: 'evm.pool-liquidity', capability: 'pool-liquidity', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}ethereum-usdc-weth-v2-pool-20260914T203317690Z.json`], protocolVersions: 'Uniswap V2-compatible (live); V3-compatible (live on Base)', gaps: ['Only the supplied pool; no pool discovery or aggregate liquidity.'] }),
50
+ entry({ chain: 'ethereum', tool: 'evm.token-transfers', capability: 'token-transfers', source: 'public-rpc', status: 'live-verified-partial', credential: null, evidence: [`${T}ethereum-wbtc-transfers-paged-window-20260914T203555717Z.json`], protocolVersions: 'ERC-20 Transfer events', gaps: ['The live run stopped at its log cap with a resume cursor; a complete multi-window run is fixture-only.'] }),
51
+ entry({ chain: 'ethereum', tool: 'evm.funding-links', capability: 'funding-links', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}ethereum-public-verify-indexed-funding-hash-20260914T203328202Z.json`], protocolVersions: 'Supplied transaction hashes, one hop', gaps: ['Discovering funders needs the indexed tool; internal transfers need traces.'] }),
52
+ entry({ chain: 'ethereum', tool: 'evm.supplied-balances', capability: 'supplied-balances', source: 'public-rpc', status: 'fixture-only', credential: null, evidence: [], protocolVersions: 'ERC-20 balanceOf', gaps: ['No live Ethereum run yet (verified on Base).'] }),
53
+ entry({ chain: 'ethereum', tool: 'evm.decode-swap', capability: 'swap-decoding', source: 'offline-decoder', status: 'live-verified', credential: null, evidence: [`${T}base-universal-router-decode-offline-20260914T203317690Z.json`], protocolVersions: 'Uniswap V2 Router02, V3 SwapRouter/02, Universal Router, Permit2', gaps: ['Offline decoding is chain-independent; unsupported selectors stay unknown.'] }),
54
+ entry({ chain: 'ethereum', tool: 'evm.indexed-transfers', capability: 'address-transfers', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}alchemy-ethereum-wallet-inbound-transfers-20260914T203328202Z.json`], protocolVersions: 'alchemy_getAssetTransfers external/internal/erc20', gaps: ['Completeness is the provider index claim; transfers are not trades.', LICENCE_GAP] }),
55
+ entry({ chain: 'ethereum', tool: 'evm.indexed-funding-links', capability: 'funding-discovery', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}alchemy-ethereum-wallet-earliest-funding-20260914T203328202Z.json`, `${T}ethereum-public-verify-indexed-funding-hash-20260914T203328202Z.json`], protocolVersions: 'alchemy_getAssetTransfers oldest-first native', gaps: ['ERC-20 funding and paymaster sponsorship are not included.', LICENCE_GAP] }),
56
+ entry({ chain: 'ethereum', tool: 'evm.contract-creation', capability: 'deployment-history', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}alchemy-ethereum-usdc-deployment-search-20260914T230848249Z.json`, `${T}alchemy-ethereum-v2-pair-deployment-search-20260914T230848249Z.json`, `${T}alchemy-ethereum-v2-pair-contract-creation-20260914T203328202Z.json`], protocolVersions: 'Alchemy getContractMetadata, then archive eth_getCode binary search (at most 28 probes) and a top-level CREATE(sender, nonce) match', gaps: ['Alchemy\'s index returned no deployer for ERC-20s; the on-chain search located USDC\'s deployment block and direct deployer.', 'Factory or CREATE2 creations (the Uniswap V2 pair) get their block but no creating contract: that needs traces.', 'Related launches by the same deployer are not indexed.', LICENCE_GAP] }),
57
+ entry({ chain: 'ethereum', tool: 'evm.wallet-token-balances', capability: 'wallet-holdings', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}alchemy-ethereum-wallet-token-balances-20260914T203328202Z.json`], protocolVersions: 'alchemy_getTokenBalances erc20, alchemy_getTokenMetadata', gaps: ['Provider latest view, not pinned to a block hash; no valuation or cost basis.', LICENCE_GAP] }),
58
+ entry({ chain: 'ethereum', tool: 'evm.indexed-token-metadata', capability: 'indexed-token-metadata', source: 'alchemy', status: 'fixture-only', credential: 'ALCHEMY_API_KEY', evidence: [], protocolVersions: 'alchemy_getTokenMetadata', gaps: ['Verified live on Base only.'] }),
59
+ entry({ chain: 'ethereum', tool: 'http.read', capability: 'web-read', source: 'public-web', status: 'live-verified', credential: null, evidence: [`${T}web-token-repository-readme-rerun-20260914T203555717Z.json`, `${T}web-refused-metadata-address-20260914T203317690Z.json`], protocolVersions: 'HTTPS GET, identity encoding, no redirects', gaps: ['Content is untrusted and evidenced only at retrieval time.'] }),
60
+ // ---------------------------------------------------------------------------------------------------------------- Base
61
+ entry({ chain: 'base', tool: 'evm.token-metadata', capability: 'token-metadata', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}base-usdc-token-metadata-20260914T203317690Z.json`], protocolVersions: 'ERC-20 string and bytes32 labels', gaps: ['Labels are untrusted; total supply is the contract counter.'] }),
62
+ entry({ chain: 'base', tool: 'evm.contract-inspect', capability: 'contract-inspection', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}base-public-l2-standard-bridge-proxy-inspect-20260914T230846496Z.json`, `${T}base-l2-standard-bridge-proxy-inspect-20260914T203555717Z.json`], protocolVersions: 'EIP-1967 slots, EIP-7702 designators', gaps: ['Custom proxies and non-standard upgrade paths are not detected.'] }),
63
+ entry({ chain: 'base', tool: 'evm.permissions', capability: 'permissions', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}base-usdc-permissions-20260914T222326238Z.json`], protocolVersions: 'owner(), EIP-1967, declared AccessControl roles', gaps: ['Role holders are not enumerated.'] }),
64
+ entry({ chain: 'base', tool: 'evm.pool-liquidity', capability: 'pool-liquidity', source: 'public-rpc', status: 'live-verified-partial', credential: null, evidence: [`${T}base-public-weth-usdc-v3-pool-20260914T230846496Z.json`, `${T}base-weth-usdc-v3-pool-keyed-20260914T222326238Z.json`], protocolVersions: 'Uniswap V3-compatible (live); V2-compatible (live on Ethereum)', gaps: ['On the official public endpoint the liquidity and fee reads were rate-limited (partial). The same tool completed through the Alchemy Base host (second artifact), which is not this row\'s source.', 'Only the supplied pool.'] }),
65
+ entry({ chain: 'base', tool: 'evm.token-transfers', capability: 'token-transfers', source: 'public-rpc', status: 'live-verified-partial', credential: null, evidence: [`${T}base-usdc-transfers-window-20260914T203317690Z.json`], protocolVersions: 'ERC-20 Transfer events', gaps: ['The official endpoint rejected a busy USDC window; the tool returned a resume cursor, not an empty result.'] }),
66
+ entry({ chain: 'base', tool: 'evm.funding-links', capability: 'funding-links', source: 'public-rpc', status: 'fixture-only', credential: null, evidence: [], protocolVersions: 'Supplied transaction hashes, one hop', gaps: ['No live Base run yet.'] }),
67
+ entry({ chain: 'base', tool: 'evm.supplied-balances', capability: 'supplied-balances', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}base-usdc-supplied-balances-rerun-20260914T203555717Z.json`], protocolVersions: 'ERC-20 balanceOf', gaps: ['Supplied accounts only; not a holder census.'] }),
68
+ entry({ chain: 'base', tool: 'evm.decode-swap', capability: 'swap-decoding', source: 'offline-decoder', status: 'live-verified', credential: null, evidence: [`${T}base-universal-router-decode-offline-20260914T203317690Z.json`], protocolVersions: 'Uniswap V2 Router02, V3 SwapRouter/02, Universal Router, Permit2', gaps: ['Unsupported selectors stay unknown.'] }),
69
+ entry({ chain: 'base', tool: 'evm.indexed-transfers', capability: 'address-transfers', source: 'alchemy', status: 'fixture-only', credential: 'ALCHEMY_API_KEY', evidence: [], protocolVersions: 'alchemy_getAssetTransfers', gaps: ['Verified live on Ethereum only.'] }),
70
+ entry({ chain: 'base', tool: 'evm.indexed-funding-links', capability: 'funding-discovery', source: 'alchemy', status: 'fixture-only', credential: 'ALCHEMY_API_KEY', evidence: [], protocolVersions: 'alchemy_getAssetTransfers', gaps: ['Verified live on Ethereum only.'] }),
71
+ entry({ chain: 'base', tool: 'evm.contract-creation', capability: 'deployment-history', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}alchemy-base-usdc-deployment-search-20260914T230848249Z.json`, `${T}alchemy-base-usdc-contract-creation-20260914T203328202Z.json`], protocolVersions: 'Alchemy getContractMetadata, then archive eth_getCode binary search and a top-level CREATE match', gaps: ['The on-chain search located Base USDC\'s deployment block and direct deployer after the index returned null.', 'Factory and CREATE2 creations are reported without the creating contract.', LICENCE_GAP] }),
72
+ entry({ chain: 'base', tool: 'evm.wallet-token-balances', capability: 'wallet-holdings', source: 'alchemy', status: 'fixture-only', credential: 'ALCHEMY_API_KEY', evidence: [], protocolVersions: 'alchemy_getTokenBalances', gaps: ['Verified live on Ethereum only.'] }),
73
+ entry({ chain: 'base', tool: 'evm.indexed-token-metadata', capability: 'indexed-token-metadata', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}alchemy-base-usdc-indexed-metadata-20260914T203328202Z.json`], protocolVersions: 'alchemy_getTokenMetadata', gaps: ['Cross-check against on-chain metadata.', LICENCE_GAP] }),
74
+ entry({ chain: 'base', tool: 'http.read', capability: 'web-read', source: 'public-web', status: 'live-verified', credential: null, evidence: [`${T}web-token-repository-readme-rerun-20260914T203555717Z.json`], protocolVersions: 'HTTPS GET', gaps: ['Content is untrusted.'] }),
75
+ // ------------------------------------------------------------------------------- P02/P03 indexed activity (Ethereum, Base)
76
+ // Live runs on 15 September 2026 (packages/deployer/scripts/verify-live.ts): UNI on Ethereum and DEGEN on Base, their creation senders, and a public wallet.
77
+ ...['ethereum', 'base'].flatMap((chain) => [
78
+ entry({ chain, tool: 'evm.contract-origin', capability: 'deployment-origin', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${A}${chain}-contract-origin-20260915T183816082Z.json`, ...(chain === 'base' ? [`${A}base-contract-origin-trace-20260926T222550757Z.json`] : [])], protocolVersions: 'alchemy_getAssetTransfers first activity, eth_getTransactionReceipt contractAddress, archive eth_getCode, debug_traceTransaction prestate diff (R02) for creations inside a contract call',
79
+ gaps: [chain === 'ethereum' ? 'UNI\'s creation (block 10861674) was confirmed by its receipt.' : 'DEGEN\'s creation (block 8925894) was confirmed by its receipt; CLANKER\'s creation inside a factory call was verified by a prestate-diff trace (26 Sep 2026), with the three contracts that ran CREATE or CREATE2 listed as candidates.', 'Contracts whose first indexed activity comes later (for example pools that receive liquidity after deployment) need a supplied creation transaction or stay a bounded block range. A trace names a CREATE creator exactly; CREATE2 creators are candidates.', LICENCE_GAP] }),
80
+ entry({ chain, tool: 'evm.address-funding', capability: 'funding-discovery-bounded', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${A}${chain}-address-funding-20260915T183816082Z.json`], protocolVersions: 'alchemy_getAssetTransfers oldest-first external/internal/erc20 with pageKey',
81
+ gaps: ['The live run followed one pageKey (two pages) and kept the next cursor; later transfers are unknown. Mints and self-transfers are not funding.', 'A funder is a counterparty, not an owner; paymaster-sponsored gas is not included.', LICENCE_GAP] }),
82
+ entry({ chain, tool: 'evm.deployer-launches', capability: 'related-deployments', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${A}${chain}-deployer-launches-20260915T183816082Z.json`], protocolVersions: 'alchemy_getAssetTransfers external from the sender, eth_getTransactionReceipt contractAddress',
83
+ gaps: ['Top-level creations by the same sender only; contracts it created through factories are not found. A shared sender is not common control.', LICENCE_GAP] }),
84
+ entry({ chain, tool: 'evm.wallet-activity', capability: 'wallet-activity', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${A}${chain}-wallet-activity-20260915T183816082Z.json`], protocolVersions: 'eth_getBalance, alchemy_getAssetTransfers in/out by category, alchemy_getTokenBalances, alchemy_getTokenMetadata',
85
+ gaps: ['One bounded page per direction (truncated with a cursor in the live run); token balances are the provider\'s latest view and most token decimals stay unknown beyond the metadata bound.', 'Transfers are not trades; no valuation, fees or results.', LICENCE_GAP] }),
86
+ ]),
87
+ // --------------------------------------------------------- P01 Token Researcher 0.3.0 market reads (inside evm.inspect-token@0.1.0)
88
+ // Factory addresses and quote tokens are listed in packages/contracts/src/token-market.ts. A refused row marks that report section unsupported.
89
+ // Live runs on 15 September 2026 (packages/research/scripts/verify-market-live.ts): UNI on Ethereum, DEGEN on Base, USDG on Robinhood Chain.
90
+ ...['ethereum', 'base', 'robinhood'].flatMap((chain) => {
91
+ const venues = { ethereum: 'Uniswap V2, SushiSwap V2 and Uniswap V3 (fees 100/500/3000/10000) against WETH, USDC and USDT', base: 'Uniswap V2, Uniswap V3 (fees 100/500/3000/10000) and Aerodrome (stable and volatile) against WETH and USDC', robinhood: 'Uniswap V2 and Uniswap V3 (fees 100/500/3000/10000) against WETH and USDG' }[chain];
92
+ const R = 'docs/evidence/token-researcher/';
93
+ const evidence = { ethereum: [`${R}ethereum-uni-market-20260915T205425465Z.json`], base: [`${R}base-degen-market-20260915T205427374Z.json`], robinhood: [`${R}robinhood-usdg-market-20260915T205509947Z.json`, `${R}robinhood-weth-pair-token-market-20260915T213122230Z.json`] }[chain];
94
+ const observed = { ethereum: 'UNI: 16 pools found (8 shown with balances) and 10 recent recipients in 15 reads; the report was partial only because UNI has no owner().', base: 'DEGEN: 14 pools found (8 shown) and 10 recent recipients; complete in 15 reads.',
95
+ robinhood: 'USDG: 5 pools and 10 recent recipients; complete in 15 reads. A token without owner() (second artifact) found 4 pools and 8 recent recipients in 15 reads, partial only for the owner() revert. Its earlier runs (robinhood-weth-pair-token-market-20260915T204833029Z and -205512300Z, kept as history) failed at the 16-read ceiling before the keyed revert stopped failing over to the official RPC.' }[chain];
96
+ return [
97
+ entry({ chain, tool: 'evm.dex-pool-discovery', capability: 'dex-pool-discovery-listed-venues', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence, protocolVersions: `Multicall3 aggregate3 factory lookups on ${venues}; balanceOf, getReserves, slot0 and liquidity at the pinned block`,
98
+ gaps: [observed, 'Listed venues and quote tokens only; Uniswap V4, other DEXes and aggregators are not checked and no total liquidity is claimed.', 'Pool balances are not executable depth or a price.', 'Verified through the Alchemy host; public RPC failover is not live-verified for these reads.'] }),
99
+ entry({ chain, tool: 'evm.recent-holder-activity', capability: 'recent-transfer-recipients', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence, protocolVersions: 'alchemy_getAssetTransfers erc20, newest 25 at or before the pinned block, then balanceOf of up to 10 recipients at that block',
100
+ gaps: ['Recent recipients are not a holder list, ranking or distribution; completeness is the index claim.', 'The index request goes only to the keyed Alchemy host, never failed over.', LICENCE_GAP] }),
101
+ ];
102
+ }),
103
+ // ------------------------------------------------------------------------------------------------- Robinhood (Orbit L2)
104
+ entry({ chain: 'robinhood', tool: 'evm.token-metadata', capability: 'token-metadata', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}robinhood-mainnet-token-metadata-20260914T230844868Z.json`], protocolVersions: 'ERC-20 labels at the latest block, EIP-1898 hash-pinned', gaps: [RH_SNAPSHOT, RH_ALCHEMY, 'Labels are untrusted; total supply is the contract counter.'] }),
105
+ entry({ chain: 'robinhood', tool: 'evm.contract-inspect', capability: 'contract-inspection', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}robinhood-mainnet-contract-inspect-20260914T230844868Z.json`], protocolVersions: 'EIP-1967 slots at the latest block, EIP-1898 hash-pinned', gaps: [RH_SNAPSHOT, RH_ALCHEMY, 'Custom proxies and non-standard upgrade paths are not detected.'] }),
106
+ entry({ chain: 'robinhood', tool: 'evm.permissions', capability: 'permissions', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}robinhood-mainnet-permissions-20260914T230844868Z.json`], protocolVersions: 'owner(), EIP-1967, declared AccessControl roles at the hash-pinned latest block', gaps: [RH_SNAPSHOT, RH_ALCHEMY, 'Role holders are not enumerated.'] }),
107
+ entry({ chain: 'robinhood', tool: 'http.read', capability: 'web-read', source: 'public-web', status: 'live-verified', credential: null, evidence: [`${T}web-token-repository-readme-rerun-20260914T203555717Z.json`], protocolVersions: 'HTTPS GET', gaps: ['Content is untrusted.'] }),
108
+ entry({ chain: 'robinhood-testnet', tool: 'evm.token-metadata', capability: 'token-metadata', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}robinhood-testnet-token-metadata-20260914T230844868Z.json`], protocolVersions: 'ERC-20 labels at the latest block, EIP-1898 hash-pinned', gaps: [RH_SNAPSHOT, RH_ALCHEMY] }),
109
+ entry({ chain: 'robinhood-testnet', tool: 'evm.contract-inspect', capability: 'contract-inspection', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}robinhood-testnet-contract-inspect-20260914T230844868Z.json`], protocolVersions: 'EIP-1967 slots at the hash-pinned latest block', gaps: [RH_SNAPSHOT, RH_ALCHEMY] }),
110
+ entry({ chain: 'robinhood-testnet', tool: 'evm.permissions', capability: 'permissions', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}robinhood-testnet-permissions-20260914T230844868Z.json`], protocolVersions: 'owner(), EIP-1967, declared AccessControl roles at the hash-pinned latest block', gaps: [RH_SNAPSHOT, RH_ALCHEMY] }),
111
+ // E01 bounded logs (15 September 2026, after D032): windows end at or below the hash-pinned latest block and every returned log block hash is checked against the canonical header.
112
+ ...['robinhood', 'robinhood-testnet'].map((chain) => {
113
+ const label = chain === 'robinhood' ? 'mainnet' : 'testnet';
114
+ return entry({ chain, tool: 'evm.token-transfers', capability: 'token-transfers', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY',
115
+ evidence: [`${T}robinhood-${label}-token-transfers-window-20260915T210139725Z.json`, `${T}robinhood-${label}-token-transfers-paged-20260915T210139725Z.json`, `${T}robinhood-${label}-token-transfers-resumed-20260915T210139725Z.json`],
116
+ protocolVersions: 'ERC-20 Transfer events in bounded block windows up to the hash-pinned latest block; each returned log block hash matched the canonical header',
117
+ gaps: [chain === 'robinhood' ? 'USDG: a complete two-block window (15 transfers, 2 log blocks verified) and two cursor pages that stopped at the 25-log page limit.' : 'The busiest testnet token in a 50-block window: a complete two-block window and two cursor pages that stopped at the call ceiling for block-hash checks.',
118
+ 'Log completeness is the provider\'s claim, and a window with no logs has nothing to hash-verify. Busy tokens page slowly: each log block costs one header read within the 10-call ceiling.',
119
+ chain === 'robinhood' ? 'Verified through Alchemy only. The keyless official RPC timed out or rate-limited unfiltered and USDG log queries (robinhood-mainnet-official-rpc-log-limits probe), so failover to it is not verified for logs.' : 'Verified through Alchemy only; failover to the official testnet RPC is not verified for logs.'] });
120
+ }),
121
+ // -------------------------------------------------------------------------------------------------------------- Solana
122
+ entry({ chain: 'solana', tool: 'solana.mint-authorities', capability: 'token-metadata', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}solana-usdc-mint-authorities-20260914T203317690Z.json`, `${T}solana-pyusd-mint-authorities-rerun-20260914T203555717Z.json`], protocolVersions: 'SPL Token mint layout; Token-2022 TLV extensions (parsed subset)', gaps: ['Unparsed Token-2022 extensions stay unknown; program upgrade authority is not read.'] }),
123
+ entry({ chain: 'solana', tool: 'solana.metaplex-metadata', capability: 'token-labels', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}solana-usdc-metaplex-metadata-20260914T203317690Z.json`], protocolVersions: 'Metaplex Token Metadata v1 prefix', gaps: ['URI is not fetched; editions and collections are not interpreted.'] }),
124
+ entry({ chain: 'solana', tool: 'solana.address-history', capability: 'address-history', source: 'public-rpc', status: 'live-verified-partial', credential: null, evidence: [`${T}solana-pyusd-address-history-rerun-20260914T203555717Z.json`], protocolVersions: 'getSignaturesForAddress (confirmed commitment, newest first)', gaps: ['Public RPC may prune history; an exhausted page is not proof of no earlier activity.', 'The linked live evidence predates the instant-read change and was read at finalized commitment.'] }),
125
+ entry({ chain: 'solana', tool: 'solana.funding-links', capability: 'funding-links', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}solana-pyusd-funding-links-20260914T203317690Z.json`], protocolVersions: 'jsonParsed System Program transfer/createAccount', gaps: ['Recent window only; first funding needs the indexed tool.'] }),
126
+ entry({ chain: 'solana', tool: 'solana.token-holders', capability: 'token-holders', source: 'helius', status: 'live-verified-partial', credential: 'HELIUS_API_KEY', evidence: [`${T}helius-pyusd-token-holders-page-20260914T203328202Z.json`], protocolVersions: 'Helius DAS getTokenAccounts', gaps: ['Pages with cursors only; never a complete holder census.', LICENCE_GAP] }),
127
+ entry({ chain: 'solana', tool: 'solana.indexed-history', capability: 'address-history-indexed', source: 'helius', status: 'live-verified-partial', credential: 'HELIUS_API_KEY', evidence: [`${T}helius-pyusd-indexed-history-20260914T203328202Z.json`], protocolVersions: 'Helius getTransactionsForAddress (signatures)', gaps: ['Page with pagination token; completeness is the provider claim.', LICENCE_GAP] }),
128
+ entry({ chain: 'solana', tool: 'solana.indexed-funding-links', capability: 'funding-discovery', source: 'helius', status: 'live-verified', credential: 'HELIUS_API_KEY', evidence: [`${T}helius-pyusd-earliest-funding-20260914T203328202Z.json`], protocolVersions: 'Helius getTransactionsForAddress (full, oldest first)', gaps: ['Native SOL funding only.', LICENCE_GAP] }),
129
+ entry({ chain: 'solana', tool: 'solana.asset-metadata', capability: 'indexed-token-metadata', source: 'helius', status: 'live-verified', credential: 'HELIUS_API_KEY', evidence: [`${T}helius-pyusd-asset-metadata-20260914T203328202Z.json`], protocolVersions: 'Helius DAS getAsset', gaps: ['On-chain mint authorities remain authoritative.', LICENCE_GAP] }),
130
+ entry({ chain: 'solana', tool: 'solana.inspect-transaction', capability: 'transaction-inspection', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${I}solana-legacy-funded-self-transfer-20260914T230733029Z.json`, `${I}solana-v0-transaction-lookup-table-20260914T222325098Z.json`, `${I}solana-legacy-message-transfer-memo-compute-20260914T222325098Z.json`, `${I}solana-legacy-message-unknown-program-20260914T222325098Z.json`, 'docs/evidence/solana-inspector/mainnet-self-transfer-agent-run-20260915T211231474Z.json'], protocolVersions: 'Legacy and v0 with lookup tables; System, SPL Token, Token-2022 base, ATA, Memo, Compute Budget; simulateTransaction sigVerify=false, replaceRecentBlockhash=true', gaps: ['Token-2022 extension sub-instructions and other programs stay unknown; simulation is a snapshot, not an asset-flow guarantee.', 'With HELIUS_API_KEY configured, Helius mainnet-beta is the first endpoint: the agent-kind worker run on 15 September 2026 (last artifact) completed through it with a succeeded simulation in 4 metered reads.'] }),
131
+ entry({ chain: 'solana', tool: 'http.read', capability: 'web-read', source: 'public-web', status: 'live-verified', credential: null, evidence: [`${T}web-token-repository-readme-rerun-20260914T203555717Z.json`], protocolVersions: 'HTTPS GET', gaps: ['Content is untrusted.'] }),
132
+ // --------------------------------------------------------------------- Catalog research tools (26 September 2026, public RPC)
133
+ // packages/tools/scripts/verify-research-live.ts through the production keyless endpoints (Ethereum PublicNode with Polkachu and MEV Blocker
134
+ // fallbacks, the official Base RPC with PublicNode fallback, the official Robinhood Chain RPC, PublicNode Solana). The first gap is each run's own headline.
135
+ entry({ chain: 'ethereum', tool: 'evm.contract-controls', capability: 'contract-controls', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-aave-pool-controls-20260926T171735170Z.json`, `${T}research-ethereum-usdc-controls-20260926T171735170Z.json`, `${T}research-ethereum-weth-controls-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.contract-controls'], gaps: ['ethereum-aave-pool-controls: Upgradeable (uups or custom proxy), controlled by an authority that is not exposed through standard proxy slots or owner(). owner() is not available. ethereum-usdc-controls: Upgradeable (transparent proxy), controlled by an account without code (a single key) (0x807a…95d2). owner() is an account without code (a single key) (0xFcb1…AE3a). Not paused.', 'Controllers are classified by code and standard getters; roles granted through AccessControl are not enumerated. A classification is not a statement of intent.'] }),
136
+ entry({ chain: 'base', tool: 'evm.contract-controls', capability: 'contract-controls', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-base-usdc-controls-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.contract-controls'], gaps: ['base-usdc-controls: Upgradeable (transparent proxy), controlled by an account without code (a single key) (0x4fc7…cA44). owner() is an account without code (a single key) (0x3ABd…6df7). Not paused.', 'Controllers are classified by code and standard getters; AccessControl role holders are not enumerated.'] }),
137
+ entry({ chain: 'robinhood', tool: 'evm.contract-controls', capability: 'contract-controls', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-robinhood-usdg-controls-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.contract-controls'], gaps: ['robinhood-usdg-controls: Upgradeable (uups or custom proxy), controlled by a timelock with a 1d delay (0xcFA0…4C6F). owner() is a timelock with a 1d delay (0xcFA0…4C6F). Not paused.', 'Controllers are classified by code and standard getters; AccessControl role holders are not enumerated.'] }),
138
+ entry({ chain: 'ethereum', tool: 'evm.token-activity', capability: 'token-activity', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-uni-activity-20260926T171735170Z.json`, `${T}research-ethereum-usdc-mint-burn-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.token-activity'], gaps: ['ethereum-uni-activity: 114 transfers of UNI (12154.40219091078855367 moved) between 54 senders and 61 receivers in the last 104 blocks (about 21 minutes; blocks 26062960-26063063, 2,000 requested). 0 at or above 10000 UNI. ethereum-usdc-mint-burn: 18 mints (84341.879001 USDC) and 13 burns (479416.988873 USDC) in the last 50 blocks (about 10 minutes; blocks 26063014-26063063, 4,000 requested); net -395075.109872 USDC.', LOG_WINDOWS] }),
139
+ entry({ chain: 'base', tool: 'evm.token-activity', capability: 'token-activity', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-base-degen-activity-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.token-activity'], gaps: ['base-degen-activity: 99 transfers of DEGEN (7486237.49661624426119377 moved) between 26 senders and 36 receivers in the last 521 blocks (about 17 minutes; blocks 51826332-51826852, 2,000 requested).', LOG_WINDOWS] }),
140
+ entry({ chain: 'robinhood', tool: 'evm.token-activity', capability: 'token-activity', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-robinhood-usdg-activity-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.token-activity'], gaps: ['robinhood-usdg-activity: 142 transfers of USDG (43737.298934 moved) between 42 senders and 52 receivers in the last 51 blocks (under a minute; blocks 73255510-73255560, 5,000 requested).', RH_LOGS, LOG_WINDOWS] }),
141
+ entry({ chain: 'ethereum', tool: 'evm.wallet-flows', capability: 'wallet-flows', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-public-wallet-flows-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.wallet-flows'], gaps: ['ethereum-public-wallet-flows: 0 incoming and 0 outgoing transfers across 0 of 12 watched tokens with 0 counterparties in the last 2,300 blocks (about 8 hours; blocks 26060764-26063063, 4,000 requested). Native balance 5.721712306242346161 ETH; 8 watched tokens held.', 'Only the listed major tokens plus one named token are followed; transfers are not trades and counterparties are addresses, not identities.'] }),
142
+ entry({ chain: 'base', tool: 'evm.wallet-flows', capability: 'wallet-flows', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-base-public-wallet-flows-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.wallet-flows'], gaps: ['base-public-wallet-flows: 0 incoming and 0 outgoing transfers across 0 of 12 watched tokens with 0 counterparties in the last 2,300 blocks (about 77 minutes; blocks 51824557-51826856, 4,000 requested). Native balance 3.12882160347253728 ETH; 8 watched tokens held.', 'Only the listed major tokens plus one named token are followed; transfers are not trades.'] }),
143
+ entry({ chain: 'robinhood', tool: 'evm.wallet-flows', capability: 'wallet-flows', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-robinhood-vault-flows-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.wallet-flows'], gaps: ['robinhood-vault-flows: 0 incoming and 0 outgoing transfers across 0 of 2 watched tokens with 0 counterparties in the last 2,300 blocks (about 4 minutes; blocks 73253326-73255625, 10,000 requested). Native balance 0.00258329 ETH; 0 watched tokens held.', 'Robinhood Chain lists two major tokens (WETH and USDG); others need the named token input.', RH_LOGS] }),
144
+ entry({ chain: 'ethereum', tool: 'evm.allowance-exposure', capability: 'allowance-exposure', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-public-wallet-allowances-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.allowance-exposure'], gaps: ['ethereum-public-wallet-allowances: 5 live allowances (4 unlimited) to 3 of 12 checked spenders across 3 tokens.', 'Only the listed token and spender matrix (plus one named token and spender) is read; allowances outside it are not found. Nothing is revoked.'] }),
145
+ entry({ chain: 'base', tool: 'evm.allowance-exposure', capability: 'allowance-exposure', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-base-public-wallet-allowances-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.allowance-exposure'], gaps: ['base-public-wallet-allowances: 1 live allowance (1 unlimited) to 1 of 12 checked spenders across 1 tokens.', 'Only the listed token and spender matrix is read.'] }),
146
+ entry({ chain: 'robinhood', tool: 'evm.allowance-exposure', capability: 'allowance-exposure', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-robinhood-vault-allowances-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.allowance-exposure'], gaps: ['robinhood-vault-allowances: No live allowance to the 5 checked spenders across 2 tokens.', 'The Robinhood spender list is Permit2 and the official Uniswap routers only.'] }),
147
+ entry({ chain: 'ethereum', tool: 'evm.treasury', capability: 'treasury', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-ens-endowment-treasury-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.treasury'], gaps: ['ethereum-ens-endowment-treasury: Safe 1.3.0 with a 1-of-1 threshold, 2 modules and 34 executed transactions.', 'Holdings cover the listed major tokens plus one named token; no prices are applied.'] }),
148
+ entry({ chain: 'base', tool: 'evm.treasury', capability: 'treasury', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-base-message-passer-treasury-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.treasury'], gaps: ['base-message-passer-treasury: A contract that is neither a Safe nor a timelock.', 'Holdings cover the listed major tokens plus one named token; no prices are applied.'] }),
149
+ entry({ chain: 'robinhood', tool: 'evm.treasury', capability: 'treasury', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-robinhood-usdg-timelock-treasury-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.treasury'], gaps: ['robinhood-usdg-timelock-treasury: A timelock with a minimum delay of 86400 seconds.', 'Holdings cover WETH, USDG and one named token.'] }),
150
+ entry({ chain: 'ethereum', tool: 'evm.dex-depth', capability: 'dex-depth', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-uni-depth-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.dex-depth'], gaps: ['ethereum-uni-depth: 8 pools for UNI; the deepest is Uniswap V3 UNI/WETH (0.3%) at 0.003581741584436829 WETH, where selling 38605.578924825459910764 UNI moves the price about 2%. Price dispersion across same-quote pools: 0.29%.', 'Listed venues and quote tokens only; depth is constant-product or active-liquidity arithmetic at one block, not an executable quote.'] }),
151
+ entry({ chain: 'base', tool: 'evm.dex-depth', capability: 'dex-depth', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-base-degen-depth-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.dex-depth'], gaps: ['base-degen-depth: 8 pools for DEGEN; the deepest is Uniswap V3 DEGEN/WETH (1%) at 0.000000408407911405 WETH, where selling 6002954.078499714209314294 DEGEN moves the price about 2%. Price dispersion across same-quote pools: 0.36%.', 'Listed venues and quote tokens only; not an executable quote.'] }),
152
+ entry({ chain: 'robinhood', tool: 'evm.dex-depth', capability: 'dex-depth', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-robinhood-usdg-depth-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.dex-depth'], gaps: ['robinhood-usdg-depth: 5 pools for USDG; the deepest is Uniswap V3 USDG/WETH (0.01%) at 0.000372150565899655 WETH, where selling 3208728.627901 USDG moves the price about 2%. Price dispersion across same-quote pools: 0.29%.', 'Uniswap V2 and V3 on Robinhood Chain only; not an executable quote.'] }),
153
+ entry({ chain: 'ethereum', tool: 'evm.pool-trades', capability: 'pool-trades', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-uni-weth-v3-trades-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.pool-trades'], gaps: ['ethereum-uni-weth-v3-trades: 101 swaps (48 buying UNI, 53 selling) in the last 1,009 blocks (about 3 hours; blocks 26062056-26063064, 2,000 requested): 42011.939849596405403454 UNI and 151.172235094626246207 WETH traded; price up 0.11%.', 'One pool only; trades routed through other pools are not seen.', LOG_WINDOWS] }),
154
+ entry({ chain: 'base', tool: 'evm.pool-trades', capability: 'pool-trades', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-base-aerodrome-weth-usdc-trades-20260926T171735170Z.json`, `${T}research-base-weth-usdc-v3-trades-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.pool-trades'], gaps: ['base-aerodrome-weth-usdc-trades: 97 swaps (85 buying WETH, 12 selling) in the last 473 blocks (about 16 minutes; blocks 51826389-51826861, 2,000 requested): 0.19495339484930725 WETH and 525.135538 USDC traded; price up 0.00%. base-weth-usdc-v3-trades: 62 swaps (39 buying WETH, 23 selling) in the last 279 blocks (about 9 minutes; blocks 51826582-51826860, 2,000 requested): 2.099232727858636242 WETH and 5641.890336 US…', 'One pool only.', LOG_WINDOWS] }),
155
+ entry({ chain: 'robinhood', tool: 'evm.pool-trades', capability: 'pool-trades', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-robinhood-usdg-weth-v3-trades-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.pool-trades'], gaps: ['robinhood-usdg-weth-v3-trades: 101 swaps (52 buying WETH, 49 selling) in the last 454 blocks (about 1 minute; blocks 73255432-73255885, 10,000 requested): 7.962201655008505597 WETH and 21394.851215 USDG traded; price down 0.01%.', RH_LOGS, LOG_WINDOWS] }),
156
+ entry({ chain: 'ethereum', tool: 'evm.lending-market', capability: 'lending-market', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-aave-usdc-market-20260926T171735170Z.json`, `${T}research-ethereum-compound-usdc-market-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.lending-market'], gaps: ['ethereum-aave-usdc-market: Aave V3 USDC: 2403038285.56061 supplied, 2205598832.829682 borrowed (91.78% utilised); supply APR 3.54%, borrow APR 4.29%. LTV 75%, liquidation at 78%. ethereum-compound-usdc-market: Compound V3 USDC: 379655981.967075 supplied, 343418662.736062 borrowed (90.45% utilised); supply APR 4.69%, borrow APR 5.63%.', 'Aave V3 and Compound V3 markets at the listed deployments only; revenue is an estimate at current rates.'] }),
157
+ entry({ chain: 'base', tool: 'evm.lending-market', capability: 'lending-market', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-base-aave-weth-market-20260926T171735170Z.json`, `${T}research-base-compound-usdc-market-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.lending-market'], gaps: ['base-aave-weth-market: Aave V3 WETH: 84125.978809916734504109 supplied, 68609.473394287337145562 borrowed (81.55% utilised); supply APR 1.41%, borrow APR 2.03%. LTV 80%, liquidation at 83%. base-compound-usdc-market: Compound V3 USDC: 9709239.666269 supplied, 8784075.918221 borrowed (90.47% utilised); supply APR 4.74%, borrow APR 5.69%.', 'Aave V3 and Compound V3 markets at the listed deployments only.'] }),
158
+ entry({ chain: 'ethereum', tool: 'evm.vault-4626', capability: 'vault-4626', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-sfrxeth-vault-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.vault-4626'], gaps: ['ethereum-sfrxeth-vault: Staked Frax Ether holds 43711.546385561952147571 frxETH; one share redeems for 1.170291102200858795 frxETH.', 'No APY: share-price history is not read.'] }),
159
+ entry({ chain: 'base', tool: 'evm.vault-4626', capability: 'vault-4626', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-base-metamorpho-vault-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.vault-4626'], gaps: ['base-metamorpho-vault: Moonwell Flagship USDC holds 4099305.303914 USDC; one share redeems for 1.089196 USDC. MetaMorpho vault: fee 15%, timelock 4d, 2 markets in the supply queue.', 'No APY: share-price history is not read.'] }),
160
+ entry({ chain: 'ethereum', tool: 'evm.liquid-staking', capability: 'liquid-staking', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-liquid-staking-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.liquid-staking'], gaps: ['ethereum-liquid-staking: 8 of 8 liquid staking tokens read. Largest by implied backing: stETH (9796809.291711220022952518 ETH).', 'Contract exchange rates, not market prices; withdrawal queues are not read.'] }),
161
+ entry({ chain: 'ethereum', tool: 'evm.governor', capability: 'governor', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-uniswap-governor-20260926T171735170Z.json`, `${T}research-ethereum-ens-governor-20260926T171735170Z.json`, `${T}research-ethereum-compound-governor-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.governor'], gaps: ['ethereum-uniswap-governor: Uniswap Governor Bravo (Compound Bravo): voting period 40320 blocks, quorum 40000000 UNI (4% of supply), timelock delay 2d. Latest proposal 102 is pending. ethereum-ens-governor: ENS Governor (OpenZeppelin): voting period 45818 blocks, quorum 1000000 ENS (1% of supply), timelock delay 2d. No proposal created in the last 6,000 blocks (about 20 hours; blocks 26057066-26063065, 10,000 request…', 'OpenZeppelin Governor and GovernorBravo only; Snapshot and multisig votes are not read. Proposal descriptions are untrusted text.'] }),
162
+ entry({ chain: 'base', tool: 'evm.governor', capability: 'governor', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-base-seamless-governor-20260926T171831279Z.json`, `${T}research-base-seamless-governor-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.governor'], gaps: ['base-seamless-governor: SeamGovernorShort (OpenZeppelin): voting period 259200 seconds, quorum 1500000 SEAM (1.5% of supply), timelock delay 2d. Latest proposal 8415861394…698468 is executed. base-seamless-governor: SeamGovernorShort (OpenZeppelin): voting period 259200 seconds, quorum 1500000 SEAM (1.5% of supply), timelock delay 2d. Latest proposal 8415861394…698468 is unknown.', 'OpenZeppelin Governor and GovernorBravo only.'] }),
163
+ entry({ chain: 'ethereum', tool: 'evm.issuer-controls', capability: 'issuer-controls', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-usdc-issuer-20260926T171735170Z.json`, `${T}research-ethereum-usdt-issuer-20260926T171735170Z.json`, `${T}research-ethereum-buidl-issuer-20260926T171735170Z.json`, `${T}research-ethereum-usdy-issuer-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.issuer-controls'], gaps: ['ethereum-usdc-issuer: USDC uses a FiatToken-style issuer model (master minter, pauser, blacklister). Pausable. Accounts can be blacklisted or frozen. Upgradeable proxy. Supply 50259143169.477236. ethereum-usdt-issuer: USDT uses a Tether-style blacklist. Pausable. Accounts can be blacklisted or frozen. Supply 88304342264.551152.', 'Reserves, attestations and legal terms are off-chain and not read.'] }),
164
+ entry({ chain: 'base', tool: 'evm.issuer-controls', capability: 'issuer-controls', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-base-eurc-issuer-20260926T171831279Z.json`, `${T}research-base-eurc-issuer-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.issuer-controls'], gaps: ['base-eurc-issuer: EURC uses a FiatToken-style issuer model (master minter, pauser, blacklister). Pausable. Accounts can be blacklisted or frozen. Upgradeable proxy. Supply 51071704.940706. base-eurc-issuer: EURC uses a FiatToken-style issuer model (master minter, pauser, blacklister). Pausable. Accounts can be blacklisted or frozen. Supply 51071704.940706.', 'Reserves and attestations are off-chain and not read.'] }),
165
+ entry({ chain: 'robinhood', tool: 'evm.issuer-controls', capability: 'issuer-controls', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-robinhood-usdg-issuer-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.issuer-controls'], gaps: ['robinhood-usdg-issuer: USDG uses AccessControl roles. Pausable. Accounts can be blacklisted or frozen. Upgradeable proxy. Supply 693667590.776494.', 'Reserves and attestations are off-chain and not read.'] }),
166
+ entry({ chain: 'ethereum', tool: 'evm.bridge-activity', capability: 'bridge-activity', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-base-bridge-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.bridge-activity'], gaps: ['ethereum-base-bridge: 102 standard-bridge events on Ethereum in the last 2,786 blocks (about 9 hours; blocks 26060280-26063065, 4,000 requested): 79 toward Base and 23 from Base; ETH 2280.632543855511208887 in and 0.0014107 out (net +2280.631133155511208887 to Base).', 'The Base canonical standard bridge only; third-party bridges and direct OptimismPortal deposits are not included.'] }),
167
+ entry({ chain: 'base', tool: 'evm.bridge-activity', capability: 'bridge-activity', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-base-base-bridge-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.bridge-activity'], gaps: ['base-base-bridge: 35 standard-bridge events on Base in the last 3,995 blocks (about 2 hours; blocks 51822873-51826867): 33 toward Base and 2 from Base; ETH 2.804203390261807882 in and 0 out (net +2.804203390261807882 to Base).', 'The Base canonical standard bridge only.'] }),
168
+ entry({ chain: 'ethereum', tool: 'evm.chain-pulse', capability: 'chain-pulse', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-chain-pulse-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.chain-pulse'], gaps: ['ethereum-chain-pulse: 159.3 transactions per block (13.28 per second) at 12.000 s blocks, 41.45% gas used, base fee 0.139 gwei (+41.52% vs about an hour ago), 4.00 blobs per block.', 'Four blocks sampled; averages are indicative, not a time series.'] }),
169
+ entry({ chain: 'base', tool: 'evm.chain-pulse', capability: 'chain-pulse', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-base-chain-pulse-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.chain-pulse'], gaps: ['base-chain-pulse: 160.7 transactions per block (80.33 per second) at 2.000 s blocks, 8.84% gas used, base fee 0.005 gwei (+0% vs about an hour ago).', 'Four blocks sampled; no blob data on L2.'] }),
170
+ entry({ chain: 'robinhood', tool: 'evm.chain-pulse', capability: 'chain-pulse', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-robinhood-chain-pulse-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.chain-pulse'], gaps: ['robinhood-chain-pulse: 6.3 transactions per block (62.98 per second) at 0.101 s blocks, 0.00% gas used, base fee 0.027 gwei (-2.18% vs about an hour ago).', 'Four blocks sampled; Arbitrum Orbit gas accounting differs from Ethereum.'] }),
171
+ entry({ chain: 'ethereum', tool: 'evm.nft-collection', capability: 'nft-collection', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-pudgy-collection-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.nft-collection'], gaps: ['ethereum-pudgy-collection: PudgyPenguins (ERC-721, supply 8888): 20 transfers including 0 mints and 0 burns to 14 receivers in the last 3,998 blocks (about 13 hours; blocks 26059069-26063066).', 'Transfers are not sales; metadata URIs are listed, not fetched.', LOG_WINDOWS] }),
172
+ entry({ chain: 'base', tool: 'evm.nft-collection', capability: 'nft-collection', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-base-basenames-collection-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.nft-collection'], gaps: ['base-basenames-collection: Basenames (ERC-721): 61 transfers including 51 mints and 0 burns to 53 receivers in the last 1,995 blocks (about 67 minutes; blocks 51824875-51826869).', 'Transfers are not sales; metadata URIs are listed, not fetched.', LOG_WINDOWS] }),
173
+ entry({ chain: 'solana', tool: 'solana.pumpfun-curve', capability: 'pumpfun-curve', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-solana-pumpfun-active-curve-20260926T171735170Z.json`, `${T}research-solana-pumpfun-graduated-curve-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['solana.pumpfun-curve'], gaps: ['solana-pumpfun-active-curve: Active pump.fun curve: 0% to graduation, 0.001837222 SOL deposited, curve price 0.000000027962 SOL per token (implied market cap 27.96 SOL); 79.3% of supply still in the curve. solana-pumpfun-graduated-curve: Graduated pump.fun token: the bonding curve is complete and trading has moved to an AMM pool.', 'Post-graduation AMM trading is not read; the curve layout is the documented pump.fun account layout.'] }),
174
+ entry({ chain: 'solana', tool: 'solana.stake-pools', capability: 'stake-pools', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-solana-stake-pools-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['solana.stake-pools'], gaps: ['solana-stake-pools: 6 stake pools read holding 20338015.78838722 SOL. Largest: JitoSOL (10383239.185751042 SOL, 1.303265685007767798 SOL per token). Highest last-epoch yield: jupSOL at about 3.57% a year.', 'Six listed pools only; yield is the last epoch\'s pool-token appreciation, annualised.'] }),
175
+ entry({ chain: 'solana', tool: 'solana.token-safety', capability: 'token-safety', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-solana-usdc-token-safety-20260926T171735170Z.json`, `${T}research-solana-pyusd-token-safety-20260926T171735170Z.json`], protocolVersions: RESEARCH_PROTOCOLS['solana.token-safety'], gaps: ['solana-usdc-token-safety: USDC (spl-token) keeps 3 issuer powers: minting, freezing, metadata changes. Supply 8421916144.143579. solana-pyusd-token-safety: PYUSD (token-2022) keeps 7 issuer powers: minting, freezing, MintCloseAuthority, PermanentDelegate, TransferFeeConfig, ConfidentialTransferMint, TransferHook. Supply 753709393.579081.', 'Program upgrade authorities and holder distribution are not assessed; a flag is a capability, not evidence of use.'] }),
176
+ // R01 (26 Sep 2026): rollup L1 controls, price oracle dependencies and token vesting, live-verified through runTool with a workflow permit on the keyless production
177
+ // endpoints (packages/tools/scripts/verify-rollup-controls.ts, verify-oracle-dependency.ts and verify-token-vesting.ts).
178
+ entry({ chain: 'ethereum', tool: 'evm.rollup-controls', capability: 'rollup-controls', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-base-rollup-20260926T194225276Z.json`, `${T}research-ethereum-robinhood-rollup-20260926T194225276Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.rollup-controls'], gaps: ['base-rollup: Base (OP Stack) L1 contracts: upgrades by a 2-of-2 Safe (0x7bB4…595c) without a timelock; nothing paused; withdrawal proofs mature after 1d; respected game type 621 (non-standard). robinhood-rollup: Robinhood Chain (Arbitrum Orbit) L1 contracts: upgrades by a 7-of-8 Safe (0x7Ae5…84b6) or a timelock with a 7d delay (0xE1e8…F465); nothing paused; assertions confirm after about 6d 8h; 2 whitelisted validators.', 'Contract addresses are the documented L1 sets (docs.base.org, docs.robinhood.com); every value is a live read. Safe signer identities are not established on-chain. Robinhood executor-role candidates come from the RoleGranted history read on 26 Sep 2026 and are re-checked with hasRole; no event history is read, so past upgrades are not listed.'] }),
179
+ entry({ chain: 'ethereum', tool: 'evm.oracle-dependency', capability: 'oracle-dependency', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-weth-oracle-20260926T195702604Z.json`, `${T}research-ethereum-wsteth-oracle-20260926T195702604Z.json`, `${T}research-ethereum-eth-usd-feed-20260926T195702604Z.json`, `${T}research-ethereum-no-oracle-20260926T195702604Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.oracle-dependency'], gaps: ['ethereum-weth-oracle: WETH is priced by a Chainlink ETH / USD proxy, 24 updates in about 24 hours, owned by a 4-of-9 Safe. ethereum-wsteth-oracle: an Aave CAPO adapter over that feed, cap parameters governed through the Aave ACL manager. ethereum-eth-usd-feed: OCR2 aggregator, phase 7. ethereum-no-oracle: no Aave V3 source and no Feed Registry feed.', 'A heartbeat is never assumed; freshness is the observed age and cadence the AnswerUpdated history in about 7,200 blocks. Discovery covers the Aave V3 oracle and the Feed Registry (WETH as ETH) only.'] }),
180
+ entry({ chain: 'base', tool: 'evm.oracle-dependency', capability: 'oracle-dependency', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-base-weth-oracle-20260926T195702604Z.json`, `${T}research-base-usdc-usd-feed-20260926T195725093Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.oracle-dependency'], gaps: ['base-weth-oracle: the Aave source is a Chainlink ETH / USD proxy, 18 updates in about 6 hours, owned by a 4-of-9 Safe. base-usdc-usd-feed: USDC / USD updated about 7 hours earlier, 0 updates in about 6 hours, maximum answer 1.05.', 'mainnet.base.org serves at most 2,000 blocks per eth_getLogs and a run has 5 log pages, so cadence covers about 10,000 blocks (about 6 hours); a 24-hour-heartbeat feed can show zero updates in that window. There is no Feed Registry on Base.'] }),
181
+ entry({ chain: 'ethereum', tool: 'evm.token-vesting', capability: 'token-vesting', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-ethereum-sablier-tranched-stream-20260926T202120126Z.json`, `${T}research-ethereum-sablier-cliff-stream-20260926T202120126Z.json`, `${T}research-ethereum-vesting-wallet-20260926T202120126Z.json`, `${T}research-ethereum-not-vesting-20260926T202120126Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.token-vesting'], gaps: ['ethereum-sablier-tranched-stream: Sablier v1.2 tranched stream #1399, 21 tranches, 64.29% vested, cancelable by the sender. ethereum-sablier-cliff-stream: v4.0 stream #1672, the whole deposit unlocks at a cliff on 2029-06-25. ethereum-vesting-wallet: OpenZeppelin VestingWallet (native ETH), fully vested. ethereum-not-vesting: the USDC proxy is not a recognised vesting contract.', 'Sablier is recognised only at the documented v1.2, v2.0, v3.0 and v4.0 Lockup addresses. Linear unlock points are computed from on-chain parameters and shown only when they reproduce streamedAmountOf; a VestingWallet total is released plus its current balance.'] }),
182
+ entry({ chain: 'base', tool: 'evm.token-vesting', capability: 'token-vesting', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-base-sablier-linear-cliff-stream-20260926T202120126Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.token-vesting'], gaps: ['base-sablier-linear-cliff-stream: Sablier v3.0 linear stream #7402, a third unlocked at a cliff on 2026-09-01, 35.69% vested, streaming to 2028-09-01, not cancelable.', 'No VestingWallet was verified live on Base; recognition is by bytecode and the same on both chains. Dynamic streams: the 30-day unlock check counts segments ending in the window.'] }),
183
+ entry({ chain: 'solana', tool: 'solana.validator-health', capability: 'validator-health', source: 'public-rpc', status: 'live-verified', credential: null, evidence: [`${T}research-solana-large-validator-health-20260926T221338748Z.json`, `${T}research-solana-mid-validator-health-20260926T221338748Z.json`, `${T}research-solana-delinquent-validator-health-20260926T221338748Z.json`, `${T}research-solana-commission-100-validator-health-20260926T221338748Z.json`, `${T}research-solana-not-a-vote-account-20260926T221338748Z.json`], protocolVersions: RESEARCH_PROTOCOLS['solana.validator-health'], gaps: ['large: current, 17.86M SOL, 7% commission, 0% skip over 9,700 leader slots, credits stable. mid: current, 181k SOL, 5%. delinquent: 181k SOL, last vote 16,473 slots behind the tip. commission-100: 5.63M SOL at 100% commission. not-a-vote-account: the USDC mint (Token program owner).', 'Every read is filtered to one validator, so there is no cluster-wide ranking; the RPC reports at most five epochs of credits and no commission history; identity and withdrawer are keys, not people.'] }),
184
+ // R02 (26 Sep 2026): Alchemy-backed tools, licensed for AGENTEX reports in writing. Verified through runTool with a workflow permit and the keyed
185
+ // Alchemy transport, the endpoint production routes traces and wide log ranges to (verify-transaction-flows.ts, verify-admin-history.ts).
186
+ entry({ chain: 'ethereum', tool: 'evm.transaction-flows', capability: 'transaction-flows', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}research-ethereum-sandwich-victim-flows-20260926T220912610Z.json`, `${T}research-ethereum-sandwich-back-run-flows-20260926T220912610Z.json`, `${T}research-ethereum-factory-creation-flows-20260926T220912610Z.json`, `${T}research-ethereum-unknown-hash-flows-20260926T220912610Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.transaction-flows'], gaps: ['ethereum-sandwich-victim-flows: ETH wrapped into WETH inside the transaction (an internal native transfer) and four ERC-20 legs. ethereum-factory-creation-flows: a Uniswap V2 pair created inside the transaction (nonce 0 to 1). 140-166 CU per run.', 'Native movements are net balance changes from a prestate-diff trace, which only the keyed Alchemy endpoint serves; without it they are unknown, never absent. Token movements are standard Transfer events.'] }),
187
+ entry({ chain: 'base', tool: 'evm.transaction-flows', capability: 'transaction-flows', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}research-base-recent-flows-20260926T220912610Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.transaction-flows'], gaps: ['base-recent-flows: sender, recipient and OP Stack fee-vault changes from the trace.', 'OP Stack fee vaults are labelled; L1 data fees are part of the fee.'] }),
188
+ entry({ chain: 'robinhood', tool: 'evm.transaction-flows', capability: 'transaction-flows', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}research-robinhood-recent-flows-20260926T220912610Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.transaction-flows'], gaps: ['robinhood-recent-flows: a WETH unwrap paid to the sender through contract execution (an internal native transfer) and three token legs.', 'Arbitrum fee accounts are not listed by the trace, so observed native changes need not sum to zero.'] }),
189
+ entry({ chain: 'ethereum', tool: 'evm.admin-history', capability: 'admin-history', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}research-ethereum-usdc-admin-history-20260926T220449692Z.json`, `${T}research-ethereum-aave-acl-manager-history-20260926T220449692Z.json`, `${T}research-ethereum-weth-admin-history-20260926T220449692Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.admin-history'], gaps: ['ethereum-usdc-admin-history: 3 upgrades and 8 admin changes since genesis (legacy ZeppelinOS slots); the implementation and owner() match the latest events. ethereum-aave-acl-manager-history: 54 role grants and 31 revocations across 7 roles, a RISK_ADMIN grant within 30 days. ethereum-weth-admin-history: no standard admin events.', 'Only the standard OpenZeppelin and EIP-1967 events are read, from the contract, its proxy admin and beacon; custom upgrade paths and events are not. Full-history log reads need the Alchemy endpoint; ranges are bisected within five pages.'] }),
190
+ entry({ chain: 'base', tool: 'evm.admin-history', capability: 'admin-history', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}research-base-usdc-admin-history-20260926T220449692Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.admin-history'], gaps: ['base-usdc-admin-history: 1 upgrade (2023-12-14) and 5 admin changes since genesis; the implementation matches the latest event.', 'Only standard events; mainnet.base.org serves at most 2,000 blocks per eth_getLogs, so full history needs the Alchemy endpoint.'] }),
191
+ entry({ chain: 'robinhood', tool: 'evm.admin-history', capability: 'admin-history', source: 'alchemy', status: 'live-verified', credential: 'ALCHEMY_API_KEY', evidence: [`${T}research-robinhood-usdg-admin-history-20260926T220449692Z.json`], protocolVersions: RESEARCH_PROTOCOLS['evm.admin-history'], gaps: ['robinhood-usdg-admin-history: 1 upgrade and 9 role grants since genesis (block 57); the implementation matches the latest event.', 'Only standard events; custom role hashes are shown by hash.'] }),
192
+ entry({ chain: 'solana-devnet', tool: 'solana.inspect-transaction', capability: 'transaction-inspection', source: 'public-rpc', status: 'fixture-only', credential: null, evidence: ['packages/providers/evidence/provider-health-20260914T203300657Z.json'], protocolVersions: 'Devnet genesis identity and head-slot freshness only', gaps: ['Devnet is not a §5 analysis target; only identity and freshness are live-verified.'] }),
193
+ ]);
194
+ export const SOURCE_GAPS = Object.freeze([
195
+ { capability: 'historical-prices', chains: ['ethereum', 'base', 'robinhood', 'solana'], neededBy: ['P01 (USD liquidity and valuation context)', 'P03 (realised and unrealised results, cost basis, win rate, CSV valuations)'], requiredProviderClass: 'historical token or pool price index', freeCandidates: 'CoinGecko/GeckoTerminal keyless OHLCV is documented for low-volume non-commercial testing; production rights and Robinhood coverage are unresolved, so it is not implemented.', agentBehaviour: 'Valuations, PnL and win rate are withheld with a stated reason; a single spot pool price is never used as a historical price.' },
196
+ { capability: 'token-holder-census', chains: ['ethereum', 'base', 'robinhood', 'solana'], neededBy: ['P01 (holder distribution)'], requiredProviderClass: 'complete token-holder index with snapshot and exclusions', freeCandidates: 'Helius DAS pages (Solana, cursor pages), supplied-account balances, and (Token Researcher 0.3.0) balances of recent transfer recipients from one Alchemy transfer page.', agentBehaviour: 'Only returned pages, supplied accounts or recent recipients are shown, labelled recent-transfer-recipients-not-a-holder-list; no distribution, ranking or concentration metric from partial data.' },
197
+ { capability: 'factory-creator-and-related-launches', chains: ['ethereum', 'base', 'robinhood'], neededBy: ['P02 (creating factory, related deployments)'], requiredProviderClass: 'transaction trace or deployment index', freeCandidates: 'On-chain archive search finds the deployment block and a direct deployer; creation receipts confirm top-level creations; factory/CREATE2 creators need traces.', agentBehaviour: 'P02 names a factory only from an event naming the contract in its creation transaction (a heuristic) and otherwise reports "created by a contract". Related launches cover top-level creations by the same sender only; factory-made launches stay unavailable.' },
198
+ { capability: 'dex-pool-discovery', chains: ['ethereum', 'base', 'robinhood', 'solana'], neededBy: ['P01 (all pools and aggregate liquidity)'], requiredProviderClass: 'DEX pool index', freeCandidates: 'DEX Screener addressed pools (internal evaluation), supplied pool reads, and (Token Researcher 0.3.0) on-chain factory lookups on listed Uniswap-compatible venues.', agentBehaviour: 'Only supplied pools or pools found on the listed venues and quote tokens are shown, with observed balances; absence on those venues is not proof of no liquidity and total liquidity is not claimed.' },
199
+ { capability: 'trade-classification', chains: ['ethereum', 'base', 'robinhood', 'solana'], neededBy: ['P03 (purchases and sales separated from transfers)'], requiredProviderClass: 'swap/trade decoder over indexed history', freeCandidates: 'Offline router decoding of supplied payloads only.', agentBehaviour: 'Transfers are listed as transfers; none is labelled a buy or sale.' },
200
+ ]);
201
+ export class CoverageError extends Error {
202
+ category;
203
+ code = 'COVERAGE_DENIED';
204
+ constructor(category, message) {
205
+ super(message);
206
+ this.category = category;
207
+ this.name = 'CoverageError';
208
+ }
209
+ }
210
+ const credentialPresent = (name, env) => /^[A-Za-z0-9_-]{16,128}$/.test(env[name] ?? '');
211
+ /** Entries for a chain, each with whether it can run now on this server. */
212
+ export function coverageFor(chain, options = {}) {
213
+ const env = options.env ?? process.env;
214
+ return CHAIN_COVERAGE.filter((item) => item.chain === chain).map((item) => ({ ...item, available: item.status !== 'disabled' && (item.status !== 'fixture-only' || options.allowFixtureOnly === true) && (item.credential === null || credentialPresent(item.credential, env)) }));
215
+ }
216
+ /** Throws `CoverageError` unless `tool` (exactly `id@version`) is covered on `chain` and runnable with the server's credentials. */
217
+ export function assertToolCoverage(chain, tool, options = {}) {
218
+ const env = options.env ?? process.env;
219
+ const [id, version] = tool.split('@');
220
+ if (!version || !/^\d+\.\d+\.\d+$/.test(version))
221
+ throw new CoverageError('version-required', `${tool} must name an exact tool version (id@x.y.z) for coverage.`);
222
+ const disabled = CHAIN_COVERAGE.find((item) => item.chain === chain && item.status === 'disabled');
223
+ if (disabled)
224
+ throw new CoverageError('chain-disabled', `${chain} analysis is disabled: ${disabled.gaps[0]}`);
225
+ const found = CHAIN_COVERAGE.find((item) => item.chain === chain && item.tool === id);
226
+ if (!found)
227
+ throw new CoverageError('chain-not-covered', `${id} has no recorded coverage on ${chain}.`);
228
+ if (found.version !== version)
229
+ throw new CoverageError('version-not-covered', `${id}@${version} is not the verified version on ${chain} (verified: ${found.version}).`);
230
+ if (found.status === 'fixture-only' && options.allowFixtureOnly !== true)
231
+ throw new CoverageError('capability-unverified', `${id} on ${chain} has fixture coverage only and stays unavailable until live verification.`);
232
+ if (found.credential && !credentialPresent(found.credential, env))
233
+ throw new CoverageError('credential-required', `${id} on ${chain} needs a server-side provider credential that is not configured.`);
234
+ return found;
235
+ }
236
+ /** Per-chain decisions for a listing or quote. A listing that declares no deterministic tools cannot claim any chain. */
237
+ export function listingCoverage(declaredChains, tools, options = {}) {
238
+ return declaredChains.map((chain) => {
239
+ if (!tools.length)
240
+ return { chain, covered: false, denials: [{ tool: null, category: 'no-tools-declared', message: 'No deterministic tools are declared, so no chain coverage can be claimed.' }] };
241
+ const denials = tools.flatMap((tool) => { try {
242
+ assertToolCoverage(chain, tool, options);
243
+ return [];
244
+ }
245
+ catch (error) {
246
+ if (error instanceof CoverageError)
247
+ return [{ tool, category: error.category, message: error.message }];
248
+ throw error;
249
+ } });
250
+ return { chain, covered: denials.length === 0, denials };
251
+ });
252
+ }
253
+ /** For listings and quotes: the declared chains on which every declared tool is covered. Unknown chains and empty tool lists yield none. */
254
+ export function coveredChains(declaredChains, tools, options = {}) {
255
+ return listingCoverage(declaredChains, tools, options).filter((item) => item.covered).map((item) => item.chain);
256
+ }
257
+ /** Public summary without evidence paths, hosts or keys: safe for capabilities and listing endpoints. */
258
+ export function coverageSummary(options = {}) {
259
+ return CoverageChainSchema.options.map((chain) => ({ chain, entries: coverageFor(chain, options).map(({ tool, version, capability, source, status, available, protocolVersions, gaps }) => ({ tool, version, capability, source, status, available, protocolVersions, gaps })) }));
260
+ }