Concentrated liquidity and ticks: why V3 and V4 quotes move the way they do
Concentrated liquidity puts depth in price ranges, so a pool can be deep at one price and thin just past it. How ticks work and what they mean for quotes.
If you have compared quotes at different sizes, you may have seen something odd. A pool quotes almost no price impact for one amount, and then impact jumps for an amount only a little larger. Or a pool that looked deep yesterday is thin today without any big trade. Both are normal for concentrated liquidity, the design behind Uniswap V3 and V4 and PancakeSwap V3 and Infinity CL pools.
This post explains the mechanism in plain terms: ranges, ticks and what happens when a swap walks across them.
From one curve to many ranges
A classic constant-product pool spreads its liquidity over every possible price, from zero to infinity. Most of that liquidity sits at prices the market will never visit, so it does almost nothing for traders.
The Uniswap V3 whitepaper changed that. Its defining idea, in its own words, is "liquidity bounded within some price range." A liquidity provider picks a range, for example 700 to 850 USDT per BNB, and their capital only works while the price is inside it. When the price leaves the range, that position stops trading and stops earning fees, and it is left holding only one of the two tokens.
The result is that the same capital can provide far more depth near the current price. The cost is that depth is no longer smooth. It is the sum of everyone's ranges, and it can change sharply from one price to the next.
Ticks: the grid prices live on
To make ranges workable, V3 divides the price line into ticks. The whitepaper defines the price at tick i as
price(i) = 1.0001^i
so each tick is a 0.01 % step from its neighbour. A price of 2 sits at about tick 6,932. A BNB price of 770 USDT, for two tokens with the same decimals, sits at about tick 66,467.
Not every tick can be the edge of a range. Each pool has a tick spacing, and only ticks divisible by it can be used. Wider spacing means coarser ranges and cheaper swaps. The spacing is tied to the fee tier:
| Fee tier | Uniswap V3 spacing | PancakeSwap V3 spacing |
|---|---|---|
| 0.01 % | 1 | 1 |
| 0.05 % | 10 | 10 |
| 0.25 % | 50 | |
| 0.30 % | 60 | |
| 1 % | 200 | 200 |
The Uniswap values come from its factory contract and SDK, and the PancakeSwap values from the PancakeSwap V3 factory.
What happens during a swap
Between two initialised ticks, a V3 pool behaves exactly like a constant-product pool. The whitepaper says so directly: for swaps small enough not to cross a tick, the contracts act like an x × y = k pool. The depth in that stretch is a single number, the active liquidity, written L.
When a swap pushes the price to the next initialised tick, the pool stops, applies that tick's change in liquidity, and continues with the new L. Every position whose range starts at that tick switches on, and every position whose range ends there switches off. Then the next stretch behaves like a constant-product pool again, deeper or thinner than before.
A worked example
Within one stretch, the amount of USDT needed to move the price follows a simple formula from the whitepaper, Δy = L × Δ√P. Take an illustrative pool where active liquidity is L = 100,000 between 760 and 780 USDT per BNB, and the price is 770.
- Buying BNB until the price reaches 780 takes about 17,961 USDT.
- Suppose the liquidity above 780 is much thinner, say
L = 10,000from 780 to 790. Moving the price from 780 to 790 then takes only about 1,785 USDT, where the same move inside the deep stretch would have taken around 17,850.
That is the jump you see in quotes. An order that stays inside the deep stretch has low price impact. An order a little larger runs past the edge of the range into thin liquidity, and the last part of it fills at much worse prices. Nothing is wrong with the quote. The depth really does end there.
Why quotes change without big trades
Because depth is made of individual positions, it changes whenever liquidity providers act. A provider who removes a large position near the current price thins the pool instantly. One who adds a tight range makes it deeper. Providers can also move their ranges at any time. So the same pool can quote very differently at the same size an hour apart, even if the price barely moved.
Gas grows with every tick crossed
Each initialised tick a swap crosses costs extra gas. The whitepaper notes that this cost is constant per tick, regardless of how many positions start or end there. Uninitialised ticks cost nothing. Uniswap's quoter contracts even report how many initialised ticks a quoted swap crossed. For a router this is part of the trade-off: a large swap that crawls through many ticks in one pool may be better split across pools.
V4, Infinity and Bin pools
Uniswap V4 keeps V3's concentrated-liquidity math but moves every pool into a single contract and lets each pool attach a hook, a contract that runs custom code around swaps. A hook can set a dynamic fee or, in some designs, change the amounts a swap pays. PancakeSwap Infinity follows the same singleton idea with its own hook system, and its CL pools use the same tick model.
Infinity also has Bin pools, a different design where liquidity sits in discrete price bins. PancakeSwap's documentation explains that a trade inside one bin has zero slippage and slippage only appears when a trade empties a bin and moves to the next. The cliffs are still there, just in steps.
How a router handles this
Reading a concentrated-liquidity pool means reading more than its price. A router needs the active liquidity and the initialised ticks around the current price, then has to walk them with the same integer math the pool uses.
At Tirio we quote these pools locally with a port of the V3 tick math, checked against the chain's own quoter contracts in our tests. We read the initialised ticks around the current price, and a swap that would walk beyond the ticks we read is not used. Hooked pools whose pricing we cannot reproduce are sampled through the venue's quoter instead, and every quote you sign is simulated as the complete transaction before it reaches you.
What this means when you trade
- Check price impact at your real size. Impact in concentrated pools can jump, so a small test quote tells you little about a large order.
- Expect splits on larger orders. Spreading an order across pools and fee tiers is often the cheapest way around a liquidity cliff. Our post on how aggregators split routes shows the arithmetic.
- Refresh before you sign. Depth can change minute to minute as positions move.
- Keep slippage sensible. If the price moves to the edge of a range while your transaction waits, your fill can be worse than the quote. See price impact vs slippage.