percentEstimated APR for CLMM

How Raydium estimates APR for concentrated liquidity pools

Overview

In a CLMM pool, fees are distributed proportionally to in-range liquidity at each tick. Calculating an accurate APR across all ticks and LPs is extremely complex—traditional constant product APR formulas don't apply.

Projected returns for CLMMs should be considered estimates at best.

Raydium displays three APR estimation methods:

  1. Overall pool estimated APR — pool-wide average

  2. Delta method — based on your position's share of liquidity

  3. Multiplier method — based on historical price range overlap


Overall pool estimated APR

Assumes trading fees and emissions are distributed across all liquidity in the pool, including out-of-range positions.

APR=(d_365,h_24,s_3600,b_0.5)×(perBlockReward×rewardPrice)+totalTradingFeetotalLiquidityValueAPR = \sum(d\_{365}, h\_{24}, s\_{3600}, b\_{0.5}) \times \frac{(perBlockReward \times rewardPrice) + totalTradingFee}{totalLiquidityValue}

Delta method

Calculates estimated APR based on your position's implied change (delta) in pool liquidity, determined by your price range and size.

Condition

i_li_c<i_ui\_l \leq i\_c < i\_u

Where:

Variable
Description

i_li\_l

lowerTickId

i_ci\_c

currentTickId

i_ui\_u

upperTickId

Token amounts in a position

ΔY=ΔL×(PP_l)\Delta Y = \Delta L \times (\sqrt{P} - \sqrt{P\_l})
ΔX=ΔL×(1P1P_u)\Delta X = \Delta L \times \left(\frac{1}{\sqrt{P}} - \frac{1}{\sqrt{P\_u}}\right)

Calculating ΔL

For estimation of tokenA (ΔX\Delta X) and tokenB (ΔY\Delta Y) we need to know ΔL\Delta L:

(ΔY×pUSDY)+(ΔX×pUSDX)=targetAmount(\Delta Y \times pUSDY) + (\Delta X \times pUSDX) = targetAmount

So we take:

(ΔL×(PP_l)×pUSDY)+(ΔL×(1P1P_u)×pUSDX)=targetAmount(\Delta L \times (\sqrt{P} - \sqrt{P\_l}) \times pUSDY) + (\Delta L \times \left(\frac{1}{\sqrt{P}} - \frac{1}{\sqrt{P\_u}}\right) \times pUSDX) = targetAmount

Then:

ΔL=targetAmount(PP_l)×pUSDY+(1P1P_u)×pUSDX\Delta L = \frac{targetAmount}{(\sqrt{P} - \sqrt{P\_l}) \times pUSDY + \left(\frac{1}{\sqrt{P}} - \frac{1}{\sqrt{P\_u}}\right) \times pUSDX}

After calculating for ΔL\Delta L, we can calculate ΔX\Delta X and ΔY\Delta Y using:

ΔY=ΔL×(PP_l)\Delta Y = \Delta L \times (\sqrt{P} - \sqrt{P\_l})
ΔX=ΔL×(1P1P_u)\Delta X = \Delta L \times \left(\frac{1}{\sqrt{P}} - \frac{1}{\sqrt{P\_u}}\right)

Estimated daily fee

Fee=feeTier×volume24H×ΔLL+ΔLFee = feeTier \times volume24H \times \frac{\Delta L}{L + \Delta L}

Where:

Variable
Description

volume24Hvolume24H

Average of 24h volume

LL

Total liquidity (cumulative of liquidityNet from all ticks that ii_ci \leq i\_c)

ΔL\Delta L

Delta liquidity

Liquidity amounts

And can be calculated from:

liquidityAmount0=amount0×P_u×P_lP_uP_lliquidityAmount0 = amount0 \times \frac{\sqrt{P\_u} \times \sqrt{P\_l}}{\sqrt{P\_u} - \sqrt{P\_l}}
liquidityAmount1=amount1P_uP_lliquidityAmount1 = \frac{amount1}{\sqrt{P\_u} - \sqrt{P\_l}}

Condition

ΔL\Delta L

If i_c<i_li\_c < i\_l

ΔL=liquidityAmount0\Delta L = liquidityAmount0

If i_c>i_ui\_c > i\_u

ΔL=liquidityAmount1\Delta L = liquidityAmount1

If i_ci_li\_c \geq i\_l && i_ci_ui\_c \leq i\_u

ΔL=min(liquidityAmount0,liquidityAmount1)\Delta L = \min(liquidityAmount0, liquidityAmount1)


Multiplier method

Calculates estimated APR based on how much your price range overlaps with historical trading activity.

Assumptions

  • Historical price data is used to extrapolate future price data (not the best indicator of future performance, but provides a decent estimate)

  • Price fluctuation within the historical range is assumed to be consistent across the time interval, resembling a periodic function with amplitude equal to the upper and lower price boundaries

Variables

Variable
Description

u_loweru\_{lower}

Lower bound of user's concentrated liquidity price range

u_upperu\_{upper}

Upper bound of user's concentrated liquidity price range

h_lowerh\_{lower}

Lower bound of historical price range across a specific time period

h_upperh\_{upper}

Upper bound of historical price range across a specific time period

Retroactive range intersection

r_lower=max(u_lower,h_lower)r\_{lower} = \max(u\_{lower}, h\_{lower})
r_upper=min(u_upper,h_upper)r\_{upper} = \min(u\_{upper}, h\_{upper})

Range definitions

userRange=u_upperu_loweruserRange = u\_{upper} - u\_{lower}
histRange=h_upperh_lowerhistRange = h\_{upper} - h\_{lower}
retroRange=r_upperr_lowerretroRange = r\_{upper} - r\_{lower}

Where retroRangeretroRange is the retroactive intersection between userRangeuserRange and histRangehistRange.

Multiplier calculation

Let mm = multiplier of rewards or fees that user will receive.

Condition
Multiplier

retroRange0retroRange \leq 0

m=0m = 0

userRange=retroRangeuserRange = retroRange

m=histRangeretroRangem = \frac{histRange}{retroRange}

histRange=retroRangehistRange = retroRange

m=retroRangeuserRangem = \frac{retroRange}{userRange}

Otherwise

m=retroRangetradeRange×retroRangeuserRangem = \frac{retroRange}{tradeRange} \times \frac{retroRange}{userRange}


Important notes

  • These are estimates, not guaranteed returns

  • Actual returns depend on trading volume, price movements, and competition from other LPs

  • Narrower ranges earn more fees when in range, but risk going out of range more often

  • Out-of-range positions earn zero fees

Last updated

Was this helpful?