RATCHET settles real bets off Pyth's sponsored push feeds on Solana, which makes it a consumer that cannot look away when one misbehaves: a late publish here is not a log line, it is a voided bet and a refunded stake. We already read every feed once a minute to keep our own settlement record. These are the statistics that fall out of it — published because the advertised parameters are public and the observed ones are not, and because this kind of number has to come from outside the oracle to mean anything. Nothing here is a complaint. It is a measurement, with its own blind spots listed at the bottom.
| FEED | SAMPLES | USABLE | TELEMETRY | ADVANCES | BLIND (OURS) | GAP MED | GAP P95 | GAP MAX | STALE>120s | AGE MED | CONF MED | CONF P95 | DIV MED | DIV MAX | DIV n | LAST PUBLISH |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| SOL7UVi…jLiE | 44 | 100.00% | 44 | 37 | 6 | 60s | 110s | 119s | 0 | 35s | 4.57 | 6.35 | 2.10 | 7.21 | 14 | 73s ago |
| BTC4cSM…PSPo | 44 | 100.00% | 44 | 37 | 6 | 60s | 110s | 119s | 0 | 36s | 3.04 | 4.15 | 1.03 | 5.43 | 14 | 73s ago |
| ETH42am…X6XC | 44 | 100.00% | 44 | 37 | 6 | 60s | 110s | 119s | 0 | 36s | 4.09 | 4.89 | 1.70 | 9.84 | 14 | 73s ago |
| BONKDBE3…wBiX | 44 | 100.00% | 44 | 37 | 6 | 53s | 106s | 107s | 0 | 30s | 20.85 | 22.86 | 5.14 | 31.80 | 14 | 56s ago |
| WIF6B23…YwbT | 44 | 100.00% | 44 | 37 | 6 | 53s | 105s | 107s | 0 | 31s | 12.05 | 16.00 | 5.08 | 16.36 | 14 | 86s ago |
| JUP7dbo…nxH5 | 44 | 100.00% | 44 | 37 | 6 | 54s | 105s | 105s | 0 | 33s | 11.61 | 13.69 | 5826657.94 | 5848872.32 | 14 | 2m ago |
| PUMPHMm3…HJSH | 44 | 100.00% | 44 | 37 | 6 | 53s | 105s | 105s | 0 | 27s | 18.11 | 22.95 | 4.07 | 32.89 | 14 | 66s ago |
USABLE — share of our Pyth reads where this feed passed every check (owner is a Pyth program, discriminator is PriceUpdateV2, verification level is Full, feed id matches, publish age under 120s). TELEMETRY — reads that carried publish_time, confidence and age, which is what every distribution to the right is computed from. It is lower than SAMPLES because price sampling predates this page; below 30 the distributions are withheld and the cell shows a dash. ADVANCES — publish_time moves we could attribute to the feed. BLIND (OURS) — pairs of looks more than 90s apart, where we stopped sampling; thrown out of every figure on this row rather than charged to the feed, because our outage is not their stall. GAP — seconds between consecutive publish_times. This is an upper bound: we only ever see a feed's latest publish, so an interval we measure may contain publishes we never saw. AGE — how old the price was when we read it, truncated by our own 120s filter (anything older is a miss, not an age). CONF — the publishers' own confidence band, in basis points of price. DIV — absolute distance from Coinbase spot, in basis points, sampled every 10 minutes, withheld below 6 cross-checks; DIV n is how many there have been.
This is the part only a game can measure. A shot expires; we look for the first oracle sample at or after that instant. If none has landed yet the shot is deferred and we look again. If the 15-minute grace window closes with nothing, the shot is voided and the stake goes back — nobody wins, nobody loses, and the feed's timing is the only reason.
| FEED | SETTLED CLEAN | DEFERRED | VOIDED |
|---|---|---|---|
| SOL | 31 | 25 | 0 |
| BTC | 16 | 19 | 0 |
| PUMP | 3 | 8 | 0 |
The table above is a 24-hour window, because the raw per-minute record is kept for four days and then expires — it exists for settlement, not for posterity. Every completed day is folded into a summary before that happens and the summary is kept for a year. This is the part that cannot be built by trying harder later. It can only be built by having started earlier.
| FEED | SAMPLES | USABLE | TELEMETRY | CONF · DAILY MED | DAYS | STALE | BLIND (OURS) | REWINDS | WORST GAP EVER | WORST DIVERGENCE |
|---|---|---|---|---|---|---|---|---|---|---|
| SOL | 1,585 | 100.00% | 1,330 | — | 1 | 3 | 78 | 0 | 2.0m 2026-08-21 | 39.52 2026-08-21 |
| BTC | 1,585 | 100.00% | 1,330 | — | 1 | 2 | 78 | 0 | 2.0m 2026-08-21 | 30.68 2026-08-21 |
| ETH | 1,585 | 100.00% | 1,330 | — | 1 | 2 | 78 | 0 | 2.0m 2026-08-21 | 34.43 2026-08-21 |
| BONK | 1,584 | 99.94% | 1,329 | — | 1 | 0 | 78 | 0 | 114s 2026-08-21 | 55.87 2026-08-21 |
| WIF | 1,585 | 100.00% | 1,330 | — | 1 | 0 | 78 | 0 | 113s 2026-08-21 | 46.91 2026-08-21 |
| JUP | 1,585 | 100.00% | 1,330 | — | 1 | 0 | 78 | 0 | 114s 2026-08-21 | 6525583.00 2026-08-21 |
| PUMP | 1,585 | 100.00% | 1,330 | — | 1 | 0 | 78 | 0 | 113s 2026-08-21 | 88.12 2026-08-21 |
CONF · DAILY MED is the median of each day's median confidence band — a robust summary, but not the median of every individual reading, and the page says which it is rather than calling it "typical" and leaving you to guess. DAYS is how many days it rests on; below 3 the figure is withheld, because one day's median wearing the word typical, in a row whose sample count is summed across every day, is the same trick this page exists to avoid. REWINDS counts publish_time moving backwards, which should never happen. It is here because a number that is always zero is worth publishing precisely so that the day it is not, somebody notices.
getMultipleAccounts read of each sponsored price account per minute, over plain
Solana JSON-RPC. No Pyth API, no key, no plan — these are ordinary accounts and reading an account
is not something anyone can bill for.PriceUpdateV2 is decoded locally from the raw bytes. A number is kept only if the
account owner is one of Pyth's own programs, the Anchor discriminator matches
sha256("account:PriceUpdateV2")[..8], the verification level is Full, the
32-byte feed id equals the one we expect, and publish_time is under 120s old.
Anything else is dropped and counted as unusable rather than quietly used.prev_publish_time < expiry <= publish_time) the on-chain program enforces —
so these samples are not a side record. They are the evidence./api/game?action=path&feed=SOL&from=<ms>&to=<ms>. Recompute anything here, or
disagree with it, without asking us.