Every measurement of Base’s VRF population so far has been a snapshot of the living. You read the active subscription list, you read balances, you count who drew what this week. The one thing a snapshot cannot tell you is how long any of it lasts, because the subscriptions that answered that question are no longer in the list. They were cancelled, deleted from storage, and the only trace they left is a log.
There are 185 of them. That is every Base VRF subscription that has ever been closed, and between them they are the only complete lives this chain has to offer: created on a known block, funded or not, wired to a game or not, drawn from or not, and then shut with a final balance returned. I pulled all of it. The median one lasted 21 hours.
TL;DR
- 185 of 1,361 Base VRF subscriptions have ever been cancelled (13.59%). The median one lived 21.1 hours, the shortest 68 seconds, the longest 503 days. 97 of 185 were shut inside a day.
- Across all 185 whole lives, 998.28 LINK and 7.45 ETH went in and 513.01 LINK and 6.95 ETH came back out. At the coordinator’s own feed prices that is 76.5% of every penny ever deposited by a dead project, returned.
- 86 of the 185 never paid for a single draw, 52 of them because they were never funded at all. The other 34 were funded, sat there, and were refunded in full.
- One subscription accounts for 91.8% of all the LINK the 185 ever spent. The 97 that died inside a day spent 0.0509 LINK and 0.0126 ETH between them, which is a rounding error.
- The exit is an early decision or no decision. Cohorts created before October 2025 have cancelled at 12.9%, against 13.59% for all cohorts, so the share that ever closes does not climb as a cohort ages. Meanwhile the median surviving subscription is 313 days old.
- A balance identity caught the one log row my indexer dropped, localised it to a 25-block window, and a second endpoint confirmed the exact missing event.
The only complete lives on the chain
The coordinator at 0xd5d517abe5cf79b7e95ec98db0f0277788aff634 emits SubscriptionCreated when a subscription is opened and SubscriptionCanceled when it is closed, and the cancellation log carries the final LINK balance, the final native balance and the address they were sent to. Pulled over the contract’s whole history that is 1,361 creations and 185 cancellations.
Those two numbers have to agree with a third. getActiveSubscriptionIds(0, 0) at block 52,952,301 returns 1,176 live identifiers, and 1,361 minus 185 is 1,176 exactly. The list itself is provably whole: asking for it with startIndex equal to the count reverts InvalidCalldata (0x1390f2a1), which is the control probe that distinguishes a complete answer from a truncated one.
So the population is not a sample. It is every subscription that has ever existed on this coordinator, sorted into 1,176 that are still open and 185 that are finished. Everything below is about the 185, because they are the only ones whose length can be measured rather than guessed.
Twenty-one hours
Subtract the creation timestamp from the cancellation timestamp and you get a lifespan. Here is the whole distribution.
| Lifespan | Subscriptions | Cumulative |
|---|---|---|
| Under 10 minutes | 20 | 10.8% |
| 10 to 60 minutes | 26 | 24.9% |
| 1 to 24 hours | 51 | 52.4% |
| 1 to 7 days | 21 | 63.8% |
| 7 to 30 days | 21 | 75.1% |
| 30 to 90 days | 24 | 88.1% |
| 90 to 365 days | 19 | 98.4% |
| Over a year | 3 | 100.0% |
The median is 0.880 days, or 21.1 hours. A quarter of them were gone within an hour. The shortest lived 68 seconds, which is long enough to create a subscription, look at it and change your mind. The longest ran 503.29 days, from 28 September 2024 to 13 February 2026.
That shape matters because of what it is not. It is not a population of projects that ran for a while and then wound down. More than half of it is people opening an account and closing it the same day, and the tail that genuinely operated for months is 22 subscriptions out of 185.
Three quarters of the money came back
Because the cancellation log states the refund, and the funding events state every deposit, the whole financial life of a dead subscription is recoverable. Summed over all 185:
| LINK | ETH | |
|---|---|---|
| Deposited over all 185 lifetimes | 998.278417 | 7.450434 |
| Refunded at cancellation | 513.007839 | 6.954993 |
| Actually spent on randomness | 485.270578 | 0.495441 |
| Share returned | 51.4% | 93.4% |
Priced with the coordinator’s own LINK_NATIVE_FEED at 0xc5e65227fe3385b88468f9a01600017cdc9f3a12 (0.0050085 ETH per LINK) and the Base ETH/USD feed (2,375.86) at the same pinned block, that is about $29,580 deposited, $22,629 refunded and $6,952 spent. 76.5% of everything a dead Base VRF project ever put in came back out.
Note the asymmetry between the two columns, because it is the opposite of what the headline suggests. The LINK side genuinely got used: about half of it was consumed. The ETH side barely moved at all, with 93.4% of it refunded. The native-paying projects in this population were not running games. They were topping up a few pennies, testing, and leaving.
Eighty-six of them never drew once
A fulfilment is never free. The coordinator deducts the payment from the subscription’s balance at delivery, Base’s flat fees are both zero and the premium is a percentage of real gas, so a draw that cost nothing is not a thing that can happen. Which means a subscription whose deposits exactly equal its refund never received a single random word in its life.
That is 86 of the 185. Fifty-two of them were never funded at all, so there was nothing to spend. The other 34 were funded, held the money, and were refunded down to the wei.
I did not want to rest a headline on an inference, so I tested it directly, querying RandomWordsFulfilled for 40 of the 185 over each one’s own lifespan window: 2,618 fulfilments. Two of those hit the indexer’s page limit and are therefore floors. On the other 38, the sum of fulfilment payments equals the deposits-minus-refund figure exactly, to the wei, in both currencies, 38 times out of 38. Two independent log streams and a cancellation receipt, closing to zero. Of the 40, the 24 with a non-zero spend all drew and the 16 with a zero spend all drew nothing, with no exceptions in either direction.
One subscription is almost the entire number
The 485 LINK of lifetime spend is not a market. A single subscription spent 445.5486 of it, which is 91.8% of all the LINK the 185 ever spent, over a 175.77-day life, funded eight times, wired to two consumer contracts. Add the second-largest and you have 98.2%. On the ETH side the top spender is 40.6% and the top three are 92.5%.
Set that against the cohort that defines the population. The 97 subscriptions that died inside a day spent 0.050897 LINK and 0.012602 ETH between them, about 70 US cents in total. The 22 that lived longer than 90 days spent 482.28 LINK, which is 99.4% of the LINK column. Any sentence beginning “the average Base VRF project” is describing nobody: there is a handful of real workloads and then there is a very large pile of accounts that were opened and shut.
The decision takes four minutes. The quitting takes a day.
Two clocks sit either side of these lives, and both are short.
The funding decision is immediate. Across the 133 cancelled subscriptions that were ever funded, the median gap between creation and first top-up is 268 seconds, the quartiles are 68 seconds and 1,790 seconds, and the fastest was 4 seconds. Eighty-three of the 133 were funded within ten minutes and 127 within a day. The same window holds across all 726 funded subscriptions on the chain, so this is not a quirk of the ones that died.
The abandonment decision is nearly as fast, at a median of 21 hours. And here is the part that makes it a decision rather than a delay: the share of a cohort that ever gets cancelled does not grow as the cohort ages. Taking every subscription created before October 2025, so every one of them has had at least a year to be tidied up, 64 of 497 have been closed. That is 12.9%, against 13.59% across all cohorts including this month’s. Waiting a year does not produce more closures.
The survivors confirm it from the other side. The 1,176 still-open subscriptions have a median age of 313.3 days, with quartiles at 165 and 493 days and the oldest at 839. Exactly one is younger than a day and seven are younger than a week. The living are not a crowd of recent arrivals who have not decided yet. They are old, and they are staying.
Forty refunds went somewhere else
An earlier measurement of subscription ownership found that cancelSubscription(subId, to) reads its destination from calldata rather than storage, so the owner names where the balance goes and it does not have to be themselves. That was a statement about what the code permits. Nobody had checked how often it is used.
It is used in 40 of the 185 cancellations, 21.6%, across 31 distinct destination addresses. One plain key at 0x55b44c936f7bcc7a14a66f2902ec357a9d5d49f3 collected the refunds of five different owners’ subscriptions, and another collected four. Only two of the 40 had transferred ownership beforehand, so in 38 cases the creating owner deliberately pointed the money at a third address on the way out. One of those destinations is 23 bytes of code reading 0xef0100e746e1b5c254b1a87e5c140c8c1e52341a0b5802, which is an EIP-7702 delegation designator: the refund went to a smart account, not a contract and not quite a key either.
None of that is misbehaviour. It is treasury routing, and it is exactly what you would expect a studio with a deployer key and a separate wallet to do. It is worth knowing anyway, because “the balance goes back to the owner” is what the interface implies and it is wrong one time in five.
The control group for the subscriptions that cannot leave
Last night’s measurement found that 159 live subscriptions cannot be cancelled by anyone, because the cancel helper makes an unguarded zero-value native call to the destination and a contract without a payable fallback rejects it. Every one of those 159 is owned by a contract.
The obvious question that finding leaves open is whether contract ownership is simply fatal. It is not, and the 185 are the proof. 59 of these 185 cancellations were made by contract owners, against 126 by plain keys. A contract that can receive a bare call closes a subscription exactly like a key can. So the failure is specific to a missing payable receive, not to being a contract, and this population is the control group that distinguishes the two.
The row my indexer dropped
One subscription came out of the arithmetic owing money: it was refunded 1.349199164388624680 ETH having only ever been funded 1.345330000000000000. A refund cannot exceed deposits minus spending, so either the chain was wrong or my data was.
The balance fields answer that without a second source. Every funding event carries the old balance and the new one, and between two funding events a balance can only fall, because the only other thing that touches it is a fulfilment taking money out. So any point where one event’s opening balance is higher than the previous event’s closing balance is a provable missing row, and the difference is a lower bound on its size.
Audited that way, the coordinator’s entire funding history of 2,085 events across 726 subscriptions contains exactly one such step, worth 0.004990523114596059 ETH, between blocks 52,431,334 and 52,431,359. No subscription opens with a non-zero balance either, so no first row is missing anywhere.
Then the confirmation. Pulling the same event type over blocks 52,430,000 to 52,440,000 from an archive RPC returns 279 rows where the indexer’s own API returns 278, and the one it is missing sits at block 52,431,353, log index 539, inside the window the identity had already fingered. Its true value is 0.005 ETH exactly. The identity’s estimate was short by 0.000009476885403941 ETH because three fulfilments landed inside that window and netted off against it, which is precisely why the method yields a floor rather than a figure.
The honest reading is that this indexer is about 99.95% complete on this contract and silently so, with no error, no gap marker and a "message":"OK" on every page. The reason any of the numbers above are publishable is not that the source was trusted. It is that three independent streams, funding events, fulfilment events and the cancellation receipt, were made to agree to the wei on every subscription where all three exist. Incidentally the one subscription involved was already described here once, as a cancellation that sent 1.349199 ETH back to its own owner. The figure was right. The ledger behind it was one row short.
Why a player should care
You cannot read any of this from a game’s front end, and it is the most honest thing available about the operator behind it. A subscription is the fuel tank for provable fairness: if it empties, draws stop, and the contract holding your stake starts waiting on somebody’s treasury decision. The population says that most of the people who open one are gone within a day, that the median operator who quits does so before spending a single cent on randomness, and that the ones who last are a very small group.
Satoshie’s position on this has not changed and this data sharpens it. We publish the subscription’s balance, its burn rate and its reserve headroom rather than a green dot, because a funded oracle is a claim you can check and an available one is a claim you cannot. Every round carries a deadline fixed in deployed code with a refund path any entrant can trigger, because the lesson of a 21-hour median lifespan is that the operator leaving is an ordinary event, not an emergency, and your exit cannot depend on them being around to press a button. And the subscription is owned by a key that can receive a bare call, which after last night’s 159 is not a detail.
Honest limits
- A cancellation is not a death certificate. An owner can close one subscription and run six others, or migrate to a wrapper. These are subscription lifespans, not project lifespans, and 133 distinct owners hold the 185.
- Lifetime deposits converted at today’s prices are not a lifetime cost. The 998 LINK went in across 28 months at prices I have not reconstructed; the dollar figures are one consistent snapshot, not a historical total.
- The direct draw check covers 40 of the 185, not all of them. The other 145 rest on the balance arithmetic alone, which is why the 86 figure is stated as “never paid for a draw” rather than as a fulfilment count. Two of the 40 also hit the indexer’s 1,000-row page limit, so their own counts are floors.
- “Never drew” rests on a fulfilment never being free. That is true of this coordinator’s current configuration, with both flat fees at zero and premium charged on real gas, and it was checked against the measured subscriptions rather than assumed. It would not survive a config change.
- The 1,176 survivors have not finished. Their median age of 313 days is a censored measurement, and the honest version of the cohort claim is the one made above: the closure share does not rise with age over the window available, which is 28 months.
- One missing row is what this method can see, not necessarily all that is missing. A dropped row inside a window with enough offsetting spending, or a dropped fulfilment, would hide. The per-subscription triple reconciliation is what bounds that, and it only bounds it where all three streams exist.
Three questions for anyone running a game
- How old is the subscription funding my draws, and has it ever been topped up by anybody other than the day it was created?
- If you closed it tomorrow, where does the balance go, and is that address in deployed code I can read or in the calldata of a transaction you have not sent yet?
- When the randomness stops arriving, what returns my stake, and does it need you to be there?
Run it yourself
Pull SubscriptionCreated and SubscriptionCanceled for the coordinator over its whole history from any indexer that takes a topic filter without a block-range cap, check that created minus cancelled equals the length of getActiveSubscriptionIds, and you have the population in two requests. Subtract the timestamps for the lifespans. Then add the two funding event types and reconcile every subscription individually: deposits, minus fulfilment payments, equals the refund in the cancellation log. If it does not close, something is missing, and the old and new balance fields will tell you where.
📷 Photo by Kelly Sikkema on Unsplash


