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/ Direct links — all 7 chain artifacts
- api.earn-defi.com/api/rates-desk/full-chain/equity_track (D)
- api.earn-defi.com/api/rates-desk/full-chain/decision_log (A)
- api.earn-defi.com/api/rates-desk/full-chain/anchors (C)
- api.earn-defi.com/api/rates-desk/full-chain/exit_nav (B)
- api.earn-defi.com/api/rates-desk/full-chain/tournament (E)
- api.earn-defi.com/api/rates-desk/full-chain/nav_proof (F)
- api.earn-defi.com/api/rates-desk/full-chain/sleeve (G)
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.2
File
scripts/verify_spa.py
Spec
PROOF_CHAIN_SPEC v1.0
Verifier SHA-256
f560aed8260bb324ef0a3a5f0001ea5c33777c389f32a8914f69c3aebe74d078
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.
Surface #8 — external timestamp anchoring
Proof-of-existence in Bitcoin (OpenTimestamps)
The hash-chain proves integrity, but it is self-hosted — a single operator could in principle regenerate it back-dated. To close that, we anchor the chain's head-hash into Bitcoin daily via OpenTimestamps. Bitcoin is an external clock we do not control.
Check it yourself, with your own client
pip install opentimestamps-client && ots verify proofs/ots/<head>.head.ots Your own OpenTimestamps client confirms the head-hash existed no later than a specific Bitcoin block's time — without our code and without trusting us. verify_spa.py (surface [I]) separately confirms the linkage: the digest file re-creates the chain head-hash exactly.
Honest caveat: OTS proofs begin at the adoption date (2026-07-03) — history before that is not Bitcoin-anchored. The immediate retro-anchor of today's head proves only "everything that exists today existed no later than today."
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.
Personal research project in paper validation — not investment advice, not a regulated service, not raising capital; results are simulated. Full disclaimer & risk disclosure →