Don't trust us — check us
Every hash we publish, you can re-derive yourself — with one command, on a clean machine, without a single line of our code. If a single byte of history was altered after the fact, the recompute diverges and points to the exact broken row.
The 5-minute path
stranger → reproduced in <5 min- 1
Download verify_spa.py and pull the full chains from /api/rates-desk/full-chain/* (each serves the WHOLE file, uncapped).
- 2
Check the checker: shasum -a 256 verify_spa.py = the pinned SHA-256 below.
- 3
Run python3 verify_spa.py data/ — zero-dependency, none of our code at check time.
- 4
Exit 0 = reproduces; 1 = mismatch with the exact broken_at. Or just watch the live demo below.
The one command
Download the verifier, pull the COMPLETE chains straight from the live API (no repo checkout needed), then run it. Exit code 0 = everything reproduces byte-for-byte; 1 = any mismatch, and the tool prints the precise broken_at.
Pull the full chains, then verify
B=https://api.earn-defi.com/api/rates-desk/full-chain
mkdir -p data/rates_desk/paper data/tournament data/rwa_backstop
curl -s $B/decision_log > data/rates_desk/decision_log.jsonl
curl -s $B/exit_nav > data/rates_desk/exit_nav.json
curl -s $B/anchors > data/rates_desk/anchors.jsonl
curl -s $B/equity_track > data/rates_desk/equity_track.jsonl
curl -s $B/tournament > data/tournament/decision_log.jsonl
curl -s $B/nav_proof > data/rwa_backstop/nav_proof.jsonl
curl -s $B/sleeve > data/rates_desk/paper/rates_desk_fixed_carry_series_proof.jsonl
python3 verify_spa.py data/ Point it at the WHOLE data/ dir — it covers all 7 surfaces (rates-desk A–D plus tournament E, RWA-NAV F, sleeve G); the narrower data/rates_desk/ form only sees A–D. You can also pin the head: --expect-head <hex> (the decision-chain head, NOT the verifier script's own SHA-256), and --expect-surfaces A,D,E,F,G fails closed if a surface is absent.
First, check the checker
"Check us" only works if you can also check the checker. Before you run it, confirm the verify_spa.py you downloaded matches this pinned release byte-for-byte.
Version
verifier-v1.0
File
scripts/verify_spa.py
Spec
PROOF_CHAIN_SPEC v1.0
Verifier SHA-256
0f8c270c8c1f0c59ffc7236b1e43c1cb2aa58329faf7839c1961ce83209f81da
Confirm authenticity
shasum -a 256 verify_spa.py Must match the SHA-256 above. If it doesn't, you don't have the authentic verifier — re-download from the pinned tag.
Full manifest: docs/VERIFIER_RELEASE.md. A tag + SHA-256 is owner-independent integrity (anyone recomputes the digest themselves). A GPG-signed git tag (provenance) is the owner's next step — intentionally not done here.
We re-derive a hash, right here
source: offlineTo prove the recipe is real, this page fetches the public decision log live and recomputes one row's entry_hash itself, with the browser's SHA-256, over the same canonical JSON the spec defines (§3). No trust in the server: your browser derives the hash from the published bytes and compares it to the one we printed.
Canonical JSON we hashed (§3)
—
Recomputed in your browser (SHA-256)
—
Published entry_hash
—
Canonical rule: recursive key sort · separators (',',':') no spaces · ensure_ascii=False · UTF-8 → SHA-256 hex. Money/rate values are published as strings, so float rounding can't corrupt them. This is exactly what verify_spa.py does for the whole chain.
If the demo is offline (API unreachable), the command above still reproduces the same head from the downloaded files — the browser demo is a convenience, not a dependency.
What it verifies — precise scope
Four independent published proofs. Honestly: this is a paper research track, $0 real capital — the verifier proves the integrity of the records, not investment outcomes.
The tamper-evident decision chain — every ENTRY and every REFUSAL, SHA-256-linked. Flip one past byte and the recompute diverges at that exact row.
The liquidation-NAV schedules — every per-row proof_hash covers its inputs AND outputs AND prev_hash, so a forged net-proceeds number or a reordered row is caught.
The append-only head-checkpoint anchors — each in-window anchor head is re-derived from the public chain, so a fabricated historical anchor is rejected.
The evidenced equity / go-live track — hash-chained like the decision chain. A forged equity number or a back-dated day diverges the recompute. This is what makes "verify the track yourself" literally true.
The files & the recipe
Public artifacts
- data/rates_desk/decision_log.jsonl
- data/rates_desk/exit_nav.json
- data/rates_desk/anchors.jsonl
- data/rates_desk/equity_track.jsonl
Full uncapped chains: /api/rates-desk/full-chain/{surface} (index at /api/rates-desk/full-chain). Also live: /api/rates-desk/proof (machine) and /refusals (human).
Documents
Hash recipe: docs/PROOF_CHAIN_SPEC.md · verifier release: docs/VERIFIER_RELEASE.md · DD pack: docs/DD_PACK.md.