# 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.

- **URL:** https://octav.fi/blog/valuing-uniswap-v3-positions
- **Published:** 2026-03-18
- **Author:** Octav Team — Portfolio Intelligence for Digital Assets
- **Topic:** Protocols
- **Tags:** uniswap, liquidity, defi
- **Source:** Octav, Practical guides on crypto NAV reporting, multi-chain portfolio management and digital asset APIs, from the team behind Octav.

---
<LogoRow items="uniswap,ethereum" caption="Protocols covered" />

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:

1. The position's tick range and liquidity amount.
2. The pool's current tick.
3. The resulting token amounts at that price.
4. **Uncollected fees** — accrued but not yet withdrawn.
5. 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](/crypto-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](/why-portfolio-apis-disagree).
