THERM
Buying therms

Buying therms

How the quote curve prices a pass, with a worked example, and why a locked rate is never re-priced.

Every pass is priced by the same public rule. There are no negotiated rates, no discounts for size, and no hidden inputs: anyone can recompute a quote from on-chain data.

The formula#

The offered rate is built from three pieces.

text
reference fee   = max(current base fee, trailing 1-hour average base fee)
curve multiplier = 1                                  if coverage ≥ 2.0
                 = 1 + 0.75 × (2.0 − coverage)        if 0.5 ≤ coverage < 2.0
                 = sales paused                       if coverage < 0.5
offered rate    = reference fee × 100,000 × curve multiplier      (gwei per therm)

Then the premium is applied to your deposit:

text
net deposit = USDG in ÷ 1.03
premium     = USDG in − net deposit
therms      = (net deposit ÷ ETH price) ÷ (offered rate × 10⁻⁹)

The net deposit is converted to ETH at purchase and stays in the pool as ETH. Therms are denominated in gas, and gas is paid in ETH, so the pool holds the asset it will eventually spend.

Why the reference fee uses the maximum#

Taking the greater of the current and trailing base fee closes an obvious hole. Without it, the cheapest moment to buy would be the first seconds of a spike, before the average catches up, and a buyer could lock a calm-period rate and immediately burn it at spike prices. Pricing off the maximum means the pool never sells below what gas costs right now.

Why the curve rises as coverage falls#

Coverage is the pool's reserves relative to its outstanding obligations at today's base fee. When coverage is high, the pool can take on more risk at the base price. As it falls, each new therm sold adds risk to a thinner cushion, so the price of that risk rises. Below 0.5×, the pool stops selling entirely until coverage recovers. This is the same logic an insurer uses when its reserves are stretched: raise premiums, then stop writing new policies.

The curve is linear on purpose. It is easy to reason about, easy to verify, and has no cliffs other than the pause.

Worked example#

Assume the current base fee is 0.13 gwei, the trailing one-hour average is 0.15 gwei, and ETH is $3,000. The reference fee is therefore 0.15 gwei, and the base rate before the curve is 0.15 × 100,000 = 15,000 gwei per therm.

You deposit 1,000 USDG. The premium is 29.13 USDG, leaving a net deposit of 970.87 USDG, which buys 0.323625 ETH of gas at purchase.

CoverageMultiplierOffered rate (gwei/therm)Therms for 1,000 USDG≈ Swaps at 320k gas
3.00×1.00015,00021,575.06,742
2.00×1.00015,00021,575.06,742
1.50×1.37520,62515,690.94,903
1.00×1.75026,25012,328.63,853
0.75×1.93829,06311,135.53,480
0.50×2.12531,87510,152.93,173
below 0.50×Sales paused

At healthy coverage, 1,000 USDG buys roughly 21,575 therms, enough gas for about 6,700 stock-token swaps. The same deposit at 1.0× coverage buys 43% fewer therms. That is the curve doing its job: when the pool is stretched, new buyers pay for the extra risk they add.

The rate is locked at purchase#

Once your pass confirms, its rate is final. Therm will never:

  • re-price therms you already hold, up or down;
  • charge a top-up if the base fee rises after you buy;
  • claw back therms if coverage falls;
  • apply a parameter change retroactively.

What you bought is 100,000 gas per therm at the rate on your pass, for as long as you hold it. If the base fee later falls below your locked rate, you do not get a refund of the difference; if it rises above it, you do not pay the difference. That symmetry is the product.

Slippage protection#

The quote can move between the moment you see it and the moment your transaction lands, because the base fee and coverage change every block. The buyPass call takes a minTherms argument. If the pass would mint fewer therms than that, the transaction reverts rather than filling at a worse rate. The app sets minTherms to 0.5% below the displayed quote by default; integrators should choose their own tolerance.

Size limits#

There is no minimum beyond 1 USDG and no maximum pass size, but a very large pass moves coverage down, and the curve is evaluated on coverage before the pass. A buyer who wants to avoid moving the price against later purchases should split a large order across several blocks and watch coverage between them.