Skip to main content

Concentrated Liquidity

The Concentrated Liquidity (CL) feature lets liquidity providers (LPs) allocate their liquidity within a specific price range.

Overview of CL

CL aims to increase capital efficiency by letting LPs set a specific price range within which their liquidity will be used by traders for swaps. Compared to full-range pools, where the liquidity is distributed from 0 to infinity, adding to CL pools, LPs can earn higher fees with the same amount of liquidity.

In a pool of stablecoins like USDT/USDC, the relative price is stable and ranges between $0.995 and $1.001. Liquidity beyond this range is unlikely to be used, so LPs need to concentrate their liquidity within this specific range to collect the most fees.

In unstable pairs like BTC/USDT, the relative price fluctuates, but it is unlikely that it can reach certain price ranges, such as 0 or infinity, in the foreseeable future. For example, if the current relative price lies between $21,000 and $21,500, LPs can concentrate their liquidity within a specific wider price range—for example, $20,900 and $21,600. This lets them collect more fees than they can earn in full-range pools with the same amount of liquidity.

An asset price is not permanent. When traders experience a need for one asset and conduct respective swaps, LPs receive more of the other asset. As a result, the price starts moving in one direction. This can continue until LPs' position consists of only one asset. LPs earn fees until the price goes beyond LPs' range. If this happens, the liquidity of such a position becomes Single-Sided, which means it's no longer active and stops earning fees. If the price returns to the LPs' range, their liquidity activates again, starting to earn fees. Neither the number of positions that LPs can create nor the price interval is limited.

Price ticks

When creating a concentrated liquidity position, LPs can't choose the liquidity price borders absolutely freely. The price range is evenly divided into price ticks. Ticks are equidistant on a logarithmic scale and are numbered from -887273 to 887273 (1774547 in total). Tick price is defined as 1.0001^tick_number with each tick representing a 0.0001% shift in price in any direction. In liquidity positions, these ticks stand for price boundaries. Thus, when LPs create a position and enter a price range, the range is automatically bounded to the nearest upper and lower ticks. This limitation is introduced to reduce the number of swap steps (see TBD for details).

The price range is therefore limited to MIN and MAX ticks. In UI, a MIN tick is usually referred to as 0, and a MAX tick as "infinity" but in fact, they have specific prices:

  • MIN tick ≈ 0.0000000000000000000000000000000000000002938662941320169—this is a very small number, almost zero.
  • MAX tick ≈ 3402908125117467600000000000000000000—this is a very large number.

As traders swap their tokens in the pool, the spot price changes. The smart contract performs swap requests with the liquidity available within the given tick until the price reaches the next one. At this moment, the smart contract switches from the current tick to the new one. The inactive liquidity that has a bound to this new tick is activated, whereas the liquidity bound to the previous one becomes dormant.

When swapping, inactive ticks don't impact the cost of transactions. However, if the price reaches the border of an active tick, new positions that use this tick as a border are activated, resulting in increased transaction costs.