Quote-token fee pools
Detailed fee accounting for Stream and Lighthouse pools.
Stream and Lighthouse pools charge the configured fee only in the immutable quote token. The mechanism changes fee denomination, not the concentrated-liquidity curve.
Why designate a quote token
In a conventional pool, providers collect whichever token traders input. Fee inventory therefore changes with trade direction. A quote-token fee pool instead makes both directions accrue fees in one asset selected when the pool is created.
For a TOKEN/USDC pool with USDC as quote:
- A trader buying TOKEN inputs USDC. The fee is taken from gross USDC input.
- A trader selling TOKEN receives USDC. The fee is taken from gross USDC output.
The provider's earned swap fees remain USDC in both cases. This does not eliminate inventory exposure. The underlying concentrated-liquidity position still changes composition as price moves.
Exact-input buy
When quote is the input token, the submitted gross quote amount G includes the fee. With fee rate f and denominator D = 1,000,000:
fee = ceil(G * f / D)
curveInput = G - feeAt a 0.30% tier, a gross input of 1,000,000 quote base units produces a fee of 3,000 units and sends 997,000 units into curve movement.
Exact-input sell
When quote is the output token, curve math first determines gross quote output C. The pool removes the quote fee before delivering output:
fee = ceil(C * f / D)
traderOutput = C - feeThe trader inputs the base token without a base-token fee. Part of the gross quote output remains in the pool as the fee.
Exact-output buy
When a swap requires net curve input N after an input-side quote fee:
grossInput = ceil(N * D / (D - f))
fee = grossInput - NThe ceiling makes the gross payment sufficient after integer rounding.
Exact-output sell
When the trader requests net quote output N, the curve must produce enough gross quote to cover both output and fee:
curveOutput = ceil(N * D / (D - f))
fee = curveOutput - NExact-output execution delivers the requested net amount only when the pool can fill it within the price limit and input maximum.
Rounding and no-progress steps
Fees round upward where necessary to preserve pool solvency. A paid step that would charge a fee while moving zero curve input and zero curve output reverts. This prevents a nominally filled step that made no economic progress.
Splitting a trade can change individual rounding boundaries. The arithmetic is designed so splitting or reversing trades cannot use rounding to extract unbacked value from the pool.
LP and protocol allocation
Each paid step divides its quote-token fee between active liquidity and protocol accrual. The default protocol denominator is 6:
protocolFee = floor(stepFee / 6)
lpFee = stepFee - protocolFeeThis is approximately one sixth of the fee for the protocol and five sixths for active liquidity, subject to per-step floor rounding. Governance can set a pool denominator to 0, which disables the protocol share, or to an integer from 4 through 10. A value is loaded once for a swap, so changes affect later swaps only.
Fees are allocated before crossing the next tick. Only liquidity active during that step earns the LP portion.
Structural quote-only accounting
For quote profiles:
- base-token fee growth remains zero;
- base-token protocol accrual remains zero;
- permitted flash borrowing is quote-token only;
- a flash callback that increases the base-token balance reverts; and
- unsolicited base-token transfers are surplus, not LP or protocol fee claims.
Anyone may call claimProtocolFees(). The pool reduces accounting before transfer and always sends claimed assets to the immutable FeeVault. The caller cannot select the recipient.
Risks and tradeoffs
Quote-only fees concentrate earned fees in one asset, but they do not guarantee that the asset is stable, redeemable, liquid, correctly labeled, or valuable. The factory does not approve quote tokens. Providers must verify the quote contract and evaluate its economic and technical risks.