Oracle
Every day after the 00:00 UTC snapshot run, the scores of all listed agents go into one Merkle tree, and its root is published on Solana in a memo from the oracle wallet 3tpH…Mba7. Anyone can then prove that an agent's score on a given day is the one that was committed, with the proof API, this page, or the standalone scripts.
- Latest root
a00758cd94f22a32ae2911fe05591ad72845ca1f20f2e5406f0cec0d6475a5b8- Date
- 2026-10-25 · 32 agents
- Memo
ac1:root:2026-10-25:a00758cd94f22a32ae2911fe05591ad72845ca1f20f2e5406f0cec0d6475a5b8:32- Transaction
- confirmed · slot 461168332 ↗
- Built
- 2026-10-25 07:13 UTC
Verify a score
The page recomputes the leaf and the root locally (WebCrypto, nothing sent anywhere but the proof and transaction lookups), then reads the root transaction through /rpc and checks that its memo matches and that the oracle wallet signed it.
The spec (AC1)
leaf = SHA-256( "AC1/leaf" ‖ slug ‖ 0x00 ‖ token_mint_or_empty ‖ 0x00
‖ u16be(score) ‖ u64be(computed_at_unix) ‖ SHA-256(components_json) )
node = SHA-256( "AC1/node" ‖ min(a, b) ‖ max(a, b) )
memo = "ac1:root:" ‖ YYYY-MM-DD ‖ ":" ‖ root_hex ‖ ":" ‖ leaf_countone root a day, one memo, all on chain- Strings are UTF-8; ‖ is concatenation;
min/maxcompare the 32-byte hashes bytewise, so a proof is just the list of sibling hashes, no left/right bits. - One leaf per listed agent with a snapshot, from its latest snapshot when the root is built. Leaves are sorted by slug (bytewise). A level with an odd count pairs its last node with itself. A single leaf is the root.
scoreis 300–850, or 0 when the snapshot shows "Not enough history".computed_atis the snapshot's unix time.components_jsonis the snapshot's components as JSON with object keys sorted, no whitespace, numbers as JavaScript'sJSON.stringifywrites them. Proofs carry this exact string, so verifiers hash it as given.- The oracle wallet is a dedicated low-value hot wallet. It only ever signs these memo transactions: the Worker rebuilds the instruction list and refuses to sign anything but one Memo instruction with a root memo, paid by that wallet.
- Proof JSON:
GET /api/v1/proof/<slug>?date=YYYY-MM-DDreturns the leaf fields, the leaf hash, the proof path, the root and the root transaction.
Known-answer vectors
Three fixed leaves, in tree order. An implementation of the spec must reproduce every hash below.
- slug
alpha- token_mint
So11111111111111111111111111111111111111112- score
742- computed_at
1790000000- components_json
{"activity":{"flags":[],"value":80},"dev":{"flags":[],"value":100},"track":{"flags":["too_few_trades"],"value":50},"transparency":{"flags":[],"value":60},"treasury":{"flags":[],"value":71.25}}- leaf hash
aaaa82fc14353d3c1f49cfdd9c70f1dee143baa991c0b24fba973252cf73e208
- slug
beta- token_mint
(empty)- score
null → encoded as 0- computed_at
1790000100- components_json
{}- leaf hash
9dfeb7db60dab0589a1d4b5013f6fdbfeea3d3aebda79a5704e3ee91838c3b20
- slug
gamma- token_mint
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v- score
300- computed_at
1790000200- components_json
{"dev":{"flags":["dev_unknown"],"value":0}}- leaf hash
c673b8e6eb214a90fff1289289e80ba13a2d39aa6422d5b99537adc841a0d3d3
- root
346779c0dc51cc1191fc1c58e65d355a106e3fa2c5eac73ab2e73c68d8f72997- proof (beta)
aaaa82fc14353d3c1f49cfdd9c70f1dee143baa991c0b24fba973252cf73e208 5484886780fde90dbee2f50093bd200431542e44d6562bf5a2beb68555e325fd
Standalone verifiers
No dependencies beyond the standard library. Both fetch the proof, recompute the leaf and root, and (with an RPC URL) check the memo on chain.
node verify-proof.mjs crawlnet --date 2026-10-25 --rpc https://api.mainnet-beta.solana.com
python3 verify_proof.py crawlnet --date 2026-10-25 --rpc https://api.mainnet-beta.solana.com
verify-proof.mjs verify_proof.py
History
| Date | Root | Agents | Transaction |
|---|---|---|---|
| 2026-10-25 | a00758cd94f22a32… | 32 | confirmed · slot 461168332 ↗ |