Basalts: Basefee, set in stone
A trustless market for Ethereum gas risk. Weekly Gas Caps on the average basefee, underwritten by ETH holders and settled by block headers proven on-chain.
Version 1.0 · November 2026
Summary. Every Ethereum transaction pays a basefee that is burned. It is cheap most of the time and spikes violently a few times a month. In the 14 days before this paper, the hourly basefee had a median of 0.059 gwei and a peak of 171 gwei, almost 3,000 times higher. Paymasters, sponsoring wallets, autonomous agents, rollups and market makers all sell fixed prices and pay this basefee later, so they are structurally short gas. Nobody offers them a hedge. Basalts does. It sells fully collateralised call spreads on each week's average basefee. Settlement uses 168 hourly samples, each a block header verified against the hash Ethereum itself stores (EIP-2935). ETH holders underwrite the caps and earn the premiums. Protocol fees fund ETH yield for BSLT stakers, buyback-and-burn, a treasury, and the keepers who run the oracle. BSLT itself launches fairly on a bonding curve, with no pre-allocation.
1. Motivation
1.1 Ethereum in late 2026
- L1 is scaling again. Fusaka (December 2025) shipped PeerDAS and blob-parameter forks. Glamsterdam adds enshrined proposer-builder separation (EIP-7732) and block-level access lists (EIP-7928), with gas-limit targets between 100M and 200M. It went live on Sepolia on October 6 and was scheduled for Hoodi on October 26; the mainnet date had not been announced when this paper was written.
- Average fees are low, and the tails remain. Higher capacity lowers the median. It does not remove demand bursts: mints, airdrops, liquidation cascades and memecoin launches still fill blocks, and EIP-1559 then raises the basefee 12.5% per full block.
- Gas is now sold, not just paid. ERC-4337 paymasters, EIP-7702 sponsoring wallets, ERC-8004 agents paying through x402, intent solvers and rollup batch posters all charge users a fixed or pre-agreed price and settle the basefee later.
- The ETH-value debate. L2s pay little to L1, and blob fees spent much of 2025 at the floor. The community wants L1-native activity that burns ETH and pays ETH.
1.2 The ask
On December 8, 2025, Vitalik Buterin asked for "a trustless onchain gas futures market" ("a prediction market on the basefee") so that users could prepay for "any specific quantity of gas in a specific time interval." Two objections followed:
- Hasu: such a market has no natural short side.
- Martin Köppelmann: because the basefee is burned, validators are not natural sellers of the hedge.
Basalts answers both.
- Trustless. Settlement reads nothing except Ethereum block headers, verified on-chain with BLOCKHASH and EIP-2935. There is no oracle committee and no admin price.
- A natural short side. ETH holders. When the basefee spikes, the burn accelerates and ETH supply contracts. An ETH holder who sells gas protection collects ETH premiums in calm weeks and pays out in exactly the weeks when the burn is strongest. For long-term holders, stakers and ETH treasury companies, underwriting gas risk is a yield source that is partly hedged by what they already hold.
1.3 Prior art
Oiler Network explored basefee options in 2021–22, first with an off-chain oracle and later with capped options on Starknet ("Pitch Lake"). Basalts differs in four ways:
- It settles on L1 against header proofs, which became cheap and practical only after Pectra's EIP-2935.
- It uses epoch-isolated pools, which remove NAV-timing exploits.
- It prices on-chain, from the oracle's own realised variance plus an explicit spike regime.
- It closes an economic loop around a fixed-supply token.
1.4 Related products today
- ETHGas (with ether.fi committing about $3B of stake, April 2026) runs a validator-side market for specific blocks and inclusion up to 64 slots (about 13 minutes) ahead, aimed at institutions, rollups and solvers.
- Several teams (Alkimiya, Hedgehog, Gas.Finance) publish experimental frameworks for structured blockspace derivatives.
Basalts differs on three axes:
- Horizon: a whole week, not a block.
- Settlement: the public average basefee proven on-chain, with no venue in the path.
- Access: anyone with a wallet can buy cover or underwrite it.
The products are complementary. A rollup can reserve the next blocks on ETHGas and insure its weekly gas budget on Basalts.
2. The Basefee Oracle
2.1 Sampling
Time is divided into epochs of 7 days, starting at GENESIS (a Thursday at 00:00 UTC).
- Each epoch has N = 168 slots. Slot k opens at
epochStart + k · 1h. - A slot accepts the header of the block whose timestamp falls within its 12-second window. That is exactly one mainnet slot, so each hour has only one block that can be submitted. If no block was proposed in that slot, the hour has no sample; the 90% coverage rule (§2.3) allows for this.
- The first valid proof wins. Anyone can submit, and submitters are paid from the keeper reserve.
2.2 Verification
recordSample(epoch, slot, rlpHeader) performs four steps:
- Decode the RLP list and read
number(field 8),timestamp(field 11) andbaseFeePerGas(field 15). Later forks only append fields, so these indices are stable. - Check the window:
slotStart ≤ timestamp < slotStart + 12s. - Look up the canonical hash:
blockhash(number)if the block is at most 256 blocks old; otherwise call the EIP-2935 history contract at0x0000F90827F1C53a10cb7A02335B175320002935, which covers 8,191 blocks (about 27 hours). - Require
keccak256(rlpHeader) == canonicalHash. A forged header cannot pass. The decoder does not need to validate anything else, because only the true header has the true hash.
The keeper re-encodes headers from eth_getBlockByNumber. Before submitting, it checks locally that its encoding hashes to the block hash. If a future fork adds header fields the keeper does not yet know, it refuses to submit rather than sending a wrong proof. A real mainnet header from block 26,371,436 is used as a test fixture.
2.3 Finality and voiding
- An epoch is final when all 168 samples are recorded, or 28 hours after it ends. By then no further proof is possible.
- It is valid if at least 90% of slots were recorded.
- An invalid epoch is void: every cap holder receives a full refund of premium and fee, and every underwriter receives their capital back. Losing the oracle can therefore never move value between the two sides.
2.4 Manipulation economics
To raise one sample's basefee by a factor x, an attacker must fill whole blocks beforehand. Each full block raises the basefee by 12.5%, and the attacker pays the burned basefee on all that gas.
- Doubling one sample takes about six consecutive full blocks.
- Moving a 168-sample average by 1% requires doubling about 1.7 samples.
- Open interest per pool is capped by that pool's capital.
- The attack costs more than it can win, and the cost is burned for everyone else's benefit.
The 12-second window holds exactly one mainnet slot, so a submitter cannot choose which block's basefee is recorded. Each hour's sample is fixed by the chain.
2.5 Pricing reference
Each in-order sample updates two exponential moving averages:
- Reference basefee F: EMA with α = 0.08 (about a one-day span).
- Realised log-variance per hour σ²: EMA with α = 0.04 of
(ln xᵢ − ln xᵢ₋₁)² / gap.
Out-of-order samples count toward the epoch average but not toward the EMAs. Sales stop automatically if no sample has arrived for 3 hours (maxStaleness).
3. Gas Caps
3.1 The instrument
A Gas Cap is a call spread on the epoch's average basefee:
payout = gas × min( max(avg − K, 0), C − K )
- K is the strike and C the ceiling, both in wei per gas.
- The maximum loss,
gas × (C − K), is locked from pool capital at purchase. No position can be under-collateralised, so there is no margin and no liquidation. - Each cap is an ERC-721 whose art and metadata are rendered fully on-chain. It can be transferred, held by a paymaster contract, or wrapped by other protocols.
3.2 The strike grid
Strikes and ceilings sit on a geometric grid:
strike(t) = 0.01 gwei × 1.08ᵗ, for t = 0…127 (0.01 to 175.7 gwei)
The grid lets settlement aggregate positions per tick: a cap adds +gas at its strike tick and −gas at its ceiling tick. The pool's total payout is then:
Σₜ netQty[t] × max(avg − strike(t), 0)
This needs at most 128 storage reads, whatever the number of caps. It is also exactly equal to the sum of the individual cap payouts, with no rounding.
3.3 Sale window
A pool's caps sell in the 3 days before its epoch starts. Nothing is sold during the live week, so no buyer can trade on samples that are already recorded.
4. Pricing
4.1 Model
The fair value of a spread per unit of gas is a two-regime lognormal price on the average:
v = clamp(σ², min, max) × volMultiplier × min(h₀ + N/3, H_cap)
spread = (1 − λ) · [C₇₆(F, K, v) − C₇₆(F, C, v)]
+ λ · [C₇₆(M·F, K, v) − C₇₆(M·F, C, v)]
- C₇₆ is the undiscounted Black-76 call price.
- h₀ is the number of hours until the epoch starts. The
/3term is the standard variance reduction for an arithmetic average. - H_cap stands in for mean reversion: basefee variance saturates rather than growing without limit.
- λ (
jumpProbBps) and M (jumpMultiplierX100) describe the spike regime: the chance that a given week is a congestion week, and how far above the quiet forward its average lands.
The jump term matters. In the 14-day mainnet sample used for calibration (November 2026), a 2×–20× cap would have paid 38% of its maximum on average across rolling windows. A pure lognormal prices that cap at about 1.9% of maximum. With the default λ = 15% and M = 15×, the model prices it at about 6.8%. That sample contained an unusually severe spike week, so the backend publishes realised versus implied statistics continuously. The Risk Manager re-tunes the parameters within governance bounds as the data accumulates.
4.2 Loading and floors
ū = (utilisationBefore + utilisationAfter) / 2
loading = margin + slope · ū + kinkSlope · max(ū − kink, 0)
premium = max( fair × (1 + loading), minRate × maxPayout ) (capped at maxPayout)
Using the mid-trade utilisation makes the price path-independent for linear loading, so splitting an order does not lower its cost.
The buyer also pays the cover fee, 15% of the premium by default. Bedrock staking reduces this fee by 10%, 25% or 40% depending on tier.
4.3 Defaults (mainnet)
| Parameter | Default | Hard bounds (timelock-only) |
|---|---|---|
| volMultiplier | 1.0 | 0.5 – 3.0 |
| horizonCap | 4 h | 1 – 168 |
| marginBps | 1,000 | 500 – 5,000 |
| slopeBps | 2,000 | 0 – 10,000 |
| kinkBps | 8,000 | 6,000 – 9,500 |
| kinkSlopeBps | 30,000 | 0 – 100,000 |
| minRateBps | 100 | 20 – 1,000 |
| min / max σ² per hour | 0.002 / 1.0 | ≥ 0.001 / ≤ 8.0 |
| jumpProbBps (λ) | 1,500 | 0 – 5,000 |
| jumpMultiplier (M) | 15× | 1× – 100× |
5. Epoch pools
5.1 Lifecycle
| Phase | Window | What happens |
|---|---|---|
| Funding | from 28 days to 3 days before start | Deposit or withdraw ETH 1:1 |
| Selling | the 3 days before start | Caps are sold; liabilities are locked |
| Live | 7 days | The oracle samples the basefee |
| Settling | after end, once the oracle is final | Anyone calls settle() and is paid a small reward |
| Settled / Void | — | Claims are open and can never be paused |
5.2 Why isolated pools
Pooled options vaults have a well-known flaw: if NAV ignores open liabilities, depositors join after good news and leave before bad news. Basalts removes the problem through ordering:
- Everyone in pool e deposits before any risk is sold, at the same 1:1 price.
- Nobody can enter or exit while risk is open.
- The pool's final assets are
capital + premiums − payouts − performance fee, shared pro rata.
5.3 Continuous deployment
A pool settles about 1 hour after its week ends (or 28 hours at most). The next pool still open for funding is e + 2. Underwriters therefore run two staggered "lanes" (even and odd weeks).
An underwriter can approve an operator, such as the protocol keeper, with setOperator. The operator may call rollover(from, to, user), which claims a settled position and redeposits it into a later funding pool in the user's name. An operator cannot withdraw funds anywhere else.
5.4 Incentives
Anyone can attach BSLT to a pool with addIncentives. It is distributed pro rata to that pool's underwriters at claim time. There is no reserved incentives allocation; incentives are funded from tokens bought on the market.
6. The BSLT token
6.1 Supply and fair launch
The supply is 1,000,000,000 BSLT, minted once in the constructor. There is no mint function, no blacklist and no pause. There is no team, treasury or incentives allocation: every token goes to the launch curve.
| Tranche | Share | How |
|---|---|---|
| Launch curve | 80% | Sold by BondingCurve along a constant-product curve with a virtual ETH reserve, so the launch needs no seed liquidity. Anyone can buy, and sell back, at the curve price. |
| Uniswap liquidity | 20% | Added by the curve itself when it sells out, together with all the ETH it raised (about 5 ETH). The pool's LP tokens are burned, so the liquidity is locked forever. |
- The curve's virtual token reserve is chosen so the Uniswap listing price equals the curve's final price: graduation causes no price jump.
- The curve starts at a market cap of about 1.56 ETH and sells out at about 5 ETH raised (net of fees).
- Dev buy. The dev wallet buys 1 ETH of BSLT in the same transaction that opens the curve, so nobody can buy ahead of it. With these parameters that is about 395M BSLT (about 39.5% of supply). The dev wallet is an ordinary holder: it can sell, and its balance is shown on the launch page.
- Until graduation the token's trading switch is off: holders can trade with the curve and stake, but cannot move BSLT into a Uniswap pair, so nobody can seed the pool early at a different price. Graduation turns trading on and hands token ownership to the timelock.
- Rounding in the curve always favours the curve (x*y >= k after every trade), so the ETH it holds always covers buying back every sold token. An invariant test checks this.
6.2 Utility
- ETH yield. Stake in Bedrock to receive 40% of all protocol revenue in ETH, streamed over 7 days.
- Fee discounts. Stakers pay 10%, 25% or 40% less cover fee at 10k, 100k or 1M BSLT staked. Discounts apply to the fee only, never the premium, so underwriters always receive the full risk price.
- Governance. Staked weight votes on Snapshot. The multisig executes passed votes through the 48-hour timelock.
- Scarcity. 20% of revenue buys BSLT on the market and burns it.
6.3 Fees and trading tax
- On the launch curve: 2% of every buy and sell, in ETH, goes to the dev wallet.
- After listing: 2% on buys and 2% on sells, applied only to registered AMM pairs. Wallet-to-wallet transfers are never taxed.
- A hard cap of 5% per side is enforced in bytecode. Changes go through the timelock.
- Tax tokens collect in the
TaxCollector. A keeper converts them to ETH in a separate transaction with an explicitminOut, typically sent through a private RPC, and sends the ETH to the dev wallet. The token never swaps inside a user's transfer, which avoids the reentrancy, sandwich and failed-transfer problems common to "auto-swap" tax tokens. The recipient is a setting: governance can redirect the tax to the Revenue Router, which shares it with stakers. - Stakers are paid from protocol fees, not from the trading tax.
6.4 Launch protections
enableTrading()is one-way; the curve calls it at graduation.- The launch max-wallet limit is removed before the curve opens (a bonding curve prices large buys itself).
- The deployer's exemption is revoked when it hands the supply to the curve; only protocol contracts are exempt.
7. Revenue and circulation
7.1 Inflows (all in ETH)
| Source | Rate | When |
|---|---|---|
| Cover fee | 15% of premium (before discount) | At purchase; held in the pool until settlement so it can be refunded if the epoch voids |
| Performance fee | 10% of a pool's positive underwriting profit | At settlement |
7.2 Distribution (RevenueRouter.distribute(), permissionless)
| Destination | Default | Bound |
|---|---|---|
| Bedrock stakers | 40% | ≥ 20% |
| Buyback & burn | 20% | — |
| Treasury | 30% | ≤ 50% |
| Keeper reserve (pays oracle samplers) | 10% | ≤ 20% |
If nothing is staked, the stakers' share is added to buyback & burn.
7.3 The loop
- Hedgers pay premiums. Underwriters earn them by supplying the depth hedgers need.
- Each sale and each profitable settlement pays fees to the router.
- The router pays stakers in ETH and burns BSLT, so BSLT demand rises with usage.
- Incentives paid in BSLT become worth more as fees rise, which attracts more underwriting depth.
- Keepers are paid from fees, so the oracle runs without a company behind it.
8. Contracts
| Contract | Role |
|---|---|
BasefeeOracle |
Header-proof sampling, epoch averages and finality, pricing reference, keeper reserve and rewards |
CoverPricer |
Black-76 pricing with the spike regime, utilisation loading, bounded risk parameters |
CoverMarket |
Epoch pools, deposits and withdrawals, cap sales, settlement, claims, rollovers, incentives, pause |
CoverNFT |
ERC-721 cap receipts with on-chain SVG; minted and burned only by the market |
BasaltToken |
Fixed-supply ERC-20 with Permit and Burnable; capped AMM tax; one-way launch switches |
BondingCurve |
Fair launch: sells BSLT on a virtual-reserve curve, opens with the atomic dev buy, and lists on Uniswap V2 with burned LP when it sells out |
TaxCollector |
Holds the tax; a keeper converts it to ETH with slippage bounds and sends it to the dev wallet; it can never withdraw BSLT |
Bedrock |
BSLT staking: 7-day ETH reward streaming, cooldown, discount tiers |
RevenueRouter |
Splits ETH revenue; bounded buyback-and-burn |
TeamVesting |
OpenZeppelin VestingWalletCliff; deployed only if a team allocation is configured (none in this launch) |
TimelockController |
OpenZeppelin; 48 h delay; the multisig is proposer and executor; no admin |
How a purchase and a settlement flow through the contracts:
buyer ──buyCover{ETH}──► CoverMarket ──quote──► CoverPricer
│ ▲ ▲
│ └─pricingReference───┤
│ BasefeeOracle ◄── recordSample(header) ── keepers
├─mint──► CoverNFT
settle() ───────────────────► │ ──fees──► RevenueRouter ──► Bedrock / treasury / oracle reserve
└──buybackAndBurn──► Uniswap ──► burn BSLT
BSLT on the curve ──2% fee──► dev wallet
BSLT on Uniswap ──2% tax──► TaxCollector ──convert──► dev wallet
8.1 Invariants (tested)
- Solvency. Every wei that enters a pool (capital, premium or fee) leaves through exactly one path: payout, refund, underwriter share, revenue, or settler reward. Rounding dust is at most 1 wei per underwriter. This is fuzzed over 1,024 random scenarios in
Solvency.t.sol. locked ≤ capital × maxUtilat all times.- The sum of individual cap payouts equals the pool's computed payout exactly.
- Claims and withdrawals are never pausable.
- A forged header, or one outside its window or outside provable history, can never be recorded.
9. Governance and security
9.1 Roles
| Role | Holder | Can | Cannot |
|---|---|---|---|
| Owner | Timelock (48 h), with the multisig as proposer and executor | Change parameters within the hard caps in code; swap the pricer; set addresses | Mint BSLT; tax above 5%; take user funds; block claims; change an epoch's coverage rule |
| Guardian | Multisig | Pause new sales and deposits | Pause claims, withdrawals or settlement |
| Risk Manager | Multisig or risk desk | Tune pricing inside the owner's bounds | Leave those bounds |
| Keeper | Hot wallet | Record samples, settle, roll positions for users who opted in, convert tax, buy back within limits | Anything custodial |
9.2 Engineering practices
- Solidity 0.8.28; OpenZeppelin 5.4; Solady fixed-point maths.
ReentrancyGuardon every external entry point that moves value. Checks-effects-interactions throughout. Narrowing casts useSafeCast.- No
delegatecall, no upgradeable proxies, and no external price feeds. - Test suite: 64 Foundry tests (unit, fuzz, deploy-script wiring), a vitest suite that checks header encoding against a real mainnet block, and a full lifecycle run on a local chain with the real keeper.
- Before mainnet: an independent audit (two firms recommended for the oracle and market) and a public bug bounty.
10. Risks
- Model risk. Basefee is fat-tailed and regime-switching. Underwriters can lose a large share of a pool's locked capital in a congestion week. That is the product working as designed, and it is disclosed on every underwriting screen.
- Liveness. If no keeper records samples, the epoch voids and everyone is made whole. Anyone can run the keeper.
- Protocol changes. A hard fork that changes how headers or the basefee work could break the oracle. Basalts depends only on header field indices 8, 11 and 15 and on EIP-2935. If either changes, the owner can pause sales while a new oracle and market are deployed. Open pools can still settle or void safely.
- Smart-contract risk. Mitigated by tests and audits, never eliminated.
- Token risk. BSLT price can fall. Yield depends on usage.
- Regulatory risk. Gas Caps are derivative-like and BSLT shares revenue. The operators must obtain legal advice for each launch jurisdiction, and may need to geofence the interface or restrict who can access it.
11. Roadmap
- Launch: weekly epochs on mainnet; BSLT fair launch on the bonding curve, then Uniswap; Bedrock.
- Integrations: a paymaster SDK that buys caps automatically; an ERC-4626 "gas budget" vault for DAOs and agents; Safe and Kohaku wallet modules.
- Blob gas caps. Separate pools on the blob basefee, once the fork schedule (BPO forks, EIP-7918's floor) stabilises enough to reconstruct the blob basefee from headers.
- Daily epochs for active desks, and an on-chain RFQ layer so market makers can quote inside the pool price.
Basalts is software. Nothing in this paper is an offer of securities or investment advice.