
Monero.SupplyMathematical Proof Of The Circulating XMR Supply, Block By Block
byCR1337
Protocol Expected Supply - Full Base Rewards
A mathematical proof of circulating Monero - derived from the consensus emission formula, computed in exact integer arithmetic.
- Latest Mined Height
- -
- Era
- -
- Base Reward
- -
- Last Updated (UTC)
- -
Height source: loading…
Upper bound of issued subsidy from the consensus base-reward formula. Real issuance is at least 1,266.386450309046 XMR lower, because oversized blocks paid the block-size penalty - the bound is derived in step 6. Fees are not new coins.
Derivation
Seven Steps From Genesis To Today's Number, 01 To 07
Every figure below is protocol expected supply (full base rewards), computed with 64-bit integer arithmetic exactly as the consensus code does it. Monero had no premine, no ICO, no founder allocation and no locked treasury.
- 01
Step 01
Units
Monero amounts are uint64 atomic units; 1 XMR = 10^12 piconero.

Fig. 01 COIN = 1000000000000 MONEY_SUPPLY = 2^64 - 1 = 18446744073709551615
1 XMR1,000,000,000,000 atomicMONEY_SUPPLY / 10^1218,446,744.073709551615 XMR18,446,744.073709551615 XMR is simply MONEY_SUPPLY divided by 10^12 - an implementation bound inside the emission formula, NOT a maximum circulating supply. Tail emission means supply grows forever, and this figure is never reached.
- 02
Step 02
Genesis, No Premine
The first issuance is an ordinary miner reward at height 0.

Fig. 02 baseReward(0, height 0) = (2^64 - 1) >> 20 = 17592186044415
Genesis date2014-04-18Genesis block hash418015bb9ae982a1975da7d79277c2705727a56894ba0fb246adaabb1f4632e3Genesis reward17.592186044415 XMRThere is no allocation branch in the code. The chain starts at zero already-generated coins and mints only through coinbase transactions.
- 03
Step 03
Smooth Emission
Each block mints a fixed fraction of what is left of the 64-bit ceiling.

Fig. 03 baseReward = (MONEY_SUPPLY - alreadyGenerated) >> emissionSpeedFactor emissionSpeedFactor = 20 (1-minute era) emissionSpeedFactor = 19 (2-minute era)
Shift by kfloor-divide by 2^kHeight 1,000 reward17.575416817881 XMRHeight 1,000,000 reward6.778664170600 XMRBecause the remaining amount shrinks every block, the reward decays smoothly instead of stepping down in halvings. There is no halving schedule in Monero.
- 04
Step 04
The 2016 Block-Time Change
At height 1,009,827 the target went from 60s to 120s and the per-block reward roughly doubled.

Fig. 04 height < 1009827 -> target 60s, emissionSpeedFactor 20 height >= 1009827 -> target 120s, emissionSpeedFactor 19
Height 1,009,826 (last 1-min block)6.715439304825 XMRHeight 1,009,827 (first 2-min block)13.430865800966 XMRXMR per minutecontinuous across the forkHalving the block rate and doubling the per-block reward keeps emission per unit of time unchanged. The curve you see later is smooth in time even though the per-block series jumps.
- 05
Step 05
Tail Emission Floor
If the formula would pay less than 0.3 XMR per minute, the protocol pays exactly that floor.

Fig. 05 floor = FINAL_SUBSIDY_PER_MINUTE * targetMinutes = 300000000000 * 2 = 600000000000 (0.6 XMR per 2-minute block)Theoretical tail start (this engine)2,639,513Observed mainnet tail start2,641,623 · 2022-06-09T00:28:57ZDifference2,110 blocks laterThe two heights differ because block-size penalties made some historical rewards smaller than the base reward. alreadyGeneratedCoins therefore grew more slowly, (MONEY_SUPPLY − already) stayed larger, and the real chain reached the 0.6 XMR floor about 2,110 blocks later. This site uses 2,639,513 inside the math engine and 2,641,623 only when describing what the real chain did.
- 06
Step 06
Sum Every Block
Protocol expected supply is the running sum of base rewards from genesis through the latest mined block.

Fig. 06 protocolSupply(H) = sum over h = 0..H of baseReward(supply(h-1), h) After height 2639513: protocolSupply(H) = 18132171660159860661 + 600000000000 * (H - 2639512)
Supply through height 2,639,51218,132,171.660159860661 XMREach later block adds0.600000000000 XMR (base)So the curve becomesa straight lineThe sum is order-dependent - each reward depends on the running total - so the engine brute-forces every block up to the tail start and then switches to the exact O(1) closed form.
- 07
Step 07
What This Does Not Prove
The number is an upper bound on issued subsidy, not a byte-for-byte on-chain coinbase sum.

Fig. 07 protocolExpectedSupply - 1,266.386450309046 >= actualIssuedSubsidy because block 2641622 still paid above the floor: already(2641622) < MONEY_SUPPLY - 0.6e12 * 2^19
Lost coinsnot measurable, not deductedHidden RingCT outputsnot summed - ordinary amounts are privateTransaction feesnot new supplyPenalty shortfall (derived lower bound)≥ 1,266.386450309046 XMR overstated
Fig. 07b - Penalty Haircut The gap is bounded, not guessed: because the real chain only hit the 0.6 XMR floor at height 2,641,623, its alreadyGeneratedCoins must have been at least 1,266.386450309046 XMR below the full-base-reward model - and since both series then grow by exactly 0.6 XMR per block, that gap never shrinks. Transfer soundness - that no hidden inflation happens inside RingCT - rests on range proofs / Bulletproofs that every node verifies, not on this page. See getmonero.org/2020/01/17/auditability.html. Nothing here should be read as a claim beyond the arithmetic shown.
Interactive
Compute Protocol Expected Supply At Any Height
Protocol expected supply (full base rewards) at a height of your choice, with the era, base reward and implied annual inflation.
Date → height is derived from target block times only and is approximate; height → supply is exact integer arithmetic. Annual inflation is the next 262,980 blocks of base rewards divided by supply at that height.
Charts
The Emission Curve, Drawn From The Engine
Protocol expected supply (full base rewards), sampled every 2,000 blocks straight from the same BigInt engine that produces the hero number - not from hand-entered figures.
Summing every block from genesis to build the chart series…
Live Identity Card
Where The Chain Is Right Now
Protocol expected supply (full base rewards) alongside the live height reported by public no-key APIs.
Live Identity Plate
The reported coinbase reward can exceed the 0.6 XMR base reward because it includes transaction fees, and can fall below it when an oversized block pays the quadratic block-size penalty. Fees are recycled coins, not new issuance. The chain tip is read directly from the source - no ±1 block adjustment is applied.
Tail Emission
Why Monero Never Stops Paying Miners
Protocol expected supply (full base rewards) grows linearly forever, by design.
Why The Tail Exists
- The miner security budget must not fall to zero. A chain whose subsidy decays to nothing has to pay for proof of work entirely out of fees.
- Monero has a dynamic block size, so blocks are not a scarce fixed resource. A fee-only market on an elastic block size is an unreliable way to fund security.
- The tail pays a base reward of 0.6 XMR per 2-minute block - or less, when a block is oversized and pays the block-size penalty.
Source: Moneropedia, “Tail Emission” - getmonero.org/resources/moneropedia/tail-emission.html
Two Tail Heights
theoretical tail start = 2639513 observed mainnet start = 2641623 (2022-06-09T00:28:57Z)
Block-size penalties made some historical rewards smaller than the base reward, so alreadyGeneratedCoins grew more slowly, (MONEY_SUPPLY − already) stayed larger, and the 0.6 XMR floor was reached about 2,110 blocks later on the real chain.
Steady-state emission: 157,788 XMR per year (262,980 blocks × 0.6), or 157,680 XMR using the cruder 365-day approximation. That is a fixed number of coins per year, so inflation is a falling percentage of a growing supply.
Verify It Yourself
Do Not Trust This Page - Reproduce It
Protocol expected supply (full base rewards) is reproducible from a full node and from the official source code.
Sum The Real Coinbases Yourself
Coinbase amounts are public even though ordinary transaction amounts are hidden. A full node will add them up for you.
# in the monerod console
print_coinbase_tx_sum 0 <height>
# or over RPC
curl http://127.0.0.1:18081/json_rpc \
-d '{"jsonrpc":"2.0","id":"0","method":"get_coinbase_tx_sum",
"params":{"height":0,"count":<height>}}' \
-H 'Content-Type: application/json'The daemon result is the actual on-chain coinbase sum including fees paid to miners; it will not equal the protocol expected supply on this page exactly. Subtract fees and expect the issued total to be slightly below this page's upper bound.
Read The Code, Check Another Checker
- Consensus formula: monero/src/cryptonote_basic/cryptonote_basic_impl.cpp → get_block_reward()
- Constants: monero/src/cryptonote_config.h
- Independent checker: moneroinflation.com