Skip to content

Refactor Merge Predictions Rewards #289

@anderdc

Description

@anderdc

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):

  1. Retrieve all miner EMA scores
  2. Normalize to sum = 1.0
  3. Scale by PREDICTIONS_EMISSIONS_SHARE (0.15)
  4. 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:

  1. Rank all miners by EMA score (descending)
  2. Zero out all rewards except the top 3
  3. Assign fixed shares: 50% / 35% / 15% of PREDICTIONS_EMISSIONS_SHARE
  4. 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_K

Why 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.py to 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 rounds count, i.e., more settled issues)
    • Single miner → receives 50%, rest unallocated

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions