MAINNET#— · — GWEI

Insurance against expensive gas.
Small premium now, ETH back if gas spikes.

#— · — GWEI

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:

  1. Hasu: such a market has no natural short side.
  2. 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.
  • 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:

  1. Decode the RLP list and read number (field 8), timestamp (field 11) and baseFeePerGas (field 15). Later forks only append fields, so these indices are stable.
  2. Check the window: slotStart ≤ timestamp < slotStart + 12s.
  3. Look up the canonical hash: blockhash(number) if the block is at most 256 blocks old; otherwise call the EIP-2935 history contract at 0x0000F90827F1C53a10cb7A02335B175320002935, which covers 8,191 blocks (about 27 hours).
  4. 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 /3 term 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

  1. ETH yield. Stake in Bedrock to receive 40% of all protocol revenue in ETH, streamed over 7 days.
  2. 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.
  3. Governance. Staked weight votes on Snapshot. The multisig executes passed votes through the 48-hour timelock.
  4. 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 explicit minOut, 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

  1. Hedgers pay premiums. Underwriters earn them by supplying the depth hedgers need.
  2. Each sale and each profitable settlement pays fees to the router.
  3. The router pays stakers in ETH and burns BSLT, so BSLT demand rises with usage.
  4. Incentives paid in BSLT become worth more as fees rise, which attracts more underwriting depth.
  5. 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 × maxUtil at 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.
  • ReentrancyGuard on every external entry point that moves value. Checks-effects-interactions throughout. Narrowing casts use SafeCast.
  • 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

  1. Launch: weekly epochs on mainnet; BSLT fair launch on the bonding curve, then Uniswap; Bedrock.
  2. Integrations: a paymaster SDK that buys caps automatically; an ERC-4626 "gas budget" vault for DAOs and agents; Safe and Kohaku wallet modules.
  3. 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.
  4. 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.