Skip to main content

Exits and the resolution fee curve

Exiting retires one or more of a charter's open branches for a pro-rata share of the reserve, paid out as STANDARD you then realize as ETH by selling into the pool. It costs a resolution fee, taken as a percentage of the withdrawal before the remainder is realized.

Exit pressure: the input to the fee

Exit pressure gauges how much withdrawal demand the reserve is absorbing right now, relative to what it's currently holding. The mainnet formula, validated against the Central Bank's own previewResolutionFeeWad view to roughly 1e-17 precision at seven test points (formula_version: mainnet-exit-2026-09-15, basis: derived):

denom    = max(bank_total_pending_live, PRESSURE_DENOMINATOR_FLOOR)
pressure = min(withdrawn_7d / denom / PRESSURE_SATURATION, 1)

withdrawn_7d is a trailing 7-day sum of STANDARD actually withdrawn, not a single day's figure, and not reset at a fixed calendar boundary; it's a rolling window. bank_total_pending_live is the reserve's current pending (held, not-yet-withdrawn) balance, floored at a fixed constant so the ratio doesn't blow up when the pending balance is small. The result is normalized to run from 0 (no pressure) to 1 (fully saturated).

This is the formula the deployed contract computes; the whitepaper's own draft, P_exit = W / max(D+W, min_reserve), is not what it runs. GET /v1/exit-pressure/history rows carry their own formula field precisely so a caller can tell which formula produced a given row; rows_without_formula in the response counts rows that predate that field, so they aren't silently misread as validated against it.

The fee: pressure-based and quadratic

fee = FEE_MIN + (FEE_MAX − FEE_MIN) · pressure²

The fee rises with the square of pressure, not linearly: it stays close to the floor for most of the pressure range and accelerates only as pressure approaches saturation. FEE_MIN and FEE_MAX are chain-read constants (GET /v1/constants), and the fee moves with everyone's recent withdrawal behavior, not just yours. The same withdrawal quoted at low system-wide pressure and at high pressure can come back with very different fees.

What each route actually gives you

  • GET /v1/charters/{id}/exit-quote (1s_std_exit_quote), your specific quote right now: gross, fee, net, and realizable_eth (an estimate of net ETH from selling into the pool, estimate: true, carrying assumptions[]).
  • GET /v1/exit/fee-curve (1s_std_exit_fee_curve), the fee rate at six points along a withdrawal-size ladder (1%, 5%, 10%, 25%, 50%, 100% of the reserve's pending balance), so you can see how the fee would move at a larger or smaller size than yours.
  • GET /v1/exit/fee-forecast (1s_std_exit_fee_forecast), a no-further-exits projection: how the system-wide fee would drift down if nobody else exits between now and a future point. Labeled as a projection, never a prediction.
  • GET /v1/exit-pressure/current and /history (1s_std_exit_pressure), the raw pressure snapshot and its trend over time.

realizable_eth and every point on the fee-curve ladder are estimates: a single-range constant-liquidity approximation of the Uniswap v4 swap (it doesn't model the trade crossing into an adjacent initialized tick), plus whichever side of the trade the sell tax applies to. Re-quote right before transacting instead of caching either number. See How to read a TSR response for what assumptions[] covers on estimate fields generally.

Where to look

QuestionRouteMCP tool
What would I actually net if I exit now?GET /v1/charters/{id}/exit-quote1s_std_exit_quote
How does the fee change at other withdrawal sizes?GET /v1/exit/fee-curve1s_std_exit_fee_curve
Where is the fee headed if nobody else exits?GET /v1/exit/fee-forecast1s_std_exit_fee_forecast
Everything above, bundled into one callGET /v1/decisions/exit1s_std_decision_exit

See Deciding with the data for the "should I exit now" decision walkthrough, including the launch-tax interaction on realizable_eth.