Uniswap v3 LPs on Ethereum earned $42M in fees in a year. Holding the tokens would have paid $20M more
Every LP dashboard shows a yearly fee rate. Few count the cost of the price moving under you. Here is a year of both on Ethereum's busiest Uniswap v3 pools, rebuilt from scratch after our first version got its main numbers wrong.
- −$20.4M
- 34%
- 93% → 41%
- 18%
- 68%
01 · The pitchGet paid for every trade, if the price sits still
Put two tokens on Uniswap and every trade that uses them pays you a small cut. Sites list that income as a yearly rate, often in double digits. What they rarely show is what happened to the tokens themselves.
People who do this are called liquidity providers, or LPs. They deposit a pair of tokens, say ETH and USDT, into a pool, and traders who swap against that pool pay a small fee on every swap, which the LPs share between them. Since Uniswap v3 arrived, an LP also picks a price range. A narrow range earns more fees per dollar while the price stays inside it, and nothing once the price leaves.
There is a cost. When the price moves, the pool keeps selling the token that is rising and buying the one that is falling. An LP ends up holding more of the loser. The gap between that and simply keeping the original tokens is called impermanent loss, and fees have to cover it.
Bitquery indexes every Ethereum block, so we checked whether they do. We followed every position on the eight busiest Uniswap v3 pools for a full year, to 13 October 2026. That is about 121,000 positions from 17,400 wallets. We valued each one against holding the same tokens and took gas off. This replaces a three-month version of the story whose main numbers were wrong, as the note at the top explains.
02 · The yearPrice moves cost more than the fees paid
The fee income was real. LPs on these pools collected $41.6M over the year, out of an estimated $59.5M the pools paid in total. The difference is fees still unclaimed when the window closed, or fees we could not tie to one position.
But the tokens moved against them. Kept in a wallet, the same deposits would have been worth $60.6M more than what came back out of the pools. Add gas, and the year closed $20.4M behind holding.
03 · ETH's yearThe price of ETH decided most of it
All eight pools pair a token with a dollar stablecoin, and in four of them that token is ETH. ETH averaged about $4,000 last October, sank to about $1,700 in June and climbed back to $2,600. Most big swings turned into losses for the LPs who were in the pool when they happened.
The chart shows it month by month. Positions opened in January, just before ETH lost a third of its price, did worst. Positions opened in February, after the drop, came out ahead. ETH then stayed in a narrower band for three months, and the fees kept coming. You can pull these prices yourself from the crypto price API.
This is the plain version of impermanent loss. Supplying liquidity is a bet that the price goes sideways. When it trends, the fees rarely make up the gap.
04 · The regular LPTwo in three lost to holding
Leave aside, for now, the bots that open and close a position inside one block; they get their own section below. About 71,000 regular positions were closed inside the year. After gas, 34% of them beat holding. Before gas it was 49%, close to a coin flip.
The width of the price range mattered less than the pitch suggests. No width won more often than it lost. Ranges between half and twice the current price did best, and 44% of them beat holding. Full-range positions, the old set-and-forget style, did worst.
Pool by pool, LPs lost money in every pool that trades ETH and in the UNI pool. The stablecoin pair and the two newer token pools were the only ones where LPs finished ahead as a group, by about $300k between them. You can query any of these pools through the DEX data API.
| Pool | Regular positions closed in the year |
|---|---|
| USDT/WETH 0.3% | 33,840 positions. 37% beat holding. Fees $26.2M, result −$10.7M. |
| USDC/WETH 0.05% | 20,315 positions. 27% beat holding. Fees $5.9M, result −$3.0M. |
| WETH/USDT 0.05% | 3,607 positions. 36% beat holding. Fees $2.5M, result −$2.3M. |
| USDC/WETH 0.01% | 3,034 positions. 31% beat holding. Fees $0.8M, result −$0.6M. |
| UNI/USDT 0.3% | 1,427 positions. 33% beat holding. Fees $0.3M, result −$0.9M. |
| USDC/USDT 0.01% | 5,635 positions. 40% beat holding. Fees $288k, result +$221k. |
| HLX/USDC 0.3% (from June) | 2,015 positions. 64% beat holding. Fees $68k, result +$45k. |
| WPRL/USDT 1% (from May) | 1,293 positions. 23% beat holding. Fees $72k, result +$41k. |
05 · PatienceThe patient collected the fees, and still lost
Most of the fee income went to people who stayed. Positions held for a week or longer collected 71% of all fees, while positions that lasted under an hour, including every one-block bot trip, collected 5%.
Staying did not fix the price problem, though. Positions held between a week and a month collected a third of all fees and still finished $9.3M behind holding. A longer stay meant more time for ETH to move.
06 · The botsA trading bot that lives for one block
A third of all positions in the data never lasted longer than one block, about 12 seconds. This is just-in-time liquidity, or JIT. A bot sees a big swap waiting in the mempool. It adds a huge position right at the current price and lets the swap pass through it. Then it pulls the position back out in the same block.
These trips moved enormous amounts of money and earned very little. Together they put $84.5B to work, 93% of all the capital in closed positions, because the same money was recycled again and again. They earned 3% of the fees.
One bot ran most of them. jaredfromsubway.eth, known on Ethereum for sandwich trading, made about 31,000 of these trips through its contract. The typical trip parked more than a million dollars for one block and earned 42 cents in fees. Before gas, 93% of the trips beat holding, for a total gain of $846k. Fees were only $97k of it. The rest came from the price moving while the swap passed through the position.
Gas changes the answer. The transactions that carried these trips paid $1.1M in gas, more than the whole gain. After gas, 41% of the trips came out ahead. Those transactions also carried the bot's other trades, so part of that gas pays for them, and the chain does not say how much. Charged the full gas bill, the liquidity side lost $279k over the year.
07 · GasGas decides the small positions
For a regular LP, gas usually costs about a dollar a position, which sounds like nothing. But most positions under $1,000 made or lost less than a dollar against holding. Before gas, 51% of them came out ahead, and a median gas bill of 67 cents cut that to 18%.
Bigger positions shrug off gas, and they win more often. Of positions above $1M, 59% beat holding. The ones that lost, though, lost large. The four in ten that lost gave up more than twice what the winners made, and the group finished $8.7M behind.
08 · The winnersA hundred wallets took two thirds of the winnings
Some LPs did make money. Fewer than half the wallets, though, had even one position that beat holding. Add up every winning position and the total is $17.1M. The top 100 wallets took 68% of it.
Most of the top wallets carry no public address label. The first version of this story said four addresses took 91%. That figure counted Uniswap's own position contract, which holds the positions of thousands of people, as a single address. Counted wallet by wallet, the top four take 22%.
09 · What held upThe pools that went nowhere paid
The pools where LPs came out ahead had one thing in common. The price did not go far. The USDC/USDT pair barely moves by design. HLX has traded between about 4 and 6 cents since July. In both, the fees were small, but nothing ate them.
Everywhere ETH was involved, the year's swings cost more than the fees paid. Uniswap v3 pays you for betting that a price will stay put, and over these 12 months most people who made that bet with ETH lost it, while gas quietly turned many small winners into losers.
The full history behind these numbers is also sold as files in the Ethereum dataset on the Bitquery Data Store. For how this version of Uniswap compares with the next one, see our Uniswap v3 vs v4 study. For the bots on the other side of these trades, see our arbitrage study.
FAQ
Do Uniswap v3 liquidity providers make money?
As a group, not over the last year on Ethereum's busiest pools. LPs there collected $41.6M in fees but finished $20.4M behind what they would have had by simply holding their tokens, after gas. Only 34% of regular positions closed in the year beat holding.
What is impermanent loss on Uniswap v3?
It is the gap between what an LP gets back from a pool and what the same tokens would be worth if they had stayed in a wallet. When the price moves, the pool sells the rising token and buys the falling one, so the LP ends up with more of the loser. A narrow price range earns more fees but also takes this loss faster.
What is JIT liquidity?
Just-in-time liquidity is a position that a bot opens right before a large swap and closes in the same block, about 12 seconds later. It collects a share of that one swap's fee. On these pools a third of all positions were JIT trips, and most came from one bot, jaredfromsubway.eth.
How much does gas cost a Uniswap LP?
Usually about a dollar per position on Ethereum at recent gas prices. That is small next to a large deposit, but most positions under $1,000 moved less than a dollar against holding, so gas turned many of them from winners into losers.
Ask these questions in plain English
Every position, fee and price in this story comes from Bitquery's Ethereum data. The Bitquery MCP server puts that data behind an AI assistant, so you can ask how a pool's liquidity moved, who opened positions in it, or what a wallet has been doing, without writing the query yourself.
Pools: USDT/WETH 0.3% (0x4e68ccd3e89f51c3074ca5072bbac773960dfa36), USDC/WETH 0.05% (0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640), USDC/WETH 0.01% (0xe0554a476a092703abdb3ef35c80e0d76d32939f), WETH/USDT 0.05% (0x11b815efb8f581194ae79006d24e0d814b7697f6), USDC/USDT 0.01% (0x3416cf6c708da44db2624d63ea0aaef7113527c6), UNI/USDT 0.3% (0x3470447f3cecffac709d3e783a307790b0208d60), WPRL/USDT 1% (0x89a67c6dee35db9815da2fb9191f0998a8b37c39) and HLX/USDC 0.3% (0x2c2226a6381e68a86c1a8dcb8d9fdab050959dd5). These are the eight Uniswap v3 pools on Ethereum with the most new positions in mid-2026.
Each position is tracked on its own: by its NFT for positions held through Uniswap's position contract, and by owner and price range otherwise. A position closes when all of its liquidity is withdrawn. Fee claims that withdraw nothing are not counted as exits.
Returns compare what came out of a position, plus fees, with holding the deposited tokens, both valued at the exit price. Hourly pool prices are used, except for positions shorter than an hour, which use the price at the end of their block. USDC and USDT are held at one dollar. Positions opened before the window are valued from their tokens on 14 October 2025, and positions still open on 13 October 2026 at that day's price. Their unclaimed fees are not visible on the chain, so win rates use closed positions only.
Gas is what each transaction paid, split across the liquidity actions in it and counted once per transaction. For the bot, the same transactions carried its other trades. 207 positions (0.2%) whose fee claims were crossed with a sibling position in the same transaction are left out of per-position figures; they cancel out in the totals.
jaredfromsubway.eth is named from public on-chain records of its address. What it intends by these trades is inferred from timing and placement, and is not stated by its owner anywhere we found.
This article is provided for informational and educational purposes only and reflects analysis of publicly available on-chain data as of the dates indicated. It does not constitute legal, financial, compliance, or investment advice, and nothing in it is a recommendation to buy, sell, or hold any token or asset, or to provide liquidity on any protocol.
The findings describe positions, fees and price movements observed on Ethereum between 14 October 2025 and 13 October 2026. Return comparisons depend on the holding benchmark, the prices used and the position-matching method, and may be incomplete or revised as more data becomes available. Blockchain addresses are pseudonymous, and an address interacting with a pool contract does not by itself establish the identity, intent, or knowledge of any party.
References to Uniswap, its position contract, or any other named protocol or project describe what the record shows about addresses and transactions linked to them. They are not statements about any party's security practices, solvency or conduct, and nothing here asserts that any party acted unlawfully or negligently.
Nothing herein should be relied upon as a definitive determination of fact. Readers should conduct their own independent verification before taking any action. The authors and publisher accept no liability for any loss or damage arising from reliance on this material. All trademarks and company names are the property of their respective owners.
Reported by Gaurav Agarwal for Bitquery Research, with AI tools; every figure was checked against the raw data.
Run the next investigation in minutes
Ask any question of the blockchain. Bitquery's AI Investigations agent traces funds, attributes wallets, and writes auditable reports across every major chain. Prefer to do it yourself? Connect the Bitquery MCP server to your AI assistant, pull the raw datasets, or query the chain directly with the Bitquery API.