Tail emission and the launch schedule (economy lane, 6 October 2026): docs/analysis/tail-emission.md with the one-page decision sheet, the supply and coins-per-block comparison against Kaspa, Bitcoin, Litecoin, Monero, Zcash, Ergo, Ethereum, Aleo, Alephium, Nexa and Dogecoin, the tail candidates A to D over forty years, the beyond-the-tail candidates E to J with their game theory (G refused by the holder ruling), the recommendation (100 a block, monthly glide with a two-year half-life, 90-day ramp, 1 percent of supply tail from year 11.4, the public sentence, the igneum.rs constants, a genesis decision for igneum-testnet-1); sim/horizon/economy-and-utility/tail_emission.py with the 2,560-row CSV and an integer mirror of the node's emission.rs that agrees with the code's own CSV to the base unit; ledger row E22 (Open, the project lead's decision owed)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
igneum-labs 2026-10-06 22:12:29 +00:00
parent 708842e40d
commit 2141df9615
7 changed files with 3739 additions and 0 deletions

View file

@ -0,0 +1,250 @@
# Tail emission and the launch schedule: a permanent security budget for Igneum
6 October 2026, night (UK). Economy lane. Model: `sim/horizon/economy-and-utility/tail_emission.py` (CSV `tail_emission.csv`, 2,560 rows: every candidate, forty years, four price paths; `tail_emission_out.md` the tables). Code: node fork branch `tail-emission-node` (486895d6 on the box mirror), `consensus/core/src/emission.rs`, the 40-year CSV `tail_emission_code.csv` printed by the code's own function and 0 base units from the model's mirror. Ledger row E22. Nothing live is touched; every number here is arithmetic on measured inputs, and every price is an input, not a prediction.
The rulings this answers, verbatim: "Fees cannot fund security for a decade." "Miners need to be the security." "we cannot pay a monthly upkeep it has to be self sustaining and self secured." "do we have a permanent solution? not a ticking time bomb for when people stop earning?" "Look into a revolutionary solution for this." "We dont want to penalise holders." "that does not seem like a lot of coins ... think outside of the box." "As i said, find a solution."
---
## The one page
**The problem.** Today's schedule pays miners USD 210,513 a day in year 1 at a flat USD 0.10, 6,877 in year 11, 427 in year 20, 13 in year 30. A 24-hour 51 percent rental costs 11.8 days of budget at any price and any hardware, so the attack costs USD 2.5 M in year 1, 81,106 in year 11, 5,042 in year 20, 158 in year 30. Year 20 pays 0.2 percent of year 1.
**Not a fix.** Fees (USD 450 a day at launch, 4,195 in year 5, under 1 percent of it to a miner; Bitcoin's fee share is 0.69 percent), a four-year halving (the same cliff later), a treasury (emission with an owner).
**The safe baseline.** A tail denominated in supply: p percent of scheduled supply a year for ever, from the first month the curve pays less. Security becomes a fixed share of market cap in every year: at p = 1 a 24-hour attack costs 0.032 percent of market cap, the 20-day veto 0.6 percent, at any price, no oracle. The holder gives **0.99 percent of their share a year** (9.5 percent over ten years), nothing else. No rent, no forced movement, no cost to inactivity.
**The revolutionary candidates, tested.** A hash thermostat (E) beats its withholding game only with presence pay and reads hardware as money: a 10x efficiency jump halves its budget for two years. Settled-value targeting (F) needs 8.5 percent inflation at velocity 1 and a wash trader pins it to its ceiling for one base fee. Security as a product (H) is 1 percent of the subsidy in year 1; dormant-coin rent (G) is refused by ruling. The hybrid (I) holds under every modelled attack and adds nothing to the floor.
**The supply question.** The coin count is cosmetic (18 decimals); the unit price is social. Kaspa and Dogecoin paid blocks in the hundreds of coins and drew miners. A solo 100 MH/s card on a 100 GH/s network earns 2,190 IGN a day today, 6,912 at 100 a block. A monthly glide loses 2.9 percent a month and halves nobody's income overnight.
**Recommendation, one coherent emission, every field a genesis parameter:** 100 IGN a block at one block a second; a monthly glide with a two-year half-life (Kaspa's shape at half its pace); a 90-day ramp from 10 percent; a 1 percent tail from the month the glide first pays under 1 percent of supply (year 11.4). Supply: 8.64 billion at the switch, 9.5 billion in year 20, 11.6 billion in year 40. The budget never falls under 1 percent of supply, tested to year 200.
**The public sentence** (replaces "4 billion, approached and never reached"): *Igneum has no hard cap. Emission starts at 100 IGN a block and falls 2.9 percent a month for ten years, then runs at 1 percent of supply a year for ever, every coin to the miners and provers who secure the chain. A holder's share falls 1 percent a year, and a 24-hour attack costs about twelve days of emission at any price, in any year.*
**What moves.** The emission constants of `igneum.rs` become one parameter set, `EmissionSchedule::CURRENT` (section 5 names each); the testnet carries `TESTNET_1`. Coded on fork branch `tail-emission-node`; the devnet digest is pinned unchanged by test; the testnet digest moves. A genesis decision for `igneum-testnet-1`, nothing live touched.
**Risks.** "No cap" is a sentence critics quote (E1 already concedes Monero's trade). The 1 percent is a judgement inside the peer range (Monero 0.85, Bitcoin 0.83, Ethereum about 0.5). Year 1 stays front-loaded (26 percent; 47 in two).
---
## 1. Supply and coins per block against other networks
Every row outside Igneum is approximate unless a file is named. Sources: `vendor/rusty-kaspa` `consensus/core/src/config/params.rs` and `consensus/src/processes/coinbase.rs` (Kaspa's constants), `vendor/rusty-kaspa/consensus/core/src/constants.rs` (`MAX_SOMPI` 29 billion); the web pages listed in section 7 for the rest. "First payout" is a 100 MH/s card against a 100 GH/s network for Igneum (model section 6) and the general shape for the others.
| Chain | Block interval | Coins a block at launch | Coins a block today | Year-1 emission as share of cap | Cap or tail | Shape | Launch price | How a solo GPU miner's first payout felt |
|---|---|---|---|---|---|---|---|---|
| Igneum today | 1 s | 31.7 (3.17 on launch day) | 31.7 | 963 M, 24% of 4 B | 4 B cap | two-year cliff, 30-day ramp | none | 2,190 IGN a day at 100 GH/s, 219 on launch day; dollars unknown |
| Igneum S1 (recommended) | 1 s | 100 (10 on launch day) | 100 | 2.36 B, 26% of the 9.11 B curve | no cap: 1% of supply a year from year 11.4 | monthly glide, two-year half-life, 90-day ramp | none | 6,912 IGN a day at 100 GH/s, 691 on launch day |
| Kaspa | 1 s (10 bps since May 2025) | 500 (pre-deflationary, Nov 2021 to May 2022), then 440 | about 2.2 at 10 bps (21.9 KAS/s; 57.4 M KAS in the month to 6 September 2026) | about 13.7 B, 48% of 28.7 B (computed from the schedule, approximate) | 28.7 B cap, 96.5% mined by September 2026 | monthly 2^(-1/12), one-year half-life (`SUBSIDY_BY_MONTH_TABLE`, 426 entries) | none for seven months; first trade June 2022 at USD 0.00017 | hundreds to thousands of KAS a day per card, worth under a dollar (approximate) |
| Bitcoin | 10 min | 50 | 3.125 (since 20 April 2024) | 2.6 M, 12.5% of 21 M | 21 M cap | four-year cliff (210,000 blocks) | none in year 1 | 50 BTC a block on a CPU, worth nothing; fees are 0.69% of miner revenue in August 2026 |
| Litecoin | 2.5 min | 50 | 6.25 (since August 2023) | 10.5 M, 12.5% of 84 M | 84 M cap | four-year cliff | about USD 0.03, approximate | 50 LTC a block on a CPU, cents |
| Monero | 1 min at launch, 2 min since 2016 | about 17.6 XMR a minute (the (M - A) >> 20 rule, approximate) | 0.6 | about a third of the 18.1 M main curve, approximate | no cap: 0.6 XMR a block for ever since 2022, 157,680 XMR a year, 0.85% of 18.45 M | smooth curve, then a fixed tail | about USD 2 to 3 (mid 2014), approximate | a few XMR a day per CPU, a few dollars |
| Zcash | 2.5 min at launch, 75 s since 2019 | 12.5 after a 20,000-block slow start from 0 | 1.5625 per 75-s block | 12.5% of 21 M (the slow start withholds about 1%) | 21 M cap | four-year cliff; 20% to founders then a dev fund | thousands of USD a coin for the first hours, approximate | fractions of a ZEC worth hundreds of dollars for a day, then little |
| Ergo | 2 min | 75 | 3 (2026), with EIP-27 re-emission to about 2045 | about 20 M, 20% of 97.74 M, approximate | 97.74 M cap | 75 ERG for two years, then minus 3 a quarter to a 3 ERG floor | about USD 0.5 to 1 (2019), approximate | tens of ERG a day per card, a few dollars; storage rent since 2023 (refused here) |
| Ethereum | 15 s at launch, 12 s slots now | 5 | about 0.24 ETH a slot (1,700 ETH a day) | about 10 M, 14% of the then supply; 72 M premined | no cap: issuance by stake, about 0.5% gross, +0.23% net after the burn (April 2026) | smooth, set by stake since 2022 | USD 0.31 at the sale (2014), approximate | a few ETH a day per card in 2015, a dollar or two |
| Aleo | 10 s | 23.8 to validators plus a coinbase to provers | the same rule, declining | 290 M coinbase in year 1, 12% inflation on a 1.5 B initial supply | no cap: coinbase falls to 0 in year 10, staking issuance continues | linear decline over ten years | about USD 0.3 to 1 (September 2024), approximate | prover rewards by proof race, won by the fastest hardware (the Aleo lesson, C9) |
| Alephium | 64 s at launch, 8 s since July 2025 | 7.5 (time curve), min of time and hash curves | 0.14 to 0.19 ALPH at 8 s | 140 M premined of 1 B; mined over about 82 years | 1 B cap | time curve 7.5 to 2.5 over four years then fixed, hash curve on top; no halving | about USD 0.3 (2021), approximate | a few ALPH a day per card, cents to a dollar |
| Nexa | 2 min | 10,000,000 | 5,000,000 after the first halving (about 21 June 2026) | about 2.6 T, 12.5% of 21 T | 21 T cap | four-year cliff | fractions of a thousandth of a cent, approximate | millions of NEXA a day per card, a dollar or less |
| Dogecoin | 1 min | random up to 1,000,000, then 10,000 | 10,000 | no cap; about 5.26 B a year, 3.9% of supply in 2026 falling with supply, approximate | no cap, fixed 10,000 a block for ever | a cliff curve to 2015, then a flat tail | fractions of a cent (2013), approximate | thousands of DOGE a day per card, cents |
What the table says. Every capped GPU coin of the last five years either front-loaded harder than Igneum (Kaspa 48 percent in year 1), or paid blocks in the hundreds or millions of coins (Kaspa, Nexa, Dogecoin) so that a card's first day was a number a miner could feel; the two chains that kept miners paid for a decade without a cap, Monero and Dogecoin, run fixed tails, and the one that measures its budget by stake, Ethereum, pays about half a percent. Igneum's 31.7 a block and 4 billion cap are Bitcoin's shape in GPU clothes, with a two-year cliff Bitcoin never risked.
### 1.1 Out of the box: the four questions
**Is 4 billion the right magnitude?** Technically no number is: with 18 decimals the unit is a label. Socially the label works in two ways. A large supply and a sub-cent price draw retail miners and buyers to a coin that feels cheap and pays blocks in the hundreds (Kaspa stayed under a dollar for years and grew; Dogecoin's uncapped billions never stopped it; approximate), and a small supply invites the "it will never be USD 1" and "it will be USD 100" games in equal measure. The security arithmetic is indifferent: on the market-cap path every schedule's budget in year 20 is the same USD 43,557 a day whether the supply is 4, 9 or 36 billion (model section 2, mcap path). The magnitude is a marketing decision with no security content, and the only honest constraint is the one in the next question.
**Should the first year pay more coins per block and taper smoothly?** Yes to the taper. The two-year cliff halves every miner's income overnight (E6, conceded); Kaspa's monthly step never did, and Kaspa kept its hash through four halvings' worth of reduction (approximate). A monthly glide with a two-year half-life loses 2.85 percent a month, the same 50 percent in two years, with no day a miner can point to. More coins per block in year 1 at the same market cap is the same dollars in more coins: it changes the feel (6,912 a day instead of 2,190 on a 100 MH/s card at 100 GH/s), not the economics.
**Should coins per block be a round memorable number?** 100 IGN a block, one block a second, "a hundred a second", is a sentence a miner repeats; 31.68808781 is a table entry. With the glide and the tail there is no cap to protect, so the launch rate can be the round number and the curve sum follows (9.11 billion at a two-year half-life; 4.55 at one year; 18.2 at four). S2 in the model keeps today's 4 billion curve and only smooths it (43.9 a block): it isolates the cliff question from the magnitude question and shows the two are independent.
**Should the ramp be longer?** The 30-day ramp withholds 37 million (0.9 percent of the curve); a 90-day ramp withholds 350 million (3.8 percent) and gives the world a quarter instead of a month before full emission, which is what "nobody takes the first month before the rest of the world hears about it" asks for in a chain that will have been public on testnet for weeks. Zcash's 20,000-block slow start is the precedent. With no cap the withheld coins cost nobody anything. Recommended: 90 days.
### 1.2 Three concrete alternative schedules, in the CSV beside the tail candidates
| Schedule | Launch IGN/s | Shape | Ramp | Curve sum | Year 1 | Years 1+2 | Tail switch | Supply at switch | Tail IGN/yr at switch | Supply year 40 |
|---|---|---|---|---|---|---|---|---|---|---|
| S1 (recommended) | 100 | monthly 2^(-1/24) | 90 days | 9.11 B | 2.36 B (26%) | 47% | year 11.4 | 8.64 B | 86.4 M | 11.60 B |
| S2 (today's curve, smoothed) | 43.9 | monthly 2^(-1/24) | 30 days | 4.00 B | 1.14 B (28%) | 49% | year 11.3 | 3.89 B | 38.9 M | 5.24 B |
| S3 (Kaspa's magnitude) | 400 | monthly 2^(-1/24) | 90 days | 36.4 B | 9.43 B (26%) | 47% | year 11.4 | 34.6 B | 346 M | 46.5 B |
| A (today) | 31.7 | two-year cliff | 30 days | 4.00 B | 963 M (24%) | 49% | none | | | 3.96 B |
All three carry the 1 percent tail. On the market-cap path their budgets are identical year by year from the switch (section 2.4): the magnitude is cosmetic, the tail is the security, the glide is the miner's experience.
---
## 2. The tail candidates, forty years
Inputs (every one labelled in the script): rental USD 281 per GH/s-day, measured 6 October 2026 (bench-log, 1,748 MH/s for USD 20.44 an hour on 38 pods; approximate above 2 GH/s, the market's supply limit); owned cost USD 24.8 per GH/s-day (lane 4: electricity USD 6.29 at the measured 258 W per 98.48 MH/s and USD 0.10 per kWh, capital USD 18.5 for a USD 2,000 card over three years, approximate); the attacker at share A rents A/(1 - A) N (`cost_model.py`), 1.04 N at 51 percent; the 20-day veto earns 51 percent of the producer subsidy back. The security budget is the miners' 80 percent of emission in dollars a day; the pool's 20 percent pays provers (the same cards, but not hash). Price paths: flat USD 0.01, 0.10 and 1.00 per IGN, and a market-cap path, USD 20 M at the end of year 1 rising 30 percent a year (the rising path of `sim/economy/security_budget.py`) and capped at USD 2 B from year 19, price = cap / supply. Only the market-cap path compares schedules of different magnitude.
### 2.1 Emission, supply and inflation (model section 1; full rows in the CSV)
| Candidate | Tail from | y5 emission / supply / infl% | y11 | y15 | y20 | y30 | y40 |
|---|---|---|---|---|---|---|---|
| A current | none | 250 M / 3.21 B / 8.44 | 31.2 M / 3.87 B / 0.81 | 7.8 M / 3.94 B / 0.20 | 2.0 M / 3.96 B / 0.05 | 61,035 / 3.96 B / 0.00 | 1,907 / 3.96 B / 0.00 |
| B fixed F = 1.5 IGN/s | year 11 | same | 47.5 M / 3.89 B / 1.24 | 47.3 M / 4.07 B / 1.17 | 47.3 M / 4.31 B / 1.11 | 47.4 M / 4.78 B / 1.00 | 47.3 M / 5.26 B / 0.91 |
| B fixed F = 0.75 | year 13 | same | 31.4 M / 3.87 B / 0.82 | 23.7 M / 3.97 B / 0.60 | 23.7 M / 4.09 B / 0.58 | 23.7 M / 4.33 B / 0.55 | 23.7 M / 4.56 B / 0.52 |
| B fixed F = 0.2 | year 17 | same | 31.4 M / 3.87 B / 0.82 | 7.8 M / 3.94 B / 0.20 | 6.3 M / 3.97 B / 0.16 | 6.3 M / 4.04 B / 0.16 | 6.3 M / 4.10 B / 0.15 |
| C 0.5% | year 13 | same | 31.4 M / 3.87 B / 0.82 | 19.7 M / 3.96 B / 0.50 | 20.2 M / 4.06 B / 0.50 | 21.3 M / 4.27 B / 0.50 | 22.4 M / 4.49 B / 0.50 |
| C 1% | year 11 | same | 38.7 M / 3.88 B / 1.01 | 40.1 M / 4.03 B / 1.00 | 42.2 M / 4.24 B / 1.00 | 46.7 M / 4.69 B / 1.01 | 51.5 M / 5.18 B / 1.00 |
| C 2% | year 9 | same | 78.2 M / 3.94 B / 2.02 | 84.5 M / 4.27 B / 2.02 | 93.4 M / 4.72 B / 2.02 | 114.4 M / 5.76 B / 2.02 | 139.3 M / 7.04 B / 2.02 |
| D four-year halving | none | 250 M / 2.23 B / 12.6 | 125 M / 3.36 B / 3.88 | 62.5 M / 3.67 B / 1.73 | 31.2 M / 3.86 B / 0.82 | 3.9 M / 3.96 B / 0.10 | 976 k / 3.98 B / 0.02 |
The Monero-shape fixed tail (B) and the percentage tail (C) are within a factor of two of each other for forty years; the difference is the century. A fixed F is a falling fraction of supply (B at F = 1.5: 1.24 percent in year 11, 0.91 in year 40, about 0.5 by year 100), a percentage is a percentage for ever. Dilution per holder per year under C: 0.498 percent at p = 0.5, 0.990 at p = 1, 1.961 at p = 2 (a holder's share falls by p/(1 + p)); over ten years 4.9, 9.5 and 18.0 percent; over forty 18.1, 32.8 and 54.7.
### 2.2 The budget, the 24-hour attack and the veto (model section 2)
Flat USD 0.10 per IGN. Each cell: miners' USD a day / 24-h 51% rental against an owned honest fleet / 20-day veto net of the attacker's earnings.
| Candidate | Year 1 | Year 11 | Year 20 | Year 30 | Year 40 |
|---|---|---|---|---|---|
| A current | 210,513 / 2.5 M / 47.5 M | 6,877 / 81,106 / 1.6 M | 427 / 5,042 / 96,470 | 13 / 158 / 3,023 | 0 / 5 / 94 |
| B F = 1.5 | same | 10,398 / 122,629 / 2.3 M | 10,361 / 122,187 / 2.3 M | 10,389 / 122,522 / 2.3 M | 10,361 / 122,187 / 2.3 M |
| C 1% | same | 8,479 / 99,999 / 1.9 M | 9,237 / 108,932 / 2.1 M | 10,236 / 120,718 / 2.3 M | 11,282 / 133,050 / 2.5 M |
| C 2% | same | 17,132 / 202,042 / 3.9 M | 20,455 / 241,229 / 4.6 M | 25,052 / 295,444 / 5.7 M | 30,515 / 359,868 / 6.9 M |
| D four-year | 105,256 / 1.2 M / 23.8 M | 27,435 / 323,541 / 6.2 M | 6,840 / 80,664 / 1.5 M | 857 / 10,111 / 193,468 | 214 / 2,521 / 48,235 |
| S1 (100/s glide, 1%) | 516,201 / 6.1 M / 116.5 M | 19,625 / 231,436 / 4.4 M | 20,717 / 244,322 / 4.7 M | 22,959 / 270,756 / 5.2 M | 25,304 / 298,414 / 5.7 M |
At USD 0.01 divide by ten, at USD 1.00 multiply by ten; the CSV carries all four paths. The ratios are constants of the hardware market and not of any schedule: 24 hours at 51 percent costs 11.8 budgets against owned hash (1.04 x 281 / 24.8) and 1.04 budgets when the honest fleet is itself rented; the veto nets 226 budgets. A 10x or 100x hardware-efficiency gain multiplies the hash on both sides (`hash_rented_ghs_10x_eff`, `_100x_eff` in the CSV) and moves no dollar figure. What the budget rents at the measured price: USD 210,513 a day is 749 GH/s rented or 8,488 GH/s kept on in owned cards in year 1 at USD 0.10; USD 427 (year 20, A) is 1.5 GH/s rented, 17 owned; USD 9,237 (year 20, C 1%) is 33 rented, 372 owned.
### 2.3 The market-cap path: what the tail buys when the price is not an input
With the cap fixed at USD 2 B from year 19 (price = cap / supply), the budget a day in year 20: A current USD 2,160, B F = 1.5 48,067, C 0.5% 21,833, C 1% 43,557, C 2% 86,680, D 35,478, S1, S2, S3 all 43,557. The 24-hour attack against an owned honest fleet in year 20: A USD 25,470, C 1% 513,673. In year 30: A 797, C 1% 515,074. In year 40: A 25, C 1% 513,673. The percentage tail is the security budget as a fraction of what the chain is worth, for ever; the cap is a budget that goes to zero whatever the chain is worth.
### 2.4 D, the slower halving: delay, not fix
D halves the launch rate (500 M a year) to keep the cap and crosses the same levels one halving later: USD 6,840 a day in year 20 where A has 427, then 857 in year 30 and 214 in year 40. The year-20 miner is better off, the year-40 miner is at the same zero, and year 1 pays half. It changes the date on the bomb.
---
## 3. Beyond the tail: the revolutionary candidates
Each candidate is in the CSV (E, I and their shock runs under `E_*`, `I_*`; F and H in `tail_emission_out.md` sections 4 and 5; J as `J_presence_tail_1pct`). Each is tested against the owner's filter: nothing takes from a holder's balance, forces movement or treats inactivity as a cost; percentage dilution is the only effect on a holder, and it is stated as a number.
### 3.1 E. The security thermostat
**Mechanism.** The tail rate floats in [0.25%, 3%] of supply a year. Every 90 days the controller reads the mean hash of the quarter against the mean of the two years before it and moves the rate by at most 0.25 points, proportionally (no dead band, so a one-off dip winds back). Hash is what difficulty reads; nothing else enters. Hash falling means attack is cheap, so emission rises; hash high, emission falls.
**Model.** Flat USD 0.10, floor 0.25, ceiling 3, start 1 percent at the switch (year 11). Steady state: the controller lifts the tail to 1.37 percent by year 14 (it remembers the curve's last years) and settles toward 1.2 by year 25. Price crash of 50 percent in year 15: the rate rises to 2.21 percent within a year and the dollar budget recovers from a 50 percent cut to an 18 percent cut (USD 10,025 a day against 12,249) at the cost of 2.2 percent dilution. Efficiency jump of 10x in year 15 (hash per dollar times ten): the controller reads ten times the security and cuts the rate to 0.37 percent; the budget halves (USD 5,047 against 12,249) and stays near half for two years while the baseline catches up. **That is the flaw: difficulty measures hardware as much as money, and the thermostat cannot tell them apart without a dollar oracle.** Withholding: a 34 percent cartel pulls its hash for one quarter in year 20; it forgoes 5.0 M IGN and takes back 719,045 IGN of extra emission after returning, a gain of 0.14 of its cost (the bounded slope and the two-year baseline do the damping). With the raise paid only to keys present through the window (the 30-day presence the finality rule already measures), its gain is 18,964 IGN, 0.00 of cost.
**Game theory.** Miner: the withholding attack is a loss at any gain under 1 per unit share (gain / cost = controller gain x share), and zero with presence pay. Holder: dilution between 0.25 and 3 percent a year, set by a controller the holder cannot see coming. Attacker: the useful move is the opposite of withholding: bring cheap hash for two years, read as abundance, let the controller cut the budget to the floor, leave, and attack during the lag before the controller rebuilds it (one point a year at most). The floor is the only thing that bounds that.
**Prior art.** Ethereum's issuance curve as a function of staked ETH (reward per validator proportional to 1 / sqrt(total stake), 2020) is the closest live rule; Decred's ticket-price controller (2016) adjusts a price, not an emission; no proof-of-work chain reads its own difficulty into its emission (approximate; none found).
**Verdict.** Survives its own game theory only with presence pay. Reads the wrong variable under hardware change. Not at genesis. Its band is worth fixing at genesis as a dormant rule miners may switch on by the 90 percent upgrade signal, which is candidate I.
### 3.2 F. Settled-value targeting
**Mechanism.** The emission floor is set so a 24-hour 51 percent rental costs at least k times the value the execution layer settled that day, measured in IGN from the state (no oracle: both sides are in IGN).
**Model.** The attack costs 11.8 budgets against owned hash, so the floor is k x V / 11.8 a day; with velocity v (value settled a year over supply) the rule demands inflation of k v / 11.8 a year: at k = 1 and v = 1, 8.5 percent; at v = 3 (Bitcoin's on-chain velocity is of this order, approximate), 25 percent; against a rented honest fleet (1.04 budgets) 96 percent at k = 1, v = 1. Bounded above by a 3 percent ceiling it is a fixed 3 percent tail from day one.
**Game theory.** The wash trader: one self-transfer of 1 billion IGN a day costs one base fee (0.005 IGN at the floor, lane 4) and raises the floor by k x 85 M IGN a day at k = 1; the rule is pinned to its ceiling by anyone for nothing, and a miner with share w collects w of it. Measuring "value" by the fee paid instead returns the problem to fees, which fail (section 4). Holder: dilution set by other people's transfers. Prior art: Budish's economic limit of proof of work (2018; the flow cost of attack against the stock at risk) is the argument; no chain runs it as a rule.
**Verdict.** Dead. Either unaffordable or pinned to its ceiling for free. The one thing it teaches is kept: security is a flow (budget a day) and the only stock it can be tied to without an oracle is supply, which is candidate C.
### 3.3 G. Dormant-coin rent
Considered (Ergo since 2019, rent charged from 2023 on boxes untouched four years, 0.13 ERG per standard box, a storage fee per byte rather than a charge on value; Freicoin 2012, about 4.9 percent a year demurrage on every coin, approximate) and **refused on the owner's ruling of 6 October 2026, "We dont want to penalise holders"**. Not modelled. Stated for the record: its steady-state budget is the coin-loss rate times active supply whatever the rent rate, an awake holder avoids it with one transaction every N years, and it is a charge on a balance, which the ruling forbids.
### 3.4 H. Security sold as a product
**Mechanism.** Rollups and the job market pay the proving pool and a settlement fee to miners per proven segment.
**Model.** Lane 4's base rollup line (19,440 IGN a day per rollup at the floor; 1, 3 and 10 rollups at launch, year 2 and year 5; 50 in the year-5 high case), with a settlement fee equal to the proving fee, at USD 0.02: USD 389 a day to miners in year 1 (1 percent of the miners' subsidy), 1,166 in year 2 (3 percent), 3,888 in year 5 (36 percent), the same 3,888 in year 11 (283 percent, because the subsidy has fallen to 1,375). The year-5 high case: 19,440 a day, 178 percent. All utility to miners and provers together (lane 4): USD 450, 1,349 and 4,195 a day.
**Game theory.** The customer compares in dollars every week and leaves at a price above the market (lane 4 proposal 1); the fee is in dollars, so it does not move with the coin, which is its virtue; a chain that doubles the rollup's cost to pay its miners loses the rollup. Holder: nothing. Miner: a line that could reach a third of the subsidy in year 5 if ten rollups come, and that no model can promise.
**Prior art.** Ethereum as rollup settlement (blob fees, 2024, burned not paid); Celestia's data fees (2023); Bitcoin's fee share after seventeen years, 0.69 percent (August 2026), the largest proof-of-work fee market there is.
**Verdict.** Build it (it is the fee market the design already has) and never count it as the floor. The number that shows why: at launch it is 1 percent of the subsidy, and it only "exceeds" the subsidy in years when the subsidy has collapsed.
### 3.5 I. The hybrid: a 1 percent floor with the thermostat above it
**Model.** Floor 1 percent, ceiling 3, otherwise E. Steady state identical to E (1.37 percent by year 14). Crash: identical to E (2.21 percent, the budget cut from 50 to 18 percent). Efficiency jump: the controller cuts to the floor and stops: the budget falls 26 percent (USD 9,018 a day against 12,249) instead of 59 percent. Cartel: identical to E (0.14, and 0.00 with presence pay).
**Does it hold under every attack modelled?** Yes, with presence pay on the raise: withholding earns nothing, the crash is cushioned, the efficiency misreading is bounded by the floor, and the holder's dilution is between 1 and 3 percent a year. What it adds over the plain floor is the crash cushion (2.2 percent instead of 1 for a 50 percent price fall) at the price of a consensus controller nobody has run and a misreading under hardware change that the floor only bounds.
**Verdict.** The one revolutionary candidate that survives. Not worth its complexity at genesis against the plain floor it rests on; worth fixing as a band at genesis (floor 1, ceiling 3, controller off) that miners may switch on by the 90 percent upgrade signal once the chain has a hash history to read. That keeps the floor as law from day one and the thermostat as a miners' option, never a protocol default.
### 3.6 J. The presence-weighted tail (this lane's addition)
**Mechanism.** C at 1 percent, with the tail portion of each block's subsidy paid by the producer key's 30-day presence (the weight the finality rule already measures) rather than per block, so that rented hash that appears for a day earns a thirtieth of the tail a standing miner earns.
**Model.** Emission identical to C 1%. The 20-day veto's earn-back falls from 51 percent of 20 days of subsidy to a third of that (a renter's weight averages 10/30 over the campaign): the veto's net cost rises from 226 to 232 budgets, 3 percent. The 24-hour double spend is unchanged (its earn-back is one day).
**Prior art.** Frontier 3.1 (rank 7, the rental tax) is the relative: it redirects part of a spiking block's subsidy to the pool. Nothing live.
**Verdict.** Honest and small: 3 percent more veto cost for a consensus rule on the coinbase. Not tonight. Kept as a frontier note.
### 3.7 The ranking
| Candidate | Holds under its own game theory | Needs an oracle | Reads the right variable | Holder effect | Verdict |
|---|---|---|---|---|---|
| C percentage tail | yes | no | supply, the stock it protects | p percent a year, stated | the floor; adopt |
| B fixed tail | yes | no | coins, a falling fraction of supply | falling dilution | the safe second; Monero's precedent |
| I hybrid | yes, with presence pay | no | hash, bounded by the floor | 1 to 3 percent | fix the band at genesis, controller off |
| J presence tail | yes | no | presence | none | frontier note |
| H fee product | yes | no | demand | none | build, never the floor |
| E thermostat | only with presence pay | no | hash, misread under hardware change | 0.25 to 3 percent | not alone |
| F settled value | no (wash trade) | no, but circular | value moved | set by others | dead |
| G dormant rent | n/a | no | inactivity | a charge on a balance | refused by ruling |
| D slower halving | n/a | no | time | none | delay, not fix |
| A today | no | no | time | none | the bomb |
---
## 4. What does not solve it, with the number
Fees: USD 450 a day to miners and provers at launch and 4,195 in year 5 (lane 4, base, USD 0.02) against USD 54,800 and 13,700 of daily emission, and under 1 percent of the year-5 fee share reaches a miner; Bitcoin's fees are 0.69 percent of miner revenue after seventeen years. A slower halving: D moves the USD 427-a-day year from 20 to about 30 at USD 0.10 and ends at the same zero. A treasury: a stock; 10 percent of 4 billion spent at the 40 million a year the 1 percent tail would pay lasts ten years, and it has an owner, which the design forbids (spec 5.6, no treasury). A dev-fund top-up: the same stock with a committee, removed on 3 October for the reason that the protocol carries no fee to any team. None of these changes the shape of the curve, and the shape is the problem: a budget that is a fixed number of coins a year, or zero, is a budget that goes to zero as a share of what it protects.
---
## 5. Recommendation, written for the owner
**Which shape.** The percentage tail (C), inside one coherent emission (S1): a round launch rate, a smooth glide, a longer ramp, the tail. Not the fixed tail (its security falls as a share of supply over a century), not the thermostat alone (it reads hardware as money), not fees, not a slower halving.
**What number.** 1 percent of scheduled supply a year. Why 1 and not 0.5 or 2: 0.5 halves the attack cost as a share of market cap (0.016 percent for 24 hours) for a saving of half a point of dilution; 2 doubles the dilution a holder carries for ever (1.96 percent a year, 54.7 percent of a share over forty years) for security no attack in the table needed. 1 percent sits at the top of the peer range (Monero 0.85, Bitcoin 0.83 and falling, Ethereum about 0.5 gross) and pays a 24-hour attack at 0.032 percent of market cap and the 20-day veto at about 0.6 percent, in every year.
**When the switch happens.** At the first monthly step where the glide pays less than 1 percent of scheduled supply a year: DAA second 328,725,000, year 11.4, with 8.64 billion scheduled. Nothing happens on that day that a miner notices: the rate stops falling and starts rising 1 percent a year.
**The holder's number, plain.** 0.99 percent of a holder's share a year, from year 11.4 on. Nothing else is asked of a holder: no rent, no movement, no cost to holding still.
**The public sentence** replaces "Hard cap of 4 billion IGN, approached and never reached" (`site/litepaper.html` line 420, the Supply figure, the meta descriptions, the cap line at 187, the Economics paragraph at 472, spec 02 2.5, the homepage tile, `/api/supply`): *Igneum has no hard cap. Emission starts at 100 IGN a block and falls 2.9 percent a month for ten years, then runs at 1 percent of supply a year for ever, every coin to the miners and provers who secure the chain. A holder's share falls 1 percent a year, and a 24-hour attack on the chain costs about twelve days of emission at any price, in any year.* The "half in the first two years" line stays true (47 percent). Spec 5.10's "the cap stays" and its review trigger go; E15 is reopened under E22.
**What changes in consensus** (done on the fork branch, no code change in the live tree tonight). `consensus/core/src/igneum.rs`: `BASE_SUBSIDY_PER_SECOND_SOMPI` (3,168,808,781), `HALVING_INTERVAL_SECONDS` (63,115,200), `LAUNCH_RAMP_SECONDS` (2,592,000), `LAUNCH_RAMP_START_PERCENT` (10), `SUPPLY_CAP_SOMPI` (4 x 10^17), `SUBSIDY_PERIODS` (33), `SUBSIDY_PER_SECOND_BY_PERIOD` and `block_subsidy()` now describe one parameter set, `EmissionSchedule::CURRENT` in `consensus/core/src/emission.rs`, and `block_subsidy()` pays the installed network's schedule; `Params::emission` carries the schedule per network and enters the consensus digest only when it differs from `CURRENT`; the testnet's value is `EmissionSchedule::TESTNET_1` (launch 100 x 10^8, ramp 7,776,000 s from 10 percent, step 2,629,800 s, multiplier 4,172,697,914 / 2^32, tail 100 basis points); `constants.rs` `MAX_SOMPI` rises from 4 billion to 100 billion coins. The coinbase manager pays the params' table; the execution layer's subsidy reads the installed one. Tests: the current schedule reproduces the 33-entry table bit for bit at 1 and 10 blocks a second; the devnet digest c562d70e1428c9789823cc40067623b4767f7c555ce7ff4ea11c1498f013ef6c is pinned and unchanged; year 20 under the current schedule pays 0.2 percent of year 1 (the known-failed case, first); under the recommendation the rate never falls under 0.99 percent of supply from the switch to year 200; 18 decimals run 5,000 years without overflow; invalid schedules are refused; the override file round-trips u128 as strings.
**A genesis decision.** The testnet digest moves (from 0fb7519337110686bde81214d2b418e8d5033181d0c0893bf73feb41b0ab1250 on the 0.3.16 tree); the devnet's does not. Nothing live is touched: the seeds of `igneum-testnet-1` sit at height 0 until the go, and the schedule in their genesis is the decision owed.
**The risk list.** (1) "No cap" is a sentence critics quote; the answer is E1's own concession and the table in section 1. (2) The 1 percent is a judgement; the model carries 0.5 and 2 so the judgement is visible. (3) Scheduled supply (the closed form) runs a few coins above minted supply because the paid subsidy rounds down each second; the explorer should show both. (4) The glide front-loads 26 percent in year 1 and 47 percent in two, the same as today; E2 stands. (5) The thermostat band, if fixed at genesis as a dormant option, is a rule nobody has run; the model's shock runs are its only evidence. (6) The decimals lane's u128 amounts are assumed by the code's u64 views, which refuse at the edge rather than wrap. (7) The rental price above 2 GH/s is a list-price extrapolation; the market supplied no more on 6 October, which makes every attack cost here a lower bound.
---
## 6. Comparison with Bitcoin, Monero, Kaspa and Ethereum
| Chain | Halving shape | Cap or tail | Issuance today, share of supply a year | Fees as share of miner or validator income | Source |
|---|---|---|---|---|---|
| Bitcoin | 4-year cliff, 210,000 blocks | 21 M | 3.125 BTC a block, about 0.83% | 0.69% (August 2026), under 1% for a year | kraken.com/learn/bitcoin-halving-history; cointelegraph.com "Bitcoin miners earn under 0.7% of revenue from fees" |
| Monero | smooth curve to 2022, then a fixed tail | no cap: 0.6 XMR a block for ever | 157,680 XMR a year, about 0.85% of 18.45 M | small; the tail is the budget | changee.com "Monero tail emission explained"; blofin.com "Monero tokenomics" |
| Kaspa | monthly 2^(-1/12), one-year half-life, after a 500 KAS pre-deflationary phase | 28.7 B | 57.4 M KAS in the month to 6 September 2026, about 2.5% of supply a year and falling | small | `vendor/rusty-kaspa` params.rs and coinbase.rs; medium.com/kaspa-currency "The chromatic symphony of Kaspa"; bitrue.com "Kaspa tokenomics explained" |
| Ethereum | none: issuance set by stake since 2022, base fee burned since 2021 | no cap | about 1,700 ETH a day gross (about 0.5%); net +0.23% a year after the burn (April 2026) | tips and MEV to proposers; the base fee is burned | bitget.com "Ethereum token supply in 2026"; 247wallst.com "Ethereum's supply: are we seeing inflation again" |
| Igneum today | 2-year cliff | 4 B | 25% in year 1, 0.81% in year 11, 0.05% in year 20 | 1% of the subsidy at launch (lane 4) | spec 02 2.5; this document |
| Igneum S1 | monthly 2^(-1/24), two-year half-life, then 1% of supply | no cap, 1% tail | 26% in year 1, 1.04% in year 11, 1.00% for ever | the same fee market, never the floor | this document |
Every figure outside Igneum and the Kaspa constants is approximate and from the page named.
---
## 7. Sources for the other chains
Web pages read on 6 October 2026, each approximate and secondary: coinlaw.io/monero-statistics; changee.com/why-xmr-rewards-never-hit-zero; blofin.com (Monero tokenomics); bitget.com/news (Ethereum token supply in 2026); 247wallst.com (Ethereum supply, 5 October 2026); medium.com/kaspa-currency (chromatic emission); bitrue.com (Kaspa tokenomics); kucoin.com news (Kaspa emission table); kraken.com/learn (Bitcoin halving history); cointelegraph.com (fees under 0.7 percent of miner revenue); theblock.co (miner fees at a 12-month low); docs.ergoplatform.com (emission, EIP-27, storage rent); ergoplatform.org (EIP-27 begins); alephium.org and medium.com/@alephium (tokenomics); asicmarketplace.com (Alephium emission); forum.nexa.org and altcoinsbox.com (Nexa halving); nexa.org (supply schedule); aleo.org (tokenomics) and medium.com/@zkto (Aleo block reward rules); oakresearch.io (Aleo tokenomics); messari.io (Kaspa, Aleo profiles). Kaspa's constants from `vendor/rusty-kaspa` as cited. Litecoin, Zcash and Dogecoin rows from memory, approximate throughout.
---
## 8. The model, the code and what was not run
`tail_emission.py`: pure Python 3.10, daily integration for every candidate except A and S1, which come from an integer mirror of the node's `EmissionTable` (`CodeMirror`); `--check-code-csv` compares the mirror with `tail_emission_code.csv` (printed on igneum-build-1 by `cargo run --release -p kaspa-consensus-core --example emission_csv`): 80 rows, largest difference 0 base units. The float model and the mirror differ by the daily ramp sampling (about 0.2 percent in year 1 for the float rows, under 1e-6 after), which is why the two code-carried schedules are not taken from it.
Node fork branch `tail-emission-node` (486895d6, pushed to the box mirror, no merge): `consensus/core/src/emission.rs` (the schedule, the table, the install, nine tests), `config/params.rs` (the field, the override, the digest rule, the pinned digests), `processes/coinbase.rs` (the manager pays the table), `services.rs`, `kaspad/src/daemon.rs` (install), `constants.rs` (`MAX_SOMPI`), `examples/emission_csv.rs`. On the box: `kaspa-consensus-core` 120 tests pass, `kaspa-consensus` coinbase tests 8 pass, `cargo check --release --workspace` clean; `--all-targets` fails in `kaspa-grpc-server` and `kaspa-wallet-core` test mocks on missing finality RPC trait items, which is the 0.3.16 tree before this branch and untouched by it.
Not run: a Devnet 2 crossing of the branch (the 0.3.16 cut carries other digest moves and this one is a genesis parameter, so the gate is the testnet genesis, not a height); the explorer's `/api/supply` and the litepaper text, which follow the decision; the thermostat under a real hash history (the shock runs are the only evidence); any price elasticity of the rollup line (lane 4's assumptions stand). The dormant-coin rent was not modelled, by ruling.

View file

@ -574,6 +574,15 @@ Answer: Correct. The fee block carries the dev address in the producer output on
Evidence: `docs/analysis/horizon/economy-and-utility.md` section 4.4 (`devfee_out.md`) and proposal 7, 6 October 2026; the fee measured on a test network, 4 October 2026 (bench-log: 9 fee blocks in 785).
### E22. The two-year halving to a hard cap is a security time bomb
"You halve every two years for ever and burn the base fee. By year 11 emission is 0.8 percent of supply, by year 20 it is 0.05 percent, and in year 40 the whole chain mints 1,900 coins. Your own economy lane says fees put USD 450 a day in front of miners and provers at launch against USD 54,800 of emission, and under 1 percent of the year-5 fee share reaches a miner at all. When the subsidy is gone the hash is gone, and the chain belongs to whoever rents a GH/s for USD 281 a day. That is not a security model. It is a countdown with a cap painted on the box."
Status: Open, the project lead's decision owed (6 October 2026, night, the economy lane). The owner's rulings tonight reopen E15's decision of 5 October (the cap absolute, no tail): "Fees cannot fund security for a decade", "Miners need to be the security", "we cannot pay a monthly upkeep it has to be self sustaining and self secured", "do we have a permanent solution? not a ticking time bomb for when people stop earning?", "We dont want to penalise holders", "find a solution". The analysis and the one-page decision sheet are `docs/analysis/tail-emission.md`; the model is `sim/horizon/economy-and-utility/tail_emission.py` (`tail_emission.csv`, forty years, every candidate, four price paths). The recommended schedule is coded as genesis parameters on the node fork branch `tail-emission-node` (486895d6: `consensus/core/src/emission.rs`, `Params::emission`, the devnet digest c562d70e pinned unchanged by test, the testnet carrying the recommended set, the 40-year CSV printed from the code's own function and 0 base units from the model's mirror). Nothing live is touched; the switch is a genesis decision for `igneum-testnet-1` and the litepaper's cap sentence changes with it. Was: Decided under E15 (5 October 2026).
Answer: Correct on every number, and the shape of the fix is known. Under the current schedule (`tail_emission.py`, candidate A) the miners' budget at a flat USD 0.10 is USD 210,513 a day in year 1, 6,877 in year 11, 427 in year 20 and 13 in year 30; the 24-hour 51 percent rental against an owned honest fleet costs 11.8 days of budget at any price and any hardware (the ratio of the measured rental price to the owned cost), so the dollar cost of the attack falls with the budget: USD 2.5 M in year 1, 81,106 in year 11, 5,042 in year 20, 158 in year 30. Fees do not fill it (the lane's fee line reaches 36 percent of the miners' subsidy in year 5 only because the subsidy has fallen 4x; Bitcoin's fee share after seventeen years is 0.69 percent of miner revenue, August 2026, approximate), a slower halving delays the same cliff by one halving (candidate D), and a treasury or a dev-fund top-up is emission with an owner and a stock that runs out at 1/x years for a spend rate x. The permanent fix is a tail denominated in supply: p percent of scheduled supply a year for ever makes the 24-hour attack cost a fixed fraction of market cap (0.032 percent at 1 percent) in every year and at every price, with no oracle and no cap. What a holder gives for it is one number: 0.99 percent of their share a year at p = 1, 9.5 percent over ten years, and nothing else (no rent, no forced movement, no cost to inactivity, the owner's ruling). The dormant-coin rent (Ergo 2019, Freicoin 2012) was refused on that ruling and is not modelled. The settled-value and thermostat shapes do not beat it: the first needs 8.5 percent inflation at velocity 1 and is pinned to its ceiling by a wash trader for one base fee; the second reads hardware as money (a 10x efficiency gain halves its budget for two years) and survives its own withholding game only with presence pay. The recommendation (one coherent emission, a genesis decision): 100 coins a block at one block a second, a smooth monthly glide with a two-year half-life (Kaspa's shape at half its pace, no cliff), a 90-day ramp, and a 1 percent tail from the month the glide first pays under 1 percent of supply (year 11.4; supply 8.64 billion then, 9.5 billion in year 20, 11.6 billion in year 40). The public sentence replaces "4 billion, approached and never reached".
Evidence: `docs/analysis/tail-emission.md` (the one page, the candidates, the chain comparison, the game theory, the constants); `sim/horizon/economy-and-utility/tail_emission.py`, `tail_emission.csv`, `tail_emission_code.csv`, `tail_emission_out.md`; the node fork branch `tail-emission-node` on the box mirror; lane 4 (`docs/analysis/horizon/economy-and-utility.md` 4.1, 4.3); `docs/bench-log.md` "Rental cost of hash, 6 October 2026"; `sim/horizon/consensus-security/cost_model.py`. Decision: the project lead.
## 5. Governance and the founders
### G1. No cryptography team

View file

@ -9,6 +9,7 @@ Models behind `docs/analysis/horizon/economy-and-utility.md` (Horizon lane 4, 6
| `security_budget_10y.py` | Task 3: ten years of subsidy, pool, fees (utility.py section 4), the hash the subsidy sustains at the measured card economics, the 34% weight attack in rented hash at USD 281 per GH/s-day, the audit lines against the entity's income | `python3 security_budget_10y.py > security_budget_10y_out.md` |
| `signal_game.py` | Task 5: the 60/90/95 thresholds, forcing and blocking costs, the 30% pool, signal-then-defect by what is signalled | `python3 signal_game.py > signal_game_out.md` |
| `devfee.py` | Task 4: the Ember dev fee in dollars by year, price and the share of miners who keep it on; per tier | `python3 devfee.py > devfee_out.md` |
| `tail_emission.py` | Tail emission and the launch schedule (economy lane, 6 October 2026, `docs/analysis/tail-emission.md`): forty years of emission, supply, inflation, holder dilution, the miners' budget at three flat prices and a market-cap path, the hash it rents or keeps on, the 24-h 51% rental and the 20-day veto against it, for the current schedule, Monero-shape and percentage tails, a four-year halving, the thermostat and hybrid under shocks, settled-value targeting, the fee product, and three launch schedules (S1 to S3). `A_current` and `S1` come from an integer mirror of the node's `consensus/core/src/emission.rs`; `--check-code-csv` compares the mirror with `tail_emission_code.csv`, which the node's `cargo run -p kaspa-consensus-core --example emission_csv` printed (0 base units apart over 80 rows) | `python3 tail_emission.py` (writes `tail_emission.csv`, 2,560 rows, and `tail_emission_out.md`; arithmetic, no lock) |
| `results/` | The stress runs as they ran tonight (`stress_main.md`: 8 scenarios x 3 seeds; `stress_busy.md`: 3 shards a block; `stress_elecfarm.md`: the farm on electricity instead of rent; its `renter farm margin` row printed a division by zero rent and is blank in the current script) | |
Every input is labelled in the script (measured, cited, designed, approximate). Nothing here is a price prediction.

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,658 @@
#!/usr/bin/env python3
"""Tail emission and the launch schedule: forty years of security budget under every candidate. The model behind
docs/analysis/tail-emission.md (economy lane, 6 October 2026, night).
python3 tail_emission.py # writes tail_emission.csv and tail_emission_out.md beside this file
python3 tail_emission.py --years 40 --csv out.csv --md out.md
Pure Python 3.10, no numpy. Arithmetic, not a measurement; every input is labelled below. Nothing here is a price
prediction or a change to any consensus parameter.
Inputs
Emission today (spec 02 2.5, consensus/core/src/igneum.rs): 1e9 IGN a year of 31,557,600 DAA s in years 1 and 2,
halving every 63,115,200 DAA s for ever; the 30-day ramp from 10% withholds about 37 M IGN; 80% producer,
20% proving pool. 31.688 IGN per DAA second after the ramp (BASE_SUBSIDY_PER_SECOND_SOMPI).
Rental price of hash: USD 0.0117 per MH/s-hour = USD 281 per GH/s-day, MEASURED 6 October 2026 on RunPod community
pods (docs/bench-log.md, "Rental cost of hash"); approximate above about 2 GH/s because the market supplied no more.
Owned-hash cost: USD 24.8 per GH/s-day (electricity USD 6.29 at 258 W / 98.48 MH/s and USD 0.10 per kWh, measured
card; capital USD 18.5, a USD 2,000 card over three years, approximate): security_budget_10y.py, lane 4, 3.3.
Attack rule (sim/horizon/consensus-security/cost_model.py): an attacker at share A rents A/(1-A) x N; 51% for 24 h
rents 1.04 N for a day; the 20-day veto rents 1.04 N for 20 days and earns 51% of the producer subsidy back.
Price paths: flat USD 0.01, 0.10, 1.00 per IGN (inputs, not predictions), and a market-cap path: USD 20 M at the
end of year 1 growing 30% a year (the rising path of sim/economy/security_budget.py) capped at USD 2 B, price =
cap / circulating supply. The market-cap path is the only one comparable ACROSS supply magnitudes (S1 to S3).
Utility revenue to miners and provers (lane 4, utility.py 3.3, base scenario at USD 0.02): USD 450 a day at launch,
1,349 in year 2, 4,195 in year 5; high scenario 20,058 in year 5. Rollup settlement line: 19,440 IGN a day per
rollup, 1 / 3 / 10 rollups at launch / year 2 / year 5 (base), 50 in year-5 high.
Candidates (tail)
A the current schedule (control)
B Monero-shape fixed tail: max(curve, F IGN per DAA second); F = 1.5, 0.75, 0.2 (tails from years 11, 13, 17)
C percentage tail: the curve until it first pays less than p% of scheduled supply a year, then p% for ever;
p = 0.5, 1, 2; emission stays a pure function of DAA score (scheduled supply, not minted supply)
D four-year halving to the same 4 B cap (500 M a year for four years, then halving): delay, not fix
E security thermostat: a percentage tail that floats in [0.25%, 3%] by a controller reading hash against its own
two-year baseline, 0.25 points a quarter at most; scenarios: flat, a 50% price crash in year 15, a 10x hardware
efficiency jump in year 15, a 34% cartel withholding for one quarter in year 20 (with and without presence pay)
F settled-value targeting: emission floor so a 24-h 51% rental costs k x the value settled that day; k = 1, 3, 10
H security sold as a product: a settlement fee to miners per proven segment, lane 4's rollup line
I hybrid: C's 1% floor plus E's thermostat above it, ceiling 3%
J presence-weighted tail: C at 1% with the tail paid by 30-day presence (the earn-back of a rental attack falls)
(G, dormant-coin rent, was refused by the owner on 6 October 2026: "We dont want to penalise holders". Not modelled.)
Candidates (launch schedule, each with the 1% percentage tail)
S1 100 IGN a block at launch (1 block/s), smooth glide 2^(-1/24) a month (two-year half-life), 90-day ramp
S2 today's 4 B curve made smooth: 43.9 IGN a block, 2^(-1/24) a month, 30-day ramp (the cliff-or-glide question alone)
S3 400 IGN a block, smooth two-year half-life, 90-day ramp: Kaspa's magnitude (curve sum 36 B)
"""
import argparse
import csv
import math
import os
import sys
YEAR_S = 31_557_600 # spec 02 2.5
HALVING_S = 2 * YEAR_S # 63,115,200
RAMP_S = 2_592_000 # 30 days
BASE_RATE = math.floor(1e9 * 1e8 / YEAR_S) / 1e8 # 31.68808781 IGN per DAA second, 8 decimals
PRODUCER = 0.80
RENT_GHS_DAY = 281.0 # measured
OWNED_GHS_DAY = 24.8 # lane 4, approximate capital
RENT_PREMIUM = RENT_GHS_DAY / OWNED_GHS_DAY # 11.3x
ATTACK_RENT = 0.51 / 0.49 # 1.04 N
MONTH_S = YEAR_S / 12
DAY = 86_400
PRICE_PATHS = ("flat_0.01", "flat_0.10", "flat_1.00", "mcap_path")
MCAP_START, MCAP_GROWTH, MCAP_CAP = 20e6, 1.30, 2e9
# lane 4 utility numbers (USD a day to miners and provers at USD 0.02, base; year-5 high), utility.py 3.3
UTILITY_BASE = {1: 450.0, 2: 1349.0, 5: 4195.0}
UTILITY_HIGH5 = 20058.0
ROLLUP_IGN_DAY = 19_440.0
ROLLUPS = {1: 1, 2: 3, 5: 10}
ROLLUPS_HIGH5 = 50
def ramp(s, ramp_s=RAMP_S):
return min(1.0, 0.1 + 0.9 * s / ramp_s)
def curve_rate(s, halving=HALVING_S, base=BASE_RATE, ramp_s=RAMP_S, smooth=False):
"""Emission per DAA second under the launch curve. Step: halves at every `halving` boundary (today's rule).
Smooth: Kaspa's chromatic shape, the rate times 2^(-1/24) at every month boundary, a two-year half-life (Kaspa's
table is 2^(-1/12) a month, a one-year half-life: vendor/rusty-kaspa consensus/src/processes/coinbase.rs)."""
if smooth:
months = int(s // MONTH_S)
return ramp(s, ramp_s) * base * 2 ** (-months / (halving / MONTH_S))
return ramp(s, ramp_s) * base / (2 ** (s // halving))
def interp_year(table, y):
keys = sorted(table)
if y <= keys[0]:
return table[keys[0]]
if y >= keys[-1]:
return table[keys[-1]]
for a, b in zip(keys, keys[1:]):
if a <= y <= b:
return table[a] + (table[b] - table[a]) * (y - a) / (b - a)
class Schedule:
"""Daily integration of one candidate. Emission is in IGN per day; supply is scheduled supply."""
def __init__(self, name, years, curve=None):
self.name = name
self.years = years
self.days = int(round(years * YEAR_S / DAY))
self.curve = curve or (lambda s: curve_rate(s))
self.emission_day = [] # IGN minted that day
self.supply = [] # scheduled supply at the end of the day
self.rate_pct = [] # emission rate as % of supply a year, that day
self.switch_day = None
self.ramp_s = RAMP_S
def run(self, rate_fn):
S = 0.0
for d in range(self.days):
s = d * DAY
r = rate_fn(s, S, d)
e = r * DAY
S += e
self.emission_day.append(e)
self.supply.append(S)
self.rate_pct.append(100.0 * r * YEAR_S / S if S > 0 else 0.0)
return self
def year_rows(self):
mirror = getattr(self, "mirror", None)
if mirror is not None:
# the code's integer function (CodeMirror below): A_current and S1 agree with the node to the base unit
return [(y, e / UNIT_BASE, S / UNIT_BASE, i) for (y, e, S, i) in mirror.year_rows(self.years)]
out = []
per_year = YEAR_S / DAY
for y in range(1, self.years + 1):
a, b = int(round((y - 1) * per_year)), int(round(y * per_year))
e = sum(self.emission_day[a:b])
S = self.supply[b - 1]
S0 = self.supply[a - 1] if a > 0 else 0.0
infl = 100.0 * e / S0 if S0 > 0 else float("nan")
out.append((y, e, S, infl))
return out
def launch_rate(self):
"""The step-0 rate before the ramp (the ramp at second 0 is exactly 10%)."""
mirror = getattr(self, "mirror", None)
if mirror is not None:
return mirror.launch_rate / UNIT_BASE
return self.curve(0) / ramp(0, self.ramp_s)
def switch_year(day):
return None if day is None else day * DAY / YEAR_S + 1
# ---- candidates --------------------------------------------------------------------------------------------------
def make_A(years):
return Schedule("A_current", years).run(lambda s, S, d: curve_rate(s))
def make_D(years):
c = lambda s: curve_rate(s, halving=4 * YEAR_S, base=BASE_RATE / 2)
return Schedule("D_4y_halving", years, curve=c).run(lambda s, S, d: c(s))
def make_B(years, F):
sch = Schedule("B_tail_F%g" % F, years)
def f(s, S, d):
c = curve_rate(s)
if c < F and s > RAMP_S:
if sch.switch_day is None:
sch.switch_day = d
return F
return c
return sch.run(f)
def make_C(years, p, name=None, curve=None, ramp_s=RAMP_S):
sch = Schedule(name or "C_pct_%g" % p, years, curve=curve)
sch.ramp_s = ramp_s
def f(s, S, d):
c = sch.curve(s)
tail = p / 100.0 * S / YEAR_S
if s > ramp_s and c < tail:
if sch.switch_day is None:
sch.switch_day = d
return tail
return c
return sch.run(f)
def make_S(years, name, base, half_life_years, ramp_days, p=1.0):
"""A launch schedule: `base` IGN per DAA second after the ramp, a smooth glide with the given half-life, a ramp of
`ramp_days` from 10%, then the p% tail. The curve's own sum (no tail) is base x half_life / ln 2."""
ramp_s = ramp_days * DAY
c = lambda s: curve_rate(s, halving=half_life_years * YEAR_S, base=base, ramp_s=ramp_s, smooth=True)
sch = make_C(years, p, name=name, curve=c, ramp_s=ramp_s)
sch.curve_sum = base * half_life_years * YEAR_S / math.log(2)
sch.ramp_withheld = 0.45 * ramp_s * base
return sch
class Thermostat(Schedule):
"""E and I. The tail rate r (% of supply a year) floats inside [floor, ceiling]. Every 90 days the controller reads
the mean hash of the last quarter against the mean of the two years before it and moves r by at most 0.25 points,
proportionally (no deadband, so a one-off dip winds back). Hash each day is the miners' dollars divided by the owned
cost per GH/s-day, times the efficiency multiplier (hash per dollar). Scenarios: price crash, efficiency jump,
cartel withholding. Holder effect: percentage dilution only, between floor and ceiling."""
def __init__(self, name, years, floor, ceiling, start=1.0, price=0.10, crash_year=None, eff_year=None,
cartel_year=None, cartel_w=0.34, presence_pay=False):
super().__init__(name, years)
self.floor, self.ceiling, self.start = floor, ceiling, start
self.price0, self.crash_year, self.eff_year = price, crash_year, eff_year
self.cartel_year, self.cartel_w, self.presence_pay = cartel_year, cartel_w, presence_pay
self.r_path = []
self.hash_path = []
self.cartel = {"forgone_ign": 0.0, "gain_ign": 0.0}
def price(self, d):
y = d * DAY / YEAR_S + 1
return self.price0 * (0.5 if self.crash_year and y >= self.crash_year else 1.0)
def eff(self, d):
y = d * DAY / YEAR_S + 1
return 10.0 if self.eff_year and y >= self.eff_year else 1.0
def in_cartel_window(self, d):
if not self.cartel_year:
return False
y0 = (self.cartel_year - 1) * YEAR_S / DAY
return y0 <= d < y0 + 90
def run_thermostat(self):
S = 0.0
r = self.start
hashes = []
for d in range(self.days):
s = d * DAY
c = curve_rate(s)
tail = r / 100.0 * S / YEAR_S
if self.switch_day is None and s > RAMP_S and c < self.start / 100.0 * S / YEAR_S:
self.switch_day = d
rate = tail if self.switch_day is not None else c
e = rate * DAY
S += e
budget = PRODUCER * e * self.price(d)
h = budget / OWNED_GHS_DAY * self.eff(d)
if self.in_cartel_window(d):
h *= (1.0 - self.cartel_w)
self.cartel["forgone_ign"] += self.cartel_w * e
hashes.append(h)
self.emission_day.append(e)
self.supply.append(S)
self.rate_pct.append(100.0 * rate * YEAR_S / S if S > 0 else 0.0)
self.r_path.append(r if self.switch_day is not None else float("nan"))
self.hash_path.append(h)
if self.switch_day is not None and d > self.switch_day and (d - self.switch_day) % 90 == 0 and d >= 90:
recent = sum(hashes[d - 90:d]) / 90.0
lo = max(0, d - 90 - 730)
base_hist = hashes[lo:d - 90]
if base_hist:
baseline = sum(base_hist) / len(base_hist)
if baseline > 0:
err = (baseline - recent) / baseline
r = min(self.ceiling, max(self.floor, r + max(-0.25, min(0.25, err))))
return self
def cartel_gain(self, counterfactual):
"""Extra emission the cartel took after returning: its share of (this run - the no-cartel run), from the end of
the withholding window; under presence pay it receives the counterfactual rate for 90 days after its return."""
if not self.cartel_year:
return 0.0
y0 = int((self.cartel_year - 1) * YEAR_S / DAY)
gain = 0.0
for d in range(y0 + 90, self.days):
extra = self.emission_day[d] - counterfactual.emission_day[d]
if self.presence_pay and d < y0 + 180:
continue
gain += self.cartel_w * extra
self.cartel["gain_ign"] = gain
return gain
# ---- the consensus code's integer function, mirrored -------------------------------------------------------------
# A line-for-line mirror of `EmissionTable` in the node fork (consensus/core/src/emission.rs, branch tail-emission-node):
# u128 integer arithmetic, Q32 per-step decay, the ramp's withheld coins in closed form, the percent tail reset once a
# year. `--check-code-csv` compares it with the CSV the code's example binary printed (tail_emission_code.csv); the
# rows of A_current and S1 in tail_emission.csv come from this mirror, so they agree with the code to the base unit.
# The float daily model above serves every other candidate (B, C, D, E, F, I, J, S2, S3), which the code does not carry.
UNIT_BASE = 10 ** 8 # base units per coin today (SOMPI_PER_KASPA); the decimals lane moves it to 10 ** 18
def _ramp_withheld(rate, a, b, ramp_s, start_pct):
if b <= a or ramp_s == 0:
return 0
n = b - a
tot = n * ramp_s - (a + b - 1) * n // 2
return rate * (100 - start_pct) * tot // (100 * ramp_s)
class CodeMirror:
def __init__(self, launch_rate, ramp_s, start_pct, step_s, q32, tail_bps=None, max_steps=4096):
self.launch_rate, self.ramp_s, self.start_pct, self.step_s, self.q32, self.tail_bps = launch_rate, ramp_s, start_pct, step_s, q32, tail_bps
self.step_rate, self.step_supply, self.switch = [], [], None
rate, supply = launch_rate, 0
for k in range(max_steps):
if tail_bps is not None and k > 0 and rate * YEAR_S * 10_000 < supply * tail_bps:
self.switch = (k, supply)
break
self.step_rate.append(rate)
self.step_supply.append(supply)
if rate == 0:
break
a, b = k * step_s, (k + 1) * step_s
minted = rate * step_s
withheld = _ramp_withheld(rate, a, min(b, ramp_s), ramp_s, start_pct) if a < ramp_s else 0
supply += minted - withheld
rate = (rate * q32) >> 32
def _rate_of(self, supply):
return supply // 10_000 * self.tail_bps // YEAR_S + (supply % 10_000) * self.tail_bps // 10_000 // YEAR_S
def tail_year(self, n):
_, supply = self.switch
rate = self._rate_of(supply)
for _ in range(n):
supply += rate * YEAR_S
rate = self._rate_of(supply)
return supply, rate
def switch_seconds(self):
return None if self.switch is None else self.switch[0] * self.step_s
def rate_at(self, seconds):
k = seconds // self.step_s
if self.switch is not None and k >= self.switch[0]:
t0 = self.switch[0] * self.step_s
return self.tail_year((seconds - t0) // YEAR_S)[1]
return self.step_rate[k] if k < len(self.step_rate) else 0
def supply_at(self, seconds):
k = seconds // self.step_s
if self.switch is not None and k >= self.switch[0]:
t0 = self.switch[0] * self.step_s
n = (seconds - t0) // YEAR_S
supply, rate = self.tail_year(n)
return supply + rate * (seconds - t0 - n * YEAR_S)
if k >= len(self.step_rate):
return self.step_supply[-1]
base, rate = self.step_supply[k], self.step_rate[k]
a = k * self.step_s
minted = rate * (seconds - a)
withheld = _ramp_withheld(rate, a, min(seconds, self.ramp_s), self.ramp_s, self.start_pct) if a < self.ramp_s else 0
return base + minted - withheld
def ramp(self, full, seconds):
if seconds >= self.ramp_s:
return full
return full * (self.start_pct * self.ramp_s + (100 - self.start_pct) * seconds) // (100 * self.ramp_s)
def block_subsidy(self, daa, bps=1):
seconds = daa // bps
return self.ramp(self.rate_at(seconds) // bps, seconds)
def year_rows(self, years):
out = []
for y in range(1, years + 1):
a, b = (y - 1) * YEAR_S, y * YEAR_S
e = self.supply_at(b) - self.supply_at(a)
S0 = self.supply_at(a)
out.append((y, e, self.supply_at(b), 100.0 * e / S0 if S0 else float("nan")))
return out
CODE_CURRENT = dict(launch_rate=3_168_808_781, ramp_s=2_592_000, start_pct=10, step_s=2 * YEAR_S, q32=1 << 31, tail_bps=None)
CODE_TESTNET_1 = dict(launch_rate=100 * UNIT_BASE, ramp_s=90 * 86_400, start_pct=10, step_s=YEAR_S // 12, q32=4_172_697_914, tail_bps=100)
def check_code_csv(path, years):
"""Compares the mirror with the CSV the node's example binary printed; returns the largest difference in base units."""
worst = 0
rows = 0
with open(path) as fh:
for r in csv.DictReader(fh):
m = CodeMirror(**(CODE_CURRENT if r["candidate"] == "A_current" else CODE_TESTNET_1))
y = int(r["year"])
if y > years:
continue
a, b = (y - 1) * YEAR_S, y * YEAR_S
e = m.supply_at(b) - m.supply_at(a)
d = max(abs(e - int(r["emission_base_units"])), abs(m.supply_at(b) - int(r["supply_end_base_units"])),
abs(m.block_subsidy(a) - int(r["block_subsidy_year_start_base_units"])))
worst = max(worst, d)
rows += 1
return worst, rows
# ---- dollars -----------------------------------------------------------------------------------------------------
def price_for(path, year, supply_end):
if path.startswith("flat_"):
return float(path.split("_")[1])
cap = min(MCAP_CAP, MCAP_START * MCAP_GROWTH ** (year - 1))
return cap / supply_end
def dollars(e_year, price):
"""Per-day dollars from a year's emission at a price: miners' 80% (the security budget), the pool's 20%, the hash
the budget rents or sustains, the 24-h 51% rental against each, the 20-day veto's net cost."""
e_day = e_year / 365.25
miners = PRODUCER * e_day * price
pool = (1 - PRODUCER) * e_day * price
hash_rented = miners / RENT_GHS_DAY # GH/s the budget rents at the measured price
hash_owned = miners / OWNED_GHS_DAY # GH/s the budget keeps on in owned cards
attack_vs_rented = ATTACK_RENT * hash_rented * RENT_GHS_DAY # = 1.04 budgets
attack_vs_owned = ATTACK_RENT * hash_owned * RENT_GHS_DAY # = 11.8 budgets
veto_rent = ATTACK_RENT * hash_owned * RENT_GHS_DAY * 20
veto_earn = 0.51 * miners * 20
return dict(miners_usd_day=miners, pool_usd_day=pool, hash_rented_ghs=hash_rented, hash_owned_ghs=hash_owned,
attack_24h_vs_rented_usd=attack_vs_rented, attack_24h_vs_owned_usd=attack_vs_owned,
veto_20d_net_usd=veto_rent - veto_earn)
def fmt(x, nd=0):
if isinstance(x, float) and math.isnan(x):
return "n/a"
if abs(x) >= 1e9:
return "%.2f B" % (x / 1e9)
if abs(x) >= 1e6:
return "%.1f M" % (x / 1e6)
if abs(x) >= 1e4:
return "{:,.0f}".format(x)
return ("{:,.%df}" % nd).format(x)
def md_table(headers, rows):
out = ["| " + " | ".join(headers) + " |", "|" + "---|" * len(headers)]
for r in rows:
out.append("| " + " | ".join(str(c) for c in r) + " |")
return "\n".join(out)
def main(argv=None):
ap = argparse.ArgumentParser()
here = os.path.dirname(os.path.abspath(__file__))
ap.add_argument("--years", type=int, default=40)
ap.add_argument("--csv", default=os.path.join(here, "tail_emission.csv"))
ap.add_argument("--md", default=os.path.join(here, "tail_emission_out.md"))
ap.add_argument("--check-code-csv", default=os.path.join(here, "tail_emission_code.csv"),
help="the CSV printed by the node's `cargo run -p kaspa-consensus-core --example emission_csv`; '' skips the check")
args = ap.parse_args(argv)
Y = args.years
tails = [make_A(Y), make_B(Y, 1.5), make_B(Y, 0.75), make_B(Y, 0.2), make_C(Y, 0.5), make_C(Y, 1.0), make_C(Y, 2.0),
make_D(Y)]
E_flat = Thermostat("E_thermostat", Y, 0.25, 3.0).run_thermostat()
I_flat = Thermostat("I_hybrid", Y, 1.0, 3.0).run_thermostat()
J = make_C(Y, 1.0, name="J_presence_tail_1pct")
tails += [E_flat, I_flat, J]
smooth_base_4b = 4e9 * math.log(2) / HALVING_S # 43.9 IGN/s: the 4 B curve made smooth
launches = [make_S(Y, "S1_round100_smooth2y_ramp90_tail1", 100.0, 2, 90),
make_S(Y, "S2_4B_smooth2y_ramp30_tail1", smooth_base_4b, 2, 30),
make_S(Y, "S3_round400_smooth2y_ramp90_tail1", 400.0, 2, 90)]
scheds = tails + launches
# the two schedules the node carries come from the mirror of its integer function, not from the float model
tails[0].mirror = CodeMirror(**CODE_CURRENT)
launches[0].mirror = CodeMirror(**CODE_TESTNET_1)
code_check = None
if args.check_code_csv and os.path.exists(args.check_code_csv):
code_check = check_code_csv(args.check_code_csv, Y)
# thermostat scenarios at flat USD 0.10
scen = {}
for tag, floor in (("E", 0.25), ("I", 1.0)):
scen[tag + "_crash"] = Thermostat(tag + "_crash50_y15", Y, floor, 3.0, crash_year=15).run_thermostat()
scen[tag + "_eff"] = Thermostat(tag + "_eff10x_y15", Y, floor, 3.0, eff_year=15).run_thermostat()
scen[tag + "_cartel"] = Thermostat(tag + "_cartel34_y20", Y, floor, 3.0, cartel_year=20).run_thermostat()
scen[tag + "_cartel_pp"] = Thermostat(tag + "_cartel34_y20_presence", Y, floor, 3.0, cartel_year=20,
presence_pay=True).run_thermostat()
base_for = {"E": E_flat, "I": I_flat}
for tag in ("E", "I"):
scen[tag + "_cartel"].cartel_gain(base_for[tag])
scen[tag + "_cartel_pp"].cartel_gain(base_for[tag])
# ---- CSV ----
fields = ["candidate", "year", "price_path", "price_usd", "emission_ign", "supply_end_ign", "inflation_pct",
"dilution_per_holder_pct", "miners_usd_day", "pool_usd_day", "security_budget_usd_day",
"hash_rented_ghs", "hash_rented_ghs_10x_eff", "hash_rented_ghs_100x_eff", "hash_owned_ghs",
"attack_24h_51pct_vs_rented_usd", "attack_24h_51pct_vs_owned_usd", "veto_20d_net_usd", "tail_rate_pct",
"switch_year"]
with open(args.csv, "w", newline="") as fh:
w = csv.DictWriter(fh, fieldnames=fields)
w.writeheader()
for sch in scheds + list(scen.values()):
paths = PRICE_PATHS if sch in scheds else ("flat_0.10",)
rows = sch.year_rows()
for (y, e, S, infl) in rows:
for path in paths:
price = price_for(path, y, S)
dd = dollars(e, price)
veto = dd["veto_20d_net_usd"]
if sch.name.startswith("J_"):
# the tail paid by 30-day presence: a 20-day renter's weight averages 10/30 of its block share
veto = ATTACK_RENT * dd["hash_owned_ghs"] * RENT_GHS_DAY * 20 - 0.51 * dd["miners_usd_day"] * 20 / 3
per_year = YEAR_S / DAY
b = int(round(y * per_year)) - 1
tail_rate = sch.r_path[b] if isinstance(sch, Thermostat) else float("nan")
w.writerow({
"candidate": sch.name, "year": y, "price_path": path, "price_usd": "%.6f" % price,
"emission_ign": "%.0f" % e, "supply_end_ign": "%.0f" % S, "inflation_pct": "%.4f" % infl,
"dilution_per_holder_pct": "%.4f" % (100.0 * (1 - 1 / (1 + infl / 100.0))) if not math.isnan(infl) else "",
"miners_usd_day": "%.2f" % dd["miners_usd_day"], "pool_usd_day": "%.2f" % dd["pool_usd_day"],
"security_budget_usd_day": "%.2f" % dd["miners_usd_day"],
"hash_rented_ghs": "%.4f" % dd["hash_rented_ghs"],
"hash_rented_ghs_10x_eff": "%.4f" % (10 * dd["hash_rented_ghs"]),
"hash_rented_ghs_100x_eff": "%.4f" % (100 * dd["hash_rented_ghs"]),
"hash_owned_ghs": "%.4f" % dd["hash_owned_ghs"],
"attack_24h_51pct_vs_rented_usd": "%.2f" % dd["attack_24h_vs_rented_usd"],
"attack_24h_51pct_vs_owned_usd": "%.2f" % dd["attack_24h_vs_owned_usd"],
"veto_20d_net_usd": "%.2f" % veto,
"tail_rate_pct": "" if math.isnan(tail_rate) else "%.3f" % tail_rate,
"switch_year": "" if sch.switch_day is None else "%.2f" % switch_year(sch.switch_day),
})
# ---- markdown ----
out = ["# Tail emission and the launch schedule over forty years (generated by tail_emission.py)", ""]
out.append("Inputs: rental USD %.0f per GH/s-day (measured 6 October 2026), owned cost USD %.1f per GH/s-day (lane 4, approximate capital), "
"premium %.1fx; a 51%% attacker rents 1.04 N. The security budget is the miners' 80%% in dollars a day; the pool's 20%% pays provers. "
"Price paths are inputs, not predictions." % (RENT_GHS_DAY, OWNED_GHS_DAY, RENT_PREMIUM))
out.append("")
if code_check is not None:
out.append("Code check: the integer mirror of `consensus/core/src/emission.rs` against `%s` (%d rows, A_current and S1): largest difference %d base units. "
"A_current and S1 below are the mirror's rows; the float daily model carries every other candidate." % (os.path.basename(args.check_code_csv), code_check[1], code_check[0]))
out.append("")
out.append("## 1. Emission and supply by candidate, selected years (emission that year / supply at its end / inflation that year %)")
out.append("")
years_show = (1, 2, 5, 9, 10, 11, 13, 15, 17, 20, 25, 30, 40)
hdr = ["candidate", "tail from", "launch IGN/s"] + ["y%d" % y for y in years_show]
rows = []
for sch in scheds:
yr = {y: (e, S, infl) for (y, e, S, infl) in sch.year_rows()}
cells = ["%s / %s / %.2f" % (fmt(yr[y][0]), fmt(yr[y][1]), yr[y][2]) if y in yr else "" for y in years_show]
rows.append([sch.name, "year %.1f" % switch_year(sch.switch_day) if sch.switch_day is not None else "none",
"%.1f" % sch.launch_rate()] + cells)
out.append(md_table(hdr, rows))
out.append("")
out.append("Launch schedules: curve sum without the tail (base x half-life / ln 2) and the ramp's withheld coins:")
out.append("")
out.append(md_table(["schedule", "launch IGN/s", "curve sum IGN", "ramp withholds IGN", "first-year emission", "share of curve sum", "years 1+2 share", "supply at tail switch", "tail IGN/yr at switch"],
[[s.name, "%.1f" % s.launch_rate(), fmt(s.curve_sum), fmt(s.ramp_withheld), fmt(s.year_rows()[0][1]),
"%.1f%%" % (100 * s.year_rows()[0][1] / s.curve_sum), "%.1f%%" % (100 * s.year_rows()[1][2] / s.curve_sum),
fmt(s.supply[s.switch_day]), fmt(0.01 * s.supply[s.switch_day])] for s in launches]))
out.append("")
out.append("## 2. Security budget a day, the 24-h 51% rental against it, and the 20-day veto, by price path")
out.append("")
for path in PRICE_PATHS:
out.append("### Price path %s%s" % (path, " (the only path comparable across S1 to S3: a fixed market cap, price = cap / supply)" if path == "mcap_path" else " (per coin: S1 to S3 are not comparable with A on this path)"))
out.append("")
hdr = ["candidate"] + ["y%d: budget / 24h vs owned / veto net" % y for y in (1, 5, 11, 15, 20, 30, 40)]
rows = []
for sch in scheds:
yr = {y: (e, S) for (y, e, S, infl) in sch.year_rows()}
cells = []
for y in (1, 5, 11, 15, 20, 30, 40):
e, S = yr[y]
dd = dollars(e, price_for(path, y, S))
cells.append("%s / %s / %s" % (fmt(dd["miners_usd_day"]), fmt(dd["attack_24h_vs_owned_usd"]), fmt(dd["veto_20d_net_usd"])))
rows.append([sch.name] + cells)
out.append(md_table(hdr, rows))
out.append("")
out.append("The ratios are constants of the hardware market, not of the schedule: a 24-h 51%% rental against an owned honest fleet costs "
"%.1f x the day's budget; against a rented honest fleet 1.04 x; the 20-day veto nets %.0f x the day's budget. A 10x or 100x "
"efficiency gain multiplies the hash on both sides and leaves every dollar figure unchanged." % (ATTACK_RENT * RENT_PREMIUM, 20 * (ATTACK_RENT * RENT_PREMIUM - 0.51)))
out.append("")
out.append("## 3. The thermostat (E) and the hybrid (I) under shocks, flat USD 0.10")
out.append("")
hdr = ["run", "tail from", "tail rate % y14 / y15 / y16 / y17 / y20 / y25", "budget USD/day y14 / y16 / y20 / y25", "hash GH/s y14 / y16 / y20"]
rows = []
for tag in ("E", "I"):
for key in ("", "_crash", "_eff", "_cartel", "_cartel_pp"):
sch = base_for[tag] if key == "" else scen[tag + key]
per_year = YEAR_S / DAY
def at(y, arr):
return arr[int(round(y * per_year)) - 1]
yr = {y: e for (y, e, S, infl) in sch.year_rows()}
rates = " / ".join("%.2f" % at(y, sch.r_path) for y in (14, 15, 16, 17, 20, 25))
budg = " / ".join(fmt(dollars(yr[y], 0.10 * (0.5 if "crash" in sch.name and y >= 15 else 1.0))["miners_usd_day"]) for y in (14, 16, 20, 25))
hs = " / ".join("%.1f" % at(y, sch.hash_path) for y in (14, 16, 20))
rows.append([sch.name, "year %.1f" % switch_year(sch.switch_day), rates, budg, hs])
out.append(md_table(hdr, rows))
out.append("")
for tag in ("E", "I"):
for key in ("_cartel", "_cartel_pp"):
sch = scen[tag + key]
f, g = sch.cartel["forgone_ign"], sch.cartel["gain_ign"]
out.append("- %s: the 34%% cartel forgoes %s IGN over its 90 withheld days and takes %s IGN of extra emission after returning (gain / cost = %.2f)." % (sch.name, fmt(f), fmt(g), g / f if f else 0))
out.append("")
out.append("## 4. Settled-value targeting (F): the inflation it demands")
out.append("")
out.append("A 24-h 51%% rental costs %.1f budgets against owned hash and 1.04 against rented hash, so the floor emission is k x V / %.1f "
"(or / 1.04) a day, where V is the value settled that day in IGN (both sides in IGN, so no oracle). With velocity v "
"(settled value a year / supply) the inflation the rule demands is k v / %.1f a year, or k v / 1.04 against a rented fleet." % (ATTACK_RENT * RENT_PREMIUM, ATTACK_RENT * RENT_PREMIUM, ATTACK_RENT * RENT_PREMIUM))
out.append("")
rows = []
for k in (1, 3, 10):
for v in (0.1, 1.0, 3.0):
rows.append([k, v, "%.1f%%" % (100 * k * v / (ATTACK_RENT * RENT_PREMIUM)), "%.0f%%" % (100 * k * v / ATTACK_RENT)])
out.append(md_table(["k", "velocity v (a year)", "inflation demanded, owned honest fleet", "rented honest fleet"], rows))
out.append("")
out.append("## 5. Security sold as a product (H): a settlement fee to miners equal to the rollup proving fee, against the miners' subsidy, USD 0.02")
out.append("")
rows = []
A = {y: e for (y, e, S, infl) in make_A(Y).year_rows()}
for y in (1, 2, 5, 9, 11, 13):
n = interp_year(ROLLUPS, y)
fee = n * ROLLUP_IGN_DAY * 0.02
util = interp_year(UTILITY_BASE, y)
sub = PRODUCER * A[y] / 365.25 * 0.02
rows.append([y, "%.0f" % n, fmt(fee), fmt(util), fmt(sub), "%.0f%%" % (100 * fee / sub), "%.0f%%" % (100 * util / sub)])
rows.append(["5 (high)", "50", fmt(ROLLUPS_HIGH5 * ROLLUP_IGN_DAY * 0.02), fmt(UTILITY_HIGH5), fmt(PRODUCER * A[5] / 365.25 * 0.02),
"%.0f%%" % (100 * ROLLUPS_HIGH5 * ROLLUP_IGN_DAY * 0.02 / (PRODUCER * A[5] / 365.25 * 0.02)),
"%.0f%%" % (100 * UTILITY_HIGH5 / (PRODUCER * A[5] / 365.25 * 0.02))])
out.append(md_table(["year", "rollups", "settlement fee to miners USD/day", "all utility to miners+provers USD/day (lane 4)", "subsidy to miners USD/day", "fee / subsidy", "utility / subsidy"], rows))
out.append("")
out.append("## 6. What a solo card's first day pays (coins): one 100 MH/s card against a network of 100 GH/s and 1 TH/s, full ramp")
out.append("")
rows = []
for sch in [tails[0]] + launches:
r = sch.launch_rate()
rows.append([sch.name, "%.1f" % r, "%.0f" % (r * DAY * 1e-3 * PRODUCER), "%.0f" % (r * DAY * 1e-4 * PRODUCER),
"%.1f" % (r * DAY * 1e-3 * PRODUCER * 0.1)])
out.append(md_table(["schedule", "IGN per block (1 block/s)", "IGN a day at 100 GH/s", "at 1 TH/s", "at 100 GH/s on launch day (ramp 10%)"], rows))
out.append("")
out.append("## 7. Holder dilution a year under a percentage tail")
out.append("")
rows = []
for p in (0.5, 1.0, 2.0, 3.0):
d1 = 100 * (1 - 1 / (1 + p / 100))
rows.append(["%.1f%%" % p, "%.3f%%" % d1, "%.1f%%" % (100 * (1 - (1 + p / 100) ** -10)), "%.1f%%" % (100 * (1 - (1 + p / 100) ** -40)),
"%.4f%%" % (100 * ATTACK_RENT * RENT_PREMIUM * p / 100 / 365.25)])
out.append(md_table(["tail p a year", "holder's share lost a year", "over 10 years", "over 40 years", "24-h 51% attack as % of market cap (owned honest fleet)"], rows))
out.append("")
text = "\n".join(out)
with open(args.md, "w") as fh:
fh.write(text + "\n")
print(text)
print("\nCSV: %s" % args.csv)
return 0
if __name__ == "__main__":
sys.exit(main())

View file

@ -0,0 +1,81 @@
candidate,year,emission_base_units,emission_ign,supply_end_base_units,supply_end_ign,inflation_pct,block_subsidy_year_start_base_units,switch_seconds
A_current,1,96303899999163249,963038999.99163249,96303899999163249,963038999.99163249,NaN,316880878,
A_current,2,99999999987285600,999999999.87285600,196303899986448849,1963038999.86448849,103.837955,3168808781,
A_current,3,49999999977864000,499999999.77864000,246303899964312849,2463038999.64312849,25.470711,1584404390,
A_current,4,49999999977864000,499999999.77864000,296303899942176849,2963038999.42176849,20.300125,1584404390,
A_current,5,24999999988932000,249999999.88932000,321303899931108849,3213038999.31108849,8.437283,792202195,
A_current,6,24999999988932000,249999999.88932000,346303899920040849,3463038999.20040849,7.780796,792202195,
A_current,7,12499999978687200,124999999.78687200,358803899898728049,3588038998.98728049,3.609546,396101097,
A_current,8,12499999978687200,124999999.78687200,371303899877415249,3713038998.77415249,3.483797,396101097,
A_current,9,6249999973564800,62499999.73564800,377553899850980049,3775538998.50980049,1.683257,198050548,
A_current,10,6249999973564800,62499999.73564800,383803899824544849,3838038998.24544849,1.655393,198050548,
A_current,11,3124999986782400,31249999.86782400,386928899811327249,3869288998.11327249,0.814218,99025274,
A_current,12,3124999986782400,31249999.86782400,390053899798109649,3900538997.98109649,0.807642,99025274,
A_current,13,1562499993391200,15624999.93391200,391616399791500849,3916163997.91500849,0.400586,49512637,
A_current,14,1562499993391200,15624999.93391200,393178899784892049,3931788997.84892049,0.398987,49512637,
A_current,15,781249980916800,7812499.80916800,393960149765808849,3939601497.65808849,0.198701,24756318,
A_current,16,781249980916800,7812499.80916800,394741399746725649,3947413997.46725649,0.198307,24756318,
A_current,17,390624990458400,3906249.90458400,395132024737184049,3951320247.37184049,0.098957,12378159,
A_current,18,390624990458400,3906249.90458400,395522649727642449,3955226497.27642449,0.098859,12378159,
A_current,19,195312479450400,1953124.79450400,395717962207092849,3957179622.07092849,0.049381,6189079,
A_current,20,195312479450400,1953124.79450400,395913274686543249,3959132746.86543249,0.049356,6189079,
A_current,21,97656223946400,976562.23946400,396010930910489649,3960109309.10489649,0.024666,3094539,
A_current,22,97656223946400,976562.23946400,396108587134436049,3961085871.34436049,0.024660,3094539,
A_current,23,48828096194400,488280.96194400,396157415230630449,3961574152.30630449,0.012327,1547269,
A_current,24,48828096194400,488280.96194400,396206243326824849,3962062433.26824849,0.012325,1547269,
A_current,25,24414032318400,244140.32318400,396230657359143249,3962306573.59143249,0.006162,773634,
A_current,26,24414032318400,244140.32318400,396255071391461649,3962550713.91461649,0.006162,773634,
A_current,27,12207016159200,122070.16159200,396267278407620849,3962672784.07620849,0.003081,386817,
A_current,28,12207016159200,122070.16159200,396279485423780049,3962794854.23780049,0.003081,386817,
A_current,29,6103492300800,61034.92300800,396285588916080849,3962855889.16080849,0.001540,193408,
A_current,30,6103492300800,61034.92300800,396291692408381649,3962916924.08381649,0.001540,193408,
A_current,31,3051746150400,30517.46150400,396294744154532049,3962947441.54532049,0.000770,96704,
A_current,32,3051746150400,30517.46150400,396297795900682449,3962977959.00682449,0.000770,96704,
A_current,33,1525873075200,15258.73075200,396299321773757649,3962993217.73757649,0.000385,48352,
A_current,34,1525873075200,15258.73075200,396300847646832849,3963008476.46832849,0.000385,48352,
A_current,35,762936537600,7629.36537600,396301610583370449,3963016105.83370449,0.000193,24176,
A_current,36,762936537600,7629.36537600,396302373519908049,3963023735.19908049,0.000193,24176,
A_current,37,381468268800,3814.68268800,396302754988176849,3963027549.88176849,0.000096,12088,
A_current,38,381468268800,3814.68268800,396303136456445649,3963031364.56445649,0.000096,12088,
A_current,39,190734134400,1907.34134400,396303327190580049,3963033271.90580049,0.000048,6044,
A_current,40,190734134400,1907.34134400,396303517924714449,3963035179.24714449,0.000048,6044,
S1_round100_smooth2y_ramp90_tail1,1,236112248481728661,2361122484.81728661,236112248481728661,2361122484.81728661,NaN,1000000000,328725000
S1_round100_smooth2y_ramp90_tail1,2,191319476659385400,1913194766.59385400,427431725141114061,4274317251.41114061,81.029035,7071067801,328725000
S1_round100_smooth2y_ramp90_tail1,3,135283299021558000,1352832990.21558000,562715024162672061,5627150241.62672061,31.650271,4999999984,328725000
S1_round100_smooth2y_ramp90_tail1,4,95659737897090600,956597378.97090600,658374762059762661,6583747620.59762661,16.999677,3535533886,328725000
S1_round100_smooth2y_ramp90_tail1,5,67641649126828200,676416491.26828200,726016411186590861,7260164111.86590861,10.274034,2499999979,328725000
S1_round100_smooth2y_ramp90_tail1,6,47829868536981600,478298685.36981600,773846279723572461,7738462797.23572461,6.587987,1767766930,328725000
S1_round100_smooth2y_ramp90_tail1,7,33820824186037800,338208241.86037800,807667103909610261,8076671039.09610261,4.370484,1249999977,328725000
S1_round100_smooth2y_ramp90_tail1,8,23914933895059200,239149338.95059200,831582037804669461,8315820378.04669461,2.960989,883883453,328725000
S1_round100_smooth2y_ramp90_tail1,9,16910411741940600,169104117.41940600,848492449546610061,8484924495.46610061,2.033523,624999977,328725000
S1_round100_smooth2y_ramp90_tail1,10,11957466639843000,119574666.39843000,860449916186453061,8604499161.86453061,1.409260,441941717,328725000
S1_round100_smooth2y_ramp90_tail1,11,8923608375894000,89236083.75894000,869373524562347061,8693735245.62347061,1.037086,312499978,328725000
S1_round100_smooth2y_ramp90_tail1,12,8693735225261400,86937352.25261400,878067259787608461,8780672597.87608461,1.000000,273890153,328725000
S1_round100_smooth2y_ramp90_tail1,13,8780672579013000,87806725.79013000,886847932366621461,8868479323.66621461,1.000000,276629054,328725000
S1_round100_smooth2y_ramp90_tail1,14,8868479302567800,88684793.02567800,895716411669189261,8957164116.69189261,1.000000,279395345,328725000
S1_round100_smooth2y_ramp90_tail1,15,8957164090044600,89571640.90044600,904673575759233861,9046735757.59233861,1.000000,282189298,328725000
S1_round100_smooth2y_ramp90_tail1,16,9046735732864800,90467357.32864800,913720311492098661,9137203114.92098661,1.000000,285011191,328725000
S1_round100_smooth2y_ramp90_tail1,17,9137203090824600,91372030.90824600,922857514582923261,9228575145.82923261,1.000000,287861303,328725000
S1_round100_smooth2y_ramp90_tail1,18,9228575118393000,92285751.18393000,932086089701316261,9320860897.01316261,1.000000,290739916,328725000
S1_round100_smooth2y_ramp90_tail1,19,9320860883120400,93208608.83120400,941406950584436661,9414069505.84436661,1.000000,293647315,328725000
S1_round100_smooth2y_ramp90_tail1,20,9414069486744600,94140694.86744600,950821020071181261,9508210200.71181261,1.000000,296583789,328725000
S1_round100_smooth2y_ramp90_tail1,21,9508210183531800,95082101.83531800,960329230254713061,9603292302.54713061,1.000000,299549626,328725000
S1_round100_smooth2y_ramp90_tail1,22,9603292290863400,96032922.90863400,969932522545576461,9699325225.45576461,1.000000,302545123,328725000
S1_round100_smooth2y_ramp90_tail1,23,9699325215534000,96993252.15534000,979631847761110461,9796318477.61110461,1.000000,305570574,328725000
S1_round100_smooth2y_ramp90_tail1,24,9796318474789800,97963184.74789800,989428166235900261,9894281662.35900261,1.000000,308626280,328725000
S1_round100_smooth2y_ramp90_tail1,25,9894281654251800,98942816.54251800,999322447890152061,9993224478.90152061,1.000000,311712543,328725000
S1_round100_smooth2y_ramp90_tail1,26,9993224471031000,99932244.71031000,1009315672361183061,10093156723.61183061,1.000000,314829668,328725000
S1_round100_smooth2y_ramp90_tail1,27,10093156707983400,100931567.07983400,1019408829069166461,10194088290.69166461,1.000000,317977965,328725000
S1_round100_smooth2y_ramp90_tail1,28,10194088276825200,101940882.76825200,1029602917345991661,10296029173.45991661,1.000000,321157744,328725000
S1_round100_smooth2y_ramp90_tail1,29,10296029162907000,102960291.62907000,1039898946508898661,10398989465.08898661,1.000000,324369322,328725000
S1_round100_smooth2y_ramp90_tail1,30,10398989448882000,103989894.48882000,1050297935957780661,10502979359.57780661,1.000000,327613015,328725000
S1_round100_smooth2y_ramp90_tail1,31,10502979351523200,105029793.51523200,1060800915309303861,10608009153.09303861,1.000000,330889145,328725000
S1_round100_smooth2y_ramp90_tail1,32,10608009145459200,106080091.45459200,1071408924454763061,10714089244.54763061,1.000000,334198037,328725000
S1_round100_smooth2y_ramp90_tail1,33,10714089228919200,107140892.28919200,1082123013683682261,10821230136.83682261,1.000000,337540017,328725000
S1_round100_smooth2y_ramp90_tail1,34,10821230115843600,108212301.15843600,1092944243799525861,10929442437.99525861,1.000000,340915417,328725000
S1_round100_smooth2y_ramp90_tail1,35,10929442420105200,109294424.20105200,1103873686219631061,11038736862.19631061,1.000000,344324571,328725000
S1_round100_smooth2y_ramp90_tail1,36,11038736844990000,110387368.44990000,1114912423064621061,11149124230.64621061,1.000000,347767817,328725000
S1_round100_smooth2y_ramp90_tail1,37,11149124212125000,111491242.12125000,1126061547276746061,11260615472.76746061,1.000000,351245495,328725000
S1_round100_smooth2y_ramp90_tail1,38,11260615464108000,112606154.64108000,1137322162740854061,11373221627.40854061,1.000000,354757950,328725000
S1_round100_smooth2y_ramp90_tail1,39,11373221619801000,113732216.19801000,1148695384360655061,11486953843.60655061,1.000000,358305530,328725000
S1_round100_smooth2y_ramp90_tail1,40,11486953834815600,114869538.34815600,1160182338195470661,11601823381.95470661,1.000000,361888585,328725000
1 candidate year emission_base_units emission_ign supply_end_base_units supply_end_ign inflation_pct block_subsidy_year_start_base_units switch_seconds
2 A_current 1 96303899999163249 963038999.99163249 96303899999163249 963038999.99163249 NaN 316880878
3 A_current 2 99999999987285600 999999999.87285600 196303899986448849 1963038999.86448849 103.837955 3168808781
4 A_current 3 49999999977864000 499999999.77864000 246303899964312849 2463038999.64312849 25.470711 1584404390
5 A_current 4 49999999977864000 499999999.77864000 296303899942176849 2963038999.42176849 20.300125 1584404390
6 A_current 5 24999999988932000 249999999.88932000 321303899931108849 3213038999.31108849 8.437283 792202195
7 A_current 6 24999999988932000 249999999.88932000 346303899920040849 3463038999.20040849 7.780796 792202195
8 A_current 7 12499999978687200 124999999.78687200 358803899898728049 3588038998.98728049 3.609546 396101097
9 A_current 8 12499999978687200 124999999.78687200 371303899877415249 3713038998.77415249 3.483797 396101097
10 A_current 9 6249999973564800 62499999.73564800 377553899850980049 3775538998.50980049 1.683257 198050548
11 A_current 10 6249999973564800 62499999.73564800 383803899824544849 3838038998.24544849 1.655393 198050548
12 A_current 11 3124999986782400 31249999.86782400 386928899811327249 3869288998.11327249 0.814218 99025274
13 A_current 12 3124999986782400 31249999.86782400 390053899798109649 3900538997.98109649 0.807642 99025274
14 A_current 13 1562499993391200 15624999.93391200 391616399791500849 3916163997.91500849 0.400586 49512637
15 A_current 14 1562499993391200 15624999.93391200 393178899784892049 3931788997.84892049 0.398987 49512637
16 A_current 15 781249980916800 7812499.80916800 393960149765808849 3939601497.65808849 0.198701 24756318
17 A_current 16 781249980916800 7812499.80916800 394741399746725649 3947413997.46725649 0.198307 24756318
18 A_current 17 390624990458400 3906249.90458400 395132024737184049 3951320247.37184049 0.098957 12378159
19 A_current 18 390624990458400 3906249.90458400 395522649727642449 3955226497.27642449 0.098859 12378159
20 A_current 19 195312479450400 1953124.79450400 395717962207092849 3957179622.07092849 0.049381 6189079
21 A_current 20 195312479450400 1953124.79450400 395913274686543249 3959132746.86543249 0.049356 6189079
22 A_current 21 97656223946400 976562.23946400 396010930910489649 3960109309.10489649 0.024666 3094539
23 A_current 22 97656223946400 976562.23946400 396108587134436049 3961085871.34436049 0.024660 3094539
24 A_current 23 48828096194400 488280.96194400 396157415230630449 3961574152.30630449 0.012327 1547269
25 A_current 24 48828096194400 488280.96194400 396206243326824849 3962062433.26824849 0.012325 1547269
26 A_current 25 24414032318400 244140.32318400 396230657359143249 3962306573.59143249 0.006162 773634
27 A_current 26 24414032318400 244140.32318400 396255071391461649 3962550713.91461649 0.006162 773634
28 A_current 27 12207016159200 122070.16159200 396267278407620849 3962672784.07620849 0.003081 386817
29 A_current 28 12207016159200 122070.16159200 396279485423780049 3962794854.23780049 0.003081 386817
30 A_current 29 6103492300800 61034.92300800 396285588916080849 3962855889.16080849 0.001540 193408
31 A_current 30 6103492300800 61034.92300800 396291692408381649 3962916924.08381649 0.001540 193408
32 A_current 31 3051746150400 30517.46150400 396294744154532049 3962947441.54532049 0.000770 96704
33 A_current 32 3051746150400 30517.46150400 396297795900682449 3962977959.00682449 0.000770 96704
34 A_current 33 1525873075200 15258.73075200 396299321773757649 3962993217.73757649 0.000385 48352
35 A_current 34 1525873075200 15258.73075200 396300847646832849 3963008476.46832849 0.000385 48352
36 A_current 35 762936537600 7629.36537600 396301610583370449 3963016105.83370449 0.000193 24176
37 A_current 36 762936537600 7629.36537600 396302373519908049 3963023735.19908049 0.000193 24176
38 A_current 37 381468268800 3814.68268800 396302754988176849 3963027549.88176849 0.000096 12088
39 A_current 38 381468268800 3814.68268800 396303136456445649 3963031364.56445649 0.000096 12088
40 A_current 39 190734134400 1907.34134400 396303327190580049 3963033271.90580049 0.000048 6044
41 A_current 40 190734134400 1907.34134400 396303517924714449 3963035179.24714449 0.000048 6044
42 S1_round100_smooth2y_ramp90_tail1 1 236112248481728661 2361122484.81728661 236112248481728661 2361122484.81728661 NaN 1000000000 328725000
43 S1_round100_smooth2y_ramp90_tail1 2 191319476659385400 1913194766.59385400 427431725141114061 4274317251.41114061 81.029035 7071067801 328725000
44 S1_round100_smooth2y_ramp90_tail1 3 135283299021558000 1352832990.21558000 562715024162672061 5627150241.62672061 31.650271 4999999984 328725000
45 S1_round100_smooth2y_ramp90_tail1 4 95659737897090600 956597378.97090600 658374762059762661 6583747620.59762661 16.999677 3535533886 328725000
46 S1_round100_smooth2y_ramp90_tail1 5 67641649126828200 676416491.26828200 726016411186590861 7260164111.86590861 10.274034 2499999979 328725000
47 S1_round100_smooth2y_ramp90_tail1 6 47829868536981600 478298685.36981600 773846279723572461 7738462797.23572461 6.587987 1767766930 328725000
48 S1_round100_smooth2y_ramp90_tail1 7 33820824186037800 338208241.86037800 807667103909610261 8076671039.09610261 4.370484 1249999977 328725000
49 S1_round100_smooth2y_ramp90_tail1 8 23914933895059200 239149338.95059200 831582037804669461 8315820378.04669461 2.960989 883883453 328725000
50 S1_round100_smooth2y_ramp90_tail1 9 16910411741940600 169104117.41940600 848492449546610061 8484924495.46610061 2.033523 624999977 328725000
51 S1_round100_smooth2y_ramp90_tail1 10 11957466639843000 119574666.39843000 860449916186453061 8604499161.86453061 1.409260 441941717 328725000
52 S1_round100_smooth2y_ramp90_tail1 11 8923608375894000 89236083.75894000 869373524562347061 8693735245.62347061 1.037086 312499978 328725000
53 S1_round100_smooth2y_ramp90_tail1 12 8693735225261400 86937352.25261400 878067259787608461 8780672597.87608461 1.000000 273890153 328725000
54 S1_round100_smooth2y_ramp90_tail1 13 8780672579013000 87806725.79013000 886847932366621461 8868479323.66621461 1.000000 276629054 328725000
55 S1_round100_smooth2y_ramp90_tail1 14 8868479302567800 88684793.02567800 895716411669189261 8957164116.69189261 1.000000 279395345 328725000
56 S1_round100_smooth2y_ramp90_tail1 15 8957164090044600 89571640.90044600 904673575759233861 9046735757.59233861 1.000000 282189298 328725000
57 S1_round100_smooth2y_ramp90_tail1 16 9046735732864800 90467357.32864800 913720311492098661 9137203114.92098661 1.000000 285011191 328725000
58 S1_round100_smooth2y_ramp90_tail1 17 9137203090824600 91372030.90824600 922857514582923261 9228575145.82923261 1.000000 287861303 328725000
59 S1_round100_smooth2y_ramp90_tail1 18 9228575118393000 92285751.18393000 932086089701316261 9320860897.01316261 1.000000 290739916 328725000
60 S1_round100_smooth2y_ramp90_tail1 19 9320860883120400 93208608.83120400 941406950584436661 9414069505.84436661 1.000000 293647315 328725000
61 S1_round100_smooth2y_ramp90_tail1 20 9414069486744600 94140694.86744600 950821020071181261 9508210200.71181261 1.000000 296583789 328725000
62 S1_round100_smooth2y_ramp90_tail1 21 9508210183531800 95082101.83531800 960329230254713061 9603292302.54713061 1.000000 299549626 328725000
63 S1_round100_smooth2y_ramp90_tail1 22 9603292290863400 96032922.90863400 969932522545576461 9699325225.45576461 1.000000 302545123 328725000
64 S1_round100_smooth2y_ramp90_tail1 23 9699325215534000 96993252.15534000 979631847761110461 9796318477.61110461 1.000000 305570574 328725000
65 S1_round100_smooth2y_ramp90_tail1 24 9796318474789800 97963184.74789800 989428166235900261 9894281662.35900261 1.000000 308626280 328725000
66 S1_round100_smooth2y_ramp90_tail1 25 9894281654251800 98942816.54251800 999322447890152061 9993224478.90152061 1.000000 311712543 328725000
67 S1_round100_smooth2y_ramp90_tail1 26 9993224471031000 99932244.71031000 1009315672361183061 10093156723.61183061 1.000000 314829668 328725000
68 S1_round100_smooth2y_ramp90_tail1 27 10093156707983400 100931567.07983400 1019408829069166461 10194088290.69166461 1.000000 317977965 328725000
69 S1_round100_smooth2y_ramp90_tail1 28 10194088276825200 101940882.76825200 1029602917345991661 10296029173.45991661 1.000000 321157744 328725000
70 S1_round100_smooth2y_ramp90_tail1 29 10296029162907000 102960291.62907000 1039898946508898661 10398989465.08898661 1.000000 324369322 328725000
71 S1_round100_smooth2y_ramp90_tail1 30 10398989448882000 103989894.48882000 1050297935957780661 10502979359.57780661 1.000000 327613015 328725000
72 S1_round100_smooth2y_ramp90_tail1 31 10502979351523200 105029793.51523200 1060800915309303861 10608009153.09303861 1.000000 330889145 328725000
73 S1_round100_smooth2y_ramp90_tail1 32 10608009145459200 106080091.45459200 1071408924454763061 10714089244.54763061 1.000000 334198037 328725000
74 S1_round100_smooth2y_ramp90_tail1 33 10714089228919200 107140892.28919200 1082123013683682261 10821230136.83682261 1.000000 337540017 328725000
75 S1_round100_smooth2y_ramp90_tail1 34 10821230115843600 108212301.15843600 1092944243799525861 10929442437.99525861 1.000000 340915417 328725000
76 S1_round100_smooth2y_ramp90_tail1 35 10929442420105200 109294424.20105200 1103873686219631061 11038736862.19631061 1.000000 344324571 328725000
77 S1_round100_smooth2y_ramp90_tail1 36 11038736844990000 110387368.44990000 1114912423064621061 11149124230.64621061 1.000000 347767817 328725000
78 S1_round100_smooth2y_ramp90_tail1 37 11149124212125000 111491242.12125000 1126061547276746061 11260615472.76746061 1.000000 351245495 328725000
79 S1_round100_smooth2y_ramp90_tail1 38 11260615464108000 112606154.64108000 1137322162740854061 11373221627.40854061 1.000000 354757950 328725000
80 S1_round100_smooth2y_ramp90_tail1 39 11373221619801000 113732216.19801000 1148695384360655061 11486953843.60655061 1.000000 358305530 328725000
81 S1_round100_smooth2y_ramp90_tail1 40 11486953834815600 114869538.34815600 1160182338195470661 11601823381.95470661 1.000000 361888585 328725000

View file

@ -0,0 +1,179 @@
# Tail emission and the launch schedule over forty years (generated by tail_emission.py)
Inputs: rental USD 281 per GH/s-day (measured 6 October 2026), owned cost USD 24.8 per GH/s-day (lane 4, approximate capital), premium 11.3x; a 51% attacker rents 1.04 N. The security budget is the miners' 80% in dollars a day; the pool's 20% pays provers. Price paths are inputs, not predictions.
Code check: the integer mirror of `consensus/core/src/emission.rs` against `tail_emission_code.csv` (80 rows, A_current and S1): largest difference 0 base units. A_current and S1 below are the mirror's rows; the float daily model carries every other candidate.
## 1. Emission and supply by candidate, selected years (emission that year / supply at its end / inflation that year %)
| candidate | tail from | launch IGN/s | y1 | y2 | y5 | y9 | y10 | y11 | y13 | y15 | y17 | y20 | y25 | y30 | y40 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A_current | none | 31.7 | 963.0 M / 963.0 M / nan | 1000.0 M / 1.96 B / 103.84 | 250.0 M / 3.21 B / 8.44 | 62.5 M / 3.78 B / 1.68 | 62.5 M / 3.84 B / 1.66 | 31.2 M / 3.87 B / 0.81 | 15.6 M / 3.92 B / 0.40 | 7.8 M / 3.94 B / 0.20 | 3.9 M / 3.95 B / 0.10 | 2.0 M / 3.96 B / 0.05 | 244,140 / 3.96 B / 0.01 | 61,035 / 3.96 B / 0.00 | 1,907 / 3.96 B / 0.00 |
| B_tail_F1.5 | year 11.0 | 31.7 | 961.1 M / 961.1 M / nan | 999.3 M / 1.96 B / 103.97 | 249.8 M / 3.21 B / 8.43 | 62.5 M / 3.78 B / 1.68 | 62.5 M / 3.84 B / 1.65 | 47.5 M / 3.89 B / 1.24 | 47.3 M / 3.98 B / 1.20 | 47.3 M / 4.07 B / 1.17 | 47.3 M / 4.17 B / 1.15 | 47.3 M / 4.31 B / 1.11 | 47.3 M / 4.55 B / 1.05 | 47.4 M / 4.78 B / 1.00 | 47.3 M / 5.26 B / 0.91 |
| B_tail_F0.75 | year 13.0 | 31.7 | 961.1 M / 961.1 M / nan | 999.3 M / 1.96 B / 103.97 | 249.8 M / 3.21 B / 8.43 | 62.5 M / 3.78 B / 1.68 | 62.5 M / 3.84 B / 1.65 | 31.4 M / 3.87 B / 0.82 | 23.7 M / 3.92 B / 0.61 | 23.7 M / 3.97 B / 0.60 | 23.7 M / 4.02 B / 0.59 | 23.7 M / 4.09 B / 0.58 | 23.7 M / 4.21 B / 0.57 | 23.7 M / 4.33 B / 0.55 | 23.7 M / 4.56 B / 0.52 |
| B_tail_F0.2 | year 17.0 | 31.7 | 961.1 M / 961.1 M / nan | 999.3 M / 1.96 B / 103.97 | 249.8 M / 3.21 B / 8.43 | 62.5 M / 3.78 B / 1.68 | 62.5 M / 3.84 B / 1.65 | 31.4 M / 3.87 B / 0.82 | 15.6 M / 3.92 B / 0.40 | 7.8 M / 3.94 B / 0.20 | 6.3 M / 3.95 B / 0.16 | 6.3 M / 3.97 B / 0.16 | 6.3 M / 4.00 B / 0.16 | 6.3 M / 4.04 B / 0.16 | 6.3 M / 4.10 B / 0.15 |
| C_pct_0.5 | year 13.0 | 31.7 | 961.1 M / 961.1 M / nan | 999.3 M / 1.96 B / 103.97 | 249.8 M / 3.21 B / 8.43 | 62.5 M / 3.78 B / 1.68 | 62.5 M / 3.84 B / 1.65 | 31.4 M / 3.87 B / 0.82 | 19.5 M / 3.92 B / 0.50 | 19.7 M / 3.96 B / 0.50 | 19.9 M / 4.00 B / 0.50 | 20.2 M / 4.06 B / 0.50 | 20.7 M / 4.16 B / 0.50 | 21.3 M / 4.27 B / 0.50 | 22.4 M / 4.49 B / 0.50 |
| C_pct_1 | year 11.0 | 31.7 | 961.1 M / 961.1 M / nan | 999.3 M / 1.96 B / 103.97 | 249.8 M / 3.21 B / 8.43 | 62.5 M / 3.78 B / 1.68 | 62.5 M / 3.84 B / 1.65 | 38.7 M / 3.88 B / 1.01 | 39.3 M / 3.95 B / 1.00 | 40.1 M / 4.03 B / 1.00 | 40.9 M / 4.12 B / 1.00 | 42.2 M / 4.24 B / 1.00 | 44.3 M / 4.46 B / 1.00 | 46.7 M / 4.69 B / 1.01 | 51.5 M / 5.18 B / 1.00 |
| C_pct_2 | year 9.0 | 31.7 | 961.1 M / 961.1 M / nan | 999.3 M / 1.96 B / 103.97 | 249.8 M / 3.21 B / 8.43 | 74.9 M / 3.79 B / 2.02 | 76.5 M / 3.86 B / 2.02 | 78.2 M / 3.94 B / 2.02 | 81.2 M / 4.10 B / 2.02 | 84.5 M / 4.27 B / 2.02 | 88.0 M / 4.44 B / 2.02 | 93.4 M / 4.72 B / 2.02 | 103.2 M / 5.22 B / 2.02 | 114.4 M / 5.76 B / 2.02 | 139.3 M / 7.04 B / 2.02 |
| D_4y_halving | none | 15.8 | 480.6 M / 480.6 M / nan | 499.7 M / 980.2 M / 103.97 | 249.8 M / 2.23 B / 12.61 | 124.9 M / 3.11 B / 4.19 | 124.9 M / 3.23 B / 4.02 | 125.3 M / 3.36 B / 3.88 | 62.5 M / 3.54 B / 1.79 | 62.5 M / 3.67 B / 1.73 | 31.2 M / 3.76 B / 0.84 | 31.2 M / 3.86 B / 0.82 | 7.8 M / 3.93 B / 0.20 | 3.9 M / 3.96 B / 0.10 | 975,894 / 3.98 B / 0.02 |
| E_thermostat | year 11.0 | 31.7 | 961.1 M / 961.1 M / nan | 999.3 M / 1.96 B / 103.97 | 249.8 M / 3.21 B / 8.43 | 62.5 M / 3.78 B / 1.68 | 62.5 M / 3.84 B / 1.65 | 50.1 M / 3.89 B / 1.31 | 54.8 M / 4.00 B / 1.39 | 55.6 M / 4.11 B / 1.37 | 56.0 M / 4.22 B / 1.35 | 56.6 M / 4.39 B / 1.30 | 57.3 M / 4.68 B / 1.24 | 58.2 M / 4.97 B / 1.19 | 59.4 M / 5.55 B / 1.08 |
| I_hybrid | year 11.0 | 31.7 | 961.1 M / 961.1 M / nan | 999.3 M / 1.96 B / 103.97 | 249.8 M / 3.21 B / 8.43 | 62.5 M / 3.78 B / 1.68 | 62.5 M / 3.84 B / 1.65 | 50.1 M / 3.89 B / 1.31 | 54.8 M / 4.00 B / 1.39 | 55.6 M / 4.11 B / 1.37 | 56.0 M / 4.22 B / 1.35 | 56.6 M / 4.39 B / 1.30 | 57.3 M / 4.68 B / 1.24 | 58.2 M / 4.97 B / 1.19 | 59.4 M / 5.55 B / 1.08 |
| J_presence_tail_1pct | year 11.0 | 31.7 | 961.1 M / 961.1 M / nan | 999.3 M / 1.96 B / 103.97 | 249.8 M / 3.21 B / 8.43 | 62.5 M / 3.78 B / 1.68 | 62.5 M / 3.84 B / 1.65 | 38.7 M / 3.88 B / 1.01 | 39.3 M / 3.95 B / 1.00 | 40.1 M / 4.03 B / 1.00 | 40.9 M / 4.12 B / 1.00 | 42.2 M / 4.24 B / 1.00 | 44.3 M / 4.46 B / 1.00 | 46.7 M / 4.69 B / 1.01 | 51.5 M / 5.18 B / 1.00 |
| S1_round100_smooth2y_ramp90_tail1 | year 11.4 | 100.0 | 2.36 B / 2.36 B / nan | 1.91 B / 4.27 B / 81.03 | 676.4 M / 7.26 B / 10.27 | 169.1 M / 8.48 B / 2.03 | 119.6 M / 8.60 B / 1.41 | 89.2 M / 8.69 B / 1.04 | 87.8 M / 8.87 B / 1.00 | 89.6 M / 9.05 B / 1.00 | 91.4 M / 9.23 B / 1.00 | 94.1 M / 9.51 B / 1.00 | 98.9 M / 9.99 B / 1.00 | 104.0 M / 10.50 B / 1.00 | 114.9 M / 11.60 B / 1.00 |
| S2_4B_smooth2y_ramp30_tail1 | year 11.3 | 43.9 | 1.14 B / 1.14 B / nan | 840.6 M / 1.98 B / 74.03 | 297.1 M / 3.29 B / 9.93 | 74.3 M / 3.83 B / 1.98 | 52.5 M / 3.88 B / 1.37 | 40.0 M / 3.92 B / 1.03 | 39.8 M / 4.00 B / 1.00 | 40.6 M / 4.08 B / 1.00 | 41.4 M / 4.16 B / 1.00 | 42.6 M / 4.29 B / 1.00 | 44.8 M / 4.51 B / 1.00 | 47.3 M / 4.74 B / 1.01 | 52.1 M / 5.24 B / 1.00 |
| S3_round400_smooth2y_ramp90_tail1 | year 11.4 | 400.0 | 9.43 B / 9.43 B / nan | 7.65 B / 17.08 B / 81.19 | 2.71 B / 29.04 B / 10.27 | 676.3 M / 33.94 B / 2.03 | 478.4 M / 34.42 B / 1.41 | 358.4 M / 34.78 B / 1.04 | 352.8 M / 35.48 B / 1.00 | 359.9 M / 36.20 B / 1.00 | 367.2 M / 36.93 B / 1.00 | 378.3 M / 38.05 B / 1.00 | 397.7 M / 40.00 B / 1.00 | 419.3 M / 42.05 B / 1.01 | 462.1 M / 46.48 B / 1.00 |
Launch schedules: curve sum without the tail (base x half-life / ln 2) and the ramp's withheld coins:
| schedule | launch IGN/s | curve sum IGN | ramp withholds IGN | first-year emission | share of curve sum | years 1+2 share | supply at tail switch | tail IGN/yr at switch |
|---|---|---|---|---|---|---|---|---|
| S1_round100_smooth2y_ramp90_tail1 | 100.0 | 9.11 B | 349.9 M | 2.36 B | 25.9% | 46.9% | 8.64 B | 86.4 M |
| S2_4B_smooth2y_ramp30_tail1 | 43.9 | 4.00 B | 51.2 M | 1.14 B | 28.4% | 49.4% | 3.89 B | 38.9 M |
| S3_round400_smooth2y_ramp90_tail1 | 400.0 | 36.42 B | 1.40 B | 9.43 B | 25.9% | 46.9% | 34.57 B | 345.7 M |
## 2. Security budget a day, the 24-h 51% rental against it, and the 20-day veto, by price path
### Price path flat_0.01 (per coin: S1 to S3 are not comparable with A on this path)
| candidate | y1: budget / 24h vs owned / veto net | y5: budget / 24h vs owned / veto net | y11: budget / 24h vs owned / veto net | y15: budget / 24h vs owned / veto net | y20: budget / 24h vs owned / veto net | y30: budget / 24h vs owned / veto net | y40: budget / 24h vs owned / veto net |
|---|---|---|---|---|---|---|---|
| A_current | 21,093 / 248,755 / 4.8 M | 5,476 / 64,576 / 1.2 M | 684 / 8,072 / 154,458 | 171 / 2,018 / 38,614 | 43 / 504 / 9,654 | 1 / 16 / 302 | 0 / 0 / 9 |
| B_tail_F1.5 | 21,051 / 248,260 / 4.8 M | 5,472 / 64,531 / 1.2 M | 1,040 / 12,263 / 234,652 | 1,036 / 12,219 / 233,807 | 1,036 / 12,219 / 233,807 | 1,039 / 12,252 / 234,447 | 1,036 / 12,219 / 233,807 |
| B_tail_F0.75 | 21,051 / 248,260 / 4.8 M | 5,472 / 64,531 / 1.2 M | 688 / 8,111 / 155,198 | 518 / 6,109 / 116,903 | 518 / 6,109 / 116,903 | 519 / 6,126 / 117,224 | 518 / 6,109 / 116,903 |
| B_tail_F0.2 | 21,051 / 248,260 / 4.8 M | 5,472 / 64,531 / 1.2 M | 688 / 8,111 / 155,198 | 171 / 2,017 / 38,588 | 138 / 1,629 / 31,174 | 139 / 1,634 / 31,260 | 138 / 1,629 / 31,174 |
| C_pct_0.5 | 21,051 / 248,260 / 4.8 M | 5,472 / 64,531 / 1.2 M | 688 / 8,111 / 155,198 | 432 / 5,097 / 97,532 | 443 / 5,226 / 100,001 | 467 / 5,509 / 105,416 | 490 / 5,776 / 110,518 |
| C_pct_1 | 21,051 / 248,260 / 4.8 M | 5,472 / 64,531 / 1.2 M | 848 / 10,000 / 191,350 | 879 / 10,362 / 198,278 | 924 / 10,893 / 208,443 | 1,024 / 12,072 / 230,996 | 1,128 / 13,305 / 254,592 |
| C_pct_2 | 21,051 / 248,260 / 4.8 M | 5,472 / 64,531 / 1.2 M | 1,713 / 20,204 / 386,609 | 1,851 / 21,828 / 417,675 | 2,046 / 24,123 / 461,594 | 2,505 / 29,544 / 565,334 | 3,052 / 35,987 / 688,610 |
| D_4y_halving | 10,526 / 124,130 / 2.4 M | 5,472 / 64,531 / 1.2 M | 2,743 / 32,354 / 619,099 | 1,368 / 16,133 / 308,704 | 684 / 8,066 / 154,352 | 86 / 1,011 / 19,347 | 21 / 252 / 4,823 |
| E_thermostat | 21,051 / 248,260 / 4.8 M | 5,472 / 64,531 / 1.2 M | 1,098 / 12,945 / 247,709 | 1,218 / 14,368 / 274,924 | 1,239 / 14,609 / 279,544 | 1,275 / 15,036 / 287,722 | 1,300 / 15,331 / 293,357 |
| I_hybrid | 21,051 / 248,260 / 4.8 M | 5,472 / 64,531 / 1.2 M | 1,098 / 12,945 / 247,709 | 1,218 / 14,368 / 274,924 | 1,239 / 14,609 / 279,544 | 1,275 / 15,036 / 287,722 | 1,300 / 15,331 / 293,357 |
| J_presence_tail_1pct | 21,051 / 248,260 / 4.8 M | 5,472 / 64,531 / 1.2 M | 848 / 10,000 / 191,350 | 879 / 10,362 / 198,278 | 924 / 10,893 / 208,443 | 1,024 / 12,072 / 230,996 | 1,128 / 13,305 / 254,592 |
| S1_round100_smooth2y_ramp90_tail1 | 51,715 / 609,884 / 11.7 M | 14,815 / 174,720 / 3.3 M | 1,955 / 23,050 / 441,062 | 1,962 / 23,137 / 442,720 | 2,062 / 24,317 / 465,304 | 2,278 / 26,861 / 513,985 | 2,516 / 29,671 / 567,759 |
| S2_4B_smooth2y_ramp30_tail1 | 24,869 / 293,282 / 5.6 M | 6,507 / 76,739 / 1.5 M | 876 / 10,326 / 197,582 | 889 / 10,479 / 200,511 | 934 / 11,016 / 210,789 | 1,035 / 12,208 / 233,596 | 1,141 / 13,455 / 257,458 |
| S3_round400_smooth2y_ramp90_tail1 | 206,480 / 2.4 M / 46.6 M | 59,251 / 698,759 / 13.4 M | 7,850 / 92,574 / 1.8 M | 7,883 / 92,963 / 1.8 M | 8,287 / 97,729 / 1.9 M | 9,184 / 108,303 / 2.1 M | 10,122 / 119,366 / 2.3 M |
### Price path flat_0.10 (per coin: S1 to S3 are not comparable with A on this path)
| candidate | y1: budget / 24h vs owned / veto net | y5: budget / 24h vs owned / veto net | y11: budget / 24h vs owned / veto net | y15: budget / 24h vs owned / veto net | y20: budget / 24h vs owned / veto net | y30: budget / 24h vs owned / veto net | y40: budget / 24h vs owned / veto net |
|---|---|---|---|---|---|---|---|
| A_current | 210,933 / 2.5 M / 47.6 M | 54,757 / 645,756 / 12.4 M | 6,845 / 80,720 / 1.5 M | 1,711 / 20,180 / 386,144 | 428 / 5,045 / 96,536 | 13 / 158 / 3,017 | 0 / 5 / 94 |
| B_tail_F1.5 | 210,513 / 2.5 M / 47.5 M | 54,720 / 645,314 / 12.3 M | 10,398 / 122,629 / 2.3 M | 10,361 / 122,187 / 2.3 M | 10,361 / 122,187 / 2.3 M | 10,389 / 122,522 / 2.3 M | 10,361 / 122,187 / 2.3 M |
| B_tail_F0.75 | 210,513 / 2.5 M / 47.5 M | 54,720 / 645,314 / 12.3 M | 6,877 / 81,106 / 1.6 M | 5,180 / 61,094 / 1.2 M | 5,180 / 61,094 / 1.2 M | 5,195 / 61,261 / 1.2 M | 5,180 / 61,094 / 1.2 M |
| B_tail_F0.2 | 210,513 / 2.5 M / 47.5 M | 54,720 / 645,314 / 12.3 M | 6,877 / 81,106 / 1.6 M | 1,710 / 20,166 / 385,879 | 1,381 / 16,292 / 311,742 | 1,385 / 16,336 / 312,596 | 1,381 / 16,292 / 311,742 |
| C_pct_0.5 | 210,513 / 2.5 M / 47.5 M | 54,720 / 645,314 / 12.3 M | 6,877 / 81,106 / 1.6 M | 4,322 / 50,970 / 975,321 | 4,431 / 52,260 / 1.0 M | 4,671 / 55,090 / 1.1 M | 4,897 / 57,757 / 1.1 M |
| C_pct_1 | 210,513 / 2.5 M / 47.5 M | 54,720 / 645,314 / 12.3 M | 8,479 / 99,999 / 1.9 M | 8,787 / 103,620 / 2.0 M | 9,237 / 108,932 / 2.1 M | 10,236 / 120,718 / 2.3 M | 11,282 / 133,050 / 2.5 M |
| C_pct_2 | 210,513 / 2.5 M / 47.5 M | 54,720 / 645,314 / 12.3 M | 17,132 / 202,042 / 3.9 M | 18,509 / 218,277 / 4.2 M | 20,455 / 241,229 / 4.6 M | 25,052 / 295,444 / 5.7 M | 30,515 / 359,868 / 6.9 M |
| D_4y_halving | 105,256 / 1.2 M / 23.8 M | 54,720 / 645,314 / 12.3 M | 27,435 / 323,541 / 6.2 M | 13,680 / 161,329 / 3.1 M | 6,840 / 80,664 / 1.5 M | 857 / 10,111 / 193,468 | 214 / 2,521 / 48,235 |
| E_thermostat | 210,513 / 2.5 M / 47.5 M | 54,720 / 645,314 / 12.3 M | 10,977 / 129,453 / 2.5 M | 12,183 / 143,675 / 2.7 M | 12,388 / 146,090 / 2.8 M | 12,750 / 150,364 / 2.9 M | 13,000 / 153,308 / 2.9 M |
| I_hybrid | 210,513 / 2.5 M / 47.5 M | 54,720 / 645,314 / 12.3 M | 10,977 / 129,453 / 2.5 M | 12,183 / 143,675 / 2.7 M | 12,388 / 146,090 / 2.8 M | 12,750 / 150,364 / 2.9 M | 13,000 / 153,308 / 2.9 M |
| J_presence_tail_1pct | 210,513 / 2.5 M / 47.5 M | 54,720 / 645,314 / 12.3 M | 8,479 / 99,999 / 1.9 M | 8,787 / 103,620 / 2.0 M | 9,237 / 108,932 / 2.1 M | 10,236 / 120,718 / 2.3 M | 11,282 / 133,050 / 2.5 M |
| S1_round100_smooth2y_ramp90_tail1 | 517,152 / 6.1 M / 116.7 M | 148,154 / 1.7 M / 33.4 M | 19,545 / 230,499 / 4.4 M | 19,619 / 231,366 / 4.4 M | 20,619 / 243,168 / 4.7 M | 22,777 / 268,608 / 5.1 M | 25,160 / 296,711 / 5.7 M |
| S2_4B_smooth2y_ramp30_tail1 | 248,689 / 2.9 M / 56.1 M | 65,071 / 767,394 / 14.7 M | 8,756 / 103,257 / 2.0 M | 8,885 / 104,787 / 2.0 M | 9,341 / 110,159 / 2.1 M | 10,352 / 122,077 / 2.3 M | 11,409 / 134,548 / 2.6 M |
| S3_round400_smooth2y_ramp90_tail1 | 2.1 M / 24.4 M / 465.9 M | 592,514 / 7.0 M / 133.7 M | 78,499 / 925,743 / 17.7 M | 78,828 / 929,630 / 17.8 M | 82,869 / 977,286 / 18.7 M | 91,835 / 1.1 M / 20.7 M | 101,216 / 1.2 M / 22.8 M |
### Price path flat_1.00 (per coin: S1 to S3 are not comparable with A on this path)
| candidate | y1: budget / 24h vs owned / veto net | y5: budget / 24h vs owned / veto net | y11: budget / 24h vs owned / veto net | y15: budget / 24h vs owned / veto net | y20: budget / 24h vs owned / veto net | y30: budget / 24h vs owned / veto net | y40: budget / 24h vs owned / veto net |
|---|---|---|---|---|---|---|---|
| A_current | 2.1 M / 24.9 M / 476.0 M | 547,570 / 6.5 M / 123.6 M | 68,446 / 807,195 / 15.4 M | 17,112 / 201,799 / 3.9 M | 4,278 / 50,450 / 965,359 | 134 / 1,577 / 30,167 | 4 / 49 / 943 |
| B_tail_F1.5 | 2.1 M / 24.8 M / 475.0 M | 547,195 / 6.5 M / 123.5 M | 103,984 / 1.2 M / 23.5 M | 103,609 / 1.2 M / 23.4 M | 103,609 / 1.2 M / 23.4 M | 103,893 / 1.2 M / 23.4 M | 103,609 / 1.2 M / 23.4 M |
| B_tail_F0.75 | 2.1 M / 24.8 M / 475.0 M | 547,195 / 6.5 M / 123.5 M | 68,774 / 811,063 / 15.5 M | 51,805 / 610,937 / 11.7 M | 51,805 / 610,937 / 11.7 M | 51,946 / 612,611 / 11.7 M | 51,805 / 610,937 / 11.7 M |
| B_tail_F0.2 | 2.1 M / 24.8 M / 475.0 M | 547,195 / 6.5 M / 123.5 M | 68,774 / 811,063 / 15.5 M | 17,100 / 201,661 / 3.9 M | 13,815 / 162,917 / 3.1 M | 13,852 / 163,363 / 3.1 M | 13,815 / 162,917 / 3.1 M |
| C_pct_0.5 | 2.1 M / 24.8 M / 475.0 M | 547,195 / 6.5 M / 123.5 M | 68,774 / 811,063 / 15.5 M | 43,220 / 509,703 / 9.8 M | 44,314 / 522,604 / 10.0 M | 46,714 / 550,904 / 10.5 M | 48,975 / 577,566 / 11.1 M |
| C_pct_1 | 2.1 M / 24.8 M / 475.0 M | 547,195 / 6.5 M / 123.5 M | 84,795 / 999,994 / 19.1 M | 87,865 / 1.0 M / 19.8 M | 92,369 / 1.1 M / 20.8 M | 102,363 / 1.2 M / 23.1 M | 112,820 / 1.3 M / 25.5 M |
| C_pct_2 | 2.1 M / 24.8 M / 475.0 M | 547,195 / 6.5 M / 123.5 M | 171,322 / 2.0 M / 38.7 M | 185,088 / 2.2 M / 41.8 M | 204,551 / 2.4 M / 46.2 M | 250,522 / 3.0 M / 56.5 M | 305,151 / 3.6 M / 68.9 M |
| D_4y_halving | 1.1 M / 12.4 M / 237.5 M | 547,195 / 6.5 M / 123.5 M | 274,347 / 3.2 M / 61.9 M | 136,799 / 1.6 M / 30.9 M | 68,399 / 806,643 / 15.4 M | 8,573 / 101,107 / 1.9 M | 2,137 / 25,208 / 482,349 |
| E_thermostat | 2.1 M / 24.8 M / 475.0 M | 547,195 / 6.5 M / 123.5 M | 109,770 / 1.3 M / 24.8 M | 121,830 / 1.4 M / 27.5 M | 123,877 / 1.5 M / 28.0 M | 127,501 / 1.5 M / 28.8 M | 129,998 / 1.5 M / 29.3 M |
| I_hybrid | 2.1 M / 24.8 M / 475.0 M | 547,195 / 6.5 M / 123.5 M | 109,770 / 1.3 M / 24.8 M | 121,830 / 1.4 M / 27.5 M | 123,877 / 1.5 M / 28.0 M | 127,501 / 1.5 M / 28.8 M | 129,998 / 1.5 M / 29.3 M |
| J_presence_tail_1pct | 2.1 M / 24.8 M / 475.0 M | 547,195 / 6.5 M / 123.5 M | 84,795 / 999,994 / 19.1 M | 87,865 / 1.0 M / 19.8 M | 92,369 / 1.1 M / 20.8 M | 102,363 / 1.2 M / 23.1 M | 112,820 / 1.3 M / 25.5 M |
| S1_round100_smooth2y_ramp90_tail1 | 5.2 M / 61.0 M / 1.17 B | 1.5 M / 17.5 M / 334.3 M | 195,452 / 2.3 M / 44.1 M | 196,187 / 2.3 M / 44.3 M | 206,195 / 2.4 M / 46.5 M | 227,767 / 2.7 M / 51.4 M | 251,597 / 3.0 M / 56.8 M |
| S2_4B_smooth2y_ramp30_tail1 | 2.5 M / 29.3 M / 561.2 M | 650,714 / 7.7 M / 146.8 M | 87,557 / 1.0 M / 19.8 M | 88,854 / 1.0 M / 20.1 M | 93,409 / 1.1 M / 21.1 M | 103,516 / 1.2 M / 23.4 M | 114,090 / 1.3 M / 25.7 M |
| S3_round400_smooth2y_ramp90_tail1 | 20.6 M / 243.5 M / 4.66 B | 5.9 M / 69.9 M / 1.34 B | 784,986 / 9.3 M / 177.1 M | 788,282 / 9.3 M / 177.9 M | 828,692 / 9.8 M / 187.0 M | 918,354 / 10.8 M / 207.2 M | 1.0 M / 11.9 M / 228.4 M |
### Price path mcap_path (the only path comparable across S1 to S3: a fixed market cap, price = cap / supply)
| candidate | y1: budget / 24h vs owned / veto net | y5: budget / 24h vs owned / veto net | y11: budget / 24h vs owned / veto net | y15: budget / 24h vs owned / veto net | y20: budget / 24h vs owned / veto net | y30: budget / 24h vs owned / veto net | y40: budget / 24h vs owned / veto net |
|---|---|---|---|---|---|---|---|
| A_current | 43,806 / 516,605 / 9.9 M | 9,735 / 114,804 / 2.2 M | 4,877 / 57,519 / 1.1 M | 3,420 / 40,337 / 771,851 | 2,161 / 25,485 / 487,662 | 67 / 796 / 15,225 | 2 / 25 / 476 |
| B_tail_F1.5 | 43,806 / 516,605 / 9.9 M | 9,730 / 114,751 / 2.2 M | 7,380 / 87,028 / 1.7 M | 20,025 / 236,156 / 4.5 M | 48,067 / 566,857 / 10.8 M | 43,429 / 512,165 / 9.8 M | 39,412 / 464,787 / 8.9 M |
| B_tail_F0.75 | 43,806 / 516,605 / 9.9 M | 9,730 / 114,751 / 2.2 M | 4,901 / 57,799 / 1.1 M | 10,273 / 121,146 / 2.3 M | 25,335 / 298,779 / 5.7 M | 24,014 / 283,205 / 5.4 M | 22,707 / 267,784 / 5.1 M |
| B_tail_F0.2 | 43,806 / 516,605 / 9.9 M | 9,730 / 114,751 / 2.2 M | 4,901 / 57,799 / 1.1 M | 3,418 / 40,313 / 771,385 | 6,955 / 82,026 / 1.6 M | 6,865 / 80,964 / 1.5 M | 6,741 / 79,499 / 1.5 M |
| C_pct_0.5 | 43,806 / 516,605 / 9.9 M | 9,730 / 114,751 / 2.2 M | 4,901 / 57,799 / 1.1 M | 8,597 / 101,380 / 1.9 M | 21,833 / 257,480 / 4.9 M | 21,893 / 258,184 / 4.9 M | 21,833 / 257,480 / 4.9 M |
| C_pct_1 | 43,806 / 516,605 / 9.9 M | 9,730 / 114,751 / 2.2 M | 6,031 / 71,129 / 1.4 M | 17,150 / 202,253 / 3.9 M | 43,557 / 513,673 / 9.8 M | 43,676 / 515,074 / 9.9 M | 43,557 / 513,673 / 9.8 M |
| C_pct_2 | 43,806 / 516,605 / 9.9 M | 9,730 / 114,751 / 2.2 M | 11,982 / 141,305 / 2.7 M | 34,129 / 402,489 / 7.7 M | 86,680 / 1.0 M / 19.6 M | 86,915 / 1.0 M / 19.6 M | 86,680 / 1.0 M / 19.6 M |
| D_4y_halving | 43,806 / 516,605 / 9.9 M | 14,012 / 165,245 / 3.2 M | 22,539 / 265,811 / 5.1 M | 29,365 / 346,311 / 6.6 M | 35,478 / 418,394 / 8.0 M | 4,333 / 51,097 / 977,737 | 1,075 / 12,677 / 242,570 |
| E_thermostat | 43,806 / 516,605 / 9.9 M | 9,730 / 114,751 / 2.2 M | 7,785 / 91,808 / 1.8 M | 23,341 / 275,258 / 5.3 M | 56,415 / 665,303 / 12.7 M | 51,348 / 605,558 / 11.6 M | 46,810 / 552,038 / 10.6 M |
| I_hybrid | 43,806 / 516,605 / 9.9 M | 9,730 / 114,751 / 2.2 M | 7,785 / 91,808 / 1.8 M | 23,341 / 275,258 / 5.3 M | 56,415 / 665,303 / 12.7 M | 51,348 / 605,558 / 11.6 M | 46,810 / 552,038 / 10.6 M |
| J_presence_tail_1pct | 43,806 / 516,605 / 9.9 M | 9,730 / 114,751 / 2.2 M | 6,031 / 71,129 / 1.4 M | 17,150 / 202,253 / 3.9 M | 43,557 / 513,673 / 9.8 M | 43,676 / 515,074 / 9.9 M | 43,557 / 513,673 / 9.8 M |
| S1_round100_smooth2y_ramp90_tail1 | 43,806 / 516,605 / 9.9 M | 11,657 / 137,467 / 2.6 M | 6,199 / 73,101 / 1.4 M | 17,077 / 201,393 / 3.9 M | 43,372 / 511,490 / 9.8 M | 43,372 / 511,490 / 9.8 M | 43,372 / 511,490 / 9.8 M |
| S2_4B_smooth2y_ramp30_tail1 | 43,806 / 516,605 / 9.9 M | 11,301 / 133,277 / 2.6 M | 6,158 / 72,628 / 1.4 M | 17,150 / 202,253 / 3.9 M | 43,557 / 513,673 / 9.8 M | 43,676 / 515,074 / 9.9 M | 43,557 / 513,673 / 9.8 M |
| S3_round400_smooth2y_ramp90_tail1 | 43,806 / 516,605 / 9.9 M | 11,656 / 137,461 / 2.6 M | 6,224 / 73,396 / 1.4 M | 17,150 / 202,253 / 3.9 M | 43,557 / 513,673 / 9.8 M | 43,676 / 515,074 / 9.9 M | 43,557 / 513,673 / 9.8 M |
The ratios are constants of the hardware market, not of the schedule: a 24-h 51% rental against an owned honest fleet costs 11.8 x the day's budget; against a rented honest fleet 1.04 x; the 20-day veto nets 226 x the day's budget. A 10x or 100x efficiency gain multiplies the hash on both sides and leaves every dollar figure unchanged.
## 3. The thermostat (E) and the hybrid (I) under shocks, flat USD 0.10
| run | tail from | tail rate % y14 / y15 / y16 / y17 / y20 / y25 | budget USD/day y14 / y16 / y20 / y25 | hash GH/s y14 / y16 / y20 |
|---|---|---|---|---|
| E_thermostat | year 11.0 | 1.37 / 1.36 / 1.34 / 1.33 / 1.29 / 1.23 | 12,249 / 12,251 / 12,388 / 12,558 | 490.3 / 494.3 / 500.6 |
| E_crash50_y15 | year 11.0 | 1.37 / 2.21 / 2.11 / 2.06 / 1.98 / 1.85 | 12,249 / 10,025 / 9,888 / 10,168 | 490.3 / 392.5 / 400.4 |
| E_eff10x_y15 | year 11.0 | 1.37 / 0.37 / 0.64 / 0.59 / 0.62 / 0.61 | 12,249 / 5,047 / 5,728 / 5,758 | 490.3 / 2341.7 / 2323.4 |
| E_cartel34_y20 | year 11.0 | 1.37 / 1.36 / 1.34 / 1.33 / 1.28 / 1.23 | 12,249 / 12,251 / 13,316 / 12,546 | 490.3 / 494.3 / 497.9 |
| E_cartel34_y20_presence | year 11.0 | 1.37 / 1.36 / 1.34 / 1.33 / 1.28 / 1.23 | 12,249 / 12,251 / 13,316 / 12,546 | 490.3 / 494.3 / 497.9 |
| I_hybrid | year 11.0 | 1.37 / 1.36 / 1.34 / 1.33 / 1.29 / 1.23 | 12,249 / 12,251 / 12,388 / 12,558 | 490.3 / 494.3 / 500.6 |
| I_crash50_y15 | year 11.0 | 1.37 / 2.21 / 2.11 / 2.06 / 1.98 / 1.85 | 12,249 / 10,025 / 9,888 / 10,168 | 490.3 / 392.5 / 400.4 |
| I_eff10x_y15 | year 11.0 | 1.37 / 1.00 / 1.00 / 1.00 / 1.00 / 1.00 | 12,249 / 9,018 / 9,386 / 9,867 | 490.3 / 3656.9 / 3806.2 |
| I_cartel34_y20 | year 11.0 | 1.37 / 1.36 / 1.34 / 1.33 / 1.28 / 1.23 | 12,249 / 12,251 / 13,316 / 12,546 | 490.3 / 494.3 / 497.9 |
| I_cartel34_y20_presence | year 11.0 | 1.37 / 1.36 / 1.34 / 1.33 / 1.28 / 1.23 | 12,249 / 12,251 / 13,316 / 12,546 | 490.3 / 494.3 / 497.9 |
- E_cartel34_y20: the 34% cartel forgoes 5.0 M IGN over its 90 withheld days and takes 719,045 IGN of extra emission after returning (gain / cost = 0.14).
- E_cartel34_y20_presence: the 34% cartel forgoes 5.0 M IGN over its 90 withheld days and takes 18,964 IGN of extra emission after returning (gain / cost = 0.00).
- I_cartel34_y20: the 34% cartel forgoes 5.0 M IGN over its 90 withheld days and takes 719,045 IGN of extra emission after returning (gain / cost = 0.14).
- I_cartel34_y20_presence: the 34% cartel forgoes 5.0 M IGN over its 90 withheld days and takes 18,964 IGN of extra emission after returning (gain / cost = 0.00).
## 4. Settled-value targeting (F): the inflation it demands
A 24-h 51% rental costs 11.8 budgets against owned hash and 1.04 against rented hash, so the floor emission is k x V / 11.8 (or / 1.04) a day, where V is the value settled that day in IGN (both sides in IGN, so no oracle). With velocity v (settled value a year / supply) the inflation the rule demands is k v / 11.8 a year, or k v / 1.04 against a rented fleet.
| k | velocity v (a year) | inflation demanded, owned honest fleet | rented honest fleet |
|---|---|---|---|
| 1 | 0.1 | 0.8% | 10% |
| 1 | 1.0 | 8.5% | 96% |
| 1 | 3.0 | 25.4% | 288% |
| 3 | 0.1 | 2.5% | 29% |
| 3 | 1.0 | 25.4% | 288% |
| 3 | 3.0 | 76.3% | 865% |
| 10 | 0.1 | 8.5% | 96% |
| 10 | 1.0 | 84.8% | 961% |
| 10 | 3.0 | 254.4% | 2882% |
## 5. Security sold as a product (H): a settlement fee to miners equal to the rollup proving fee, against the miners' subsidy, USD 0.02
| year | rollups | settlement fee to miners USD/day | all utility to miners+provers USD/day (lane 4) | subsidy to miners USD/day | fee / subsidy | utility / subsidy |
|---|---|---|---|---|---|---|
| 1 | 1 | 389 | 450 | 42,103 | 1% | 1% |
| 2 | 3 | 1,166 | 1,349 | 43,776 | 3% | 3% |
| 5 | 10 | 3,888 | 4,195 | 10,944 | 36% | 38% |
| 9 | 10 | 3,888 | 4,195 | 2,736 | 142% | 153% |
| 11 | 10 | 3,888 | 4,195 | 1,375 | 283% | 305% |
| 13 | 10 | 3,888 | 4,195 | 684 | 568% | 613% |
| 5 (high) | 50 | 19,440 | 20,058 | 10,944 | 178% | 183% |
## 6. What a solo card's first day pays (coins): one 100 MH/s card against a network of 100 GH/s and 1 TH/s, full ramp
| schedule | IGN per block (1 block/s) | IGN a day at 100 GH/s | at 1 TH/s | at 100 GH/s on launch day (ramp 10%) |
|---|---|---|---|---|
| A_current | 31.7 | 2190 | 219 | 219.0 |
| S1_round100_smooth2y_ramp90_tail1 | 100.0 | 6912 | 691 | 691.2 |
| S2_4B_smooth2y_ramp30_tail1 | 43.9 | 3036 | 304 | 303.6 |
| S3_round400_smooth2y_ramp90_tail1 | 400.0 | 27648 | 2765 | 2764.8 |
## 7. Holder dilution a year under a percentage tail
| tail p a year | holder's share lost a year | over 10 years | over 40 years | 24-h 51% attack as % of market cap (owned honest fleet) |
|---|---|---|---|---|
| 0.5% | 0.498% | 4.9% | 18.1% | 0.0161% |
| 1.0% | 0.990% | 9.5% | 32.8% | 0.0323% |
| 2.0% | 1.961% | 18.0% | 54.7% | 0.0646% |
| 3.0% | 2.913% | 25.6% | 69.3% | 0.0969% |