Every published signal commits a 32-byte SHA-256 over 7 specific authorship fields to a 0-value transaction on Base mainnet (chain_id 8453). RONIN cannot retroactively edit the claim — RONIN does not control Base.
| Block | When | Canonical hash (32 bytes) | Tx |
|---|---|---|---|
| Loading from Base mainnet… | |||
The canonical hash is computed deterministically: SHA-256 over JSON.stringify of {signal_id, author_user_id, entry_price, target, stop_loss, published_at_iso, recipe_name} with sort_keys=True. The hash field excludes PII by design — no email, no IP, no operator identity.
The fixture below is the L5 smoke-test signal. Click Compute hash — your browser runs SHA-256 via SubtleCrypto, mirroring the Python implementation. The output should match the on-chain hash from the smoke transaction. Edit any field to see the hash change.
—
Read the Python implementation: ronin_crypto/services/onchain_anchor.py · compute_canonical_hash. The JS here mirrors json.dumps(sort_keys=True, separators=(',',':'), ensure_ascii=False) and unicodedata NFC normalization.
The canonicalization function is 20 lines of Python. SHA-256 over 7 named fields, sorted, UTF-8 encoded, NFC normalized. No hidden inputs.
The publisher wallet's full transaction history is public on basescan. Around 100 independent Base nodes worldwide hold the same record.
The SHA-256 widget above runs in your browser via SubtleCrypto. Same fields in → same hash out. RONIN never sees your inputs.
Every validation capability we claim on the homepage flips green on this page when its code and data are both wired. No claim ships before its row is green. This page updates every 60 seconds from /api/audit/validation-status — same endpoint anyone can curl.
What this means: a ● means the code shipped AND the backing data is live — the marketing claim is provable. A ● means code is ready and we're waiting for the first run. A ● means code is ready and an operator action is pending. The page is the scorecard.
Note: this section tracks a separate Base Sepolia contract for edge-retraction events. The L5 live anchor ledger above is the canonical surface — it covers every published signal, not only retractions. This block is retained while the contract finishes its testnet soak.
| Edge | Threshold spec | Status | Last update | Tx |
|---|---|---|---|---|
| Loading from chain… | ||||
For every retracted edge above we replay the signals it would have fired AFTER its retraction date and compare against actual outcomes. If the cohort under-performs the base-rate, the retraction was justified. If it over-performs, we were overcautious — and we say so. Source ↗
| Edge | Retracted | Signals (post) | Would-have hit-rate | vs base-rate | Verdict |
|---|---|---|---|---|---|
| Loading post-mortem… | |||||
For every NO_TRADE signal the gates issued, we paper-trade it at the entry the gates would have suggested and measure realized PnL over the signal's horizon. If RONIN's skips would have lost money on average, the selection beats coin-flip. Anonymized aggregate across all tenants — no per-tenant data exposed.
Every active gate has a training-time hit-rate band. Each week we measure the realized hit-rate of signals that gate passed and compare. Drift above 10pp from the training band means the gate has stopped working as claimed. Aggregate counts only — no per-gate data exposed.