When a concentrated-liquidity position goes out of range, its principal becomes entirely one token and stops earning new swap fees until the pool price returns to its range. In Uniswap v3, a price quoted as token B per token A leaves all A below the lower bound and all B above the upper bound. Previously earned fees remain separate from that inventory.
The useful next step is to identify the tokens you can actually withdraw. Keep principal, uncollected fees and assets already in your wallet as separate records. Combining them too early can make a single-sided position look like it is still trading or earning fees.
The mechanics below use a plain Uniswap v3 position. A vault, borrowed position or additional reward program can introduce other balances and rules.
Fix the price direction first
Define price P as units of B needed to buy one A. A rising P means A is becoming more expensive relative to B. For this example, A corresponds to token0 and B to token1, with quantities expressed in whole-token units.
With that orientation:
- Below the lower bound, the principal is entirely A.
- Strictly inside the range, the principal contains both A and B.
- Above the upper bound, the principal is entirely B.
This direction follows the real-reserve model in section 2 of the Uniswap v3 whitepaper. As swaps move the pool price upward through the interval, the position releases A and accumulates B. A move downward does the reverse.
The labels depend on the quotation. A range of 1,600–3,600 B per A becomes 1/3,600–1/1,600 A per B when inverted; the endpoints also reverse order. Write the unit beside every displayed price before interpreting an interface's “above” or “below” status.
Use the price of the actual pool, rather than an unrelated exchange's last trade, to classify its position. Uniswap's concentrated-liquidity documentation explains that position boundaries are ticks and that liquidity becomes active as the pool moves through them.
Follow one unchanged position through six observations
Consider an original hypothetical position with a lower price of 1,600 B/A, an upper price of 3,600 B/A and liquidity parameter L = 600. L describes the position's curve; it is not its deposit value in B.
Assume ordinary tokens, fixed bounds and unchanged L. Exclude fees, gas, rewards and contract rounding from the principal calculation. B is the reporting unit; no dollar peg is assumed. These round boundaries simplify the arithmetic. A deployed position must use the pool's permitted tick grid.
The square roots of the bounds are 40 and 60. Take the square root of the current P and clamp it between those values; call the result s. The principal quantities are:
- A amount = L × (1/s − 1/60).
- B amount = L × (s − 40).
Clamping s at 40 or 60 produces the fixed single-token quantities outside the interval. These are the normalized relationships implemented by Uniswap's LiquidityAmounts library, which selects a different calculation below, within and above the bounds.
At entry, P = 2,500, so s = 50. A equals 600 × (1/50 − 1/60) = 2; B equals 600 × (50 − 40) = 6,000. The starting principal is worth 2 × 2,500 + 6,000 = 11,000 B.
| Observation | Pool price, B/A | Principal A | Principal B | New swap-fee eligibility |
|---|---|---|---|---|
| Entry, inside | 2,500 | 2 | 6,000 | Eligible |
| Falls below lower bound | 900 | 5 | 0 | Inactive |
| Returns inside | 2,025 | 3.333333 | 3,000 | Eligible |
| Rises above upper bound | 4,900 | 0 | 12,000 | Inactive |
| Continues above | 6,400 | 0 | 12,000 | Inactive |
| Returns to entry price | 2,500 | 2 | 6,000 | Eligible |
The third row uses s = 45. Its exact A quantity is 10/3, rounded in the table. The principal value is (10/3) × 2,025 + 3,000 = 9,750 B.
The same unchanged position returns to its original principal quantities at the final observation. There was no withdrawal or range reset in between. Fees are outside this table and can differ even when principal returns to the same mix.
These are sequential teaching states, with the intervening swaps assumed to move the pool through the stated prices. No live pool or transaction was tested. The rows also avoid exact-boundary states, where a rounded interface price can obscure the pool's tick accounting.
At a live v3 boundary, read the pool's stored current tick. A funded position contributes active liquidity when its lower tick is at or below the current tick and its upper tick is above it. The pool's range checks use that interval; a rounded displayed price alone cannot settle the status.
Fee eligibility and an existing fee balance are different records
An active position is eligible for swap fees allocated to its liquidity. Actual income still depends on swaps occurring, the position's share of active liquidity and applicable protocol deductions. Simply spending time inside the interval does not establish a fee amount. Uniswap's fee documentation describes active-liquidity allocation and separately claimable v3 fees.
Once the position is outside, swaps elsewhere in the pool do not earn it new swap fees. Fees accrued before it left remain a separate claim. They do not automatically increase L or move the range.
Add another explicitly hypothetical assumption: by the 4,900 B/A observation, earlier in-range swaps have generated an uncollected balance of 0.03 A and 40 B. These quantities are stipulated, not estimated from trading volume. Assume price stays above 3,600 between the next two observations, with no collection or other balance changes.
| Pool price, B/A | Uncollected A | Uncollected B | Fee balance valued in B | Principal plus fees, B |
|---|---|---|---|---|
| 4,900 | 0.03 | 40 | 187 | 12,187 |
| 6,400 | 0.03 | 40 | 232 | 12,232 |
At the first snapshot, fee value is 0.03 × 4,900 + 40 = 187 B. At the second, it is 0.03 × 6,400 + 40 = 232 B.
The displayed value grows by 45 B while token quantities and new fee accrual are unchanged. A dashboard showing a larger currency value therefore needs a quantity check before you describe the change as newly earned fees.
The principal is all B in both rows, while the total claim still includes 0.03 A. This is why “single-sided” should identify the principal being discussed. For the broader accounting comparison, the pool fees versus net return guide connects fee receipts with inventory changes and operating costs.
Single-sided principal keeps its remaining token exposure
At 900 B/A, the position owns 5 A worth 4,500 B. If P falls further to 400 while the position stays below range, the same 5 A is worth 2,000 B. The lower bound stopped further conversion into A; it did not create a floor under A's value.
Above the upper bound, the 12,000 B principal stays fixed in B units as A moves from 4,900 to 6,400. Its value in another reporting currency can still change with B's exchange rate.
Crossing a plain LP range does not itself cause liquidation. Uniswap's explanation of out-of-range positions explicitly distinguishes this status from liquidation. Borrowing against a position adds a separate collateral question.
A gain from entry also needs a benchmark. At 4,900 B/A, the fee-free principal is 12,000 B, above its original 11,000 B value. Holding the original 2 A and 6,000 B would instead be worth 2 × 4,900 + 6,000 = 15,800 B.
The impermanent loss versus holding example explains how to retain that original-token benchmark. Its full-range 50/50 shortcut needs different equations for this bounded position.
Choose the next inventory deliberately
Leaving the position open preserves its range. If pool price re-enters, its liquidity can activate again without creating a replacement position. Uniswap's out-of-range guide describes this return to fee eligibility. There is no scheduled reactivation; price may stay outside indefinitely.
That also preserves future conversion. In the example, leaving the all-B principal open allowed it to become mixed again on the final move back to 2,500. Section 2.1 of the whitepaper explains why a crossed range intended as a conversion must be withdrawn if the provider wants to prevent it trading back.
| Possible action | Inventory consequence to assess |
|---|---|
| Keep the existing range | Retain the current token exposure and potential future conversion on re-entry |
| Remove liquidity and collect | Receive the current claim; subsequent exposure follows the tokens retained in the wallet |
| Create a replacement range | Fund a new inventory mix, potentially requiring a swap and additional transaction costs |
Uniswap's range-change instructions require removing existing liquidity and creating a new position. Moving the range starts a new allocation decision; it cannot restore the original token mix without the necessary trades.
If reallocation requires a swap, compare the actual route and final amounts. The DEX aggregator split-routing guide addresses that execution question. The concentrated-liquidity swap-path guide explains why other positions' active ranges matter to the swap's output.
Reconcile one position before acting
Use a single state reference for the inventory and fee calculation. A wallet overview can combine multiple ranges, old fee receipts and tokens unrelated to the position.
| Record | Validation question |
|---|---|
| Chain, pool, version and position identifier | Are you inspecting the intended position? |
| Token contracts, order and decimals | Do A, B and the price quotation use consistent units? |
| Actual bounds and stored current pool tick | Does the funded position meet the lower-inclusive, upper-exclusive active-tick test? |
| Position L and liquidity changes | Is it still funded, and were tokens added or removed? |
| Principal quantities and current fee claim | Are separately claimable fees counted exactly once? |
| Pending and confirmed operations | Have removal and collection actually completed? |
| Original contribution and costs | What inventory and expense boundary define the comparison? |
For v3 integrations, stored fee checkpoints require care. The position-manager source keeps liquidity, ticks, fee-growth checkpoints and tokens owed separately; collection updates fee accounting before transferring the claim. A previously stored owed amount alone can miss later fee growth. Tokens owed can also include principal released by a liquidity decrease, so distinguish that amount from trading fees. The contract separates decreasing liquidity from collecting owed tokens, even when an interface bundles those actions.
Record the principal token, both fee quantities and the confirmed transaction state before choosing a new range. That gives the decision a concrete starting inventory and prevents an inactive status label from substituting for an account of what you own.
