How long until a stablecoin transfer is final?

measured, not claimed · the slowest of 20 transfers of 1 USDC on each chain, one at a time · one machine in Falkenstein, DE · last run 18 Oct 2026 · 1 of 15 measured so far
18 octthe first run: Solana. Twenty transfers of 1 USDC, one at a time, from srv2 (Falkenstein, DE) through Infura: runs/solana/2026-10-18T2118Z.json. all changes
by burmisov.com ✱
donefinal
  1. not measured · final takes minutes by design
What does “final” mean here?

The chain's own last level: once a transfer is there, nothing in the chain's rules can undo it. Each chain names it differently — Solana calls it finalized (the slot is rooted), Tron solid, a rollup is final when its batch is finalized on Ethereum. The row's details print the chain's own name for it.

The figure is the slowest of the 20 transfers in the latest run, sent one at a time, so the true time is at or below it — that is the ≤. Milliseconds under a second, seconds under two minutes, minutes above. A chain whose final takes minutes by design is listed with ≈ and its documented figure, and not measured.

What does “done” mean?

The earliest level at which the chain itself says the transfer will not be dropped — the level wallets show and exchanges act on. Solana's confirmed, a rollup's sequencer confirmation, a BNB block.

When a chain's final takes longer than three seconds but done is under three, done is printed in black with a green mark: on those chains a fast use case still works, if you accept the chain's word for done. When final itself is under three seconds, done is left quiet.

Why is a figure not what the chain's docs claim?

The docs describe the design: a block every so many milliseconds, final after so many blocks. The figure is the whole path as a sender meets it: signing on our machine, the RPC's queue, inclusion, the chain's own confirmation rule, and the RPC answering our poll — the slowest of twenty tries. The gap between the two is the point of the page.

Every row quotes the chain's claim beside its measurement, with the date the docs were read. When the two disagree by more than twice, the row says so and the change appears under what changed. If you think we measured the wrong level, run it yourself or report a correction.

Why these chains — and why is mine not here?
  • 1Ranked by the USD stablecoins each chain holds, from DeFiLlama's public list of chains, read on the day of the run. The top 15 are in. The dollar figures are DefiLlama's, read the same day; the token's market cap is CoinGecko's.
  • 2A chain whose own docs give no confirmation inside about ten seconds is shown in its place with the docs, and not measured.
  • 3Bitcoin holds no major stablecoin and is out by the rule. It is shown anyway: it is the chain everyone asks about.

next below the cut · tempo 0.72 · monad 0.70 · arc 0.67 · op mainnet 0.60 · stellar 0.54 · mantle 0.54 · sui 0.50 · $bn stablecoins · 18 Oct 2026

A chain enters at the first run after it crosses the line, and leaves one run after it falls below. If yours holds more than the fifteenth chain here, it is on its way; if it does not, you can still run it yourself today with the same code, and we will gladly link your run.

Why are Ethereum and Bitcoin not measured?

Because their docs already answer the question, in minutes: Ethereum is final after two epochs, 12.8 minutes or more; Bitcoin's custom is six blocks, about an hour. Measuring them would only confirm the docs. They are listed in their place, with the docs, so that nobody has to ask where they went.

Why the slowest of 20, and not an average?

A figure that was true for every transfer in the run. An average hides the one you would have hit; a median hides half of them. If you need the distribution, every transfer is in the run file, with its hash.

Why 1 USDC, and why from one machine?

A dollar is the smallest transfer anyone makes, and a plain token transfer is the simplest practical transaction, so nothing in it but the chain is being timed. Each one goes alone and is watched until it is final before the next is sent. One machine with a named RPC provider makes the runs comparable with each other — both are part of the number, so both are printed in every run. Your machine and your RPC will give you your number: run it yourself.

How is it measured?
  • aA wallet of ours sends 1 USDC (USDT where the chain has only USDT) to a second wallet of ours, one the runner derives from the first wallet's key and never stores. Nothing else is in the transaction beyond what makes it land and tells it apart: on Solana, a memo naming the run and a small priority fee.
  • bThe clock starts the instant before the signed transaction leaves our machine. The machine and the RPC provider are named in every run: both are part of the number. No simulation or preflight is run before sending; a transfer that cannot land is recorded as failed.
  • cThe transaction is polled on the chain's own RPC until it reaches each level the chain defines: first in a block, the earliest level the chain calls safe (*done* on the page), the level it calls final (*final*). The chain's own names for its levels are kept and printed. A level's time is the moment the poll that first showed it came back, so a figure carries up to one poll interval (100 ms by default, recorded in the run, with the number of polls each transfer took) plus one RPC round trip of slack. Figures are never smaller than the truth.
  • dTwenty transfers per chain per run, one at a time: a transfer is sent alone and watched until it is final (or fails, or its cap passes) before the next one is built. Nothing else runs meanwhile. One run a week. The page shows the slowest of the twenty; the run file has all of them, with hashes.
  • eEach chain's own claim is quoted from its documentation beside the link, with the date it was read and the date it will be read again.
  • fThe method is versioned. A run records the version it was made under; the page shows the latest version's runs and links the older.
  • gSetup and teardown are not timed. Before the first transfer the runner creates what transfers need (the recipient's token account, say); after the last it sends the asset back to the first wallet, closes what it created and reclaims the rent. Their transaction ids are in the run file too.
  • hBy design: a chain is listed with its documented figures and not measured when even the earliest level it stands behind takes a minute or more (Ethereum: an epoch; Bitcoin: a block; Tron: solidified). Chains whose first safe level comes in seconds are measured, however long their last level takes — the rollups included.
  • iUntil a chain is measured, the page shows the seconds its own docs give, marked ≈, with the quote beside them. Where the docs give no number, the page shows ?.
  • jA chain may be listed outside the cut by decision, when it is new and built for stablecoins (Arc), or because everyone asks (Bitcoin); the landscape file says so.
  • ·The method is versioned; old runs keep the version they were made under. method v0 ↗
What changed?
  • 18 octthe first run: Solana. Twenty transfers of 1 USDC, one at a time, from srv2 (Falkenstein, DE) through Infura: runs/solana/2026-10-18T2118Z.json. Slowest *confirmed* 1.105 s, slowest *finalized* 8.075 s; the twenty finalized between 7.164 s and 8.075 s. Method v0. The runner holds one key, makes its recipient from it, and returned the 20 USDC and the account rent afterwards; those transactions are in the run file too.
  • 18 octmocks 7 and 8. The byline above the list; *done* emphasised when it is fast while *final* is not; the column words link to their questions; everything below the list is a question that expands; a link to a chain opens and highlights its row.
  • 18 octthe project starts. The premise, the page design (six mocks), the structure and the method draft are in docs/. Nothing is measured yet.
Can I run it myself, for my chain?

Yes — for one chain, a handful, or all. The code is the code behind every figure here. With one wallet of yours and an RPC URL:

git clone https://github.com/burmisov/txfinality.com
cd txfinality.com && npm install
cp .env.example .env                     # your RPC URL for the chain; never committed
npx txfinality wallet --chain solana     # a sender into .env; fund it with a little SOL and 20 USDC
npx txfinality measure --chain solana --runs 20   # → runs/solana/<stamp>.json, with the hashes; funds come back

The runner makes its own recipient, returns the USDC and closes the accounts afterwards. Or hand the README to your agent and ask it for your chain's numbers. Something wrong on the page: report a correction.

Who made this, and why?

Sergey Burmisov. "Final in N seconds" is a claim every chain makes and nobody measures the same way; this page measures it the same way for all of them and shows its work. It grew out of building a router for stablecoin transfers, where the real finality time is the number that matters.

data.jsonllms.txtgithub.com/burmisov/txfinality.comreport a correctionmethod v0built 2026-10-18