Put $10,000 into an ETH/USDC blockchain that runs exactly as written when it is called, holding and moving funds according to its code, without an intermediary able to change the outcome.">smart contract holding reserves of two or more tokens, supplied by users, that a decentralized exchange uses to execute trades automatically at a price set by a formula.">pool the old way and your money is spread over every price from zero to infinity. Put the same $10,000 into a band from $1,800 to $2,200 with ETH at $2,000 (example prices), and by our arithmetic it earns about 20 times the fees per dollar for as long as ETH stays inside. The minute ETH leaves the band, it earns nothing and you hold 100% of one asset. That trade is the whole of Uniswap v3 concentrated liquidity.
Uniswap v4, announced as live at the end of January 2025, kept that maths and rebuilt the plumbing: one contract per chain for every pool, net settlement, and hooks, which are programs attached to a pool. As of 30 October 2026 v3 and v4 each show about $32.5 billion of 30-day volume on DefiLlama, ahead of every other venue it tracks. This lesson assumes you have read our lesson on liquidity pools and impermanent loss.
Uniswap v3 concentrated liquidity: from x·y=k to a price range
A constant-product pool keeps reserves ready for every price, including prices the pair will never see: a DAI/USDC pool holds liquidity for DAI at $50 while the pair trades within a cent of $1. Our derivation of the AMM maths has the proof, and the guide to decentralized exchanges and AMMs the plain-language version.
Uniswap Labs announced v3 on 23 March 2021 with a target of 5 May, and its later research dates the deployment to that day. The whitepaper by Hayden Adams, Noah Zinsmeister, Moody Salem, River Keefer and Dan Robinson rests on one observation: a position only has to hold enough tokens to cover price moves inside its own range. Inside that range it behaves like a constant-product pool with far larger reserves than it really owns, which the whitepaper calls virtual reserves. The maths feels like x·y=k with a big k, but the real money behind it runs out at the edges.
Ticks, ranges and liquidity: how a v3 position works
Price as a tick: the 1.0001 grid
v3 cuts prices into ticks, and each tick is a price 1.0001 times the one below it, so one tick is a 0.01% step. The tick index is the logarithm of the price in base 1.0001. By our arithmetic, 6,932 ticks double the price.
With ETH at $2,000 the tick index is about 76,013, $1,800 is about 74,959 and $2,200 about 76,966. Those numbers are illustrative, in dollars per ETH. A block explorer shows something else, because contracts work in raw token units (USDC has 6 decimals, WETH 18) and in the pair’s fixed token order.
Only ticks divisible by the pool’s tick spacing can be used, which is why your interface snaps a typed price to the nearest step. The whitepaper ties spacing to the fee tier.
| Fee tier | Tick spacing | Price step between usable ticks | Status |
|---|---|---|---|
| 0.01% | 1 | about 0.01% | Added by governance, executed 31 December 2021 |
| 0.05% | 10 | about 0.10% | At launch, May 2021 |
| 0.30% | 60 | about 0.60% | At launch, May 2021 |
| 1.00% | 200 | about 2.02% | At launch, May 2021 |
What a range does to your capital
Back to the $10,000 at $2,000 per ETH (example). A position from $1,800 to $2,200 holds 2.378 ETH and 5,244 USDC. A range from $1,000 to $4,000 holds 2.5 ETH and 5,000 USDC, the same as a full-range position. The deposits look alike. What differs is the liquidity, the L in the formulas: how much trading each dollar can absorb per step of price.
Compare a range with a full-range position holding the same liquidity and the gain has a closed form: 1 / (1 – (pa/pb)1/4), where pa and pb are the edges and the price sits at the geometric centre. The table is our own calculation from that formula.
| Range around the current price | Capital efficiency vs full range |
|---|---|
| +/-0.05% (0.10% wide) | about 4,000x |
| +/-1% | about 200x |
| +/-5% | about 40x |
| +/-10% | about 20x |
| +/-30% | about 7x |
| -50% / +100% | about 3.4x |
The top line reproduces Uniswap’s headline claim, “up to 4000x capital efficiency relative to Uniswap v2”, which the blog limits to a single 0.10% range. Its example matches the second line: about $25 million from the v2 DAI/USDC pair, concentrated between 0.99 and 1.01, would give the depth of $5 billion in v2.
These are ceilings on fee capture at the centre of a range, not returns. The multiple drops to zero outside the range, and it ignores everyone else: if every LP concentrates, the same fees are split among more liquidity. A multiple of 200 also needs a pair that stays within 1%, which describes stablecoins and little else.

Fee tiers split the same pair into several pools
v2 charged a flat 0.30%. The v3 factory opened with three tiers and left governance free to add more, which is how the 0.01% tier arrived. Each tier is a separate pool with its own liquidity and price, so ETH/USDC at 0.05% and ETH/USDC at 0.30% are two markets kept in line by arbitrage. An LP now picks a pair, a tier and a range, where v2 asked for a pair alone. Routers send flow to whichever pool gives the best net price, so a tier with thin liquidity may see little volume at all.
A position is an NFT, and that changes the accounting
Why LP shares stopped being fungible
In v2 every LP owns a share of one curve, so an ERC-20 token can represent it. In v3 two LPs with different ranges own different things. Uniswap’s announcement is direct: “LP positions will be represented by non-fungible tokens (NFTs)”. The protocol documentation names the standard, ERC-721.
Fees changed too. In v2 they are added to the reserves and compound by themselves. In v3 they accumulate as a claimable balance tied to the position and must be redeemed by the owner; putting them back to work takes a transaction that costs gas. Anyone who wants a fungible share needs a wrapper contract that pools positions and issues its own ERC-20, which is what the managers below do.
Reading a position on an explorer or dashboard
A position shows up as a token ID in your wallet. Open it on the Uniswap interface or a third-party dashboard and five numbers tell you almost everything:
- The minimum and maximum ticks, usually translated into prices, are the edges of the range.
- The liquidity value L is what the pool uses to compute your share of each swap.
- The current tick shows if the position is in range: it must sit between your two edges.
- The token amounts show how far the mix has shifted from one asset to the other.
- Uncollected fees are your earnings to date, kept apart from the principal.
Out of range: when your liquidity stops earning
What leaving the range does, in numbers
As the price rises, a position sells ETH for USDC. As it falls, the position buys. At the upper edge of the $1,800 to $2,200 example it holds only USDC; at the lower edge only ETH. Beyond an edge the position, in the words of the docs, stops accruing fees until the price re-enters. There is no stop-loss in that: nothing closes, nothing warns you, and the tokens stay in the pool.
| ETH moves to (example) | Position value | Value if tokens were held | State |
|---|---|---|---|
| $1,000 | $5,142 | $7,622 | All ETH, no fees |
| $1,600 | $8,227 | $9,049 | All ETH, no fees |
| $1,800 | $9,255 | $9,524 | Lower edge |
| $2,200 | $10,232 | $10,476 | Upper edge |
| $2,400 | $10,232 | $10,951 | All USDC, no fees |
| $3,000 | $10,232 | $12,378 | All USDC, no fees |
Our own calculation for a $10,000 deposit at $2,000, before fees. Above the upper edge the value is frozen at $10,232, whatever ETH does next.
Amplified impermanent loss: one price move, three ranges
The formula from the previous lesson, 2√r/(1+r) – 1, applies to the full range. Concentration raises the loss for the same move, since the same tokens get swapped over a shorter stretch of price.
| ETH moves to (example) | Full range | $1,000 to $4,000 | $1,800 to $2,200 |
|---|---|---|---|
| $1,000 | -5.7% | -19.5% | -32.5% |
| $1,600 | -0.6% | -2.1% | -9.1% |
| $1,800 | -0.1% | -0.5% | -2.8% |
| $2,200 | -0.1% | -0.4% | -2.3% |
| $2,400 | -0.4% | -1.4% | -6.6% |
| $3,000 | -2.0% | -6.9% | -17.3% |
Own calculation, difference against holding the initial tokens, before fees, with amounts from x = L(1/√p – 1/√pb) and y = L(√p – √pa). A fall of 50% costs 5.7%, 19.5% or 32.5% depending on the band. The fees earned inside the range have to pay for that gap.
Do the fees cover it?
For early v3 they did not: the 2021 study of 17 pools in the previous lesson counted $199.3 million of fees against $260.1 million of impermanent loss. Its sample stops in autumn 2021 and covers aggregate LPs, so it does not prove that concentrated LPs lose as a class. That question stays open.
Managing a range: by hand, by tool, by manager
Rebalancing by hand has a price
Moving a range takes three steps: remove liquidity and collect, swap to the new mix, add liquidity at new ticks. Each pays gas, and the swap pays the pool fee and price impact. Every move also turns the gap to holding into a realised loss, since you exit after the price moved. On Ethereum mainnet those costs rule out small positions. A layer 2 cuts the gas and leaves the realised loss where it was.
Automatic managers: Arrakis and Gamma
A manager is a vault that owns the position and moves it for you, usually through off-chain strategy logic and on-chain transactions. You receive a share in the vault, and you take on its contract risk and its operator’s choices.
Arrakis‘s main product today is not a retail yield vault. Its documentation describes Arrakis Pro as non-custodial on-chain market making for token issuers: the issuer owns a vault represented by an NFT, Arrakis runs the strategy within set limits, and changes to core parameters sit behind a two-day timelock. DefiLlama showed about $56.8 million of staking or liquidity, measured at current market prices. It is the main size metric in DeFi.">TVL on 30 October 2026.
Gamma’s January 2024 exploit and what followed
Gamma Strategies ran vaults over concentrated positions. On 4 January 2024 an attacker drained several of its stablecoin and liquid-staking vaults on Arbitrum. The first estimate reported by The Block, from PeckShield and BlockSec, was about $3.4 million, which Rekt News matched to the ether the attacker ended up with, while writing of at least $4.5 million in all. Later counts were higher: Verichains put the loss at nearly $6.2 million, about $2.7 million of it from one gDAI-DAI vault, and Gamma’s own update to the Arbitrum forum said “approximately $6M+”.
The explanations differ too. Gamma’s first account, quoted by Rekt, blamed a price-change threshold set too high on some liquid-staking and stablecoin vaults. Verichains points at shares computed from real-time prices, which the attacker pushed with borrowed DAI. Rekt reported 1,000 ETH going into Tornado Cash. Gamma told the forum it had developed a compensation plan, and Web3 Is Going Just Great, citing Gamma’s post-mortem, reports estimated recoveries of 25% to 40% depending on the category of user. We could not open that post-mortem or confirm what users finally received.
| Date | Gamma TVL (DefiLlama) |
|---|---|
| 3 January 2024 | $127.8 million |
| 10 January 2024 | $78.8 million |
| 1 January 2025 | $58.8 million |
| 1 January 2026 | $6.9 million |
| 30 October 2026 | $2.8 million |
Gamma survived at under 3% of its pre-exploit size. The series does not show that the exploit alone caused the fall, which took years. As of 30 October 2026 its app offers vaults for Uniswap v4.
JIT liquidity, the competitor you cannot see
Sandwich attacks and MEV are covered in our guide to using a DEX safely. Just-in-time liquidity is the LP’s version. A searcher spots a large pending swap, adds a very narrow position just before it, takes a large share of the fee, and removes the position right after.
A Uniswap Labs study by Xin Wan and Austin Adams counted 8,287 attempts from 5 May 2021 to 18 July 2022, with over 95% of the liquidity from one account and about 0.3% of liquidity demand served, and it finds that swappers benefited. Researchers at Imperial College London use the word attack and count 36,671 cases over 20 months, for 7,498 ETH of profit at an average return of 0.007%. They agree that takers gain, and add that existing LPs see their share diluted by 85% on average in those swaps.
Uniswap v4: one contract, net accounting, programmable pools
Uniswap announced v4 as live on 31 January 2025 on 10 chains, after nine audits and a $2.35 million security competition, with a bug bounty of up to $15.5 million. The docs state that the concentrated liquidity underneath is the same as v3, so ticks, ranges, amplified loss and out-of-range behaviour all carry over.
The singleton and flash accounting
In v3 each pool is its own contract, deployed by a factory. In v4 pools are entries in the state of a single contract on each chain: the v4-core README describes “a singleton-style architecture, where all pool state is managed in the PoolManager.sol contract”. Creating a pool becomes much cheaper, and so does a route through several pools.
Flash accounting is the second half. A caller unlocks the PoolManager, performs as many swaps and liquidity changes as it wants, and each one only updates an internal net balance called a delta. Tokens move at the end, and every delta must be back at zero or the transaction reverts. The docs say transient storage made the design practical; that is EIP-1153, memory that lasts one transaction.
Two smaller changes matter to LPs. Native ETH is back, so pools no longer need wrapped ether. And in v4 accrued fees act as a credit when you modify liquidity: increasing a position turns them into liquidity without a separate step. Positions are still ERC-721 NFTs, through the periphery’s PositionManager contract.
Hooks: what a hook can and cannot do
A hook is an external smart contract attached to a pool when it is created. Each pool has at most one, and a hook can serve many pools. The PoolManager calls it before and after initialisation, adding or removing liquidity, a swap and a donation. Its permissions are encoded in the bits of its own address.
That allows fees that change with volatility, on-chain limit orders or automated liquidity management. Fees get freer as well: a v4 pool creator can set any fee from 0% to 100% in steps of 0.0001%, or let a hook set it dynamically.
According to the README, which callbacks run on a pool “cannot change after pool initialization”. That guarantee covers the list of callbacks, not the code behind them: an upgradeable hook can change what it does. A hook sits in the path of your funds, which puts composability and its stacked risks inside a single pool.
Hook adoption: counting is harder than it looks
On launch day Uniswap said over 150 hooks had been developed. Later counts vary widely, because public dashboards count addresses, and an address can be a clone, a test or a dead experiment. We found no reliable dated figure for active hooks or their share of volume, so we give none.
The price of flexibility: Cork and Bunni
Trail of Bits, in a July 2026 review of hook security, says neither of these exploits came from a flaw in the v4 core or the PoolManager. It puts the duty this way: “Hook developers are responsible for validating the application-specific assumptions their hooks add.”
| Date | Project | Loss | What failed |
|---|---|---|---|
| 28 May 2025 | Cork Protocol (v4 hook) | 3,761 wstETH per Cork; about $12 million per Trail of Bits | Missing authorisation checks in its hook, combined with a rollover pricing flaw |
| 2 September 2025 | Bunni (v4 hook) | About $8.4 million | Rounding direction in idle-balance updates, exploited with 44 tiny withdrawals after a flash loan |
Cork’s post-mortem places the fault in its rollover mechanism and its own hook implementation, downstream of what it calls its core protocol.
Bunni’s case is the sharper one for LPs. Its own explanation was that each rounding direction was safe in isolation and that combining them was not. Two pools were hit, on Unichain and Ethereum. On 22 October 2025 it announced it would shut down, saying a secure relaunch would cost “6-7 figures in audit and monitoring expenses alone”.
Trail of Bits lists seven failure patterns. Three matter most to a reader: a hook that anyone can call, custom accounting that leaks value, and a hook whose failure blocks a user’s exit. The last can trap a withdrawal, since the callback runs in the same transaction as the removal.

Licences and governance: forks and the fee switch
Business Source License: v3 is free, v4 not yet
v3-core shipped under the Business Source License 1.1, with a change date of 1 April 2023 at the latest and GPL 2.0 or later after it. Uniswap said the licence limits commercial or production use for up to two years, so direct production forks had to wait.
v4-core is still in that window. Its BUSL-1.1 licence names a change date of 15 June 2027 at the latest, unless an earlier one is set through its ENS record, and the change licence is MIT. The README adds that some files are under MIT and each header says which. Until then, production use of the BUSL files needs a commercial licence or a grant.
UNIfication: what the fee switch changed for LPs
For years LPs kept 100% of swap fees and the UNI token had no claim on them. The UNIfication proposal, which passed in late December 2025, ended that. It turned on protocol fees, routes them and Unichain’s net sequencer fees to a UNI burn, removed fees on Uniswap Labs’ interface, wallet and API, and approved a one-off burn of 100 million UNI. Searchers claim the collected assets by burning a required amount of UNI.
Governance then widened the switch, chain by chain.
| Executed | Proposal | Effect | For / against |
|---|---|---|---|
| December 2025 | UNIfication | v2 and select v3 pools on Ethereum | over 125 million / 742 |
| 7 March 2026 | Fee Expansion: Vote 1 | Every v3 pool on Ethereum by fee tier; v2 and v3 on Arbitrum, Base, OP Mainnet | 62,837,439 / 4,968 |
| 8 March 2026 | Fee Expansion: Vote 2 | v2 and v3 on Celo, Soneium, Worldchain, X Layer, Zora | 77,831,696 / 11 |
| 1 June 2026 | Fee Expansion: Vote 3 | v2 and v3 on BNB Chain and Polygon | 72,977,936 / 0 |
| 27 July 2026 | Fee Expansion: Robinhood Chain | v2 and v3 on Robinhood Chain | 46,881,791 / 0 |
| 27 July 2026 | Activate v4 Protocol Fees (Part 1/2) | First v4 pools, on seven chains | 46,604,583 / 1,274,746 |
| 5 October 2026 | Fee Expansion: Arc | v2 and v3 on Arc | 46,262,383 / 0 |
The proposal of March replaced a pool-by-pool list with one default per fee tier, so a v3 pool now pays without any vote of its own, while governance can still override a single pool. The current defaults are on chain. We read them from the Ethereum adapter contract on 30 October 2026: a quarter of the swap fee on the two low tiers, a sixth on the two high ones. Those shares give the same split as the documentation’s table. Other chains may differ, and governance can change the values.
| Version and tier | LP keeps | Protocol fee | Share of the swap fee |
|---|---|---|---|
| v2, all pools | 0.25% | 0.05% | 1/6 |
| v3, 0.01% | 0.0075% | 0.0025% | 1/4 |
| v3, 0.05% | 0.0375% | 0.0125% | 1/4 |
| v3, 0.30% | 0.25% | 0.05% | 1/6 |
| v3, 1.00% | 0.8334% | 0.1666% | 1/6 |
v4 works differently, because a pool can have any fee. The July proposal sets rules by family of pool and covers three: pools without hooks, pools launched from a Continuous Clearing Auction, and aggregator hooks. Hookless pools follow a curve that gives, for an LP fee of 0.05%, 0.30% or 1%, a protocol fee of 0.0125%, 0.05% or 0.10%, which is the PoolManager’s cap. Other hooked pools stay out. It names Ethereum, Arbitrum, Base, BNB Chain, Polygon, Optimism and Robinhood Chain; Celo, Soneium, Worldchain, X Layer and Zora were left to a second vote, which we did not find on the governance site on 30 October 2026.
For an LP on an enabled v3 pool, a quarter or a sixth of the gross fee is gone, and any backtest from before the switch overstates income.
Uniswap v2 vs v3 vs v4 in one table
| v2 | v3 | v4 | |
|---|---|---|---|
| Date | Announced 23 March 2020 | Mainnet 5 May 2021 | Announced live 31 January 2025 |
| Liquidity shape | Whole curve | Chosen range | Chosen range, plus hooks |
| LP position | ERC-20 share | ERC-721 NFT | ERC-721 NFT via PositionManager |
| Swap fee | Flat 0.30% | Fixed tiers | Any static fee, or dynamic through a hook |
| Fees earned | Compound in the pool | Collected by hand | Credited when liquidity changes |
| Contracts | One per pair | One per pair and tier | One singleton per chain |
| ETH | Wrapped | Wrapped | Native ETH supported |
| Licence | GPL 3.0 (v2-core) | BSL, then GPL 2.0+ since April 2023 | BUSL-1.1 and MIT until June 2027 at the latest |
| Main LP risk | Impermanent loss | Amplified loss, out of range | The same, plus hook code |
v3 pools matter beyond LPs: each stores a cumulative tick that gives a geometric-mean time-weighted price, and our lesson on DeFi oracles covers its uses and limits.
Where the liquidity sits on 30 October 2026
| Version | TVL | Volume, last 30 days | Largest chains by TVL |
|---|---|---|---|
| v2 | about $902 million | about $0.69 billion | Ethereum $773m, Base $85m, Polygon $20m |
| v3 | about $1.57 billion | about $32.65 billion | Ethereum $843m, Base $304m, Arbitrum $127m, Robinhood Chain $87m |
| v4 | about $1.18 billion | about $32.49 billion | Ethereum $727m, Robinhood Chain $172m, Base $98m, Arbitrum $35m |
Figures from the DefiLlama API, 30 October 2026, summed from its chain data. Its DEX list totals about $250.7 billion for the same 30 days, so v3 and v4 together are about 26%, by our arithmetic. The next entry, PancakeSwap AMM V3, shows $16.3 billion.
v4 matches v3 on volume with less TVL. The data does not make it more efficient: the mix of routed flow, tests and hook-driven trading is not visible in these totals. The Uniswap project page has the wider picture.
US and UK readers: the SEC, the IRS and HMRC
Uniswap Labs said on 25 February 2025 that the SEC had closed its investigation with no action, after a Wells notice the year before. That is the company’s account of a case about Labs, and it says nothing about the status of your position.
The tax gaps on pools are set out in the previous lesson. Concentrated positions add two facts. The swap inside a manual rebalance is an exchange of one digital asset for another, which the IRS page treats as reportable, so a busy range means many taxable events; see our US crypto tax guide. In the UK, HMRC published draft legislation on cryptoasset loans and liquidity pools on 13 July 2026, updated on 28 October. It would defer Capital Gains Tax in certain circumstances until an economic disposal and covers automated market making arrangements. We have not established how it would apply to a v3 position, and our UK guide has the rules in force.
How to judge a position without being told what to do
We do not recommend pairs, ranges or managers. These questions decide whether a position makes sense for you:
- Range against volatility: how often has this pair left a band of this width in the past few months?
- Fee tier against volume: is there enough trading in this exact pool, not in the pair overall?
- Gas against size: how many rebalances can the position afford on this chain?
- Exit: at each edge, which asset will you hold, and do you want to hold it?
- Net of the protocol fee: does your estimate use the LP share, or the gross fee?
- Manager: who controls the vault, what is the timelock, and has it ever been exploited?
- Hook: is it audited, is it upgradeable, who holds the keys, and can it block a withdrawal?
A dashboard’s fee figure never includes the loss against holding, so put the two side by side. A later lesson walks through opening a position step by step, on a testnet first and then with a small amount.



