Writing

The tape nobody keeps

15 October 2026 · figures measured 15 October 2026

Every time somebody prices a transfer here, ten providers are asked what they would pay for it, at the same moment, for the same coin on the same chain. The answers are ranked, the spread between best and worst is printed, and the best one is measured against mid-market so that “top of the list” becomes a number rather than a position.

Then it was written to a cache key with a fifteen-minute expiry, and deleted.

That is the thing worth writing down. The fan-out is a price tape for a market that publishes none — swap providers have no consolidated feed, no tick history, nothing a reader can go back to and check — and this deployment was producing one as a side effect and throwing it away on a timer.

Why it cannot be rebuilt later

The quotes could, in principle, be re-asked. The benchmark could not.

A quote is only interesting beside the market it was quoted against, and mid-market here is the median of four large venues’ public tickers, published only if at least two of them answered. That is a reading taken at an instant. There is no endpoint anywhere that will say what the median of those four said at 14:32 on a past Tuesday. Ask them tomorrow and they will tell you about tomorrow.

So a quote kept without its benchmark is a number with nothing to compare it to, and a benchmark not written down at the moment of the fan-out is gone. Everything else in this change follows from that one asymmetry: the tick has to carry its own spot price, written at the same second, or it is not a measurement at all.

A non-answer is a measurement

The second thing being discarded was the silence. When a fan-out comes back with six rows instead of ten, the four missing providers are missing for reasons that are not the same reason:

What happenedWhat it means
QuotedAsked, answered, priced
ErroredAsked, and it failed or refused — an outage, a floor, a bad pair
UnconfiguredNever asked, because no key is set. A setup gap, not a market fact
BarredNever asked, because it is deliberately kept off this pair

Those are four different facts and only the first two are about the provider. A coverage figure that folds the last two in is wrong in a specific and flattering direction: it reports a decision as an outage, and a missing credential as a provider that does not serve the pair.

The fan-out is the only place that can still tell them apart. One function further out and all four have collapsed into “fewer rows than providers”. It now reports the barred ones explicitly, which it never did — they were filtered out early, correctly, so that a barred provider would not be misreported as a missing key, and then nothing said anything about them at all.

One size is the wrong number of sizes

The temptation is to sample each pair at one sensible amount — a thousand dollars or so — and call it the price of that pair. Measured across seven providers at six transfer sizes on one pair in a single pass, that is not merely incomplete. It inverts.

Transfer sizeBest-to-worst spread
25 USDT26.44%
150 USDT3.39%
400 USDT and upabout 1.7%

And the provider paying the most on 25 USDT pays the least on 1,000 — not by getting worse, but by charging a flat percentage under mid-market at every size while the others improve past it. A dataset holding only the comfortable size would name that provider the cheapest and be wrong about every transfer anybody actually makes.

Coverage moves the same way. The number of providers quoting a pair is not a property of the pair: on this deployment the same Monero pair has gone from three providers quoting to seven inside six minutes. A single reading of “how many quote this” is a property of the minute it was taken in, and the only honest version of that figure carries a range and a count.

What it cost to start keeping it

The first attempt at this made the build slower, and then made it fail.

Writing a tick costs a benchmark lookup — four venues, up to four seconds. Dropping that into the fan-out meant it also ran during a build, where every pair page is prerendered and fans out twice. A cold build would therefore have claimed twenty-six sampling slots and done twenty-six venue lookups inside the slowest renders on the site. One pair page took more than the three-minute per-page limit and passed only on a retry, which is a failure that would have arrived intermittently, weeks later, looking like a provider having a bad minute.

The fix was not to make it faster. It was to notice that those ticks were worth nothing: every one of those pairs revalidates within fifteen minutes in production and gets sampled there, against a live market, from the host that actually serves readers, rather than from a build machine. Nothing is recorded during a build now. The capture happens after the response — which is the only place work nobody is waiting for belongs.

What it is for

Two questions, one record. What the best achievable rate was for a pair at a size at a minute, which is the only way to say whether a transfer was well executed. And which providers answered, how often, and how far under the market they sat — which is the only way to say anything about a provider that is measured rather than repeated from its own marketing.

Neither can be answered today. A response rate over four samples is not a response rate, and the analysis refuses to print one below thirty. That is the point of starting: the value of this dataset is a function of how long it has been kept, and nothing about it can be backfilled. The providers page already prices every provider against mid-market each time it is read. Until now that was the only moment any of it existed.

Plan an exchange

Every figure above can be checked against the providers yourself — no account, no sign-up, and nothing is held for you at any point.