Production-lean, developer-friendly Observatory Bundle Inspector for Base mainnet, plus a Dune verification witness layer.
- Schemas + verification core
- Live observatory ingestion (Base RPC)
- Inspector UI dashboard
- Dune SQL witness package
- Tests + docs
- Bundle run endpoint for live evidence ingestion and bundle generation:
manifest.json,evidence_items.json,leaf_hashes.json,proofs.json,features.json
- Verification endpoints (server-side):
GET /healthPOST /observatory/verify-manifestPOST /observatory/verify-rootPOST /observatory/verify-proof
- Additional APIs:
POST /observatory/runPOST /topics/generatePOST /topics/validatePOST /logs/decodePOST /features/derive
- Dark dashboard UI with run controls, validation panel, summary cards, inspector tabs, export/download, raw log workbench, and debug tab.
- Dune folder with parameterized SQL and dashboard mapping doc.
- Chain: Base mainnet (
8453) - Domain:
EXECUTION_INTEGRITY_V1 - Token:
0x833589fcd6edb6e08f4c7c32d4f71b54bda02913 - Transfer topic:
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef - Approval topic:
0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925
npm install
npm startOpen http://localhost:3000.
PORT(default3000)
POST /observatory/run
{
"rpc_url": "https://mainnet.base.org",
"subject": "0x...optional"
}Windowing is deterministic:
latest = eth_blockNumberend_block = latest - finality_depthstart_block = end_block - window_size + 1
Log ingestion details:
- Transfer and Approval calls are split into separate
eth_getLogspipelines. - Topic validation uses
^0x[a-fA-F0-9]{64}$. - Chunking starts at 100 blocks; on failing chunk may reduce to 50.
- Retries 429/500/502/503/504 with exponential backoff.
See /dune/sql and /dune/dashboard-spec.md.
This layer is an independent witness for counts and diagnostics, not the canonical Merkle commitment engine.
npm test- Hashing uses Ethereum-compatible Keccak-256 for manifest, leaves, and Merkle nodes.
- Verification endpoints validate payload shape (32-byte hex hashes and proof path positions).
- Technical explainer / whitepaper:
docs/OBSERVATORY_WHITEPAPER.md
- If
Run Observatoryappears idle, confirm the status label/progress bar updates in the UI and check browser console/network for/observatory/runerrors. - If testing from phone, ensure your runtime URL is publicly routable (Codespaces forwarded public port, tunnel URL, or same LAN reachable host).
- Use
GET /healthfirst to validate server reachability before running ingestion.