NightWatch Labs, updated 2026-10-21
In an efficient market one asset has one price. In practice the same token is quoted on dozens of exchanges, and the quotes differ. One Price is NightWatch's map of those differences. It also tries to answer the harder question: is a gap something a person could actually cross, or is it a mirage? This page explains how a gap is computed and why most gaps are smaller, or less real, than they look.
If a token costs 100 on one venue and 101 on another, the textbook move is to buy the cheap one and sell the dear one. That needs three things at once: both quotes are live and comparable, the token can be moved from one venue to the other, and the cost of doing so is smaller than the gap. The One Price page shows the gaps and, next to each, how far each of those conditions is verified.
The waterfall scanner collects the last traded price of the token from every tracked venue that lists it. Prices in other currencies are converted to a USDT-equivalent. For each token with at least two listings the scanner takes the lowest price and the highest price and computes the spread: the highest divided by the lowest, minus one, in percent. Spreads under 0.5% are not stored. The venue with the lowest price and the venue with the highest price are recorded with the number of venues and the time skew, in milliseconds, between the earliest and latest quote used.
A second figure checks whether the gap is a crossed market. The scanner takes the lowest ask and the highest bid across different venues. If the highest bid is above the lowest ask, a buy on one venue and a sell on the other would have been profitable at those quoted prices before fees; the percentage is stored as the actionable gap. The ranking uses each venue's last traded price converted to USDT; the bid/ask crossing figure is stored beside it.
The ranking board looks back over a window of 1, 2 or 24 hours and orders tokens by the largest spread seen in that window, with tokens that pass quality checks listed first. It also reports habituality, how often the same gap recurs over seven days, and a 24-hour trend. A token that shows 8% once and never again is treated differently from one that shows 0.6% every day. The board is precomputed by a worker about every two minutes and served from storage; if the stored copy is older than ten minutes the response says it is stale.
| Tag | What it means |
|---|---|
| CAPTURABLE | Both doors are reported open: withdrawals at the buying venue and deposits at the selling venue. Where both venues publish per-network data, the route must also be on a shared network with no contract mismatch. |
| MIRAGE | The price gap exists, but a door on the route is shut, or the two venues list different assets under one ticker. |
| UNVERIFIED | There is not enough route data to call it either way. |
The boardâs tags use a lighter three-state check (open, shut, unknown) on stored door and contract data, not the full pair gate. The public pair-gate read is the full gate, the same code the systemâs own engines use. It checks in a fixed order. First, identity: a ticker known to mean different assets on different venues is refused. Second, data: with no chain or contract data for a venue, the answer is âunknown supportâ and the route is not accepted. Third, doors: for a shared chain to count, withdrawals must be enabled at the buying venue and deposits at the selling venue on that same chain, after chain names have been normalised so that spellings of one network match. If both venues publish a contract on a chain and the contracts differ, that route is blocked as a collision. Fourth, speed: a route whose only open path is the slow Bitcoin network is rejected by default, because a settlement time of half an hour or more does not suit the minute-scale window in which these gaps close.
Each refusal has a reason code, such as identity_collision, unknown_support, no_common_network, route_closed_or_collision or mainnet_only. The gate result is cached for 60 seconds per token and venue pair.
The page therefore ranks by raw gap but labels each row with its route status, so a large number on a shut route reads as what it is. Rows whose route is unverified stay in the list.
Suppose a token shows a raw gap of 1.2% between venue A (cheaper) and venue B. Both venues charge a taker fee of 0.1%, so trading costs take 0.2 points and leave 1.0. Withdrawing from A costs a flat fee that equals 0.3% of the trade at your size, which leaves 0.7. The transfer takes eight minutes, and in that time the gap narrows to 0.9% before your sell executes at B, so the realised gap is roughly 0.4% after the same costs. If the deposit door at B was shut for that token, the row would carry the MIRAGE tag and the whole 1.2% would be unreachable. These are illustrative numbers, invented to show the order of the steps, not any real result.
The page runs one shared poller of about 60 seconds, paused while the browser tab is hidden. Each tile has its own error boundary, so a broken feed shows an error in that tile only. The recent-scan tape is cached for three seconds on the server and bounded to the last 15 minutes of scans.
Read the Observatory method page for how regional premiums are separated from the stablecoin basis, and the risk disclosure for the general limits of this material.
Informational only, not investment advice. See the risk disclosure.