UltraDAG inherited Bitcoin’s halving constants: 50 coins per block, halving every 210,000 blocks, 21 million max supply. Bitcoin produces blocks every 10 minutes. UltraDAG produces rounds every 5 seconds.
That difference — a factor of 120 — meant the entire emission schedule would complete in three months instead of a hundred years. We caught it before mainnet launch and redesigned the schedule from first principles.
The Constraint
Bitcoin’s emission has an elegant identity that most people don’t think about:
initial_reward x halving_interval x 2 = max_supply
50 BTC x 210,000 blocks x 2 = 21,000,000 BTC
The factor of 2 comes from the geometric series 1 + 1/2 + 1/4 + ... = 2. This means the three constants — initial reward, halving interval, and max supply — are mathematically coupled. You can’t change one without adjusting another.
UltraDAG kept 21M max supply (the right choice for brand clarity). It kept 210,000 as the halving interval (wrong — this is a block count, not a time duration). And it kept 50 as the initial reward (wrong — this was sized for 10-minute blocks).
Two Bugs, Not One
Bug 1: Per-Validator Instead of Per-Round
Pre-Staking Emission Bug: Before staking is active, the pre-staking emission model should split block_reward equally among all validators. Instead, each validator received the full reward. With 5 validators: 250 UDAG/round instead of 50.
Root cause: the validator count used for splitting was derived from DAG vertex counts in the previous round, which was 0 at startup. max(0, 1) = 1, so each validator got the undivided reward.
Fix: Added configured_validator_count field to StateEngine, set from the --validators N CLI flag. Both engine and validator loop now use this deterministic value instead of counting vertices in finality batches.
Bug 2: The Schedule Itself
Even after fixing the per-validator split, the emission was still far too fast. At 50 UDAG/round with 5-second rounds:
- 17,280 rounds/day x 50 UDAG = 864,000 UDAG/day
- First halving at 210,000 rounds = 12.15 days
- 60% of all mining rewards emitted in under two weeks
- Supply effectively exhausted within 3 months
For comparison, Bitcoin’s first halving took 4 years. Most serious L1s measure halvings in years, not days.
The Redesign
We fixed max_supply at 21M and solved for reward and interval combinations that produce credible timelines:
| Reward/Round | Halving Interval | First Halving |
|---|---|---|
| 50 UDAG | 210,000 | 12 days |
| 5 UDAG | 2,100,000 | 4 months |
| 2 UDAG | 5,250,000 | 10 months |
| 1 UDAG | 10,500,000 | ~1.66 years |
We chose 1 UDAG per round with a 10,500,000-round halving interval. The identity holds:
1 UDAG x 10,500,000 rounds x 2 = 21,000,000 UDAG
The New Schedule
Genesis allocates 2,050,000 UDAG (faucet reserve + developer allocation), leaving 18,950,000 UDAG for mining. The supply cap in StateEngine enforces the 21M ceiling — once cumulative mining + genesis reaches 21M, block rewards drop to zero regardless of the halving schedule.
| Period | Reward/Round | Mined | Cumulative | % of 21M |
|---|---|---|---|---|
| Year 0-1.7 | 1.0000 UDAG | 10,500,000 | 12,550,000 | 59.8% |
| Year 1.7-3.3 | 0.5000 UDAG | 5,250,000 | 17,800,000 | 84.8% |
| Year 3.3-5.0 | 0.2500 UDAG | 2,625,000 | 20,425,000 | 97.3% |
| Year 5.0-5.7 | 0.1250 UDAG | 575,000 | 21,000,000 | 100% |
Supply cap reached at approximately year 5.7. After that, validators earn only from transaction fees.
Validator Economics
Daily emission is 17,280 UDAG (one per round, 17,280 rounds per day). Split among validators:
| Validators | UDAG/Day Each | UDAG/Year Each |
|---|---|---|
| 5 (testnet) | 3,456 | 1,262,304 |
| 10 | 1,728 | 631,152 |
| 21 (max active) | 823 | 300,549 |
At 21 validators, each earns ~823 UDAG/day in the first halving period. This is meaningful enough to incentivize early validators while conservative enough that the schedule doesn’t look like an exit scam.
Why Not Exactly Bitcoin’s Timeline?
Bitcoin’s 4-year halvings at 5-second rounds would require an initial reward of ~0.033 UDAG per round. That’s too small to meaningfully reward early validators, especially when split 21 ways. The daily emission per validator would be ~27 UDAG — less than a single faucet request.
1.66-year halvings hit the sweet spot: aggressive enough to reward early participants, conservative enough that the schedule extends over 5+ years of meaningful emission. The supply cap provides a hard ceiling regardless.
What Changed
// Before
INITIAL_REWARD_SATS = 50 * COIN // 50 UDAG per round
HALVING_INTERVAL = 210,000 // ~12 days at 5s rounds
// After
INITIAL_REWARD_SATS = 1 * COIN // 1 UDAG per round
HALVING_INTERVAL = 10,500,000 // ~1.66 years at 5s rounds
Two constants changed. The rest of the system — supply cap enforcement, stake-proportional distribution, observer penalties, halving logic — was already correct. The fix was purely parametric.
The emission schedule is enforced at three levels:
block_reward(height)computes the halved reward,apply_vertex_with_validators()caps coinbase atMAX_SUPPLY - total_supply, and the supply invariant (liquid + staked == total_supply) is checked unconditionally in release builds.