The measurement
Logs forever, state for ten minutes
No key, no proxy, no vendor. Every figure here comes from eth_getLogs,
eth_call and eth_getBalance against rpc.mainnet.chain.robinhood.com,
read by tools/scan.mjs and written to data/chain.json.
The denominator is safe
ERC-20 requires a Transfer on every mint and burn, so totalSupply at any past
block is a sum over events the node still holds. tools/verify-supply.mjs reconstructs a real
vault's supply from block 1 and checks it against the chain, with a control that drops one mint and
requires the reconstruction to break.
The numerator is not
totalAssets() at a block behind the horizon answers metadata is not found. The same
call at head answers immediately. Both are checked in the same run, because "it failed" is only
evidence if the control succeeded.
How the horizon is found
By bisection, on a precompile — an account that exists at every block, so a failure is the node
refusing rather than the account not being there. Above the horizon eth_getBalance answers
normally; below it, every state read returns metadata is not found with the block number
it gave up at.
It moves, so it is measured more than once per run and both readings are published: 6,203 and 5,910 blocks in the run that produced this page. A single reading would have been quoted as though it were a constant.
The census
52 addresses emitted an ERC-4626 Deposit across 60
windows of 20,000 blocks spread over the chain's life. A topic match is a
candidate, not an identity — the same event signature is emitted by things that are not vaults —
so each one is asked for asset(), totalAssets(), decimals(),
totalSupply() and convertToAssets(). 49 answered all of it.
3 did not and are not counted.
A revert and a transport failure are not the same answer, and the scanner separates them.
A candidate that reverts on asset() is not a vault; a candidate the node could not be asked
about is unknown, and counting that as "not a vault" shrinks the census silently and in the
direction that flatters the finding.
Per vault
Every one of them, and its holes
| Vault | Address | Pins | Blocks pinned | Share of window | Median gap | Worst gap | Own events |
|---|---|---|---|---|---|---|---|
| steakUSDG USDG |
0xbeef…09dd | 15,389 | 14,351 | 0.3588% | 0.3 minutes | 16.2 minutes | 4 |
| spUSDG USDG |
0xde77…4087 | 347 | 346 | 0.0086% | 5.3 minutes | 5.3 hours | 2 |
| rUSD USDG |
0xcfa0…6370 | 13 | 10 | 0.0003% | 24.9 minutes | 2.4 days | — |
| FUSDG USDG |
0x7082…6149 | 8 | 8 | 0.0002% | 88.8 minutes | 3.3 days | — |
| MLP USDe |
0x24b8…bf9d | 45 | 45 | 0.0011% | 75.3 minutes | 9.2 hours | 2 |
| sGREEN GREEN |
0x290a…df73 | 27 | 27 | 0.0007% | 84.3 minutes | 21.6 hours | — |
| STATE DEEP |
0xbfb7…73d5 | 15 | 15 | 0.0004% | 6.0 hours | 22.3 hours | 5 |
| sBTC3x USDG |
0xadcc…7083 | 1 | 1 | 0.0000% | 4.4 days | 4.4 days | — |
| cIN IN |
0x4ef5…adc1 | 1 | 1 | 0.0000% | 3.4 days | 3.4 days | — |
| mTBILL USDG |
0x84a1…367d | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| mCREDIT USDG |
0xd102…ef70 | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| pBTC3x USDG |
0x4472…0e3e | 3 | 3 | 0.0001% | 40.2 hours | 44.7 hours | — |
| p2hUSDG USDG |
0x42e0…be14 | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| rUSD USDG |
0x8d3d…488f | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| sROAR ROAR |
0x9560…9c10 | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| pHOOD3x USDG |
0xe24c…5c36 | 19 | 19 | 0.0005% | 1.9 hours | 43.6 hours | 9 |
| pBTC USDG |
0x925f…0ea0 | 3 | 3 | 0.0001% | 21.7 hours | 3.2 days | — |
| sBTC USDG |
0xc25c…b91d | 1 | 1 | 0.0000% | 4.4 days | 4.4 days | — |
| xSR SR |
0x0e4b…7912 | 1 | 1 | 0.0000% | 4.4 days | 4.4 days | — |
| bbqUSDGturbo USDG |
0xbeef…a4fd | 2 | 2 | 0.0000% | 2.1 days | 2.5 days | — |
| h33 xHOOD |
0xa703…af38 | 7 | 7 | 0.0002% | 25.3 hours | 29.7 hours | — |
| stAGORA AGORA |
0x92de…d463 | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| 0xafb0…4c54 USDG |
0xafb0…4c54 | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| evAI vAI |
0x3e62…2576 | 3 | 2 | 0.0000% | 14.5 hours | 3.9 days | — |
| evPONS vPONS |
0x2396…bd0c | 1 | 1 | 0.0000% | 4.1 days | 4.1 days | — |
| evSPY vSPY |
0x2251…9d09 | 6 | 5 | 0.0001% | 9.4 hours | 3.7 days | — |
| evBONER vBONER |
0x651b…564a | 5 | 4 | 0.0001% | 14.4 hours | 2.7 days | — |
| tLOTTERY $LOTTERY |
0xf289…5e91 | 10 | 10 | 0.0003% | 54.7 minutes | 4.0 days | 1 |
| aRHUSDG USDG |
0xf4d0…459e | 72 | 73 | 0.0018% | 37.0 minutes | 15.1 hours | UpdateLastTotalAssets(uint256) |
| wCASHCAT CASHCAT |
0x5418…c7a5 | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| pSPY USDG |
0xb1a2…526c | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| pCHIP USDG |
0x1049…8e30 | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| vCSA USDG |
0x97fa…c2ff | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| vATL USDG |
0x0ff9…5580 | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| vPAT USDG |
0x6470…a290 | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| RHtest_sub USDG |
0xef46…2dae | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| yvWETH WETH |
0x92c7…510d | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| yvVIRTUAL VIRTUAL |
0x5cb5…a694 | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| PurintaUSDG USDG |
0x3778…d0a8 | 2 | 2 | 0.0000% | 19.4 hours | 3.3 days | — |
| bLendLP WETH |
0xd3ac…b9bc | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| p3USDG USDG |
0x05ae…4d00 | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| p3NVDA NVDA |
0xa386…928c | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| GM_sub USDG |
0x8252…49d3 | 0 | 0 | 0.0000% | 4.7 days | 4.7 days | — |
| 0x026d…5ca1 USDG |
0x026d…5ca1 | 23 | 23 | 0.0006% | 4.0 hours | 14.6 hours | 2 |
| evNVDA vNVDA |
0x75fa…50f7 | 11 | 10 | 0.0003% | 9.4 hours | 30.0 hours | — |
| vSPY SPY |
0xbc95…7a9d | 4 | 4 | 0.0001% | 9.4 hours | 3.7 days | — |
| vBONER BONER |
0x2e3f…e435 | 5 | 5 | 0.0001% | 14.4 hours | 2.7 days | 2 |
| drLS USDG |
0x94c2…97e6 | 4 | 4 | 0.0001% | 11.5 hours | 3.5 days | — |
| stUSDG USDG |
0x839a…3713 | 8 | 8 | 0.0002% | 3.1 hours | 3.4 days | 3 |
A pin is a Deposit or Withdraw carrying a
non-zero assets and a non-zero shares, which fixes the conversion rate at that block. Own events
names a mark-carrying event where the vault emits one, and otherwise counts how many topics it emits
outside the ERC-20 and ERC-4626 set. Where a vault does emit a mark, those blocks are counted as
recoverable in every column: a vault that does the right thing is credited for it.
The worst gap is censored for the 20 vaults that pin no price at all — their true gap is longer than the window, and is reported as the window.
The control
The same chain, done right
Uniswap V3's Swap carries sqrtPriceX96. 598,889 of them over
150,000 blocks, in 2,659 pools. A pool's price history survives the state
horizon and a vault's does not, on the same node, in the same blocks.
Each share depends on the window it was measured over. The ratio is the part that does not, which is why it is the figure the front page leads with.