Uniswap

Uniswap liquidity pools - Position Changes, Range Status and Fee Evidence

Uniswap liquidity pools change a provider’s displayed token mix as the pool price moves, even when the wallet submits no transaction. To explain an expected-versus-observed mismatch, first match the network, protocol version, token contracts, pool identifier and position identifier. Then compare the pool’s current price with the position bounds, separate principal amounts from uncollected fees and check the latest onchain action. Concentrated positions in v3 and v4 may move between two-token and single-token states as price crosses their ranges. A v2 position follows its share of whole-pool reserves instead. This trace shows whether the difference comes from price movement, fee accounting, a liquidity change or the wrong pool state.

Symptoms That Point to Pool-State Changes

A changed position display usually has a limited set of causes. The pool price may have moved, shifting the position’s token composition. Fees may have accrued or been collected. Liquidity may have been added or removed. A tracker may also be reading a different pool, position or block than the one the reader expects.

An unexpected in-range label calls for a price-orientation and tick check. A fee balance that appears frozen may reflect an out-of-range position, little relevant swap activity or stale indexed data. If identifiers do not match, stop the trace there because calculations from another pool cannot explain the intended position.

Pool Identity Before Position Math

Pool identity determines which state belongs in the calculation. Token symbols alone are insufficient because distinct contracts can share a symbol. The network, protocol version, ordered token contracts and pool identifier must match. A v3 pair can have separate pools under different fee configurations, while a v4 PoolKey includes its ordered currencies, fee field, tick spacing and hook address.

Position identity matters separately. A v2 LP token balance represents a proportional pool share. V3 and v4 concentrated positions carry their own ranges and liquidity values. Compare readings from the same confirmed block whenever possible. Otherwise, a legitimate price move or transaction between snapshots can look like an accounting error.

Why Did the Position’s Token Balances Change?

Position token balances change because swaps move the pool price along its pricing curve. For concentrated liquidity, the current price determines how much of each token the position could withdraw from its principal at that state.

Movement Inside the Selected Range

An in-range position normally contains both pool tokens. As the pool price moves toward one boundary, the position holds more of one token and less of the other. Its liquidity value can remain unchanged throughout that movement. Therefore, changing token amounts without a wallet transaction can be normal pool behavior rather than a deposit or withdrawal.

Movement Beyond a Range Boundary

A position outside its selected range becomes single-sided. Which token remains depends on token ordering, price direction and whether the quoted price has been inverted for display. An out-of-range concentrated-liquidity position does not earn LP fees until the pool price returns to its selected range. Leaving the range is not liquidation, and the position can become active again after re-entry.

Price Orientation, Ticks and Boundary Evidence

Price orientation decides whether a move appears upward or downward and which token accumulates near each boundary. Resolve that orientation before interpreting the displayed amounts.

Token Order and Reciprocal Prices

A pool stores an ordered token pair, while an interface may quote either token against the other. Reversing the quote turns a price into its reciprocal and swaps the visual meaning of the lower and upper limits. The position itself has not changed merely because the display uses the opposite orientation.

Stored Ticks and Displayed Bounds

Concentrated positions store lower and upper ticks rather than arbitrary decimal labels. Interfaces convert those ticks into prices and may round the result. Near a boundary, use the current pool tick and stored tick limits instead of deciding from rounded labels that appear equal.

One Checkpoint for Every Value

A defensible comparison uses the pool price, current tick, position liquidity, range and fee state from one block. Mixing a live price with an older position snapshot can produce token amounts that never existed together. Record the block with the values so a later refresh can be distinguished from an earlier state.

Where Did the Accrued Fees Go?

Fee location depends on the protocol version. In v2, swap fees remain in the pool and affect the reserves backing LP tokens. They are not shown as a separate collectable balance for each provider. In v3 and v4, earned fees are accounted separately from principal, so accrual alone does not increase position liquidity. In v4, an increase-liquidity operation credits unclaimed fee revenue into the position.

For v3, a raw tokens-owed value may not by itself reflect every fee earned since the position was last updated. A complete calculation uses fee growth inside the position’s range and its last recorded checkpoints. After collection, the uncollected balance falls and the wallet receives the claimed tokens, while the position’s liquidity can remain unchanged.

Version Boundaries in Position Accounting

Protocol version changes both the ownership record and the evidence needed to explain a position.

V2 Pool Shares

A v2 trace starts with the wallet’s LP token balance, total LP token supply and the pool reserves. The wallet’s proportional share connects those values to its underlying token amounts. Swaps, fee accumulation and liquidity actions change the reserves, so an older reserve snapshot cannot support a current redemption estimate.

V3 Concentrated Positions

A v3 position is represented by an NFT and identified by its token ID; its pool, lower tick, upper tick and liquidity describe its state. Current token amounts are derived from those values and the pool price. Uncollected fees require separate fee-growth accounting. Collecting fees does not move the range or increase the stored liquidity.

V3 Concentrated Positions: A v3 position is represented by an NFT and identified by its token ID; its pool, lower tick, upper tick and liquidity describe its state.; Current token amounts are derived from those values and the pool price. Uncollected fees require separate fee-growth accounting.; Collecting fees does not move the range or increase the stored liquidity.

Open full-size image

V4 Pools and Hooks

A v4 position also uses concentrated-liquidity ranges, but the pool key and hook configuration belong in the identity check. Hooks can modify pool behavior, and v4 may use dynamic fee logic. A calculation that assumes an ordinary static-fee pool can be incomplete when the selected pool has different configured behavior.

Continue, Wait or Stop

The next action follows from the strongest available evidence. Continue the analysis when every identifier matches and the difference can be reproduced from the same pool checkpoint. If a confirmed transaction has not yet reached the tracker, wait for its state to refresh while retaining the receipt and block number.

Stop before changing the position when the network, token contracts, pool key, position identifier or price orientation remains unresolved. The same boundary applies when hook-dependent behavior has not been included. A range cannot simply be edited in place on a concentrated position; changing it requires removing liquidity and creating liquidity under new bounds, which is a separate onchain decision.

Verification Record Before Changing the Position

A final position record should connect each observed state to one mechanism and one confirmation boundary. The comparison below keeps market movement separate from fee and liquidity actions.

Observed State Position Effect Boundary or Proof
Price moves inside the range Principal token amounts shift while stored liquidity can remain constant The current pool tick remains within the stored bounds
Price leaves on the lower side The concentrated position becomes entirely one token, subject to quote orientation The current tick is outside the stored interval on its lower side
Price leaves on the upper side The position becomes entirely the other token, subject to quote orientation The current tick is outside the stored interval on its upper side
Fees are collected Uncollected fees decrease without requiring a principal-liquidity change A successful receipt and post-transaction fee state confirm collection
Liquidity is added or removed Stored liquidity and withdrawable principal change A successful receipt and the new position-liquidity value confirm the action
Verified Position State Price movement, fee movement and liquidity actions remain separate All values refer to the same pool, position and confirmed checkpoint

Keep the network, version, pool and position identifiers beside the quoted price orientation, bounds, liquidity, token amounts, uncollected fees and block number. Matching evidence supports continuing or waiting. A conflict supports stopping before another transaction changes the state that still needs to be explained.

Practical questions

Can a Concentrated Position Be Active Without Showing New Fees?

Yes, an in-range position can remain active without showing a noticeable fee increase. Fees require swaps that use liquidity at prices covered by the position. Limited activity, very small accruals or a delayed interface refresh can leave the displayed amount unchanged. Compare fee-growth data across confirmed blocks before treating the display as proof that nothing accrued.

Which Onchain Change Proves That Liquidity Was Removed?

A successful transaction receipt paired with a lower position-liquidity value proves that liquidity was removed. Wallet token transfers may accompany the action, but they should not be the only evidence because collection and other operations can also transfer tokens. Compare the same position before and after the confirmed transaction, using its pool identity and stored range.

Why Can the Fiat Value Change While the Token Units Stay the Same?

Fiat value can change because it is a valuation layer rather than part of the position’s stored token units. A pricing feed may update while the underlying position snapshot remains fixed. Missing or filtered price data can also make a fiat estimate disappear. Use onchain token amounts, liquidity and pool state for the position trace, then value them separately.

When Can Fees Accrue in Both Pool Tokens?

Fees can accrue in both pool tokens when qualifying swaps use the active position in both trading directions. A swap fee is taken from the input side, so the mix of fee tokens reflects the activity that crossed the position’s range. In-range status establishes eligibility to earn; it does not determine the eventual split between the two fee balances.

Does Adding Liquidity Keep the Existing Price Range?

Adding liquidity to an existing concentrated position increases liquidity under that position’s stored lower and upper ticks. It does not rewrite those bounds. A different range requires a separate position after any desired removal from the old one. Confirm that the transaction targets the intended position identifier because an interface may also offer a flow that creates a new position.

Can a zero-liquidity v3 NFT Still Hold Claimable Fees?

Yes, a v3 position NFT can remain after its principal liquidity reaches zero while tokens are still owed to the position. Those amounts must be collected before the empty NFT can be burned. Read both the liquidity value and fee-related state; the NFT’s presence alone does not prove that principal remains, and zero liquidity does not prove that every claimable amount is gone.

Which Snapshot Makes Two Position Trackers Comparable?

Two trackers are comparable when they use the same network, protocol version, pool, position and confirmed block. A matching timestamp is weaker because the trackers may index different blocks or refresh at different times. If historical block selection is unavailable, refresh both after the same confirmed action and record their block references before comparing token amounts or fees.

- updated