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:
parent
27d7bfba50
commit
f66d210102
7 changed files with 3739 additions and 0 deletions
250
docs/analysis/tail-emission.md
Normal file
250
docs/analysis/tail-emission.md
Normal 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.
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
2561
sim/horizon/economy-and-utility/tail_emission.csv
Normal file
2561
sim/horizon/economy-and-utility/tail_emission.csv
Normal file
File diff suppressed because it is too large
Load diff
658
sim/horizon/economy-and-utility/tail_emission.py
Normal file
658
sim/horizon/economy-and-utility/tail_emission.py
Normal 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())
|
||||
81
sim/horizon/economy-and-utility/tail_emission_code.csv
Normal file
81
sim/horizon/economy-and-utility/tail_emission_code.csv
Normal 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
|
||||
|
179
sim/horizon/economy-and-utility/tail_emission_out.md
Normal file
179
sim/horizon/economy-and-utility/tail_emission_out.md
Normal 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% |
|
||||
|
||||
Loading…
Reference in a new issue