NAV, decay & funding

The mechanics behind a coin's backing: how NAV moves, and the two running costs that act on it.

NAV, net asset value, is what one unit of a leveraged token is worth: the real perp position's equity divided by the LT's supply. It moves like this, where L is 5 — negative for a short — and P is the underlying's price:

NAV_t = NAV_{t-1} × [1 + L × (P_t − P_{t-1}) / P_{t-1}]

The key word is multiplicative. NAV compounds off its own previous value, not off the launch value. That single fact produces everything else on this page.

Decay

Constant leverage is not "the underlying's return, times five". Take a 5× long over two periods, up 5% then down 5%:

  1. Start: underlying $100.00, NAV 1.0000
  2. +5%: underlying $105.00, NAV = 1.0000 × (1 + 5×0.05) = 1.2500
  3. −5%: underlying $99.75, NAV = 1.2500 × (1 − 5×0.05) = 0.9375

The underlying finished 0.25% down — essentially flat. The position is down 6.25%, twenty-five times worse.

That's decay: the structural cost of holding constant leverage through volatility. It isn't a fee or bad execution — it falls straight out of the compounding formula, and it scales sharply with leverage. The same round trip costs 1.0% at 2× and 25% at 10×; perp.fun sits at 5×.

Direction matters less than shape. Constant-leverage exposure compounds in your favour through a sustained trend and against you through oscillation, so a month of chop costs real value even when the underlying finishes where it began.

Wipe risk

At 5×, a −20% move in the underlying between two rebalances takes NAV to zero. Arithmetically, not approximately.

Rebalancing is what stands between the position and that number: the keeper adjusts notional continuously to hold target leverage, so a −20% move arriving over hours is survivable because the position de-risks as it goes down. A −20% move arriving in one gap is not. That's why the keeper runs continuously and why its uptime is treated as a safety property rather than an ops detail.

Funding

A perpetual has no expiry, so the two sides pay each other a periodic funding rate to keep the perp anchored to spot. When the perp trades above spot, longs pay shorts; below, shorts pay longs.

For a coin's hedge this is a continuous drain or credit on the backing. It scales with notional rather than equity, so a 5× position pays funding on five times its capital. On a crowded long it's persistently negative for longs — normal, not something going wrong, and it never stops while the position is open. It accrues whether or not anyone trades your coin.

So a coin's backing bleeds slightly even when the underlying doesn't move: decay from volatility, funding from time.

Putting it together

Three forces act on the backing at all times. Direction helps in a sustained trend your way and hurts in a sustained trend against you. Decay never helps — it costs you every time the underlying oscillates. Funding usually hurts, because you're generally on the crowded side.

Only the first can be positive, which is why the design pushes gains out through buybacks quickly instead of letting them sit and decay.

What this suits is a directional view over a short horizon. What it doesn't suit is a long-term hold or a route to plain spot exposure — for that, the underlying itself is the better instrument.

How NAV gets on-chain

The contracts can't see Lighter, so the keeper computes NAV from the position's real equity, signs it with EIP-712, and posts it to that LT's oracle. The oracle only accepts the authorized signer's NAV and the signer can be rotated; timestamps must be strictly increasing, so a replayed or reordered post is rejected; a NAV timestamped ahead of the chain is rejected; a minNav floor guards against division-by-zero and absurd posts; and past the staleness bound the money-path read reverts outright, so the vault freezes rather than transacting on an old number.

latestNav() reverts when stale and is what the vault uses; peekNav() doesn't and is what front-ends use. maxStaleness is 120 seconds, sized at eight or more times the keeper's sweep interval. Posting is movement-driven — a 5 bps delta or a 600-second heartbeat — and batched fleet-wide through NavBatchRelay, so gas scales with volatility and live-market count rather than with the size of the catalogue.

Every number on this page is reproducible offline: the model lives in keeper/hood10l/risk_engine.py with deterministic price trajectories in trajectories.py. Run python3 simulate.py decay, chop or crash.