Signals v1 realizes maker-side performance once per day. At that daily batch
boundary, trading PnL and gross fees are turned into an explicit allocation
across the maker capital stack.
This page describes the fee waterfall as an algorithm. It is the accounting
rule that maps a day into:
- the LP credit for the day,
- the new backstop balance,
- and the new treasury balance.
Ordering and rounding are fixed so the same day inputs produce the same outputs.
The waterfall is defined as an algorithm, not as a discretionary process.
State and notation
The waterfall takes a pre-batch state and a day input.
Pre-batch state:
- Nt−1: maker NAV before the day, WAD
- Bt−1: backstop NAV before the day, WAD
- Tt−1: treasury NAV before the day, WAD
Day inputs:
- Lt: maker trading PnL for the day, signed WAD
- Fttot: gross fees generated during the day, WAD
Policy and safety configuration:
- ΔEt: tail budget available for backstop support, WAD
- pdd∈(−1,0): drawdown floor parameter, WAD
- ρBS: backstop coverage ratio, WAD
- ϕLP,ϕBS,ϕTR: residual fee split weights, WAD
Throughout, "WAD" means 1018 fixed-point units. Token-level rounding is a
separate surface; the waterfall itself is defined at WAD precision.
Two validity constraints are enforced by the mechanism:
ϕLP+ϕBS+ϕTR=1
−1<pdd<0
Algorithm
The waterfall is easiest to read as five steps. Each step produces intermediate
values that also act as safety checks.
Step 1: Loss compensation from fees
Define the negative part of the day PnL:
Lt−=max(0,−Lt)
Use gross fees to compensate losses first, up to the magnitude of the loss:
Ftloss=min(Fttot,Lt−)
The remaining fee pool is:
Ftpool=Fttot−Ftloss
Define NAV after applying trading PnL and loss compensation:
Ntraw=Nt−1+Lt+Ftloss
Catastrophic losses that would make Ntraw negative are rejected by
reverting the batch.
Step 2: NAV floor and backstop grant
The waterfall enforces a NAV floor derived from the prior NAV:
Ntfloor=⌈Nt−1⋅(1+pdd)⌉
The ceiling is intentional. It makes the floor conservative in the direction
that increases the required grant.
Grant need is the shortfall below the floor:
Gtneed=max(0,Ntfloor−Ntraw)
Two safety constraints are enforced as hard reverts:
Gtneed≤ΔEt
Gtneed≤Bt−1
If both hold, the grant is applied without further capping:
Gt=Gtneed
After the grant:
Ntgrant=Ntraw+Gt
Btgrant=Bt−1−Gt
Step 3: Backstop coverage fill from fees
The backstop has a target balance proportional to maker NAV:
Bttarget=ρBS⋅Ntgrant
The amount needed to reach the target is:
ΔBtneed=max(0,Bttarget−Btgrant)
Fees fill the backstop toward the target before any residual split:
Ftfill=min(ΔBtneed,Ftpool)
The remaining fee amount after fill is:
Ftremain=Ftpool−Ftfill
Step 4: Residual split with dust to LP
Residual fees are split by weights. The split uses floor arithmetic:
FLPcore=⌊Ftremain⋅ϕLP⌋
FBScore=⌊Ftremain⋅ϕBS⌋
FTRcore=⌊Ftremain⋅ϕTR⌋
Because each component is floored, a remainder exists:
Ftdust=Ftremain−FLPcore−FBScore−FTRcore
That dust is assigned to LP.
Step 5: Output balances
Define the total fee credited to LP:
Ft=Ftloss+FLPcore+Ftdust
The pre-batch NAV used by vault share accounting is:
Ntpre=Ntgrant+FLPcore+Ftdust
The next backstop and treasury balances are:
Bt=Btgrant+Ftfill+FBScore
Tt=Tt−1+FTRcore
Revert surface and hard constraints
The waterfall executes as contract logic and has explicit revert conditions.
Parameter validity:
- The residual weights must sum to one exactly at WAD precision:
ϕLP+ϕBS+ϕTR=1.
- The drawdown floor parameter must satisfy −1<pdd<0.
Day safety:
- Catastrophic loss that would push maker NAV negative causes a revert.
- Tail budget violation causes a revert:
Gtneed>ΔEt ⇒ revert
- Backstop insufficiency causes a revert:
Gtneed>Bt−1 ⇒ revert
These constraints define what it means for a day to be processable by the maker
accounting layer.
Rounding and dust
Rounding is part of the contract.
Two details are easy to miss:
- The NAV floor uses a ceiling. It is computed conservatively high, which can
increase grantNeed by at most one unit of WAD rounding.
- The residual split uses floor arithmetic. The remainder becomes
Ftdust and is assigned to LP.
Dust is bounded by fixed-point arithmetic. It is not a discretionary pool and it
does not accumulate as an ambiguous residual.
Worked examples
Examples are shown in whole tokens for readability. Internally they correspond
to WAD values.
Example A: Gain day with residual split
Assume:
- Nt−1=1,000
- Bt−1=200
- Tt−1=0
- Lt=+8
- Fttot=12
- ρBS=0.2
- ϕLP=0.7, ϕBS=0.2, ϕTR=0.1
Loss compensation is zero because Lt−=0, so Ftloss=0 and
Ftpool=12. NAV after the day is Ntraw=1008.
With no grant, Ntgrant=1008 and Btgrant=200.
Backstop target is Bttarget=0.2⋅1008=201.6, so
ΔBtneed=1.6 and Ftfill=1.6.
Residual fees are Ftremain=10.4. The floor split gives:
FLPcore=⌊10.4⋅0.7⌋,FBScore=⌊10.4⋅0.2⌋,FTRcore=⌊10.4⋅0.1⌋
Any rounding remainder becomes Ftdust and is credited to LP. The
outputs follow mechanically from the formulas above.
Example B: Loss day that triggers a grant
Assume:
- Nt−1=1,000
- Bt−1=200
- Tt−1=0
- Lt=−450
- Fttot=10
- pdd=−0.3
- ΔEt=200
Loss compensation uses fees first:
Lt−=450,Ftloss=min(10,450)=10,Ftpool=0
NAV after loss compensation is:
Ntraw=1000−450+10=560
The NAV floor is Ntfloor=⌈1000⋅0.7⌉=700, so
the grant need is:
Gtneed=700−560=140
Both safety constraints hold in this setup: 140≤ΔEt and
140≤Bt−1. The batch applies Gt=140, bringing maker NAV back to the
floor for the next day:
Ntgrant=560+140=700,Btgrant=200−140=60
With Ftpool=0, there is no backstop fill and no residual split on
this day. The update is entirely the PnL realization plus the floor grant.
Example C: Loss day that reverts under tail budget
Assume:
- Nt−1=1,000
- Bt−1=200
- Lt=−700
- Fttot=0
- pdd=−0.3
- ΔEt=100
Then Ntraw=300 and Ntfloor=700, so
Gtneed=400. Because 400>ΔEt, the batch reverts.
This is intended behavior. Tail budget is the mechanism-level bound on how much
backstop support can be required by the NAV floor rule for that batch.