/** * Who won the blocks, and what became of the rewards. * * **This table reports flows and does not judge them.** Every figure is * something the chain recorded — direction comes from each transfer event's own * `from` and `to` — but what the figures *mean* is a question the data cannot * settle. An operator may hold several addresses, may settle off-chain, or may * simply be a solo miner keeping what it earned, which is the ordinary case and * unremarkable. * * So there is no badge, no flag, and no word like "delinquent" anywhere here. * What earns the table its place is **comparison**: one miner's recipient count * says almost nothing, and beside its neighbours' it says a great deal. The * reader draws the conclusion; the site lays out the evidence and names its * limits. * * The name column is the weakest thing on the page and is marked as such. There * is no such thing as a "pool" on this chain — the word appears only inside a * name an operator reports over telemetry, and a site that flagged entities as * delinquent on the strength of a name they chose themselves would be one bad * match away from libelling someone. */ import { useEffect, useState } from 'react' import { Link } from 'react-router-dom' import type { Distribution } from '../api/generated/Distribution' import { RequestFailed, fetchDistribution } from '../api/rest' import { height as fmtHeight, share as fmtShare, shortAddress, tokens } from '../lib/format' import { href } from '../lib/routes' import type { Window as WindowName } from '../api/generated/Window' export function DistributionPanel({ chain, window: windowName, decimals, symbol, }: { chain: string window: WindowName decimals: number /** The unit, shown once in the header rather than on every cell: six columns * of amounts each repeating "QTC" is noise, and they are all the same unit. */ symbol: string }) { const [data, setData] = useState(null) const [error, setError] = useState(null) useEffect(() => { const controller = new AbortController() setData(null) setError(null) fetchDistribution(chain, windowName, controller.signal) .then(setData) .catch((e: unknown) => { if (controller.signal.aborted) return setError(e instanceof RequestFailed ? e.message : 'Could not reach the observer.') }) return () => controller.abort() }, [chain, windowName]) if (error) return

{error}

if (!data) return

Following the rewards…

const amount = (raw: string | null | undefined) => raw === null || raw === undefined ? '—' : tokens(raw, decimals, 1) return (

Where the rewards went

{fmtHeight(data.window_blocks)}-block window · amounts in {symbol} ·{' '} {data.indexed_from !== null && data.indexed_to !== null ? `blocks ${fmtHeight(data.indexed_from)}–${fmtHeight(data.indexed_to)}` : 'nothing indexed yet'}
{data.miners.map((m) => { const recipients = m.flows?.recipients ?? null return ( ) })}
Each miner's share of blocks, what it was paid, and what it has sent on
Miner Share Mined Received Sent visibly Recipients
{m.display} {/* Only where the name is not already the address: an unattributed miner renders as its payout address, and repeating it underneath is one string printed twice. */} {m.address && m.attribution !== 'preimage' && ( {shortAddress(m.address)} )}
{fmtShare(m.share)} {amount(m.mined)} {amount(m.received)} {amount(m.flows?.sent)} {recipients === null ? '—' : fmtHeight(recipients)}

This chain hides who sends. A wormhole transfer records its recipient and its amount but not its origin — on mainnet, 9,894 such transfers reached 654 recipients with no sender recorded at all. So sent visibly and recipients count only the transfers that named a sender, and{' '} a zero in those columns is not evidence that nothing left. It is evidence that nothing left by a route the chain writes down. Payouts here are very plausibly wormhole transactions, and the privacy is a feature of the chain rather than a gap in this table.

There is no column here that can tell you whether a miner is paying out, and there cannot be. {' '} The chain pays a mining reward to an address derived from the miner's own reward preimage — a Poseidon hash that no key signs for. Nothing can transfer out of it. The only way to move the value is a wormhole exit, which credits its destination{' '} without debiting the source. So received is a running total of everything ever credited, it rises and never falls, and it does that identically for an operator who pays out in full and one who pays out nothing. Measured over all of mainnet's history, the largest miner's balance rose at every sample and fell at none.

That is also why this table no longer carries a “retained” percentage. It read close to 100% for every miner on the chain, because it had to, and a number that is the same for everyone reads as an accusation aimed at whoever happens to be at the top — which here is simply whoever mined the most. The place any of this is observable is the{' '} wormhole page, which counts what has gone in and come out without claiming to know who moved it.

The names are the weakest column and come from telemetry, not the chain — an operator chooses what its node calls itself, so a name containing “pool” is a claim rather than a fact. Received is chain state and is true now, while mined,{' '} sent visibly and recipients are counted over the indexed range above; on a chain read from genesis those agree, on one still being indexed backwards they do not.

) }