Skip to main content

The fee model

Stable AMM reuses AMM v4’s Fees struct, but not AMM v4’s numbers. Stable pools charge a far lower fee, which is what you would expect from a pool designed for like-priced assets. There is only one fee tier per pool (set at initialization); pools cannot be reconfigured into higher tiers.
These are not “defaults” — they are the values on every live mainnet Stable pool. All three (USDT/USDC 2EXiumdi14E9b8Fy62QcA5Uh6WdHS2b38wtSxp72Mibj, 9DTY3rv8xRa3CnoPoWJCMcQUSY7kUHZAoFKNsBhx8DDz, 9f4FtV6ikxUZr8fAjKSGNPPnUHJEwi4jNk8d79twbyFf) carry the identical set above, and with SetParams removed in the 2026-06-22 upgrade there is no longer any instruction that can change them. Verified by decoding AmmInfo.fees from mainnet.
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:
  • 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.0024% 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 $10,000 of volume goes

On a USDC-heavy Swap of $10,000 against a live Stable pool:
The same $10,000 through an AMM v4 pool pays $25.00, and through a CPMM index=0 pool $25.00 — 12.5× more. That gap is the point of the product: stable pairs move very little, so LPs need very little compensation for inventory risk, and the tight curve plus the low fee is what keeps large stable-to-stable swaps competitive.

Comparison table

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.
  • Don’t assume AMM v4’s rate. The Fees struct is shared with AMM v4, so it is easy to copy AMM v4’s 25 / 10_000 into a Stable quote. Stable pools charge 2 / 10_000. Quoting a Stable pool at 0.25% overstates the fee by 12.5×.
  • Curve vs. fees: Fee application is independent of whether the curve is a formula (x·y=k in AMM v4) or a lookup table (Stable). Both take the fee off the input amount before touching the curve.
  • 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