Skip to main content

Every provably fair game on Base makes the same promise, and it is a good one: the number that picked the winner came from Chainlink VRF, the proof is on chain, and you can check it tonight or in four years. That promise is about correctness. It is cryptography, and cryptography does not get tired.

What nobody mentions is that the promise is also a bill. Every draw is paid for out of a prepaid account called a VRF subscription, held at the coordinator contract, owned by an address that is not yours, topped up by a human who has to remember. The maths is free forever. The delivery is metered.

So I counted the meters. Every VRF subscription on Base, every top-up, every draw, for exactly seven days. Here is what the funding side of provable fairness actually looks like.

TL;DR

  • 1,160 VRF subscriptions exist on Base. 39 of them drew anything in seven days, and 579 (49.9%) hold zero LINK and zero ETH and have never had a single draw fulfilled.
  • Thirteen top-up transactions paid for all 12,946 draws in the window. Ten distinct subscriptions were funded, 0.185 ETH in total, against 0.045 ETH burned.
  • Not one of those top-ups was in LINK, even though a LINK-denominated draw costs 49.5% less than a native one at the current oracle feed.
  • 67.9% of every draw on the chain runs through one subscription, and it has 20 days of balance left at its own burn rate. It is the only subscription on Base with a runway shorter than eight months.
  • 99.8% of what a draw costs is the oracle’s fee, not the chain’s gas. The L1 data component is a rounding error, and the price still moved 17.4-fold inside one week.

What I measured, and how you can repeat it

The target is the Chainlink VRF 2.5 coordinator on Base at 0xd5d517abe5cf79b7e95ec98db0f0277788aff634. The window is blocks 52,001,892 to 52,304,292, which is 302,401 blocks between 18:32:11 UTC on 30 September 2026 and 18:32:11 UTC on 7 October 2026. That is exactly 604,800 seconds, so Base averaged 2.000 seconds a block across the sample, which is a pleasant sanity check on everything that follows.

Two reads. First, getActiveSubscriptionIds(0, 0) on the coordinator, which returns the complete list of live subscription IDs, then getSubscription(id) on each one for its LINK balance, its native ETH balance, its lifetime fulfilment count, its owner and its registered consumer contracts. Second, eth_getLogs across the whole window for every event the coordinator emitted, decoded by topic.

Before trusting the population figure I probed its edges, because a truncated list would quietly understate everything. getActiveSubscriptionIds(1159, 1) returns one ID. getActiveSubscriptionIds(1160, 1) reverts with InvalidCalldata, and so does 1161. The set is exactly 1,160, not a page of it.

Every number below is first hand. Nothing here comes from a dashboard.

A population of 1,160, of which 39 are awake

The first surprise is how much of Base’s randomness infrastructure is scaffolding that was never used.

  • 1,160 active subscriptions.
  • 814 of them (70.2%) have never had a draw fulfilled. Their lifetime request count is zero.
  • 579 of them (49.9%) hold nothing at all: zero LINK, zero ETH. Every one of those 579 also has a lifetime count of zero, so these are not accounts that ran dry, they are accounts that were opened and abandoned. 158 of them nonetheless have a consumer contract registered, which means somebody deployed a game contract, wired it to a funding source, and never put money in it.
  • 478 (41.2%) have no consumer contract at all.
  • 39 drew randomness during the seven days. That is 3.4% of the population.

The 346 subscriptions that have ever drawn anything account for 2,156,931 lifetime fulfilments between them. The infrastructure is real and well used. It is just that the live surface of it, on any given week, is about three dozen accounts.

Thirteen transactions

In 604,800 seconds, the coordinator processed 12,947 randomness requests and 12,946 fulfilments. Over the same period it recorded thirteen funding events, spread across ten subscriptions, totalling 0.185135 ETH (about $473 at $2,556.54/ETH from the chain’s own ETH/USD feed). The largest single top-up was 0.1 ETH. The smallest was 0.000832 ETH, which is roughly 83 US cents.

Against that, the whole chain burned 0.045195 ETH and 0.076750 LINK on randomness in the week. Call it $116.57 for every provably fair draw on Base for seven days. That is not a typo and it is genuinely impressive: a cryptographic guarantee covering nearly thirteen thousand outcomes, for less than the price of a decent dinner.

It is also the whole point. A dependency this cheap is a dependency nobody puts on a dashboard. Thirteen transactions is not an infrastructure budget, it is a habit, and habits belong to specific people.

The runway table

For each of the 39 subscriptions that drew, divide its current balance by its own observed burn rate over the week. That gives a runway in days, measured against actual behaviour rather than a guess.

Draws in 7 days Share of chain Balance Runway at own burn rate
8,789 67.9% 0.105 ETH 20 days
2,101 16.2% 0.510 ETH 1,124 days
746 5.8% 0.088 ETH 266 days
442 3.4% 0.105 ETH 851 days
180 1.4% 0.150 ETH 2,798 days

The median runway across all 39 is about 8,300 days. Twenty-six of them have over a decade of money at current rates. Exactly one subscription on the entire chain is inside thirty days, and it is the one doing 67.9% of the work.

I want to be careful here, because the lazy version of this post writes that sentence as a scandal. It is not. Someone is clearly minding it: at block 52,182,807 that same subscription went from 0.079996 ETH to exactly 0.120000 ETH, a top-up of 0.040004 ETH, which is the signature of a human rounding a balance back up to a tidy number. The maintenance is happening. The point is narrower and, I think, more interesting: on a chain with 1,160 randomness accounts, the concentration of actual randomness is so extreme that the fairness of most on-chain gaming on Base depends on one person’s calendar reminder.

And nothing in any game surfaces that. A player can verify last night’s proof forever. They cannot see whether tomorrow’s draw has been paid for.

The denomination the market declined

This is the finding I did not expect.

VRF 2.5 lets a subscription pay in LINK or in native ETH. Of 12,946 fulfilments, 12,785 (98.76%) paid in ETH and 161 paid in LINK. Fine, convenience wins, that is not news.

What is news is the price. The median native draw cost 0.00000398 ETH, about 1.02 US cents. The median LINK draw cost 0.000509 LINK, which at the coordinator’s own LINK/NATIVE feed reading of 0.00523146 is 0.00000266 ETH, about 0.68 cents. Paying in ETH costs 49.5% more per draw than paying in LINK, and that discount is not hidden anywhere obscure, it is the documented premium structure doing exactly what it was designed to do.

Across the week the chain paid roughly $43 extra for the privilege of not holding LINK. At this volume that is nothing, and no sensible operator would reorganise their treasury over it. But scale the same ratio to a platform doing a million draws a year and the convenience fee becomes a line item somebody has to defend.

The part that genuinely matters is what came next: of thirteen top-ups in seven days, zero were LINK. Not one subscription on Base was refilled in the cheaper denomination all week. The discount exists, it is checkable in two contract calls, and the market walked past it.

Almost none of a draw’s price is the chain

Every fulfilment on an L2 emits an L1GasFee figure alongside it, the cost of posting that transaction’s data to Ethereum. Median across 12,946 fulfilments: 0.0000000075 ETH, against a median total payment of 0.00000398 ETH.

The L1 data component is 0.2% of what a draw costs. The other 99.8% is the oracle’s fee.

That reframes a thing I have written about before. When I measured Base’s gas floor in 10,226 Blocks at the Same Gas Price, the conclusion was that the cost of entering a raffle is pinned to a floor and cheap is not the same as fixed. Randomness is the opposite shape. Gas barely registers in the price, and yet the price of a draw still swung 17.4-fold inside the same week, from 0.00000093 ETH to 0.00001624 ETH. The variance lives in the premium, not in the chain.

Which means a runway measured in days is not a runway measured in draws. A subscription with twenty days of balance at this week’s prices has rather fewer than twenty days if next week prices like the expensive end of this one. Nobody is drawing more. The meter just runs faster.

Twelve charged failures, and one that never came back

Two small anomalies worth naming, because both are things a player pays for and never sees.

Twelve of the 12,946 fulfilments (0.093%) returned success = false: the proof verified, the consumer contract reverted when handed the result, and the subscription was charged in full anyway. Nine came from a single consumer requesting five random words against a 250,000 callback gas limit, which is a configuration that runs out of gas on arrival. That one subscription made 93 draws in the week and failed 9 of them, a 9.7% failure rate, paid for, for seven consecutive days. Three more came from a contract literally named Dice, which is the same address I caught doing this in 1,893 Draws in a Day two days ago. It has not been fixed.

And one request, made at block 52,011,909, has never been fulfilled. It is 6.8 days old as I write. I went looking for the reason and could not find one: the subscription holds 0.001 ETH, which buys about 251 draws at the median price, the requesting contract is still registered as a consumer, and the gas lane it asked for served 2,739 other requests in the same window without complaint. It asked for three confirmations and one word with a 2,500,000 callback gas limit, and then nothing. I cannot tell you why, and neither can the chain. That is the honest finding, and it is worse than a diagnosed failure.

What a game contract can and cannot check

Here is the part that matters for anyone building a raffle or a coinflip.

A game contract can verify almost everything about itself. It can check that entries closed, that the prize is escrowed, that the entrant list is final, that the randomness it received carries a valid proof. What it cannot check is whether the account that funds its own draws has money in it. That balance lives in a different contract, under a different owner, in a denomination the game does not hold, and the only way the game learns about it is that requestRandomWords reverts and the draw does not happen.

This is a different failure from the one I wrote up in Every Crypto Game Promises a Fair Outcome, which catalogued the ways a request dies in flight. This is one floor below that. It is not a request that fails, it is a request that is never made, and the player experience is not an error, it is a draw that simply stays “pending” while the interface keeps rendering happily.

So the design question is not “is the subscription funded”, it is “what does the contract do when it is not”. Three properties are cheap to build and almost nobody ships them:

  • Publish the runway. The balance and the burn rate are both public reads. A game that draws nightly can display “funded through 27 October” as easily as it displays a countdown, and refusing to is a choice.
  • Make the stall refundable by anyone. If the draw has not resolved by a deadline fixed in deployed code, any address should be able to trigger the refund path. An operator who has to press a button is an operator who can decline to.
  • Size the callback honestly. Nine charged failures a week on one contract is a configuration bug that has been invisible for seven days because the money involved is pennies and nobody is watching the pennies.

Where Satoshie sits in this picture

Inside it, obviously. We are one of the subscriptions. Our draws are paid out of a prepaid balance held at the same coordinator, owned by us, topped up by us, and if we forget, our rounds do not resolve either. There is no architecture that exempts you from this, and anyone selling you one is selling you a chain they also operate.

What we will commit to is the first bullet above, because it is the one that costs nothing and is therefore the one whose absence is telling. The balance funding our draws is a public read on a public contract. Publishing the number, and the runway it implies, turns a dependency you have to trust us about into a dependency you can check. That is the entire thesis of this series applied to our own plumbing: not “trust us, it is funded”, but “here is the read, go and look”.

The honest limits on everything above are worth stating plainly. One week is one week, and a week containing a big top-up looks healthier than one that does not. My runway figures assume each subscription keeps drawing at this week’s rate, which is exactly the assumption a busy weekend breaks. The 834.7 LINK and 7.42 ETH gap I found between the coordinator’s own s_totalBalance and the sum of the 1,160 active subscriptions is most likely accumulated fulfilment fees awaiting withdrawal, but there is no public getter for that on this deployment, so I am inferring it rather than measuring it and you should treat it as unproven. And the unfulfilled request is one data point out of 12,947, which is a rate of 0.008%, not a crisis.

Three questions worth asking any on-chain game

  1. What is the subscription ID funding your draws, and what is its balance right now? Both answers are two contract calls away. A platform that cannot produce them has not thought about this, and a platform that will not produce them has.
  2. What happens to my stake if the draw never resolves? Not “it will resolve”. What happens if it does not, who can trigger it, and is that person me.
  3. Who tops it up, and what tells them to? If the answer is a person and a memory, that is fine and normal. It is just not the same kind of guarantee as the proof, and the two should not be sold in the same sentence.

The meter in the photograph is an honest piece of infrastructure. It takes your money, it shows you exactly how much time you bought, and when the time is gone it says so in red where anyone can read it. Provable fairness, for all its mathematical superiority, currently does the first part and skips the second. Thirteen transactions a week keep the whole thing running, the proof stays verifiable forever either way, and not one player on Base can see the dial.

All figures are first hand from the Chainlink VRF 2.5 coordinator on Base at block 52,304,292, covering blocks 52,001,892 to 52,304,292 (30 September to 7 October 2026). Prices from the chain’s own ETH/USD and LINK/NATIVE feeds at the same block.

📷 Photo by John Cardamone on Unsplash

Valentina Ní Críonna

Author Valentina Ní Críonna

More posts by Valentina Ní Críonna