Pool size
115
miners
115/256 passed the participation gate
Live Bittensor · Subnet 21 · updated daily
Results for 5 October 2026 · 115 miners scored of 256 registered
Every score for 5 October 2026 is in a signed daily receipt anchored on chain. Re-check it yourself with the public verifier from the SN21 repo:
python scripts/verify_day.py --url https://hope-bittensor-api.onrender.com --day 2026-10-05 It checks the signature, the hash chain and the on-chain anchor, and recomputes every score. Add --miner <your hotkey> to check only yours.
Miners earning
20 / 129
paid today, out of everyone scored
Needed to earn
+0.017
edge of place 20, the last paid miner
Top miner
UID 218
+0.034 edge · 0.593 accuracy
Scores settled
2,444,796
predictions checked against real outcomes
129 miners · ranked by edge over the field
| Place | UID | Edge accuracy below | Result | ||||
|---|---|---|---|---|---|---|---|
| 1 | 218 | +0.034 0.593 | Earning · Elite | ||||
| — | 75 | +0.033 0.583 | Below the alpha hold Why?
| ||||
| 2 | 171 | +0.030 0.580 | Earning · Elite | ||||
| 3 | 44 | +0.030 0.581 | Earning · Elite | ||||
| 4 | 72 | +0.029 0.602 | Earning · Elite | ||||
| 5 | 1 | +0.027 0.576 | Earning · Elite | ||||
| 6 | 234 | +0.026 0.575 | Earning · Elite | ||||
| 7 | 19 | +0.025 0.588 | Earning · Elite | ||||
| 8 | 199 | +0.024 0.581 | Earning · Elite | ||||
| 9 | 110 | +0.023 0.572 | Earning · Elite | ||||
| 10 | 148 | +0.022 0.589 | Earning · Elite | ||||
| 11 | 245 | +0.022 0.586 | Earning · Competitive | ||||
| 12 | 160 | +0.021 0.569 | Earning · Competitive | ||||
| — | 91 | +0.020 0.600 | Below the alpha hold Why?
| ||||
| 13 | 196 | +0.020 0.580 | Earning · Competitive | ||||
| 14 | 163 | +0.020 0.568 | Earning · Competitive | ||||
| 15 | 211 | +0.020 0.576 | Earning · Competitive | ||||
| 16 | 32 | +0.019 0.567 | Earning · Competitive | ||||
| 17 | 194 | +0.019 0.578 | Earning · Competitive | ||||
| 18 | 124 | +0.019 0.567 | Earning · Competitive | ||||
| 19 | 188 | +0.018 0.566 | Earning · Competitive | ||||
| 20 | 9 | +0.017 0.574 | Earning · Competitive | ||||
| Earning cut · place 20 · edge +0.017 | |||||||
| — | 42 | +0.017 0.574 | Below the earning cut Why?
| ||||
| — | 117 | +0.017 0.566 | Below the alpha hold Why?
| ||||
| — | 254 | +0.016 0.565 | Below the earning cut Why?
| ||||
| — | 95 | +0.016 0.622 | Duplicate model Why?
| ||||
| — | 250 | +0.015 0.577 | One seat per coldkey Why?
| ||||
| — | 125 | +0.015 0.573 | Below the earning cut Why?
| ||||
| — | 141 | +0.014 0.620 | Duplicate model Why?
| ||||
| — | 186 | +0.013 0.562 | Below the alpha hold Why?
| ||||
| — | 133 | +0.012 0.559 | Below the earning cut Why?
| ||||
| — | 177 | +0.011 0.566 | Below the earning cut Why?
| ||||
| — | 241 | +0.011 0.572 | One seat per coldkey Why?
| ||||
| — | 154 | +0.010 0.558 | Below the alpha hold Why?
| ||||
| — | 225 | +0.010 0.569 | One seat per coldkey Why?
| ||||
| — | 28 | +0.010 0.557 | Duplicate model Why?
| ||||
| — | 114 | +0.010 0.557 | Duplicate model Why?
| ||||
| — | 142 | +0.010 0.557 | Duplicate model Why?
| ||||
| — | 224 | +0.010 0.557 | Duplicate model Why?
| ||||
| — | 6 | +0.010 0.557 | One seat per coldkey Why?
| ||||
| — | 202 | +0.010 0.557 | Duplicate model Why?
| ||||
| — | 200 | +0.010 0.557 | Duplicate model Why?
| ||||
| — | 136 | +0.009 0.556 | One seat per coldkey Why?
| ||||
| — | 162 | +0.009 0.607 | Tenure Why?
| ||||
| — | 13 | +0.008 0.604 | Below the alpha hold Why?
| ||||
| — | 178 | +0.008 0.556 | Below the earning cut Why?
| ||||
| — | 222 | +0.008 0.610 | Tenure Why?
| ||||
| — | 149 | +0.007 0.556 | One seat per coldkey Why?
| ||||
| — | 50 | +0.007 0.555 | One seat per coldkey Why?
| ||||
| — | 134 | +0.007 0.563 | One seat per coldkey Why?
| ||||
| — | 58 | +0.005 0.596 | Below the earning cut Why?
| ||||
| — | 89 | +0.004 0.551 | One seat per coldkey Why?
| ||||
| — | 230 | +0.004 0.551 | Below the earning cut Why?
| ||||
| — | 48 | +0.002 0.548 | Below the alpha hold Why?
| ||||
| — | 88 | +0.000 0.547 | One seat per coldkey Why?
| ||||
| — | 43 | −0.000 0.546 | Duplicate model Why?
| ||||
| — | 205 | −0.001 0.557 | Below the alpha hold Why?
| ||||
| — | 249 | −0.001 0.545 | One seat per coldkey Why?
| ||||
| — | 244 | −0.001 0.546 | Below the earning cut Why?
| ||||
| — | 76 | −0.002 0.544 | Duplicate model Why?
| ||||
| — | 214 | −0.002 0.544 | One seat per coldkey Why?
| ||||
| — | 60 | −0.003 0.544 | Duplicate model Why?
| ||||
| — | 66 | −0.004 0.562 | Below the alpha hold Why?
| ||||
| — | 198 | −0.005 0.541 | One seat per coldkey Why?
| ||||
| — | 140 | −0.006 0.541 | Below the earning cut Why?
| ||||
| — | 92 | −0.006 0.551 | Below the earning cut Why?
| ||||
| — | 39 | −0.007 0.539 | Below the earning cut Why?
| ||||
| — | 53 | −0.009 0.555 | One seat per coldkey Why?
| ||||
| — | 30 | −0.011 0.535 | One seat per coldkey Why?
| ||||
| — | 25 | −0.011 0.535 | Duplicate model Why?
| ||||
| — | 240 | −0.011 0.535 | Duplicate model Why?
| ||||
| — | 143 | −0.011 0.535 | Duplicate model Why?
| ||||
| — | 104 | −0.011 0.535 | Duplicate model Why?
| ||||
| — | 130 | −0.011 0.535 | Duplicate model Why?
| ||||
| — | 112 | −0.011 0.534 | Duplicate model Why?
| ||||
| — | 164 | −0.013 0.532 | Below the alpha hold Why?
| ||||
| — | 34 | −0.015 0.531 | Duplicate model Why?
| ||||
| — | 120 | −0.015 0.538 | Below the alpha hold Why?
| ||||
| — | 63 | −0.018 0.534 | Below the earning cut Why?
| ||||
| — | 69 | −0.029 0.515 | Below the alpha hold Why?
| ||||
| — | 132 | −0.034 0.510 | Duplicate model Why?
| ||||
| — | 203 | −0.034 0.510 | Duplicate model Why?
| ||||
| — | 208 | −0.034 0.509 | Duplicate model Why?
| ||||
| — | 41 | −0.037 0.506 | One seat per coldkey Why?
| ||||
| — | 103 | −0.041 0.503 | Below the earning cut Why?
| ||||
| — | 2 | −0.045 0.511 | Below the alpha hold Why?
| ||||
| — | 82 | −0.047 0.495 | Below the alpha hold Why?
| ||||
| — | 26 | −0.050 0.504 | Duplicate model Why?
| ||||
| — | 238 | −0.050 0.504 | Duplicate model Why?
| ||||
| — | 90 | −0.053 0.501 | Duplicate model Why?
| ||||
| — | 251 | −0.053 0.501 | Duplicate model Why?
| ||||
| — | 33 | −0.055 0.497 | Below the alpha hold Why?
| ||||
| — | 181 | −0.056 0.485 | One seat per coldkey Why?
| ||||
| — | 138 | −0.077 0.462 | One seat per coldkey Why?
| ||||
| — | 137 | −0.078 0.467 | Below the alpha hold Why?
| ||||
| — | 100 | −0.079 0.460 | One seat per coldkey Why?
| ||||
| — | 105 | −0.082 0.464 | Below the alpha hold Why?
| ||||
| — | 247 | −0.315 0.215 | Below the alpha hold Why?
| ||||
| — | 204 | −0.332 0.203 | One seat per coldkey Why?
| ||||
| — | 31 | −0.347 0.186 | One seat per coldkey Why?
| ||||
| — | 167 | −0.379 0.151 | Duplicate model Why?
| ||||
| — | 242 | −0.379 0.151 | One seat per coldkey Why?
| ||||
| — | 55 | −0.394 0.139 | One seat per coldkey Why?
| ||||
| — | 0 | −0.423 0.104 | One seat per coldkey Why?
| ||||
| — | 189 | −0.425 0.102 | One seat per coldkey Why?
| ||||
| — | 40 | −0.425 0.102 | One seat per coldkey Why?
| ||||
| — | 12 | −0.425 0.102 | One seat per coldkey Why?
| ||||
| — | 252 | −0.425 0.102 | One seat per coldkey Why?
| ||||
| — | 54 | −0.450 0.083 | One seat per coldkey Why?
| ||||
| — | 14 | −0.467 0.062 | One seat per coldkey Why?
| ||||
| — | 17 | −0.482 0.043 | One seat per coldkey Why?
| ||||
| — | 243 | −0.482 0.042 | One seat per coldkey Why?
| ||||
| — | 231 | −0.482 0.042 | One seat per coldkey Why?
| ||||
| — | 8 | −0.482 0.042 | One seat per coldkey Why?
| ||||
| — | 239 | −0.483 0.041 | One seat per coldkey Why?
| ||||
| — | 70 | −0.521 0.000 | Below baseline Why?
| ||||
| — | 237 | −0.521 0.000 | Below baseline Why?
| ||||
| — | 56 | −0.521 0.000 | Below baseline Why?
| ||||
| — | 108 | −0.521 0.000 | Below baseline Why?
| ||||
| — | 216 | −0.521 0.000 | Below baseline Why?
| ||||
| — | 61 | −0.521 0.000 | Below baseline Why?
| ||||
| — | 20 | −0.521 0.000 | Below baseline Why?
| ||||
| — | 169 | −0.521 0.000 | Below baseline Why?
| ||||
| — | 45 | −0.521 0.000 | Below baseline Why?
| ||||
| — | 152 | −0.521 0.000 | Below baseline Why?
| ||||
| — | 118 | −0.521 0.000 | Below baseline Why?
| ||||
| — | 170 | −0.521 0.000 | Below baseline Why?
| ||||
| — | 115 | 0.616 | Building evidence Why?
| ||||
| — | 192 | 0.341 | Building evidence Why?
| ||||
Click a UID to open that miner's page. Edge is the average lead over the field on the same changes — it ranks and pays; accuracy is shown beneath it.
Daily stream — live. Each day's settled standings are published here as they mature, with outcomes measured at 7, 14 and 28 days. Earlier weekly epochs remain in the Epochs tab as the historical record. About the daily stream →
Prediction performance by change type. For every kind of account change: the best model's score, the current winner's beside it, and the score broken into direction, size, range and goal. Performance tab → Full page →
More on SN21: daily numbers, score distribution, history, method, API and performance
Pulse · Operational snapshot
Headline numbers from the latest published day. SN21 publishes a new day of settled results every day; these tiles describe the most recent one. The leaders are in the leaderboard at the top of the page.
Pool size
115
miners
115/256 passed the participation gate
Baseline beat rate
100.0%
of pool
Share above the conditional-prior baseline
Elite tier
11
60.0% of emissions
EMA ≥ baseline + 1σ this epoch
Cohort context · this epoch vs all published
Tier band · Pool vs emissions
Live
Share of pool
measured
Share of emissions
policy constant
Elite
EMA ≥ baseline + 1σ
pool 9.6% · emit 60.0%
Competitive
beats baseline
pool 19.1% · emit 30.0%
Participating
passed gate
pool 19.1% · emit 10.0%
Tier rail · Emission shares + epoch context
4 metrics
Competitive
22
0.30 emissions share
Participating
22
0.10 emissions share
Multiplier
1.00×
Search
Formula
1.2.1
@ 6b24e0c
Find yourself on chain
Opens taostats
Per IA D-05, no per-miner identifier ever leaves this server. The browser navigates straight to taostats.
For every kind of account change since the rich-data baseline (2026-08-20): the best model, the current winner beside it, and each score broken into its parts — 2,444,796 settled scores from 151 models.
Full page →Distribution · Score histogram + tier breakdown
Per IA D-05 the public surface publishes the shape of the score distribution — not per-miner identifiers. Bins are k-anonymity-collapsed to a 5-miner floor; the chain remains the source of truth for raw per-UID data.
Results · BD-2026-10-05
Search ×1.00
Plain-language summary
Earning today
20/129
16% of the field
Not earning
109
most: a second hotkey on one owner
Top score
0.622
leader of the pool
Score range
0.118
Mixed range
Why the other 109 are not earning
Each row below names the rule that applied to it, and who holds the seat where that matters. Scores are unaffected — they are facts either way.
Verifiable against chain
Signed and chain-anchored
2026-10-05
Every published day is attested and hash-chained to the day before, and the feed's rolling root is committed on chain — so one anchor covers the whole history, not a single block span.
Reproduce locally
python scripts/verify_day.py --url https://hope-bittensor-api.onrender.com --day 2026-10-05 Recomputes every score from the day's signed receipt. Prints "ok": true when they reproduce, and names the entry that disagrees when they do not.
Scoring · v1.2.1 · commit 6b24e0c115
The per-miner leaderboard is at the top of this page.
Score range · 115 miners scored
Aggregate summary
Scores landed between 0.504 and 0.622 — top score 0.622
Range collapses to a 15.5-point window
0.474
0.629
Axis is auto-zoomed to the data range so percentile positions are legible even when the underlying histogram bins are coarse. Score cuts shown above are exact; positioning is proportional.
| Score range | Miner count | Share of pool |
|---|---|---|
| 0.00–0.10 | 7 | 6.1% |
| 0.10–0.25 | 11 | 9.6% |
| 0.25–0.30 | 0 | 0.0% |
| 0.30–0.35 | 0 | 0.0% |
| 0.35–0.40 | 0 | 0.0% |
| 0.40–0.45 | 0 | 0.0% |
| 0.45–0.50 | 7 | 6.1% |
| 0.50–0.55 | 33 | 28.7% |
| 0.55–0.60 | 50 | 43.5% |
| 0.60–0.65 | 7 | 6.1% |
| 0.65–0.70 | 0 | 0.0% |
| 0.70–0.75 | 0 | 0.0% |
| 0.75–0.80 | 0 | 0.0% |
| 0.80–0.85 | 0 | 0.0% |
| 0.85–0.90 | 0 | 0.0% |
| 0.90–0.95 | 0 | 0.0% |
| 0.95–1.00 | 0 | 0.0% |
Position bands · Find where you sit
5 bands
| Band | Score cut | Tier hint | What it means |
|---|---|---|---|
| Top score | 0.622 | Elite · 60% | Highest score achieved by any miner in this epoch’s qualifying pool. |
| Top 25% | 0.568 | Elite · 60% | Scoring at or above this puts you in the top quartile of the pool. |
| Mean score | 0.481 | — | Average across the qualifying pool — useful proxy for the conditional-prior baseline. |
| Median | 0.548 | Competitive · 30% | Half the pool scored at or above this, half below. |
| Bottom 25% | 0.504 | Participating · 10% | Scoring at or below this puts you in the bottom quartile of the pool. |
Tier hints are heuristic from this epoch's percentile cuts. Actual tier membership depends on EMA across multiple epochs vs the conditional-prior baseline + 1σ. See Methodology.
Score → band calculator
Heuristic
Enter a value between 0.000 and
1.000. Defaults shown match this epoch's distribution.
Band placement
Enter a score above
—
—
115/256 passed the gate.
| Tier | Count | Share of pool | Share of emissions |
|---|---|---|---|
| Elite | 11 | 9.6% | 60.0% |
| Competitive | 22 | 19.1% | 30.0% |
| Participating | 22 | 19.1% | 10.0% |
Elite-tier floor: met this epoch.
Accuracy by change type moved to the Performance tab — the cumulative picture with best model, current winner and score parts.
The score is an accuracy score from 0 to 1, where 1 is a perfect prediction. A score of 0.6 means the model is about 60% of the way to perfect. It is not the percentage of predictions that were correct.
It blends four things:
The leaderboard number is not a single day: it is the average of a model's recent predictions, where recent work counts more than old (a score twelve days old counts half). Predictions are locked before any outcome exists, and a day's first score settles about 15 days after its basket — 7 days of outcomes plus a settling week so late conversions count.
Mining? Look up your own scores by hotkey — per-day entries, win/lose by change type, and the signed receipt that lets you reproduce every number.
Epochs · Frozen records, newest first
Every closed epoch publishes as a permanent record at
/predictions/epochs/[release_key].
Published rows are immutable per IA D-13; corrections appear as separate
rows, not edits.
61 epoch slots · newest first · 22 have corrections
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Methodology · Verification map
Every number on this dashboard is reconcilable to on-chain validator output. The links and procedure below are the entry points for verifying any published epoch independently — the chain is the source of truth; this site mirrors the spec and surfaces aggregates.
3 steps
Step 1 / 3
Mirrored canonical SN21 documents on this site — whitepaper, reward mechanism, epoch structure.
Step 2 / 3
scripts/verify_day.py checks any published day: the signed receipt, the hash chain, the on-chain anchor, and every score recomputed.
Step 3 / 3
Block range + scoring formula commit on every record lets you query the chain directly.
scripts/verify_day.py in the
SN21 repo fetches a day's signed receipt, checks its signature, the
hash chain and the on-chain anchor, re-runs the open-source scoring
code, and names the exact entry if anything disagrees.
python scripts/verify_day.py \
--url https://hope-bittensor-api.onrender.com \
--day YYYY-MM-DD \
--miner <your hotkey> # optional: only your entries
No keys and no archive node needed: the receipt, proof and
allocation audit are public. Add --expect-anchor
with the root you read from the chain to close the loop yourself.
Weekly epochs before 3 August 2026 use scripts/verify_epoch.py.
Per-miner emissions on SN21 are derivable from per-miner scores (Reward Mechanism §"Component 2"). Publishing per-UID scores publishes per-UID emissions — doxxing-adjacent, and a strong anti-coordination signal. The chain already exposes per-UID data to anyone who queries it. The dashboard publishes what the chain does not: the shape of the distribution, the size of the qualifying pool, the baseline-beat rate, and the scoring formula version that produced them.
API & schema · Public read surface for researchers and validators
Every published epoch is reachable as JSON without a key. Drop the cURL line into a terminal, the Python snippet into a Jupyter cell, and you have the same data the dashboard is rendering — plus the provenance fields needed to reconcile against the chain.
Latest published epoch
GET 200https://adtao.io/api/sn21/latest.json
Returns { epoch: EpochReport | null }
— the freshest published row, or
null until
the first publish click. 60-second cache.
All published epochs
GET 200https://adtao.io/api/sn21/index.json
Returns { count, epochs: EpochReport[] }
newest first. Canonical snake_case pydantic shape per the
SN21 source-of-truth model. 60-second cache.
Total fields
21
Nullable
3
Aggregate-only
D-05
Schema version
v1.0
curl -sSL "https://adtao.io/api/sn21/latest.json" \
-H "Accept: application/json" | jq '.epoch'
Returns the full EpochReport JSON. Pair with
jq for pretty-printing.
import json, urllib.request
URL = "https://adtao.io/api/sn21/latest.json"
with urllib.request.urlopen(URL) as r:
resp = json.loads(r.read())
epoch = resp["epoch"]
if epoch is None:
raise SystemExit("no published epochs yet")
print(f"Epoch {epoch['epoch_id']}")
print(f"Pool size {epoch['pool_size']} of {epoch['total_registered_uids']}")
print(f"Beat rate {epoch['baseline_beat_rate']:.1%}")
print(f"Formula {epoch['scoring_formula_version']} @ {epoch['scoring_formula_commit'][:7]}")
print(f"Blocks {epoch['block_range_start']}-{epoch['block_range_end']}")
Zero dependencies — uses
urllib from the stdlib.
Pydantic source-of-truth
| Field | Type | Units | Semantic |
|---|---|---|---|
| epoch_id | string | release-key | Canonical SN21 release key — BD-2026-08-20 in the daily stream, WR-2026-W21-PUB-E1 in the weekly era. Stable URL path component. |
| epoch_type | string | enum | Standard epoch classification (Daily, Search, Discovery, …). Drives epoch_type_multiplier. |
| epoch_subtype | string | null | — | Optional sub-classification when epoch_type alone is insufficient. |
| block_range_start | integer | block height | Inclusive lower bound of the chain blocks aggregated for this epoch. |
| block_range_end | integer | block height | Inclusive upper bound. Reconcile via a Bittensor archive node. |
| scoring_formula_version | string | semver | Released aggregator wire-shape version. Pinned per epoch. |
| scoring_formula_commit | string | git sha (40) | Commit hash of SN21-adtao at epoch close. Links to the SHA-pinned source. |
| horizon_set | string[] | duration | Time horizons the scoring formula evaluated — 7d, 14d, 28d in the daily stream; 7d, 14d in the weekly era. |
| epoch_type_multiplier | float | × | Emission multiplier applied to this epoch_type. Constants per epoch type. |
| pool_size | integer | miners | Count of qualifying miners (passed the participation gate). |
| total_registered_uids | integer | miners | Count of UIDs registered on netuid 21 at epoch close. |
| pool_size_below_distribution_floor | boolean | — | True when pool_size < 15; histogram is omitted in that case. |
| baseline_beat_rate | float | ratio (0–1) | Share of pool with EMA above the conditional-prior baseline. |
| score_distribution | object | null | histogram | bin_edges, bin_counts, summary {mean, median, p25, p75, max}. Null when pool below floor. |
| tier_distribution | object | — | elite, competitive, participating { count, share_of_pool, share_of_emissions } + elite_floor_met. |
| tier_split_active | boolean | — | False when the pool collapses to a single undivided group. |
| emergency_intervention | object | — | { triggered, type, outcome, summary_text }. Routine epochs read { triggered: false }. |
| validator_output_snapshot_timestamp | string | ISO 8601 UTC | When the validator output was captured for this aggregation. |
| chain_fetch_timestamp | string | ISO 8601 UTC | When the chain reading completed. |
| commentary_markdown | string | null | markdown | Optional human commentary. Null on routine epochs. |
| aggregator_version | integer | — | Wire-shape version of the aggregator. Bumped when the same input produces different output. |
The dashboard reads from the JSON endpoint. The JSON came from the aggregator. The aggregator reads chain + validator output. The chain is the source of truth. Re-run the aggregator with the same inputs and you get the same JSON — or a discrepancy you can act on.
git clone https://github.com/ippcteam/SN21-adtao.git
cd SN21-adtao && pip install -e .
python scripts/verify_epoch.py \
--epoch-id WR-2026-W21-PUB-E1 \
--validator-hotkey 5GxVLdpRGZN... \
--tier-2-base https://archive.example.io Needs Python 3.11+ and a Bittensor archive node URL. The full score recomputation also needs the operator's truth-file (reveal blob per §9.A.2). Chain-integrity mode does not.
verify_epoch.py