Skip to main content

The fee model

Stable AMM uses the same fee structure as AMM v4. There is only one fee tier per pool (set at initialization); pools cannot be reconfigured into higher tiers.
FieldDefaultMeaning
swap_fee_numerator / swap_fee_denominator25 / 10_000Gross trade fee: 0.25% of input volume.
trade_fee_numerator / trade_fee_denominator25 / 10_000Same 0.25%; legacy field formerly used for OpenBook order pricing, retained for layout compatibility.
pnl_numerator / pnl_denominator12 / 100Protocol’s share of the fee: 12% — i.e., 0.25% × 12% = 0.03% of volume.
min_separate_numerator / min_separate_denominator4 / 10_000Internal rounding floor.
There is no fund-fee and no creator-fee line — these are post-AMM v4 inventions (CPMM/CLMM). Stable AMM predates that convention.

How the split is computed

On each swap:
gross_fee = ceil(amount_in * (swap_fee_numerator / swap_fee_denominator))    // e.g., 0.25% of amount_in
pnl_portion = gross_fee * (pnl_numerator / pnl_denominator)                  // 12% of gross_fee
lp_portion = gross_fee − pnl_portion                                          // 88% of gross_fee
  • lp_portion stays in the vault, inflates k, and benefits LPs on redemption.
  • pnl_portion increments AmmInfo.out_put.need_take_pnl_coin or need_take_pnl_pc (depending on the input token) and is swept by WithdrawPnl.
Same invariant-preserving trick as CPMM: the PnL amount sits in the vault physically but is subtracted from the “effective reserves” used in the curve math, so removing it does not shift the price.

OpenBook PnL (retired)

Early in its life, the pool also posted limit orders on OpenBook; when those filled, it earned or lost the market-maker/taker spread, settled during MonitorStep, and tracked the result in the out_put.total_pnl_{coin,pc} counters. That path has been dormant for years — the pool holds no open orders, so the only fee accrual is the 0.03% protocol share described above. The total_pnl_* counters remain in the layout but no longer increment. The 2026-06-22 upgrade removed the leftover OpenBook code (including MonitorStep). CPMM became the default for new pools partly because of this former coupling to OpenBook; Stable AMM is order-book-independent.

Collection

The Raydium multisig (or whoever controls amm_admin) calls WithdrawPnl to sweep:
  1. Transfers need_take_pnl_coin and need_take_pnl_pc from vaults to admin-designated accounts.
  2. Zeroes the counters.
The operation does not move the curve. LPs see no price change.
WithdrawPnl was changed in the 2026-06-22 upgrade: it now uses a fixed 10-account, admin-only layout with no compatibility path (old layouts fail with errors such as InvalidTokenCoin), and when the pool’s available funds are insufficient to cover the PnL it returns TakePnlError directly instead of disabling the pool. See products/stable/instructions.

LP fee redemption

No dedicated “collect fees” instruction. LP fees accumulate in vaults, inflating the reserves. LPs realize them by burning LP via Withdraw. The value of an LP token grows as reserves grow.

Visualization: where $1,000 of volume goes

On a USDC-heavy Swap of $1,000 against a default-parameter Stable pool:
Gross trade fee (0.25%):     $2.50
  LP share   (0.22%):         $2.20  → stays in pool, raises k
  PnL share  (0.03%):         $0.30  → need_take_pnl_pc, swept by WithdrawPnl
User receives (minus curve):  $997.50
Compare to AMM v4 (identical) and CPMM (0.25% tier, no creator fee): CPMM gives LPs $2.10, protocol $0.30, fund $0.10.

Comparison table

Stable AMMAMM v4CPMM index=0
Trade fee0.25%0.25%0.25%
LP0.22%0.22%0.21%
Protocol0.03%0.03%0.03%
FundNoneNone0.01%
CreatorNoneNone0 by default
Full matrix: reference/fee-comparison.

Integrator notes

  • Quoting: Always read AmmInfo from the chain; do not hardcode fees. With SetParams now removed, the fee parameters on existing pools are effectively fixed.
  • Curve vs. fees: The 0.25% fee is independent of whether the curve is a formula (x·y=k in AMM v4) or a lookup table (Stable). Both apply the same 0.25% to the input amount.
  • No rewards: Stable pools do not support on-pool reward emissions. Ecosystem farms (Farm v3/v5/v6) handle staking elsewhere.

Where to go next

Sources:
  • raydium-stable/program/src/state.rs (Fees struct)
  • On-chain AmmInfo.fees fields on live mainnet pools