You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Revised 2026-07-30 after reading the v440 source (#8740). The premise this epic was
originally filed on — that the emission gate throttles TAO injection — is wrong. The gate
redistributes; it does not withhold. 100.00% of block emission reaches subnets. The
corrected mechanism, and the surface that is actually worth building, are below. #8740 carries
the full derivation.
What v440 actually does
Runtime spec 440 (live on finney since 2026-07-27) added a Hill emission gate to the subnet
emission pipeline. The full pipeline, read from pallets/subtensor/src/coinbase/{subnet_emissions,run_coinbase,block_emission}.rs at tag v440
and reproduced against live chain state to a mean share error of 4.3e-8:
alpha_in_i = tao_emission_i / price_i, capped at root_proportion_i · alpha_emission_i; the remainder becomes excess_tao → chain buys
get_subnet_terms
8
balancer splits materialized TAO into price-active vs reservoir; only the price-active part is written to SubnetTaoInEmission
inject_and_maybe_swap
Live parameters: θ = 0.008989, q = 0.75 (raised from the 0.61 default post-deploy), EmissionGateExponent storage unset → runtime default h = 3.
The four things that make this worth building
1. The gate is redistributive, not extractive. Step 4 renormalizes gated shares to sum to 1
— the source says so directly: e_i = gate(s_i) * s_i / sum(gate(s_j) * s_j). Aggregate TAO is
untouched; what changes is which subnets get it. Who gained and who lost share at the gate is a
real, publishable, currently-invisible number.
2. TAO arrives through two channels, and only one is visible anywhere. Measured at block
8,736,990:
The 67% arriving as chain buys is the alpha injection cap at step 7 — as a subnet's alpha
issuance grows, root_proportion shrinks, the cap falls, and TAO that can no longer be paired
as liquidity is spent buying alpha on the subnet's own pool instead. Age-driven, not
gate-driven. Both channels are TAO arriving, with different price effects. The split, per
subnet, is the single most useful thing on this surface and nobody publishes it.
3. MinerBurned silently reweights every subnet's share. 68 of 128 subnets have a non-zero
value, and it multiplies straight into their TAO share at step 2. Unpublished anywhere.
(U96F32 — divide by 2^32. Scaling this as rao was the largest error in the first
reconstruction.)
4. The network is past its first halving, and the obvious storage item is stale. TotalIssuance = 11,180,113 TAO → log2(1/(1−issuance/2.1e16)) = 1.0966 → floor 1 → block
emission = 0.5 TAO/block. The BlockEmission storage item reads 1.0 TAO and is not the
live figure; the live value is recomputed from issuance every block. Anyone deriving emission
percentages from that storage item is off by 2×.
What we already publish that is now misleading
emission_share = alpha_price / Σ alpha_price (scripts/lib/economics-artifacts.ts:186) is stage 1 of the pipeline above — the gate's raw input, before miner-burn weighting, before
the gate, before the enabled filter. It is the default sort on /api/v1/economics, summed into total_emission_share (src/domain-summary.ts:116), exported as mean_emission_share on /economics/trends, and rendered in three UI surfaces. Every one of them reads as "share of TAO
emission" and is now five stages upstream of it. That is #8746.
Why the split.#8743 was carrying four separable deliverables (per-subnet capture, a
network-level change log, the block-emission derivation, and the verification harness). They
have different storage shapes, different write patterns, and different review surfaces, so they
are four PRs, not one. #8749 exists because everything #8744 publishes is a reconstruction —
without a harness holding it against live chain state, the surface is a claim rather than a
verified one. #8750 exists because a single dormant switch would invalidate the entire
decomposition at once.
Traps, all of which cost real debugging time
MinerBurned is U96F32 (÷2^32), not rao.
The three gate parameters are 128-bit U64F64 (16 bytes), not 64-bit.
EmissionGateExponent unset means h = 3, not 0. h = 0 yields gate = 0.5 for everything.
SubnetEmissionEnabled defaults to true — absent ≠ disabled.
BlockEmission storage is stale; derive from TotalIssuance.
SubnetAlphaOutEmission is alpha to participants; SubnetAlphaInEmission is alpha to the pool. Σ 127.0 vs Σ 9.42 per block. Pool-ratio math needs alpha_in.
SubnetAlphaOutEmission is not a constant 1.0 — it is a per-subnet halving curve
(get_block_emission_for_issuance(alpha_issuance_i)). It reads 1.0 today only because no
subnet has crossed its first threshold.
SubnetTaoInEmission is per-block, reservoir-smoothed and cap-limited. A single sample is
not a stable measure; 47 of the 54 subnets reading zero are SubnetEmissionEnabled = false,
not gate casualties.
get_shares_flow (TAO-flow EMA) exists in v440 but is #[allow(dead_code)] and not wired
in. The machinery is provisioned and partially warm: SubnetTaoFlow is written on all 128
subnets by live stake/swap code, while SubnetEmaTaoFlow is set on 124 and frozen at
exactly block 8,466,530 (~37.6 days behind tip) — the signature of a path that ran and was
switched off. If it is switched back on, the gate's input changes from price to demand flow
and every figure here moves at once. Monitored by monitor(chain): alert if the dormant TAO-flow emission path is activated #8750.
Placement
/chain/emissions, a peer of /chain/governance and /chain/runtime, plus a panel on /subnets/{netuid}. Network-wide mechanism, not a tab under one subnet.
Explicitly out of scope
Any claim that emission is being throttled or withheld. It is not. 100.00% of block
emission reaches subnets.
Reimplementing the pipeline as a forecast. We publish the decomposition of what happened, not
a simulation of what will.
Forecasting parameter changes.
Advice on what to do about any of it.
Definition of done
For any subnet: its price share, its miner-burn weight, its post-gate share, whether it is
emission-enabled, and its TAO split between pool injection and chain buys — each with the
block height and storage key that produced it.
The decomposition reproduces the chain to fixed-point tolerance, and a regression test holds
it there.
θ, q, h served with change history.
emission_share is unambiguous everywhere it appears.
Every published value is reproducible by an outside reader against a public RPC endpoint.
Map hasher is Identity — key suffix is the netuid as u16 little-endian (74 → 4a00). All 128
per item in one state_queryStorageAt. Item hashes are twox128(<name>), derivable with the
repo's own src/twox-storage-key.ts.
Related: #8702 (upgrade radar) would have flagged v440 while it was still on testnet.
What v440 actually does
Runtime spec 440 (live on finney since 2026-07-27) added a Hill emission gate to the subnet
emission pipeline. The full pipeline, read from
pallets/subtensor/src/coinbase/{subnet_emissions,run_coinbase,block_emission}.rsat tagv440and reproduced against live chain state to a mean share error of 4.3e-8:
FirstEmissionBlockNumber.is_some()∧SubtokenEnabled∧NetworkRegistrationAllowedget_subnets_to_emit_tos_i = SubnetMovingPrice_i / Σ SubnetMovingPrice— price EMA shareget_shares_price_emaw_i = s_i · (1 − MinerBurned_i), renormalizedget_sharesθ= q-mass bar over w, recomputed whenblock % 360 == 0maybe_update_emission_gate_barg_i = w_i · 1/(1+(θ/w_i)^h), renormalized to sum 1apply_emission_gateSubnetEmissionEnabled == false→ zeroed, share redistributedget_subnet_block_emissionstao_emission_i = block_emission · g_iget_subnet_block_emissionsalpha_in_i = tao_emission_i / price_i, capped atroot_proportion_i · alpha_emission_i; the remainder becomesexcess_tao→ chain buysget_subnet_termsSubnetTaoInEmissioninject_and_maybe_swapLive parameters:
θ = 0.008989,q = 0.75(raised from the 0.61 default post-deploy),EmissionGateExponentstorage unset → runtime default h = 3.The four things that make this worth building
1. The gate is redistributive, not extractive. Step 4 renormalizes gated shares to sum to 1
— the source says so directly:
e_i = gate(s_i) * s_i / sum(gate(s_j) * s_j). Aggregate TAO isuntouched; what changes is which subnets get it. Who gained and who lost share at the gate is a
real, publishable, currently-invisible number.
2. TAO arrives through two channels, and only one is visible anywhere. Measured at block
8,736,990:
The 67% arriving as chain buys is the alpha injection cap at step 7 — as a subnet's alpha
issuance grows,
root_proportionshrinks, the cap falls, and TAO that can no longer be pairedas liquidity is spent buying alpha on the subnet's own pool instead. Age-driven, not
gate-driven. Both channels are TAO arriving, with different price effects. The split, per
subnet, is the single most useful thing on this surface and nobody publishes it.
3.
MinerBurnedsilently reweights every subnet's share. 68 of 128 subnets have a non-zerovalue, and it multiplies straight into their TAO share at step 2. Unpublished anywhere.
(
U96F32— divide by 2^32. Scaling this as rao was the largest error in the firstreconstruction.)
4. The network is past its first halving, and the obvious storage item is stale.
TotalIssuance= 11,180,113 TAO →log2(1/(1−issuance/2.1e16))= 1.0966 → floor 1 → blockemission = 0.5 TAO/block. The
BlockEmissionstorage item reads 1.0 TAO and is not thelive figure; the live value is recomputed from issuance every block. Anyone deriving emission
percentages from that storage item is off by 2×.
What we already publish that is now misleading
emission_share=alpha_price / Σ alpha_price(scripts/lib/economics-artifacts.ts:186) isstage 1 of the pipeline above — the gate's raw input, before miner-burn weighting, before
the gate, before the enabled filter. It is the default sort on
/api/v1/economics, summed intototal_emission_share(src/domain-summary.ts:116), exported asmean_emission_shareon/economics/trends, and rendered in three UI surfaces. Every one of them reads as "share of TAOemission" and is now five stages upstream of it. That is #8746.
Sub-issues
#8740Pin the gate's actual input— done, findings on the issueemission_sharemeans, the reconstruction rule/api/v1/network/parameters(pure storage read)BlockEmissionitem is staleSubnetEmissionEnabledchange history/chain/emissionsUI + per-subnet panelemission_shareas stage-1 inputUnblocked now: #8741, #8742, #8747, #8748, #8750. #8743 needs only #8747.
Why the split. #8743 was carrying four separable deliverables (per-subnet capture, a
network-level change log, the block-emission derivation, and the verification harness). They
have different storage shapes, different write patterns, and different review surfaces, so they
are four PRs, not one. #8749 exists because everything #8744 publishes is a reconstruction —
without a harness holding it against live chain state, the surface is a claim rather than a
verified one. #8750 exists because a single dormant switch would invalidate the entire
decomposition at once.
Traps, all of which cost real debugging time
MinerBurnedis U96F32 (÷2^32), not rao.EmissionGateExponentunset means h = 3, not 0.h = 0yieldsgate = 0.5for everything.SubnetEmissionEnableddefaults to true — absent ≠ disabled.BlockEmissionstorage is stale; derive fromTotalIssuance.SubnetAlphaOutEmissionis alpha to participants;SubnetAlphaInEmissionis alpha to thepool. Σ 127.0 vs Σ 9.42 per block. Pool-ratio math needs
alpha_in.SubnetAlphaOutEmissionis not a constant 1.0 — it is a per-subnet halving curve(
get_block_emission_for_issuance(alpha_issuance_i)). It reads 1.0 today only because nosubnet has crossed its first threshold.
SubnetTaoInEmissionis per-block, reservoir-smoothed and cap-limited. A single sample isnot a stable measure; 47 of the 54 subnets reading zero are
SubnetEmissionEnabled = false,not gate casualties.
get_shares_flow(TAO-flow EMA) exists in v440 but is#[allow(dead_code)]and not wiredin. The machinery is provisioned and partially warm:
SubnetTaoFlowis written on all 128subnets by live stake/swap code, while
SubnetEmaTaoFlowis set on 124 and frozen atexactly block 8,466,530 (~37.6 days behind tip) — the signature of a path that ran and was
switched off. If it is switched back on, the gate's input changes from price to demand flow
and every figure here moves at once. Monitored by monitor(chain): alert if the dormant TAO-flow emission path is activated #8750.
Placement
/chain/emissions, a peer of/chain/governanceand/chain/runtime, plus a panel on/subnets/{netuid}. Network-wide mechanism, not a tab under one subnet.Explicitly out of scope
emission reaches subnets.
a simulation of what will.
Definition of done
emission-enabled, and its TAO split between pool injection and chain buys — each with the
block height and storage key that produced it.
it there.
θ,q,hserved with change history.emission_shareis unambiguous everywhere it appears.Reproducing
Map hasher is Identity — key suffix is the netuid as u16 little-endian (74 →
4a00). All 128per item in one
state_queryStorageAt. Item hashes aretwox128(<name>), derivable with therepo's own
src/twox-storage-key.ts.Related: #8702 (upgrade radar) would have flagged v440 while it was still on testnet.