Yesterday I published a count of every Chainlink VRF subscription on Base and ended it with an admission. One randomness request, made at block 52,011,909, had never been fulfilled. I looked for a reason and could not find one. The subscription had money in it. The requesting contract was still registered. The gas lane it used had served 2,739 other requests in the same week without complaint.
I found the reason. It was sitting in the request itself, in a field that most people treat as a label.
Every VRF request carries a keyHash, a 32-byte value you copy out of the Chainlink docs. It looks like an identifier, the sort of constant you paste once and never think about again. It is not an identifier. It is a price, in wei, and multiplied by one other field in the same request it decides how much money you must be holding before anybody will answer you.
TL;DR
- Base has exactly two VRF gas lanes, and the only difference between them is a number: 2 gwei and 30 gwei. Both are registered on the coordinator and readable in one call. A third index reverts, so that is the complete set.
- Neither ceiling is doing anything. Across all 302,401 blocks of my measurement week, Base’s base fee never once exceeded 0.0169 gwei, which leaves the cheaper lane 118 times more headroom than the chain’s worst block needed.
- What the lane actually sets is your float. Chainlink’s own formula multiplies the lane maximum by your callback gas limit, so the same draw needs 0.00224 ETH parked on the cheap lane and 0.0336 ETH on the expensive one. The draw itself costs about one US cent.
- Of 29 subscriptions paying in ETH, 28 clear that bar and every one of their requests was fulfilled. The one that does not clear it, at 1.2% of the figure, is the owner of the request that never came. It is now 7.8 days old and still outstanding on chain.
- 78.8% of Base’s randomness rides the cheap lane, and not one of the 40 subscriptions that drew anything used both. Nobody on the chain is hedging the choice, and most of them have never been told it is a choice about money.
What I measured
The target is the Chainlink VRF 2.5 coordinator on Base at 0xd5d517abe5cf79b7e95ec98db0f0277788aff634. The window is blocks 52,001,892 to 52,304,292, seven days to 18:32 UTC on 7 October 2026, the same 12,947 requests and 12,946 fulfilments I counted in Provable Fairness Is Prepaid. Everything below is a direct read.
The lanes come from s_provingKeyHashes(uint256) on the coordinator. Index 0 and index 1 return the two key hashes Chainlink documents for Base. Index 2 reverts, which is the control probe: the list is complete, not a page of it. Feeding each hash to s_provingKeys(bytes32) returns a struct whose second field is the lane maximum, and there it is in plain wei: 2,000,000,000 for the first key and 30,000,000,000 for the second. Two gwei and thirty gwei, exactly as advertised.
The coordinator’s own s_config() fills in the rest without anybody’s documentation: a maximum callback gas limit of 2,500,000, a minimum request confirmation count of zero, a native premium of 60% and a LINK premium of 50%, with both flat fees set to zero. Those numbers match the docs, which is reassuring and also the last time the docs and the chain will agree in this post.
A keyHash is a ceiling, not a name
Chainlink’s definition is not hidden. The docs call the gas lane “the maximum gas price you are willing to pay for a request in wei” and say you define that limit by choosing a keyHash. The lane exists so that the oracle can bump its gas price during a spike and still be inside a bound you agreed to in advance.
So the choice is a liveness bet. Pick the 2 gwei lane and you have told the service it may not pay more than 2 gwei to deliver your draw. If the chain’s price of inclusion goes above that, your draw waits for the price to come back down. Pick the 30 gwei lane and you have raised your own ceiling fifteenfold.
The obvious question is whether that ceiling has ever been close to binding on Base, and the answer is a careful no, followed by an interesting yes.
Across the whole measurement week, 302,401 consecutive blocks, Base’s base fee sat at its 0.005 gwei floor for the median block and peaked at 0.0169 gwei. Not one block in the week reached even 0.1 gwei. The cheap lane’s ceiling is 400 times the median and 118 times the worst block of the week. As a constraint on anything, it is decorative.
February is the interesting part. In 10,226 Blocks at the Same Gas Price I made the point that Base’s floor is a configuration, not a law, and that the same fee had peaked hundreds of times higher earlier in the year. This time I pulled the whole three days rather than a sample, 129,601 blocks from 4 to 7 February 2026, and the picture is sharper than the one I published. 822 blocks, 0.63% of them, carried a base fee at or above 2 gwei. They fall into six separate episodes between 15:23 UTC on 5 February and 00:15 UTC on 6 February, the longest running 263 blocks, about nine minutes. The peak block, 41,773,788, sat at 2.947 gwei, which is a quarter higher than the figure my earlier sample found and comfortably over the cheap lane’s entire budget.
For about 27 minutes this year, then, the base fee alone on Base exceeded the maximum price that 78.8% of the chain’s randomness requests are configured to pay. I cannot show you a draw that stalled because of it, because no request was in flight on that lane during those minutes. What I can show you is that the precondition is real and nobody chose it deliberately.
The thing the lane actually does to you
Here is the part that is not a hypothetical. From the Chainlink docs, the minimum subscription balance is:
Gas lane maximum × (200,000 max verification gas + callback gas limit) × (100 + premium) / 100
and the docs are explicit about its status: it is “a higher amount you need to reserve before your request is processed”, displayed in the Subscription Manager as Max Cost, and “that does not mean the actual request will cost” it. The actual bill, charged after the fact, uses the real gas price. The reserve uses the lane maximum.
Run it for the most common configuration on Base, a 500,000 callback gas limit, at the 60% native premium:
| Lane | Reserve required | At $2,444.60/ETH | Median cost of one draw | Reserve, in draws |
|---|---|---|---|---|
| 2 gwei | 0.00224 ETH | $5.48 | 0.0000040 ETH | 554 |
| 30 gwei | 0.0336 ETH | $82.14 | 0.0000040 ETH | 8,317 |
The draw costs a US cent. The cheap lane asks you to hold 554 draws’ worth of ETH before it will run one, and the expensive lane asks for 8,317. That is the whole difference between the two lanes in normal conditions: not speed, not price, not fairness, just float.
And the lane does not show up in the bill at all. At a matched 2,500,000 callback gas limit, the median payment on the 30 gwei lane was 0.0000020 ETH against 0.0000095 ETH on the 2 gwei lane. The expensive lane was cheaper. Different consumers, different hours and a volatile L1 data component make that comparison soft, but the direction is enough to kill the intuition that a higher lane is a higher price. You pay the gas that was actually used at the gas price that actually applied. The lane never enters the arithmetic.
The draw that never came
Which brings us back to block 52,011,909, at 00:06:05 UTC on 1 October 2026.
The request asked for one random word, three confirmations, the 30 gwei lane, and a callback gas limit of 2,500,000, the coordinator’s hard maximum. That is the most expensive pair of settings available on Base. Its reserve, by the formula above, is 0.1296 ETH, or 0.081 ETH if you drop the premium and count only the gas.
The subscription held 0.001 ETH. I read the balance at the block before the request, so this is not a drained account read after the fact. It is 1.2% of the gas-only figure and 0.8% of the documented one. The subscription’s lifetime fulfilment count is zero: somebody deployed a 19,150-byte contract, created a subscription, funded it once with a thousandth of an ether, fired its first ever request, and is still waiting.
The chain agrees it is still waiting. s_requestCommitments for that request ID still returns 0xd4b61d15df54b33f4fcd6c55b0d8bbd8dabef27cb484ec2c1916fe69e0e150e1, while the same call for any fulfilled request returns 32 zero bytes. The commitment is cleared on fulfilment, so a non-zero value is proof of a live request, not an inference. It has been outstanding for 7.8 days.
Yesterday I wrote that 0.001 ETH “buys about 251 draws at the median price”. That was true and completely beside the point. Nothing in this system prices a request at what a draw costs. It prices it at what a draw could cost on the lane you named, and the account was never within two orders of magnitude of that.
28 of 29, and three that should not have been served
One data point is an anecdote, so I ran the same test across every subscription that paid in ETH during the week, reading each balance at the block before its most expensive request.
There are 29 of them. 28 clear the lane maximum multiplied by their own gas budget, and all 12,785 of their requests were fulfilled. One does not clear it, and its request is the only one in the week that was not. Zero counterexamples in either direction.
The margins make this more interesting than a clean threshold would. The three tightest passes sat at 1.10, 1.25 and 1.31 times the gas-only figure, which means they were at 0.68, 0.78 and 0.82 times the reserve Chainlink documents. All three were served anyway, every request, all week. So the published formula, premium included, is not the gate. Something close to the gas-only version of it is, and my data brackets the real threshold loosely between 1.2% and 110% of that number rather than pinning it.
That is as far as the chain will take you, and it is worth being precise about why. The coordinator accepted the failing request. It emitted the event, wrote the commitment and charged nothing. Whatever declined to answer it did so off chain, in software I cannot read, on a rule that is not in the contract. The on-chain record of a request that will never be answered is byte-identical to the record of one that will be answered in six seconds.
What this is worth to a game
Satoshie’s raffles and coinflips sit on exactly this plumbing, so this is our configuration too, and the reasonable thing to publish is the shape of the exposure rather than a reassurance.
Two fields in a request multiply into a cash requirement. One of them is a hash and the other is a gas number. Neither looks like money, neither is validated against your balance when the request is accepted, and the difference between the cheapest and the most expensive combination anybody actually used this week is a factor of 169. A game that picks the maximum callback gas limit because bigger sounds safer has quietly multiplied its own float requirement by nearly four, and will find out the first time a player’s draw does not resolve.
The honest version of a provable fairness claim therefore has a second half that nobody prints. The first half is cryptographic: the proof was verified on chain before the callback ran, and that is true forever. The second half is financial: the account that pays for the next draw holds a balance, against a threshold set by two numbers in a config file, enforced by a service none of us operate. I catalogued the ways a request dies in flight back in August and listed an underfunded subscription first. I did not know then that “underfunded” is defined by a 32-byte constant most builders copy without reading.
So the design rule we hold ourselves to is boring and checkable: publish the subscription ID, the key hash and the callback gas limit; hold a balance that clears the lane maximum times the full gas budget with the premium on top, not one that merely clears the cost of a draw; and put a contract-enforced, permissionless timeout behind every game, because the one failure mode this post describes has no on-chain signature at all until the deadline you wrote arrives.
Honest limits
Four of them. The February crossing is real but no VRF request was in flight on the cheap lane during those 27 minutes, so I am showing you a loaded condition, not a stall. The threshold inference rests on 29 subscriptions and one failure, which rules the documented formula out but does not locate the real rule, and a single top-up to that account would end the experiment. Eleven subscriptions pay in LINK and are priced by a different formula with a different premium, so they are excluded from the test entirely rather than counted as passes. And request confirmations, which 87.8% of the week’s requests set to zero, are a separate exposure that belongs to the finality question, not this one.
Three questions worth asking any on-chain game
- Which key hash do your draws use, and what callback gas limit? Both are in the request event, so the honest answer is a link to one. Multiply them out and you know what the game must hold before it can run.
- Does the balance clear that figure, or merely cover the draws? These are different numbers by a factor of several hundred, and only one of them is the one the service checks.
- What happens on day eight? Somewhere on Base a contract has been waiting since 1 October for a number that is not coming. If that were your stake, which function would you call?
The sign in the photograph is the right mental model. It costs nothing to drive under it, it constrains nobody on an ordinary day, and the road does not check your height before letting you on. It simply states a condition that is either true of you or is not, and finding out is entirely your problem.
All figures are first hand from the Chainlink VRF 2.5 coordinator on Base, covering blocks 52,001,892 to 52,304,292 (30 September to 7 October 2026) and 41,686,927 to 41,816,527 (4 to 7 February 2026). ETH at $2,444.595 from the Coinbase spot API on 8 October 2026.
📷 Photo by Taewoo Kim on Unsplash


