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=(d365,h24,s3600,b0.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

ilic<iui_l \leq i_c < i_u

Where:

Variable
Description

ili_l

lowerTickId

ici_c

currentTickId

iui_u

upperTickId

Token amounts in a position

ΔY=ΔL×(PPl)\Delta Y = \Delta L \times (\sqrt{P} - \sqrt{P_l})
ΔX=ΔL×(1P1Pu)\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×(PPl)×pUSDY)+(ΔL×(1P1Pu)×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(PPl)×pUSDY+(1P1Pu)×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×(PPl)\Delta Y = \Delta L \times (\sqrt{P} - \sqrt{P_l})
ΔX=ΔL×(1P1Pu)\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 iici \leq i_c)

ΔL\Delta L

Delta liquidity

Liquidity amounts

And can be calculated from:

liquidityAmount0=amount0×Pu×PlPuPlliquidityAmount0 = amount0 \times \frac{\sqrt{P_u} \times \sqrt{P_l}}{\sqrt{P_u} - \sqrt{P_l}}
liquidityAmount1=amount1PuPlliquidityAmount1 = \frac{amount1}{\sqrt{P_u} - \sqrt{P_l}}

Condition

ΔL\Delta L

If ic<ili_c < i_l

ΔL=liquidityAmount0\Delta L = liquidityAmount0

If ic>iui_c > i_u

ΔL=liquidityAmount1\Delta L = liquidityAmount1

If icili_c \geq i_l && iciui_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

uloweru_{lower}

Lower bound of user's concentrated liquidity price range

uupperu_{upper}

Upper bound of user's concentrated liquidity price range

hlowerh_{lower}

Lower bound of historical price range across a specific time period

hupperh_{upper}

Upper bound of historical price range across a specific time period

Retroactive range intersection

rlower=max(ulower,hlower)r_{lower} = \max(u_{lower}, h_{lower})
rupper=min(uupper,hupper)r_{upper} = \min(u_{upper}, h_{upper})

Range definitions

userRange=uupperuloweruserRange = u_{upper} - u_{lower}
histRange=hupperhlowerhistRange = h_{upper} - h_{lower}
retroRange=rupperrlowerretroRange = 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?