Valuing Uniswap V3 Concentrated Liquidity
A Uniswap V3 position is an NFT whose composition changes with price. Why a token balance tells you nothing, and what has to be computed to value one.

Protocols covered
Uniswap
Ethereum
Uniswap V2 positions were fungible LP tokens: hold 1% of the supply, own 1% of the pool. V3 replaced that with concentrated liquidity, and in doing so made LP positions genuinely hard to value.
The position is an NFT, not a balance
A V3 position is an ERC-721 token representing liquidity provided within a specific price range — a lower and upper tick. Two positions in the same pool with the same capital can be worth different amounts and hold entirely different assets.
That means a balance query returns, at best, "this wallet owns NFT #123456". The value is contract state, not a number in the wallet.
Composition changes with price
Within its range, a position holds a mix of both assets that shifts as the price moves. Outside its range, it holds exactly one:
| Price relative to range | Position holds |
|---|---|
| Below the range | 100% of the base asset |
| Inside the range | A mix, shifting as price moves |
| Above the range | 100% of the quote asset |
| Out of range (either side) | Earning no fees |
The last row is the operationally important one. An out-of-range position is still capital, but it has stopped doing the job it was deployed for. A portfolio report that shows only value will not surface that; a report that shows range status will.
What has to be computed
To value a V3 position you need, at minimum:
- The position's tick range and liquidity amount.
- The pool's current tick.
- The resulting token amounts at that price.
- Uncollected fees — accrued but not yet withdrawn.
- Prices for both underlying assets.
Point four is routinely missed. Uncollected fees can be a material share of a position's value, and they sit in the contract rather than the wallet. An API that reports the liquidity but not the fees understates every active LP position, and understates the most successful ones most.
Impermanent loss is not a data field
A common request is for the API to report impermanent loss. It cannot, because IL is defined against a counterfactual — what the assets would be worth if you had simply held them — and that depends on when you entered.
What a portfolio API can give you is the honest inputs: current composition, fees earned, and range status. Computing IL against your own cost basis is a downstream job, and one that belongs alongside transaction reconciliation where the entry price actually lives.
V4 and hooks
Uniswap V4 keeps concentrated liquidity and adds hooks — custom logic attached to a pool. Hooks can alter fee behaviour and position mechanics, which means coverage is now per-hook as well as per-pool. A provider supporting "Uniswap V4" does not necessarily support every hook deployed against it.
Worth asking about explicitly rather than assuming.
Checking a provider
For a wallet with an open V3 position:
- Is the position resolved into underlying token amounts, or shown as an NFT?
- Are uncollected fees included, and shown separately?
- Is range status exposed — in range, or out?
- Does the value change correctly when the pool price crosses a range boundary?
A provider that reports LP positions at the LP token's own market price, rather than by resolving pool composition, is making the error described in Why Portfolio APIs Disagree About Net Worth.
Keep reading
ProtocolsTracking Curve Pools, Gauges and veCRV
Curve positions move through three places and only one is your wallet. Why staked LP tokens vanish from balance queries and how locked veCRV should be valued.
2 min read
ProtocolsTracking Aave Positions: Supply, Debt, Health
Aave supplies and borrows are separate tokens with independent balances. How to net them into a real position, and why health factor belongs in risk data.
2 min read
ProtocolsValuing stETH and Liquid Staking Positions
Rebasing and wrapped staking tokens need different valuation logic. Why stETH balances change with no transaction, and how wstETH breaks naive pricing.
2 min read