Skip to content

Stop burning miner emissions: normalize distributed rewards to 100%#590

Merged
anderdc merged 4 commits into
testfrom
no-burn-normalize
Jul 21, 2026
Merged

Stop burning miner emissions: normalize distributed rewards to 100%#590
anderdc merged 4 commits into
testfrom
no-burn-normalize

Conversation

@anderdc

@anderdc anderdc commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

Why

Subnet emission on Bittensor scales with price × (1 - miner_burn) — every unit of weight routed to the recycle UID shrinks the whole subnet's emissions. We were burning the full penalty shortfall (ineligible holders, capacity < 1, fill_ratio < 1, empty direction buckets), which regularly amounted to a large slice of the pool.

What

The reward formula is untouched: eligible × pool × crown_share × capacity × fill_ratio. The change is only what happens to the shortfall — instead of topping up RECYCLE_UID, it is left undistributed, and set_weights' existing L1 normalization stretches the distributed mass to 100% of emissions. All penalties keep their full relative bite (ratios between miners are unchanged); the mass a penalized miner forfeits now flows pro-rata to the miners who performed instead of burning.

  • calculate_miner_rewards: recycle top-up removed; the scoring trace now logs undistributed=… with the same cause diagnostics.
  • Halt: scores are frozen (no update_scores call) so pre-halt weights persist on chain, instead of routing the full pool to the recycle UID. _flush_halt_window dashboard semantics unchanged.
  • set_weights empty/NaN fallback: skips the round (previous on-chain weights persist) instead of burning — bittensor's uniform-1/n fallback is still avoided.
  • build_halted_rewards deleted; RECYCLE_UID kept in constants (documents the owner UID; tests assert it receives nothing).

Incentive notes

  • Hard gates (eligibility, can_fund, executability band) are unaffected — a gated miner still earns absolute zero, and its share flows to other miners, never back to it.
  • Soft multipliers become relative rather than absolute: a penalized miner's loss is its competitors' gain. The one regression surface is a low-competition regime where a dominant operator's fleet could coast — worth watching in the scoring traces (undistributed= line) after deploy.

Tests

795 passed (full suite). Recycle-pinning tests rewritten to assert the new invariant: nothing lands on RECYCLE_UID, reward sum equals distributed mass only, halt freezes scores.

anderdc and others added 4 commits July 21, 2026 14:28
…zation stretch to 100%

Subnet emission scales with price x (1 - miner_burn), so routing the
penalty shortfall to the recycle UID was costing the subnet emissions.
The reward formula is unchanged (eligible x pool x crown_share x
capacity x fill_ratio); the shortfall is simply left undistributed and
set_weights' existing L1 normalization stretches the distributed mass
to 100% of emissions. Penalties keep their full relative bite.

- calculate_miner_rewards: no recycle top-up; trace logs the
  undistributed remainder instead
- halt: freeze scores (skip update) so pre-halt weights persist
  instead of routing the full pool to the recycle UID
- set_weights: empty/NaN scores skip the round (previous on-chain
  weights persist) instead of burning
@anderdc
anderdc merged commit 0f30f59 into test Jul 21, 2026
3 checks passed
@anderdc
anderdc deleted the no-burn-normalize branch July 21, 2026 19:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant