Skip to main content
Track DAMM v2 releases here.
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 #229

Changed

  • CollectFeeMode::Compounding configs and pools now accept compounding_fee_bps = 0.

Fixed

  • Funding a reward while pool liquidity is very small can push RewardInfo.reward_per_token_stored past 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_reward and withdraw_dead_liquidity_reward. The accumulator now wraps, and a pending reward larger than u64::MAX is clamped instead of failing.
  • The RewardInfo.dead_liquidity_reward_checkpoint used in the withdraw_dead_liquidity_reward endpoint, and the Pool.dead_liquidity_fee_checkpoint used in the claim_protocol_fee2 endpoint, previously rejected a quotient above u128::MAX and 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_liquidity and Pool.fee_b_per_liquidity previously 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, matching RewardInfo.reward_per_token_stored, and a pending fee larger than u64::MAX is clamped instead of failing.
  • PoolMetrics and PositionMetrics totals 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 like PoolMetrics.total_position and UserRewardInfo.total_claimed_rewards.

TypeScript SDK: @meteora-ag/cp-amm-sdk 1.5.0

SDK PR #115

Changed

  • Synced the IDL and bankrun program fixture to cp_amm 0.2.5.
  • CollectFeeMode.Compounding accepts compoundingFeeBps = 0. The trading fee stays claimable and is not compounded into the reserve.

Added

  • getDeadLiquidityReward quotes the compounding dead-liquidity reward.

Fixed

  • getUnClaimLpFee, getRewardInfo, and getUserRewardPending wrap fee and reward accumulators the same way the program does, and clamp a pending fee or reward at u64::MAX.
  • Reward quotes keep the checkpoint delta when pool liquidity is zero. getUnClaimLpFee includes that reward accrual, and an optional currentTime projects emissions up to the reward end. A reward step whose time and rate do not fit in a u128 throws MathOverflowError. getRewardInfo returns the emission in raw tokens when pool liquidity is zero.
  • getAvailableVestingLiquidity subtracts liquidity already released when periodFrequency or liquidityPerPeriod is 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

IntegratorsWhat ChangedWhat To Do
Partners
  • Support for Stock Tokens migrated from DBC
  • Bump your SDK version to @meteora-ag/cp-amm-sdk@1.4.7-rc.0 to start testing.

Program: cp-amm 0.2.4

Program ID (mainnet and devnet): cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGGProgram PR #225

Added

  • Added Config.permission. Only private configs, meaning those with a pool_creator_authority, can hold permissions. The only permission so far is CreatePoolWithoutMintValidation, which lets initialize_pool and initialize_pool_with_dynamic_config skip 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_config and create_dynamic_config take a new trailing permission: u128 field.

Breaking Changes

  • EvtCreateConfig and EvtCreateDynamicConfig include the new permission field.

TypeScript SDK: @meteora-ag/cp-amm-sdk 1.4.8

SDK PR #111

Changed

  • Synced the IDL and bankrun program fixture to cp_amm 0.2.4.
  • ConfigState.permission is a u128 bitmask. Use isConfigPermissionAllow with ConfigPermission.CreatePoolWithoutMintValidation (bit 0) to detect configs that skip permissionless mint and token-badge checks. Token-2022 wrapped SOL is still rejected.

Added

  • Added ConfigPermission enum and isConfigPermissionAllow helper to read the config permission bitmask.
  • createPool, createCustomPool, createCustomPoolWithDynamicConfig, and initializeReward reject 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_LIQUIDITY reward

What To Do

IntegratorsWhat ChangedWhat To Do
Partners
  • Deprecation of Rate Limiter
  • As the Rate Limiter is deprecated, you need to migrate to change your BaseFeeMode to other modes.
  • Bump your SDK version to @meteora-ag/cp-amm-sdk@1.4.5-rc.0 to start testing.

Program: cp-amm 0.2.3

Program ID (mainnet and devnet): cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGGProgram PR #219

Deprecated

  • Deprecated BaseFeeMode::RateLimiter. New configs and new pools can no longer be created with BaseFeeMode::RateLimiter. Existing configs with BaseFeeMode::RateLimiter can no longer be used to create new pools.
  • Existing pools with BaseFeeMode::RateLimiter are unaffected. Operators can still call fix_pool_fee_params, fix_config_fee_params and update_pool_fees on existing pools and configs with BaseFeeMode::RateLimiter.

Removed

  • Removed deprecated endpoints claim_protocol_fee and zap_protocol_fee.

Fixed

  • In CollectFeeMode::Compounding pools, the claiming fee generated by the DEAD_LIQUIDITY share is no longer stranded in the vault. It is settled into Pool.protocol_b_fee on every claim_protocol_fee2, tracked by the new Pool.dead_liquidity_fee_checkpoint field. Only the claiming fee (the 10_000 - compounding_fee_bps portion of the trading fee) accrues to the protocol, whereas the DEAD_LIQUIDITY share of compounding fees intentionally remains in the reserve, benefiting LPs and traders. PoolMetrics.total_lp_b_fee and PoolMetrics.total_protocol_b_fee are 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 #108

Changed

  • Synced the IDL and bankrun program fixture to cp_amm 0.2.3.
  • Breaking: getBaseFeeParams no longer takes tokenBDecimal or activationType. Those arguments were only used to encode RateLimiter params, which this helper now rejects.

Deprecated

  • Deprecated BaseFeeMode.RateLimiter for new configs and new pools. getBaseFeeParams, validatePoolFees, createCustomPool, createCustomPoolWithDynamicConfig, and createPool reject RateLimiter. Existing RateLimiter pools still quote and swap. getRateLimiterParams and 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

IntegratorsWhat ChangedWhat To Do
Partners
  • New Position Delegate Instruction
  • New Withdraw Dead Liquidity Instruction
  • Bump your SDK version to @meteora-ag/cp-amm-sdk@1.4.3-rc.0 to start testing.

Program: cp-amm 0.2.2

Program ID (mainnet and devnet): cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGGProgram PR #210

Added

  • 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: the close_position, split_position, and split_position2 endpoints remain callable by the owner only.
  • Added new endpoint update_delegate_permission to set the permission bitmask on Position.delegate_permission. Pass permission = 0 to clear all permissions. Callers are responsible for managing the SPL token delegate via SPL Approve / Revoke separately. The bitmask supports 8 permissions: AddLiquidity, RemoveLiquidity, RemoveLiquidityToOwner, ClaimPositionFee, ClaimPositionFeeToOwner, ClaimReward, ClaimRewardToOwner, LockPosition.
  • Added new endpoint withdraw_dead_liquidity_reward allowing the funder to recover the unowned DEAD_LIQUIDITY reward share of a CollectFeeMode::Compounding pool at any time, without waiting for the reward campaign to end. This share is tracked by the new dead_liquidity_reward_checkpoint field in the Pool RewardInfo.

Changed

  • Renamed the signer account from owner to signer, 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 with PoolError::InvalidAuthority (6053), PoolError::InvalidPermission (6054), or PoolError::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 #105

Added

  • Added updateDelegatePermission endpoint 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 withdrawDeadLiquidityReward endpoint to withdraw the reward share attributable to a compounding pool’s permanent dead liquidity. Only valid for CollectFeeMode.Compounding pools.
  • Added PositionDelegatePermission enum and encodeDelegatePermissions helper to build the delegate permission bitmask.
  • Added UpdateDelegatePermissionParams and WithdrawDeadLiquidityRewardParams types.

Changed

  • Bumped the IDL and program fixture: the signer account on position instructions (addLiquidity, removeLiquidity, removeAllLiquidity, claimPositionFee, claimReward, lockPosition, lockInnerPosition and permanentLockPosition) was renamed from owner to signer so 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).
Breaking release. If you build swap instructions manually, run DLMM swap quotes, or index certain DLMM events, please plan an upgrade before mainnet deployment.

Release summary

What We Shipped

  • Compounding Liquidity

What To Do

IntegratorsWhat ChangedWhat To Do
Swap Routers
  • Swap quote computation
  • For concentrated pools, update your quote logic to exclude partnerFee from fee calculations
  • For compounding pools, update your quote logic to use the constant-product formula x * y = k. Compute quotes using token_a_amount, token_b_amount, and liquidity from pool state.
Trading Terminals
  • EvtSwap2 event parsing
  • Tracking of pool reserves amounts for compounding pools
  • swap_result.partner_fee is removed. Total trading fee is now split into claiming_fee and compounding_fee. Update event deserialization accordingly.
  • Read token_a_amount and token_b_amount directly from pool state (not derived from liquidity math).
Partners
  • Swap quote computation
  • Pool liquidity derivation
  • Bump your SDK version to @meteora-ag/cp-amm-sdk@1.3.6.rc.1 to start testing.

Program: cp-amm 0.2.0

Program ID (mainnet and devnet): cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGGProgram PR #187

Added

  • Pool now will track reserves balances (token_a_amount, token_b_amount) if pool.layout_version == 1. For pool layout_version 0, operator can call the new endpoint fix_pool_layout_version to 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 formula token_a_amount * token_b_amount = constant.
  • Endpoints create_config, initialize_customizable_pool and initialize_pool_with_dynamic_config will allow user to create pool with collect_fee_mode == Compounding, and config for compounding_fee_bps.

Changed

  • Related to event EvtSwap2, in swap_result field, partner_fee will be replaced by compounding_fee, now total_trading_fee will be calculated as swap_result.claiming_fee + swap_result.compounding_fee

Removed

  • Removed partner field from Pool struct
  • Removed unused partner_fee feature and the claim_partner_fee endpoint

Breaking Changes

  • Quote function will be changed by the new fee mode

TypeScript SDK: @meteora-ag/cp-amm-sdk 1.3.7

SDK PR #101

Added

  • Added new CollectFeeMode.Compounding mode — 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 LiquidityHandler interface and two implementations: CompoundingLiquidityHandler and ConcentratedLiquidityHandler, with a getLiquidityHandler factory function that dispatches based on collectFeeMode.
  • Added compoundingFeeBps field to PoolFeesParams for configuring the compounding fee split.
  • Added collectFeeMode parameter to getLiquidityDelta, getDepositQuote, getWithdrawQuote, and preparePoolCreationParams.
  • Added tokenAAmount, tokenBAmount, and liquidity parameters to getDepositQuote and getWithdrawQuote for compounding liquidity calculations.

Changed

  • Rewrote swapQuote.ts to use LiquidityHandler abstraction, supporting both concentrated and compounding liquidity modes.
  • Fee structure: tradingFee split into claimingFee + compoundingFee in SwapResult2, FeeOnAmountResult, and SplitFees types.
  • Renamed PoolVersion enum to LayoutVersion.
  • PoolFeesParams.padding changed from number[] to number.
  • splitFees and getFeeOnAmount no longer accept hasPartner parameter.
  • getQuote totalFee now computed as claimingFee + compoundingFee + protocolFee + referralFee.
  • getQuote2 return type: tradingFee and partnerFee replaced with claimingFee and compoundingFee.
  • collectFeeMode comment updated: 0: BothToken, 1: OnlyB, 2: Compounding.
  • Liquidity delta and amount functions (getLiquidityDeltaFromAmountA, getLiquidityDeltaFromAmountB, getAmountAFromLiquidityDelta, getAmountBFromLiquidityDelta) now accept collectFeeMode and dispatch to the appropriate handler.

Removed

  • Removed claimPartnerFee endpoint and ClaimPartnerFeeParams type.
  • Removed partnerFee from fee result types (FeeOnAmountResult, SplitFees, SwapResult2).
  • Removed hasPartner helper function.
  • Removed FEE_PADDING constant.