Improved Rewards and Compounding Pools
Release summary
What We Shipped
- Enabled quote-only fees on compounding pools by accepting
compounding_fee_bps = 0 - Improved reward, fee, and metrics handling so overflowing accumulators wrap instead of freezing the pool
Program: cp-amm 0.2.5
Program ID (mainnet and devnet): cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGGProgram PR #229Changed
CollectFeeMode::Compoundingconfigs and pools now acceptcompounding_fee_bps = 0.
Fixed
- Funding a reward while pool liquidity is very small can push
RewardInfo.reward_per_token_storedpast its upper limit. The overflow caused the following endpoints to fail permanently on the pool:add_liquidity,remove_liquidity,remove_all_liquidity,claim_reward,split_position,split_position2,fund_reward,withdraw_ineligible_rewardandwithdraw_dead_liquidity_reward. The accumulator now wraps, and a pending reward larger thanu64::MAXis clamped instead of failing. - The
RewardInfo.dead_liquidity_reward_checkpointused in thewithdraw_dead_liquidity_rewardendpoint, and thePool.dead_liquidity_fee_checkpointused in theclaim_protocol_fee2endpoint, previously rejected a quotient aboveu128::MAXand failed the instruction. This would have frozen the dead liquidity of the pool. The quotient is now reduced instead of rejected. Pool.fee_a_per_liquidityandPool.fee_b_per_liquiditypreviously rejected growth past their upper limit and failed the swap. Every later swap would have recomputed and rejected the same step, so the pool would have been frozen. Both accumulators now wrap, matchingRewardInfo.reward_per_token_stored, and a pending fee larger thanu64::MAXis clamped instead of failing.PoolMetricsandPositionMetricstotals previously rejected growth past their upper limit, which would have failed every swap on the pool and every fee claim on the position. These counters now wraps likePoolMetrics.total_positionandUserRewardInfo.total_claimed_rewards.
TypeScript SDK: @meteora-ag/cp-amm-sdk 1.5.0
SDK PR #115Changed
- Synced the IDL and bankrun program fixture to cp_amm 0.2.5.
CollectFeeMode.CompoundingacceptscompoundingFeeBps = 0. The trading fee stays claimable and is not compounded into the reserve.
Added
getDeadLiquidityRewardquotes the compounding dead-liquidity reward.
Fixed
getUnClaimLpFee,getRewardInfo, andgetUserRewardPendingwrap fee and reward accumulators the same way the program does, and clamp a pending fee or reward atu64::MAX.- Reward quotes keep the checkpoint delta when pool liquidity is zero.
getUnClaimLpFeeincludes that reward accrual, and an optionalcurrentTimeprojects emissions up to the reward end. A reward step whose time and rate do not fit in a u128 throwsMathOverflowError.getRewardInforeturns the emission in raw tokens when pool liquidity is zero. getAvailableVestingLiquiditysubtracts liquidity already released whenperiodFrequencyorliquidityPerPeriodis zero.
Support for Stock Tokens migrated from DBC
Mainnet deployment for Release 0.2.4 is planned for September 8, 2026, at 11:00 AM UTC+8 (Tuesday).
Release summary
What We Shipped
- Support for Stock Tokens migrated from DBC
What To Do
| Integrators | What Changed | What To Do |
|---|---|---|
| Partners |
|
|
Program: cp-amm 0.2.4
Program ID (mainnet and devnet): cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGGProgram PR #225Added
- Added
Config.permission. Only private configs, meaning those with apool_creator_authority, can hold permissions. The only permission so far isCreatePoolWithoutMintValidation, which letsinitialize_poolandinitialize_pool_with_dynamic_configskip the standard mint validation for trusted configs. The Token-2022 wrapped SOL is still rejected under this permission, use the SPL wrapped SOL instead.
Changed
create_configandcreate_dynamic_configtake a new trailingpermission: u128field.
Breaking Changes
EvtCreateConfigandEvtCreateDynamicConfiginclude the newpermissionfield.
TypeScript SDK: @meteora-ag/cp-amm-sdk 1.4.8
SDK PR #111Changed
- Synced the IDL and bankrun program fixture to cp_amm 0.2.4.
ConfigState.permissionis a u128 bitmask. UseisConfigPermissionAllowwithConfigPermission.CreatePoolWithoutMintValidation(bit 0) to detect configs that skip permissionless mint and token-badge checks. Token-2022 wrapped SOL is still rejected.
Added
- Added
ConfigPermissionenum andisConfigPermissionAllowhelper to read the config permission bitmask. createPool,createCustomPool,createCustomPoolWithDynamicConfig, andinitializeRewardreject Token-2022 wrapped SOL (NATIVE_MINT_2022) before sending a transaction.
Deprecation of Rate Limiter
Mainnet deployment for Release 0.2.3 is planned for August 20, 2026, at 11:00 AM UTC+8 (Thursday).
Release summary
What We Shipped
- Deprecation of Rate Limiter
- Remove stranded
DEAD_LIQUIDITYreward
What To Do
| Integrators | What Changed | What To Do |
|---|---|---|
| Partners |
|
|
Program: cp-amm 0.2.3
Program ID (mainnet and devnet): cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGGProgram PR #219Deprecated
- Deprecated
BaseFeeMode::RateLimiter. New configs and new pools can no longer be created withBaseFeeMode::RateLimiter. Existing configs withBaseFeeMode::RateLimitercan no longer be used to create new pools. - Existing pools with
BaseFeeMode::RateLimiterare unaffected. Operators can still callfix_pool_fee_params,fix_config_fee_paramsandupdate_pool_feeson existing pools and configs withBaseFeeMode::RateLimiter.
Removed
- Removed deprecated endpoints
claim_protocol_feeandzap_protocol_fee.
Fixed
- In
CollectFeeMode::Compoundingpools, the claiming fee generated by theDEAD_LIQUIDITYshare is no longer stranded in the vault. It is settled intoPool.protocol_b_feeon everyclaim_protocol_fee2, tracked by the newPool.dead_liquidity_fee_checkpointfield. Only the claiming fee (the10_000 - compounding_fee_bpsportion of the trading fee) accrues to the protocol, whereas theDEAD_LIQUIDITYshare of compounding fees intentionally remains in the reserve, benefiting LPs and traders.PoolMetrics.total_lp_b_feeandPoolMetrics.total_protocol_b_feeare left untouched since they are monotonically increasing counters. Note: actual protocol receipts = total_protocol_b_fee + settled dead-liquidity fee
TypeScript SDK: @meteora-ag/cp-amm-sdk 1.4.6
SDK PR #108Changed
- Synced the IDL and bankrun program fixture to cp_amm 0.2.3.
- Breaking:
getBaseFeeParamsno longer takestokenBDecimaloractivationType. Those arguments were only used to encode RateLimiter params, which this helper now rejects.
Deprecated
- Deprecated
BaseFeeMode.RateLimiterfor new configs and new pools.getBaseFeeParams,validatePoolFees,createCustomPool,createCustomPoolWithDynamicConfig, andcreatePoolreject RateLimiter. Existing RateLimiter pools still quote and swap.getRateLimiterParamsand the rate-limiter encode/decode helpers remain for those pools.
Position Delegate
Mainnet deployment for Release 0.2.2 is planned for June 26, 2026, at 11:00 AM UTC+8 (Friday).
Release summary
What We Shipped
- Position Delegate
- Withdraw Dead Liquidity (Compounding Pools Only)
What To Do
| Integrators | What Changed | What To Do |
|---|---|---|
| Partners |
|
|
Program: cp-amm 0.2.2
Program ID (mainnet and devnet): cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGGProgram PR #210Added
- Added support for NFT delegates to manage positions. The following endpoints can now be signed by a delegate if the owner has granted them permission:
claim_position_fee,claim_reward,add_liquidity,remove_liquidity,remove_all_liquidity,lock_position,lock_inner_position,permanent_lock_position. Note: theclose_position,split_position, andsplit_position2endpoints remain callable by the owner only. - Added new endpoint
update_delegate_permissionto set the permission bitmask onPosition.delegate_permission. Passpermission = 0to clear all permissions. Callers are responsible for managing the SPL token delegate via SPLApprove/Revokeseparately. The bitmask supports 8 permissions:AddLiquidity,RemoveLiquidity,RemoveLiquidityToOwner,ClaimPositionFee,ClaimPositionFeeToOwner,ClaimReward,ClaimRewardToOwner,LockPosition. - Added new endpoint
withdraw_dead_liquidity_rewardallowing the funder to recover the unownedDEAD_LIQUIDITYreward share of aCollectFeeMode::Compoundingpool at any time, without waiting for the reward campaign to end. This share is tracked by the newdead_liquidity_reward_checkpointfield in the PoolRewardInfo.
Changed
- Renamed the signer account from
ownertosigner, now that the signer may be a delegate, in the following endpoints:claim_position_fee,claim_reward,add_liquidity,remove_liquidity,remove_all_liquidity,lock_position,lock_inner_position,permanent_lock_position.
Breaking Changes
- The following endpoints previously rejected unauthorized signers with Anchor’s
ConstraintTokenOwner(2015) and now reject withPoolError::InvalidAuthority(6053),PoolError::InvalidPermission(6054), orPoolError::DelegatedAmountNonZero(6070):claim_position_fee,claim_reward,add_liquidity,remove_liquidity,remove_all_liquidity,lock_position,lock_inner_position,permanent_lock_position.
TypeScript SDK: @meteora-ag/cp-amm-sdk 1.4.4
SDK PR #105Added
- Added
updateDelegatePermissionendpoint to grant or revoke delegate permissions on a position. It SPL-approves the delegate on the position NFT account and sets the on-chain delegate permission bitmask in a single transaction. - Added
withdrawDeadLiquidityRewardendpoint to withdraw the reward share attributable to a compounding pool’s permanent dead liquidity. Only valid forCollectFeeMode.Compoundingpools. - Added
PositionDelegatePermissionenum andencodeDelegatePermissionshelper to build the delegate permission bitmask. - Added
UpdateDelegatePermissionParamsandWithdrawDeadLiquidityRewardParamstypes.
Changed
- Bumped the IDL and program fixture: the signer account on position instructions (
addLiquidity,removeLiquidity,removeAllLiquidity,claimPositionFee,claimReward,lockPosition,lockInnerPositionandpermanentLockPosition) was renamed fromownertosignerso a delegate can sign. SDK parameter interfaces are unchanged.
Compounding Liquidity
Mainnet deployment for Release 0.2.0 is planned for March 13, 2026, at 11:00 AM UTC+8 (Friday).
Release summary
What We Shipped
- Compounding Liquidity
What To Do
| Integrators | What Changed | What To Do |
|---|---|---|
| Swap Routers |
|
|
| Trading Terminals |
|
|
| Partners |
|
|
Program: cp-amm 0.2.0
Program ID (mainnet and devnet): cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGGProgram PR #187Added
- Pool now will track reserves balances
(token_a_amount, token_b_amount)ifpool.layout_version == 1. For pool layout_version 0, operator can call the new endpointfix_pool_layout_versionto pump pool version. - Add a new
collect_fee_mode (Compounding), in the new collect fee mode, fee will be collected in quote token, and a percentage of fee (configurable) will be added in reserves for compounding. In the new collect fee mode, the pool doesn’t have concentrated price range, instead following constant-product formulatoken_a_amount * token_b_amount = constant. - Endpoints
create_config,initialize_customizable_poolandinitialize_pool_with_dynamic_configwill allow user to create pool withcollect_fee_mode == Compounding, and config forcompounding_fee_bps.
Changed
- Related to event
EvtSwap2, inswap_resultfield,partner_feewill be replaced bycompounding_fee, now total_trading_fee will be calculated asswap_result.claiming_fee + swap_result.compounding_fee
Removed
- Removed
partnerfield from Pool struct - Removed unused
partner_feefeature and theclaim_partner_feeendpoint
Breaking Changes
- Quote function will be changed by the new fee mode
TypeScript SDK: @meteora-ag/cp-amm-sdk 1.3.7
SDK PR #101Added
- Added new
CollectFeeMode.Compoundingmode — a constant-product (x * y = k) liquidity mode where a configurable percentage of trading fees are compounded back into pool liquidity (as token B), with the remaining fees available for claiming. Pools with compounding mode do not use price ranges. - Added
LiquidityHandlerinterface and two implementations:CompoundingLiquidityHandlerandConcentratedLiquidityHandler, with agetLiquidityHandlerfactory function that dispatches based oncollectFeeMode. - Added
compoundingFeeBpsfield toPoolFeesParamsfor configuring the compounding fee split. - Added
collectFeeModeparameter togetLiquidityDelta,getDepositQuote,getWithdrawQuote, andpreparePoolCreationParams. - Added
tokenAAmount,tokenBAmount, andliquidityparameters togetDepositQuoteandgetWithdrawQuotefor compounding liquidity calculations.
Changed
- Rewrote
swapQuote.tsto useLiquidityHandlerabstraction, supporting both concentrated and compounding liquidity modes. - Fee structure:
tradingFeesplit intoclaimingFee+compoundingFeeinSwapResult2,FeeOnAmountResult, andSplitFeestypes. - Renamed
PoolVersionenum toLayoutVersion. PoolFeesParams.paddingchanged fromnumber[]tonumber.splitFeesandgetFeeOnAmountno longer accepthasPartnerparameter.getQuotetotalFeenow computed asclaimingFee + compoundingFee + protocolFee + referralFee.getQuote2return type:tradingFeeandpartnerFeereplaced withclaimingFeeandcompoundingFee.collectFeeModecomment updated:0: BothToken, 1: OnlyB, 2: Compounding.- Liquidity delta and amount functions (
getLiquidityDeltaFromAmountA,getLiquidityDeltaFromAmountB,getAmountAFromLiquidityDelta,getAmountBFromLiquidityDelta) now acceptcollectFeeModeand dispatch to the appropriate handler.
Removed
- Removed
claimPartnerFeeendpoint andClaimPartnerFeeParamstype. - Removed
partnerFeefrom fee result types (FeeOnAmountResult,SplitFees,SwapResult2). - Removed
hasPartnerhelper function. - Removed
FEE_PADDINGconstant.

