How we count
Every number on Burnwood comes from public Zcash chain data. This page shows exactly how each one is calculated, where the data comes from and what can make it imperfect.
What Burnwood measures
is the next network upgrade of Zcash. (a draft) defines what it deploys: 25-second blocks (ZIP 218), halving-preserving issuance from the NSM reserve (ZIP 237) and disallowing (ZIP 2003). Together they start the Network Sustainability Mechanism (). From the NU7 activation block on, 60% of each block's transaction fees don't go to the miner (ZIP 235, applied as modified by ZIP 259). They move into the , a balance held by the protocol that isn't part of the circulating supply.
The reserve comes back. Under ZIP 237 (also a draft), it's paid out again as extra block rewards, gradually: about half of the reserve in each period. On mainnet that starts around February 2031. Testnet has its own start block, so for testnet we give the block only, never a date.
The exact start height hasn't been assigned yet. Until it is, we use the height where ZIP 237's reissuance starts, as Zcash node software computes it:
- mainnet: block 16,026,474 − 2 × A
- testnet: block 16,235,274 − 2 × A
A is the NU7 . For the current mainnet activation height that's block . It's an estimate, and it will change if the proposals change.
ZIP 259 currently labels this height "February 2031" on both networks. For testnet that label is an error, and a correction has been proposed.
The reissuance start height on mainnet is block , set in ZIP 259.
When Burnwood says "removed from circulation", it means "set aside in the NSM reserve until reissuance starts". "Burnwood" and "burn meter" are shorthand for exactly that.
What burns today regrows in 2031.
Burnwood has three phases, chosen by chain data rather than the calendar: a countdown to NU7, a live view of the activation, and afterwards a meter of the ZEC set aside since NU7. Throughout, it also shows how much ZEC is (held in Zcash's private pools).
When NU7 isn't scheduled on the network (no activation height, or the height was withdrawn), Burnwood waits and says so. It never guesses a date.
Exact formulas
All amounts are integers in (1 ZEC = 100,000,000 zatoshi). No floating-point maths is used for money. Displayed ZEC values are truncated (never rounded up), so we never overstate.
Blocks remaining
blocks remaining = A − tip heightwhere A is the activation height reported by the network's nodes. The height is never hard-coded; if the network changes it, the countdown follows.
Estimated time of activation (ETA) and range
- Window: the last
W = min(576, available)blocks (576 blocks ≈ 12 hours at 75 s). Below 48 blocks there's no ETA. - Average interval:
t̄ = (time(tip) − time(tip − W)) ÷ W. Only the first and last timestamps matter, so one odd timestamp can't distort it. ETA = seen time of the tip + blocks remaining × t̄.- Range: the window is split into stretches of 48 blocks (about an hour each). Each stretch's average interval is computed the same way. The range uses the 10th and 90th percentile of those averages:
earliest = seen + remaining × P10,latest = seen + remaining × P90. - In plain words: "if blocks keep coming at the pace of the last 12 hours, NU7 arrives around here; the range shows how much that pace has varied hour to hour." We use hourly averages rather than single block times, because single intervals vary wildly (from seconds to several minutes) and would give a range several days wide.
- After activation there's no ETA.
Block interval
interval(h) = time(h) − time(h − 1)using the . Miner clocks are loose, so an can be zero or negative. We display at least 1 s and mark it "clock skew"; the raw value is in the block's details. We never use a single interval as a headline; headline block times are averages.
Time windows (last hour / 24 h / 7 days / 30 days): a window ends at the last checked block and covers the blocks since the chain's clock was that far behind it. The chain's clock is the latest block timestamp seen so far, because miners' clocks can be slightly out of order. So a window is always an unbroken run of blocks, and no block inside it is left out. Daily history uses the same clock: a block counts on the UTC day of the latest block timestamp seen so far, so each day is also an unbroken run of blocks.
Average block time (1 h / 24 h): the same telescoping average over the blocks in the last hour or 24 hours. Blocks in the last hour counts the blocks in that window; after NU7 the target is 144 (3,600 s ÷ 25 s).
Fees per block
- Primary: the block's total fees as reported by CipherScan.
- Second path (from a node): a cross-check before NU7, and a fallback when CipherScan is unavailable.
- before NU7:
fees = coinbase transparent outputs − (block subsidy − Lockbox share). The share is the only part of the that isn't paid out in the coinbase, and the miner claims every fee there, so this is exact and independent of CipherScan. - after NU7 (provisional, pending the specification text for the NU7 coinbase total): the miner receives only 40% of fees, so
fees = removed(h) + (coinbase transparent outputs − (block subsidy − Lockbox share)). It reusesremoved(h), so it isn't an independent check. We use it only to fill in a fee when CipherScan is unavailable. - Correction note: an early version of our spec used "coinbase outputs − subsidy" after NU7 as well. That would count only 40% of fees.
- When the coinbase has shielded outputs this path can't see the amounts, and it reports no value.
- before NU7:
- before NU7: CipherScan can't see Sprout JoinSplits (transactions that move ZEC in or out of the Sprout pool). For a block that contains them, the fee comes from the second path, and those transactions are left out of the median fee per transaction. From NU7 on, no transaction can carry a JoinSplit (ZIP 2003).
ZEC removed per block (from the NU7 activation block on). Three methods, all in zatoshi, used in this order:
- NSM reserve change (first):
removed(h) = reserve(h) − reserve(h − 1), reading the reserve balance directly from a node that reports it (CipherScan's node, ≥ 1.5.0) at two consecutive blocks. At block A the previous reading is the seed, so the seed is left out automatically. - Pool delta (second, when a reserve reading is missing):
removed(h) = block subsidy(h) − Σ change in every value pool at h, from our Zebra node. The subsidy and fees that didn't land in any pool went to the reserve. Valid until reissuance starts (the start block is under "What Burnwood measures"; ≈ 2031 on mainnet). - Fee share (the check):
removed(h) = floor(fees(h) × 6 ÷ 10). Rounded down once per block, in the miner's favour (ZIP 235, applied as modified by ZIP 259). Example: fees of 1,002 zatoshi → 601 zatoshi removed. It checks the other two. It only produces the headline when neither the reserve nor our Zebra node is available, or to split a gap of several blocks between two reserve readings, and then only if the parts add up exactly to the reserve change.
From NU7 until the next halving, the block subsidy is 0.52083333 ZEC: 0.41666668 to the miner (plus 40% of fees), 0.04166666 to and 0.06249999 to the Lockbox. The ZCG and Lockbox shares apply from NU7 until the current funding streams end.
ZEC removed since NU7
removed since NU7 = reserve(throughHeight) − seedwhich equals Σ removed(h) for every block from A up to the last checked block (throughHeight). Every time we read the reserve, we check that the two agree. If they don't, the headline stops at the last block where they did.
The is never counted. The reserve starts with a one-off amount: the block rewards and fees that miners left unclaimed before. It's placed in the reserve at NU7, so it isn't fee removal, and it's excluded. We don't hard-code it. ZIP 237 sets it as the reserve balance at block A−1, the block just before NU7, so we read it from the reserve at block A−1 and lock it once that block has 10 . If we couldn't read block A−1 (for example, because a source was down), we work out an implied seed, reserve − Σ removed after activation. It's shown as provisional and serves only as a check until a seed is locked. The "Method in use right now" box below shows the seed's exact value once it has been measured.
Rates: last 24 h / 7 days / 30 days = the sum of removed(h) for the blocks in that time window (see "Time windows" above). Average per block (24 h) = last 24 h ÷ number of blocks in that window, rounded down.
Shielded actions per block = spends + Sapling outputs + actions + actions + Sprout JoinSplits, counted over all the block's transactions, the coinbase included. Shown as "—" only when no source returned the transaction details for that block.
Fees (24 h) = sum of block fees in the window (shown as "—" if any block in it lacks a fee value). Median fee per transaction = the lower median of fees paid by non-coinbase transactions in the last 24 h whose fee is known exactly (see the Sprout note under "Fees per block").
Shielded share
shielded % = (Sprout + Sapling + Orchard + Ironwood) ÷ (Transparent + Sprout + Sapling + Orchard + Ironwood) × 100Sprout still counts as shielded after NU7: NU7 disables spending from it, but its funds stay in the pool and remain shielded. The Lockbox and the NSM reserve are shown separately and are excluded: neither is part of the circulating supply.
Ironwood share
Ironwood share = Ironwood ÷ (Ironwood + Orchard) × 100a gauge of the move from Orchard to Ironwood. Since , Orchard can only be spent from, not added to.
Progress ring: the share of the way from the previous upgrade's activation height (NU6.3, block 3,428,143) to A.
Activation: Burnwood only says "NU7 is live" when the tip is at or past A and the node reports that the chain tip follows NU7's consensus rules (branch id 77190ad9). The height alone is never enough.
Method in use right now
Which of the three methods produces the headline, and whether our checks agree, right now. Updated every minute.
Loading the live method…
What the methods mean, in the order we use them:
- NSM reserve: used first, whenever a node reports the reserve and the reserve check agrees. The headline is the reserve minus the seed. This includes CipherScan-only mode: if our Zebra node is down, the headline still comes from the reserve and is marked "Single source".
- Pool delta: used second, when the reserve isn't reported. Exact on its own.
- Fee share: a check on the other two. It produces the headline only when neither the reserve nor our Zebra node is available. Exact on its own.
When all three are available, they must agree to the zatoshi. If they don't, the headline stops at the last block they agreed on, and we investigate.
Data sources and cross-checks
- Primary: a hosted node (QuickNode, or Tatum as the alternative): the chain tip, blocks, value pools and block subsidy.
- Backup: CipherScan ( node, api.cipherscan.app), when configured: a second opinion on every block, plus block fees and the NSM reserve balance. Thank you, CipherScan.
- Standby: any other configured provider, ready in case a source can't follow NU7.
- The providers in use right now, and the role of each, are in the live box above (the "Sources" row) and in the "Chain data" line at the bottom of the page.
- ZecStats (mainnet only) cross-checks the shielded share and the Ironwood share. At most once a minute, we apply our own formulas to ZecStats' pool values and compare the result with ours at the same block; the live box above shows whether they agree. We publish only that result and our own figures, never ZecStats' numbers. ZecStats uses CipherScan's data, so we don't count it as an independent source, and it never changes our numbers. Attribution wherever ZecStats is cited: Data: ZecStats — CC BY 4.0.
Burnwood never runs a wallet, holds keys or sends transactions. Your browser only downloads our published JSON files; it never contacts these providers.
How each block is checked
| Status | Meaning |
|---|---|
| Confirmed | Both sources report the same block, and the removal methods agree |
| The second source hasn't reported this block yet (usually seconds) | |
| Only one source is healthy. Numbers are still exact, but not cross-checked | |
| Disputed | The sources disagree about a block or an amount. The headline freezes at the last agreed block until it's resolved |
The countdown, the block list and block times keep moving during a dispute: they come from the primary source and aren't amounts of ZEC.
Pool figures that aren't confirmed yet. Pool figures are checked the same way: both sources must report the same balances at the same block. If they disagree, the shielded meter shows the last figures they both confirmed. If they haven't agreed even once yet (for example, just after Burnwood starts watching a network), there's nothing confirmed to fall back on. The meter then shows the figures from our current main source, marked "Unconfirmed", until the sources agree.
Freshness. The dot in the header measures our data, not the network: "Live" when our data is under 3 minutes old, "Delayed" (amber) from 3 minutes, "Stale" (red) from 10 minutes. It also follows our data sources, even when our data was updated moments ago: "Delayed" when the source we're reading from is having trouble, and "Stale" when none of our sources can deliver new blocks. A problem with any other source doesn't change the dot; it shows as "Single source" or "Sources disagree" on the figures it affects. When data is delayed or stale, numbers are labelled "as of block N". When it's stale, they're dimmed and nothing animates.
Caveats
- Timestamps are noisy. Miners set block times loosely, so single intervals can look odd. We show averages and clamp displayed intervals to at least 1 s.
- Difficulty needs time to settle. After NU7, mining averages over the last 102 blocks (up from 17; ZIP 218), about 42.5 minutes at 25 seconds per block. So it needs time to settle, and the first intervals after activation are noisy.
- Fees are small today, so the removal is small. We count it exactly anyway, to the zatoshi.
- Pool history can start later than the rest of the history. The daily history goes back to the first block Burnwood read, but pool balances are only recorded from the moment Burnwood started watching the network. Earlier days have no shielded share, so the shielded-share chart starts on the first day that has one.
- Reorganisations. The chain can briefly rewrite its latest blocks. We treat the last 600 blocks as provisional (after NU7, nodes accept up to 600 blocks deep, ZIP 218) and recompute when that happens. Daily history only uses blocks with at least 10 confirmations. Milestones show "confirming" until they have 10.
- Time windows follow the chain's clock, not ours. "Last 24 h" means the blocks since the chain's clock was 24 hours behind the last checked block. We use the latest block timestamp seen so far, because miners' clocks can be slightly out of order, so no block is skipped. Daily rows use the same chain clock: a block counts on the UTC day of the latest block timestamp seen up to it, so each day is an unbroken run of blocks. The result can be off from real time by up to about 90 minutes.
- Estimates stay estimates. The and the reissuance height can move.
Specifications
- ZIP 218: 25-second block target spacing
- ZIP 235: removing 60% of transaction fees from circulation (applied as modified by ZIP 259)
- ZIP 237 (draft): halving-preserving issuance from the NSM reserve
- ZIP 259 (draft): deployment of NU7 (ZIP 218 + ZIP 237 + ZIP 2003)
- ZIP 2003 (draft): disallow version 4 transactions
- Data: ZecStats — CC BY 4.0
Independence and licences
Burnwood is an independent community tool. It is not affiliated with the Zcash Foundation, ZODL, Shielded Labs or ECC.
The data is free to use under CC0. You can check every number yourself: the formulas are above, and the raw data is in the open API.
Privacy and analytics
Burnwood counts visits with PostHog Cloud, in its EU region. The counts are anonymous: they tell us how many pages were viewed and cards were shared, not who you are.
What is sent
Only these four events, each marked with the network you're viewing (mainnet or testnet):
pageview: when a page loads. It carries the page's address with no query except?net=, and, if you followed a link here, only the domain of the page that linked.share-click: when you press Share. It carries the page's stage: A (NU7 not scheduled yet), B (countdown), C (activation) or D (counting since NU7).share-result: when a share finishes. It carries the outcome: shared with the image, shared as a link, card downloaded, link copied, or failed.card-download: when you download a card. It carries the card's kind, for example the countdown card or the activation card.
PostHog's code adds basic technical details to every event, such as browser and operating system, device type, screen and window size, language, time zone, and random identifiers that exist only in memory for that one page load. So every page load counts as a new, separate visit, and your visits aren't linked together.
PostHog looks up your country from your IP address as each event arrives, then discards the address. Only the country and continent are kept.
What isn't collected
- No cookies. The analytics store nothing in your browser. Burnwood itself keeps only its own display settings there: your theme, a note that the site's fonts are already downloaded (so your next visit can show them straight away) and, for the current tab only, details such as whether announcements are paused. None of them is used for analytics or sent anywhere.
- No stored IP addresses.
- No profiles. Events aren't tied to a person or to earlier visits.
- No session recording, no heatmaps and no automatic click tracking. Only the four events above are sent.
- No fingerprinting. We don't try to recognise returning visitors.
Your choices
If your browser sends Do Not Track or Global Privacy Control (privacy signals your browser can send for you), PostHog's code isn't loaded and nothing is sent.
The analytics code is part of Burnwood and comes from our own site. It starts only after the page has finished loading, so it doesn't hold up the page, and it sends events to PostHog's EU servers (eu.i.posthog.com). Many ad blockers block it. The site works the same either way, and our page-view counts are lower than the real number.