CenturionDEX
Launch App

Fees

Last modified:

Swap fees

Every swap pays a fee that is distributed pro-rata to all in-range1 liquidity at the instant of the trade. If the spot price moves outside a position's bounds, that position becomes inactive and earns nothing until the price returns.

Unlike earlier versions, v3 does not auto-compound fees into the pool. Accrued fees are tracked separately and must be collected manually by the position owner.

Pool fee tiers

Each token pair may have multiple pools, each with a distinct fee:

TierTypical use
0.01 %Stablecoins (USDC/DAI)
0.05 %Correlated assets (CTN/stCTN)
0.30 %Most volatile pairs (CTN/USDC)
1.00 %Exotic or illiquid tokens

In v2, fragmenting liquidity across multiple fee levels would have degraded execution quality. Concentrated liquidity breaks this constraint: because capital efficiency is decoupled from total pool depth, multiple fee tiers can coexist without meaningful harm to traders.

Finding the right fee

Asset characteristics drive fee-tier selection. Low-volatility pairs gravitate toward the lowest tier — providers face minimal price risk and swappers seek near-parity execution. Exotic or rarely traded tokens tend toward higher tiers, compensating providers for the cost risk of holding less predictable assets.

Fee math

Deduction per swap

The fee is removed from the input amount before the constant-product calculation runs:

amountIn_after_fee = amountIn * (1 - fee_tier)

For a 0.30 % pool and a 10 CTN swap:

Fee = 10 * 0.003 = 0.03 CTN
Effective input = 10 - 0.03 = 9.97 CTN

The 0.03 CTN remains in the pool, claimable by in-range providers.

Distribution among LPs

Only in-range liquidity earns fees. Each provider's share is proportional to their liquidity L relative to the total in-range liquidity L_total:

LP_fee_share = (L_i / L_total) * total_fee

Example: Total in-range liquidity is 1,000,000 units; your position contributes 50,000 units. A swap generates 0.03 CTN in fees:

Your fee = (50,000 / 1,000,000) * 0.03 = 0.0015 CTN

Fee-growth tracking (feeGrowthGlobal)

The pool tracks accumulated fees per unit of liquidity via a fixed-point accumulator:

feeGrowthGlobal += fee_amount / L_total

This value only increases. Fees owed to a position between two points in time:

fees_owed = L_i * (feeGrowthGlobal_now - feeGrowthGlobal_at_deposit)

The contract also tracks per-tick fee growth (feeGrowthOutside) to handle positions that cycle in and out of range — see whitepaper §6.3 for the full derivation.

Estimating fee APR

For a v3 position with liquidity L and total in-range liquidity L_total:

Daily fees = (L / L_total) * daily_volume * fee_tier
Fee APR = Daily fees * 365 / position_value

Worked example: $10,000 deposited in a 0.30 % CTN/USDC pool. The pool trades $5 M daily with $2 M in-range TVL.

Daily fees = ($10,000 / $2,000,000) * $5,000,000 * 0.003 = $75
Fee APR = $75 * 365 / $10,000 = 273.75 %

This is a gross figure — it does not account for impermanent loss or time spent out of range. See LP Profitability for the net calculation.

Protocol fees

A governance-controlled protocol fee may be enabled on certain pools, directing a share of swap fees to a specified address for ongoing development. Details: protocol fees and fee-setting rationale.

Footnotes

  1. In-range liquidity: liquidity in any position whose bounds straddle the current spot price.