Impermanent loss on Uniswap v3: my real result after fees and gas

Uniswap shows you the fees your position earns, never what the pool’s rebalancing costs you. I ran the full numbers on five months of EURC/USDC liquidity, and the pool wasn’t what lost me money.

USDC and EURC flowing into a Uniswap pool. On the right, a price line leaving its range band, then three bars: fees collected in green, impermanent loss in red, almost as long, and gas as a tiny sliver.

Impermanent loss is the hidden cost of providing liquidity. Uniswap displays the fees your position earns, not what the pool’s rebalancing takes away. From February to July 2026, I provided EURC and USDC on Uniswap v3. My portfolio says I lost 1.14%. The pool actually made me a little money: it was the euro that cost me.

How a liquidity pool works

You deposit two tokens of equal value. Anyone swapping one for the other goes through your pool and pays a fee, which you earn in proportion to your share (Uniswap’s documentation on fees).

In return, the pool keeps rebalancing your position. When one token goes up, it sells some for you. When it goes down, it buys more for you. So you always end up with more of the token that fell and less of the one that rose.

The impermanent loss formula

Impermanent loss compares two values on the same day: what you withdraw from the pool, and what the tokens you deposited would be worth if you had simply held them.

Impermanent loss = 2√r ÷ (1 + r) − 1

r is the price of one token against the other at withdrawal, divided by that same price at deposit. The formula holds for a full-range position: Uniswap v2, or a v3 position spread over the whole curve. It leaves out the fees you collect.

Price moveLoss vs. holding
× 1.25 or ÷ 1.25−0.6%
× 1.5−2.0%
× 2 or ÷ 2−5.7%
× 3−13.4%
× 5−25.5%
Impermanent loss curve for a full-range position by the price ratio between the two tokens, from × 0.1 to × 10: zero at × 1, −0.6% at × 1.25, −5.7% at × 2 as at × 0.5, −25.5% at × 5
Direction doesn’t matter: a price that doubles costs as much as one that halves.

It’s called “impermanent” because it disappears if the price returns to where it started. While you stay in the pool, it’s an unrealized loss. It becomes final when you withdraw, the way an unrealized gain becomes realized when you sell.

What a price range changes on Uniswap v3

On Uniswap v3, you pick a price range (Uniswap’s documentation on concentrated liquidity). All your capital works inside that range. It earns far more fees there than over the full range, and impermanent loss grows by the same factor.

When the price leaves your range, two things happen. Your position stops earning. And it ends up entirely in one token: the one that fell.

That happened to me three times. Between early February and mid-March, the euro lost 2.7% against the dollar. Over the full range, that move would have cost me 0.01%. In my narrow range it cost me 0.96%, nearly a hundred times more, and my position came back entirely in EURC.

Collecting fees isn’t withdrawing

On Uniswap v3 and v4, fees aren’t added to your position. They build up on the side, and you collect them with a separate transaction that returns a little of both tokens. Your capital stays in the pool.

In a wallet’s history, a fee collection looks like a small withdrawal. Yet it’s the only real gain an open position has.

On Uniswap v2, fees are reinvested in the pool automatically. You only see them at withdrawal, mixed in with your capital.

Calculating your real result in a spreadsheet

Two results matter, and they answer different questions:

  • the result in dollars = withdrawn + fees collected − deposited − gas. It’s what your portfolio shows;
  • the result vs. holding = withdrawn + fees collected − value of the tokens held − gas. It’s what the pool earned you, or cost you.

Every amount uses the price of its day: the deposit at the deposit date, the withdrawal and the held tokens at the withdrawal date, gas at the ETH price on the day you paid it.

For a pair with a dollar stablecoin, such as EURC/USDC or ETH/USDC, one row per position is enough. Put the quantities deposited in B2 (the USDC) and C2 (the other token), the other token’s price at deposit in D2, the quantities withdrawn in E2 and F2, its price at withdrawal in G2, fees collected in dollars in H2 and gas in dollars in I2:

CellFormulaWhat it gives
J2=B2+C2*D2value deposited
K2=B2+C2*G2value of the same tokens, held
L2=E2+F2*G2value withdrawn
M2=L2-K2impermanent loss
N2=L2+H2-J2-I2result in dollars
O2=L2+H2-K2-I2result vs. holding

Divide M2 by K2 to get the loss as a percentage.

My real result: EURC/USDC on Uniswap v3

From February 3 to July 3, 2026, I provided EURC and USDC on Uniswap v3, on Ethereum. Three times, the price left my range. I collected my fees and withdrew, then, the first two times, opened a new position around the new price. Over the five months I got back 66% of my USDC and 133% of my EURC: the pool had me buying euros while they fell.

PositionEuro effectImpermanent lossFees collectedGasResult in dollarsVs. holding
February → March, 41 days−1.31%−0.94%+0.90%−0.02%−1.37%−0.06%
March → April, 42 days+0.99%−0.39%+0.68%−0.06%+1.21%+0.23%
April → July, 66 days−0.99%−0.77%+0.99%−0.10%−0.87%+0.12%

Each row is a percentage of the capital deposited in that position. Up to rounding, the first four columns add up to the result in dollars.

Waterfall chart of my Uniswap v3 EURC/USDC position on Ethereum over 150 days, as a percentage of capital committed: +2.58% in fees collected, −2.13% impermanent loss, −0.18% gas, for +0.27% vs. holding my tokens; then −1.41% from the euro’s drop, for −1.14% in dollars
My real numbers. The euro’s drop would have hit me just the same had I held.

Over the whole period, fees brought in 2.58% of the capital, about 6.3% a year. Impermanent loss took back 2.13% and gas 0.18%. Compared with simply holding my tokens, I made 0.27% in 150 days. That’s thin.

The −1.14% in my portfolio comes mostly from the euro, which lost 3% in five months. I would have lost that too by holding my EURC. It wasn’t the pool that cost me, it was the pair.

My takeaway: a narrow range earns a lot of fees, but every exit from the range costs almost as much as it earned. On a pair that barely moves, the “vs. holding” number is what tells you whether the pool was worth it.

Gas: Ethereum vs. a layer 2

My nine transactions on Ethereum cost 0.18% of the capital, or 7% of the fees collected. In 2026, Ethereum gas is low: the most expensive one, a deposit, cost a dollar. On Base and Arbitrum, two “layer 2” networks built on top of Ethereum, my three other positions took eleven transactions for 8 cents in total.

Gas is fixed, fees scale with your capital. On a small amount, or if you reposition often, Ethereum gas can eat everything. I ran the same numbers for a loan in my real Aave yield after gas.

Those three positions were short. My two USDC/USDT pools had no impermanent loss: both tokens are worth a dollar. The Uniswap v2 one, on Arbitrum, made 0.23% in 12 days. The Uniswap v4 one, on Base, collected next to nothing in 10 days: a pool with no volume earns nothing. The third, EURC/USDC on Aerodrome (Base), lasted 13 days and came out roughly flat in dollars.

Where the spreadsheet breaks, and what Crypto Master does

A Uniswap position is hard to rebuild in a spreadsheet:

  • an out-of-range withdrawal returns a single token: in your history it looks like an ordinary deposit, and nothing says it closes a position;
  • a fee collection looks like a partial withdrawal;
  • every movement needs the price of its day, for both tokens and for the ETH spent on gas;
  • on v2, fees are inside the withdrawal and don’t show up separately;
  • a position still in the pool isn’t in your wallet’s balances: on Uniswap v3 it’s just an NFT, and what the pool would hand back only shows in Uniswap’s app.

Crypto Master reads your wallet by its public address, never your recovery phrase (what we keep, and what we never ask for). Its DeFi operations page groups your Uniswap and Aerodrome movements by pair: deposits, fee collections and withdrawals, including a withdrawal that returns a single token. Gas is assigned at the day’s price, and the net result is calculated.

For a withdrawn position, it compares that result with holding your tokens: price divergence (the impermanent loss), pool fees and gas, in dollars, at prices on the day you exited. For a position still in the pool on Uniswap v3 (Ethereum), Uniswap v2 (Arbitrum) or Aerodrome (Base), it reads on-chain what the pool would hand back today, uncollected fees included. You get its unrealized result and the same comparison, without withdrawing anything.

Liquidity provision section of the Crypto Master demo: four positions, two still in the pool (USDC/USDT on Orca and on Uniswap v3) and two withdrawn; the Uniswap v3 ETH/USDC position, withdrawn after 152 days with $13.05 in fees collected and $4.68 in gas, made +$486.82, or +48.68%, but −$101.69 versus holding its tokens
The demo portfolio: two positions in the pool, two withdrawn, each compared with holding its tokens.

Frequently asked questions

What is impermanent loss?

It’s the gap between what you withdraw from a liquidity pool and what the same tokens would be worth if you had held them. It comes from the pool’s automatic rebalancing.

Is impermanent loss permanent?

Not while you stay in the pool: it disappears if the price returns to where it started. It becomes final when you withdraw.

What is the impermanent loss formula?

For a full-range position, 2√r ÷ (1 + r) − 1, where r is the price ratio between the two tokens at withdrawal versus deposit. A price that doubles costs 5.7%.

Do fees make up for impermanent loss?

Sometimes, and barely: in my EURC/USDC pool, 2.58% in fees covered 2.13% of impermanent loss and 0.18% of gas.

What happens when the price goes out of range on Uniswap v3?

Your position stops earning fees and ends up entirely in one token, the one that fell. It becomes active again if the price comes back into the range.

How much gas does providing liquidity cost?

On Ethereum in 2026, from a few cents to a dollar per transaction for my positions. On Base or Arbitrum, less than a cent.

See Uniswap positions grouped by pair, with their fees collected, gas, net result and how they did against holding, on a made-up portfolio and without creating an account.

Open the demo

Share: LinkedIn X Facebook

Read next

Wallets & DeFi

Random tokens in your wallet: spam, dusting or scam?

A token you never bought just showed up in your wallet, sometimes with a tempting dollar value or a website in its name. It can’t take anything from you as long as you leave it alone. Here’s what it’s after, and how to tell it apart from the real thing.

· 7 min read

Audience measurement We would like to measure traffic on this site with Google Analytics, to learn which pages are actually useful to you. Nothing is stored on your device or sent until you accept. Your choice lasts six months and can be changed at any time from the footer. Read the privacy policy.