-
Notifications
You must be signed in to change notification settings - Fork 60
Description
Problem
Merge prediction participation is critically low. After discussions with miners, the core issue is clear: rewards are spread too thin across all participants, making the competition not worth the effort. With 15% of emissions distributed proportionally across every miner with a positive EMA score, individual payouts are not worth the investment.
Current Behavior
- 15% of total emissions are allocated to the merge prediction competition (
PREDICTIONS_EMISSIONS_SHARE = 0.15) - All miners with a positive EMA score receive a proportional share of that 15% allocation
- EMA scores are normalized to sum to 1.0, then scaled by the allocation
- This means rewards are diluted across potentially dozens of miners, with diminishing returns for everyone
Reward flow (forward.py:build_prediction_ema_rewards):
- Retrieve all miner EMA scores
- Normalize to sum = 1.0
- Scale by
PREDICTIONS_EMISSIONS_SHARE(0.15) - Distribute proportionally
Proposed Solution: Top-3 Winner-Takes-Most
Refactor reward distribution so that only the top 3 miners by EMA score receive merge prediction rewards, with a fixed split:
| Place | Share of Allocation |
|---|---|
| 1st | 50% |
| 2nd | 35% |
| 3rd | 15% |
The 15% emissions allocation to the competition remains unchanged. What changes is how that allocation is distributed — concentrated among the top 3 rather than spread across all participants.
Implementation Details
Primary change: build_prediction_ema_rewards() in gittensor/validator/forward.py
Should become:
- Rank all miners by EMA score (descending)
- Zero out all rewards except the top 3
- Assign fixed shares: 50% / 35% / 15% of
PREDICTIONS_EMISSIONS_SHARE - Handle edge cases where fewer than 3 miners have positive EMA scores (distribute among however many exist, using the same ratio order — e.g., if only 2 miners: 50% and 35%, remaining 15% unallocated)
New constants to add in gittensor/constants.py:
PREDICTIONS_TOP_K = 3
PREDICTIONS_TOP_K_SHARES = [0.50, 0.35, 0.15] # create tests to ensure sums to 1.0 and len == TOP_KWhy This Works
- Concentrates incentives: Top performers earn meaningful rewards instead of everyone getting dust
- Creates real competition: Miners have a clear target — be in the top 3
- Preserves the scoring system: The EMA-based ranking still rewards consistency, timeliness, and accuracy over time. All the existing scoring mechanics (correctness cubing, timeliness bonus, consensus bonus, order bonus) still determine who the top 3 are
Test Updates
- Update
tests/validator/test_emission_shares.pyto validate top-k distribution logic - Add test cases:
- Standard case: 3+ miners with positive EMA → 50/35/15 split
- Fewer than 3 miners with positive EMA → distribute among available, remainder unallocated
- Ties in EMA score (tiebreaker: higher
roundscount, i.e., more settled issues) - Single miner → receives 50%, rest unallocated