What the Uniswap fee switch actually costs LPs

Uniswap's protocol fee has been collecting on the big mainnet v3 pools since December 27, 2025, and on all v3 pools on Arbitrum and Base since March 6, 2026. Everything below is about v3: v2 has its own fee and v4's is a separate governance track, still in progress. Plenty has been written about what that means for UNI. Almost nothing has been written about what it means for the people providing the liquidity. We measured it, position by position, with no estimates: every number below is reconstructed from on-chain state.

The comparison that answers the question runs between two complete scenarios. In one, the fee never exists and LPs keep every fee dollar. In the other, the fee runs for each position's entire life. Real positions live in between: their pre-activation fees were untaxed, and their post-activation fees arrived already net of the protocol's cut, because the pool contract deducts the protocol share before crediting LPs. We build both scenarios from actual accounting: where the fee already ran, we add its take back; where it had not started, we subtract it. This is accounting, not equilibrium: nothing here models LPs changing behavior because of the fee.

What governance activated

  1. UNIfication (passed late 2025) turned on protocol fees for v2 and a first wave of mainnet v3 pools, those where Uniswap held 90%+ market share. The v3 rates: 0.01% and 0.05% pools give up one quarter of LP fees; 0.30% and 1% pools give up one sixth. The mainnet pools here activated December 27, 2025.

  2. The Protocol Fee Expansion (Vote 1, executed March 6, 2026; Vote 2, executed March 8, 2026) extended the same per-tier rates to all remaining mainnet v3 pools and all v3 pools on eight more chains, including Arbitrum and Base, which activated March 6, 2026.

  3. v4 protocol fees are a separate track, with votes underway since mid-July. Excluded throughout.

A fee haircut is not a return haircut

Your net return as an LP is fees earned minus divergence loss. Divergence loss is a loss by construction: zero at best, when price is exactly at your entry, and growing the further price moves away. Fees are the only reason LPing (sometimes) beats holding. The protocol fee applies only to the fees side, so the relative damage to your net return is the haircut multiplied by how fee-dependent your position is.

A position that earned $100k in fees against $10k of divergence loss nets $90k. A 16.7% fee haircut takes $16.7k, which is 18.5% of net. Mild.

A position that earned $100k in fees against $80k of divergence loss nets $20k. The same haircut takes the same $16.7k, which is 83% of net. Brutal.

Measured across the cohort below: the median profitable position gives up 28% of its net return to a 17-25% fee haircut.

The data

Scope: Ethereum mainnet, Arbitrum and Base, every Uniswap v3 pool pairing ETH with USDC or USDT holding at least $100k TVL. That is 20 pools, of which 18 contain qualifying positions.

Inside those pools we measure one fixed set of positions. We call it the cohort, and every number in this post describes it unless stated otherwise. A position is in the cohort if it:

  • is still open and has never had a withdrawal

  • has at least $1,000 deposited

  • is at least 30 days old

  • has earned fees at all (price never entering a position's range means nothing accrued and nothing for the fee to take)

8,053 positions qualify. Profitability throughout is measured against HODL, APRs are lifetime figures, and everything is a snapshot as of July 24, 2026. Everyone else in these pools pays the fee too but is not counted here: closed positions, every LP who ever withdrew (which covers rebalancing vaults and just-in-time liquidity), and sub-$1k positions.

The fee split is exact for every position, with no estimation anywhere:

  • 4,238 positions were minted after their pool activated. All their fees are post-fee reality by construction.

  • 3,815 positions predate activation. For each one we reconstructed its full fee state at its pool's exact activation block from archive data: the position's fee checkpoints and owed balances, plus the pool's fee-growth accumulators, which together give the precise fees earned up to the activation boundary. Post-activation fees are the recorded lifetime totals minus that reconstruction.

The results

No fee

Fee always on

Median net APR

+4.5%

+1.5%

Net profitable vs HODL

59.8%

53.7%

Positions flipped unprofitable by the fee

491

Protocol take over these positions' observed lifetimes

$6.8M of $30.0M gross fees

[Lifetime net APR distribution, no-fee scenario vs fee always on: chart_results_hist.png]

post image

Per position, the median cost is 3.5 points of net APR. That is each position measured against itself, which is why it differs from the 3.0-point gap between the two medians above: the positions earning the most fees take the biggest cuts. The median profitable position gives up 28% of its net return. The fee flips 491 positions, one in ten of everything that would be profitable without it.

Separately from the scenario comparison: the protocol has actually collected about $3.6M from these positions since activation. That figure is realized revenue, not a model; $2.5M of it came from positions that straddle activation and $1.1M from positions created after the fee switch.

post image

[The cohort's $30.0M in gross fees split two ways: scenario vs reality: chart_results_money.png]

Where it costs the most

post image

[Median lifetime net APR by width, fee tier, and network, before and after the fee: chart_where_dumbbell.png]

By range width (width is the ratio of a position's upper price bound to its lower one; a 1.8x range on ETH/USDC runs, for example, from $1,500 to $2,700; full range means the position's ticks span the entire usable range for its fee tier):

Width

No fee

Fee always on

Flipped

Narrow (<1.3x)

-17.8%

-20.8%

96

Middle (1.3-1.8x)

+7.9%

+3.3%

175

Wide (1.8x+)

+9.6%

+6.3%

199

Full range

+2.2%

+1.3%

21

Splitting each width by fee tier:

Median net APR, no fee / fee always on

0.01%/0.05% pools (25% cut)

0.3%/1% pools (16.7% cut)

Narrow

-22.5% / -25.6%

-11.4% / -14.6%

Middle

+4.2% / 0.0%

+11.7% / +7.3%

Wide

+8.7% / +4.7%

+10.9% / +7.9%

Full range

+2.4% / +1.0%

+2.1% / +1.4%

Wide ranges stay clearly positive under the fee on both tiers. Middle widths take the deepest cut, fee-dependent enough to feel the haircut, not wide enough to earn through it, and on the 25% tier their median under the fee is exactly zero. Narrow ranges lose money in both scenarios: the fees they earn do not come close to covering the divergence loss a tight range accumulates, with or without a protocol cut.

By position age:

Age

n

No fee

Fee always on

Flipped

30-90 days

2,592

+9.7%

+4.9%

252

90-180 days

2,429

+14.7%

+10.7%

108

180 days-1 year

2,350

-26.2%

-28.5%

81

1 year+

682

+9.1%

+5.4%

50

Read the age rows for what they are: entry-date cohorts. The 180-days-to-1-year bucket is deeply underwater in both scenarios because of when it entered, not because of the fee: those positions were opened between late July 2025 and late January 2026, a window containing ETH's August highs above $4,300, and ETH has roughly halved since. Their median divergence loss is 24% of deposits against 6% in fees, so the market path swamps everything else. The fee's own effect is the gap between the two columns, and it stays in a narrow band (2.3 to 4.8 points) across every age. What does move with age is the flips: over half of all flipped positions (252 of 491) are in the youngest bucket, where cushions are thinnest and a quarter of the fees is the difference between positive and negative.

Two aggregate medians cross zero under the fee: the 0.01%/0.05% tier goes from +2.2% to -1.1%, and Arbitrum goes from +1.1% to -2.3%. On the highest-rate tier and the chain most concentrated in it (92% of Arbitrum's cohort is on 0.05% pools), the median position's lifetime economics go negative under the fee. Base goes +7.9% to +4.5%; mainnet +5.0% to +2.6%.

By pool

Pool

Positions

No fee

Fee on

Flipped

Lifetime take

Collected so far

WETH/USDC 0.05% (Arbitrum)

2,447

+0.8%

-2.7%

158

$498k

$184k

WETH/USDC 0.3% (Base)

1,832

+10.5%

+6.9%

116

$231k

$185k

WETH/USDT 0.3% (mainnet)

1,114

+3.9%

+1.6%

56

$618k

$435k

USDC/WETH 0.05% (mainnet)

687

+9.1%

+5.3%

51

$4.39M

$2.35M

WETH/USDT 0.05% (Arbitrum)

522

+0.4%

-3.6%

39

$119k

$38k

WETH/USDC 0.05% (Base)

513

-4.1%

-7.4%

22

$115k

$37k

USDC/WETH 0.3% (mainnet)

273

+5.9%

+3.6%

14

$478k

$163k

WETH/USDC 0.3% (Arbitrum)

217

+9.2%

+5.9%

4

$29k

$15k

WETH/USDT 0.05% (mainnet)

122

-0.5%

-4.3%

9

$216k

$129k

USDC/WETH 0.01% (mainnet)

108

+2.2%

-1.5%

11

$36k

$19k

WETH/USDT 0.01% (mainnet)

98

+2.2%

-0.5%

6

$52k

$15k

WETH/USDT 0.3% (Arbitrum)

32

-5.8%

-9.5%

1

$3k

$1k

WETH/USDC 0.05% (Arbitrum, USDC.e)

23

+4.6%

+0.1%

3

$12k

$508

WETH/USDC 0.01% (Arbitrum)

21

-37.8%

-39.3%

1

$1.6k

$122

WETH/USDC 0.01% (Base)

18

-33.1%

-36.0%

0

$1.1k

$92

WETH/USDC 1% (Base)

11

+19.2%

+14.3%

0

$9k

$7k

WETH/USDT 0.3% (Base)

10

-13.7%

-15.6%

0

$205

$145

WETH/USDT 1% (mainnet)

5

+10.9%

+6.9%

0

$13k

$1k

The mainnet USDC/WETH 0.05% pool dominates the dollars: $4.4M of the cohort's $6.8M lifetime take, and $2.3M of the $3.6M collected so far.

Cross-checking against on-chain receipts

The protocol's revenue is independently visible on-chain: every sweep emits a `CollectProtocol` event, and whatever has accrued since the last sweep is held in each pool's `protocolFees` slot. Summing both across the 20 pools from each pool's activation block through July 24 gives $13.4M, all but a few thousand dollars of it already swept to each chain's TokenJar, Uniswap's fee-collection contract. Collection is continuous: the first sweeps happened within two days of activation, and every pool was swept within the last day.

The cohort's $3.6M realized take is 27% of that, and in every pool it is below both the pool-wide total and the cohort's share of TVL.

Pool

Protocol revenue on-chain

Cohort take

Cohort share of revenue

Cohort share of pool TVL

WETH/USDC 0.3% (Base)

$4.66M

$185k

4.0%

21%

USDC/WETH 0.05% (mainnet)

$3.12M

$2.35M

75.3%

82%

WETH/USDT 0.3% (mainnet)

$2.63M

$435k

16.5%

54%

WETH/USDC 0.05% (Arbitrum)

$1.05M

$184k

17.5%

60%

USDC/WETH 0.3% (mainnet)

$472k

$163k

34.6%

76%

WETH/USDT 0.05% (mainnet)

$426k

$129k

30.2%

78%

WETH/USDC 0.05% (Base)

$347k

$37k

10.7%

36%

13 smaller pools

$659k

$98k

14.8%

51%

Total

$13.4M

$3.6M

26.8%

53%

The two extremes tell the same story from opposite ends. The mainnet USDC/WETH 0.05% pool is dominated by large passive positions, our cohort holds 82% of its TVL, and accordingly pays 75% of its protocol fee. The Base 0.3% pool is the busiest revenue source of all 20, but its fee flow comes overwhelmingly from tight, frequently recycled positions that the never-withdrawn filter excludes, so the cohort's 21% of TVL pays only 4% of the take. TVL shares come from our pool snapshots and are used only for this plausibility check. The per-pool `CollectProtocol` tally and the script that produced it are in the published dataset.

What to do with this

The fee is part of the terrain now. For the most common strategy, LPing to beat holding, fees have to out-earn divergence loss, and on these pools a sixth to a quarter of them goes to the protocol first. Wide ranges clear that bar most often, on both tiers. Middle and tight ranges on the 25% tier are where lifetime economics stop working at the median. Your dashboard shows net APR (fees and divergence loss together) for every position. And a note on the backtester: it replays observed on-chain fee growth, which on fee-on pools is already net of the protocol's cut, so do not apply any additional haircut to its results.

Check it out Revert

Check the data yourself

One CSV row per position: the boundary-reconstructed fee split, both scenarios, explicit profitability booleans, unrounded values, and a revert.finance link per row so every input can be checked against its live page. The bundle includes the per-pool activation table (block, transaction, timestamp), the boundary reconstruction script, and the on-chain cross-check: a per-pool `CollectProtocol` tally with the script that produced it. Snapshot: July 24, 2026.