On-chain investigationUniswap v3Updated 16 October 2026

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.

Correction, 16 October 2026. The first version of this story, published on 13 October, covered 91 days. Three of its headline figures did not hold up. "Four addresses took 91% of the profit" counted Uniswap's shared position contract, which thousands of people use, as one address. The "$51.7M of profit" came from the same mistake. "Burns outran mints every day" counted fee claims as exits. We rebuilt the study on a full year, with each position tracked on its own and gas included. Every number below is new.
At a glance
We followed every liquidity position on Ethereum's eight busiest Uniswap v3 pools for 12 months. The people who supplied the tokens collected $41.6M in trading fees. Price moves took more than that, and after gas they finished $20.4M behind what they would have had by holding the same tokens. Two in three positions held longer than one block lost to holding. The biggest player by capital, the trading bot jaredfromsubway.eth, beat holding on 93% of its trips before gas and 41% after it, though that gas also paid for its other trades. A hundred wallets took two thirds of all the winnings.
$41.6M
Fees collected by LPs in 12 months
−$20.4M
Result vs just holding, after gas
34%
Regular positions that beat holding
68%
Of all winnings taken by 100 wallets
Key findingsEach line has its own share link
  1. −$20.4M

    Liquidity providers on Ethereum's eight busiest Uniswap v3 pools earned $41.6M in fees in a year, and price moves cost them $60.6M.

  2. 34%

    Of 71,166 regular positions closed in the year beat holding after gas. Before gas it was 49%.

  3. 93% → 41%

    Share of jaredfromsubway.eth's 31,299 one-block liquidity trips that beat holding, before and after gas. Its transactions paid $1.1M in gas, which also covered its other trades, against an $846k gain.

  4. 18%

    Positions under $1,000 that beat holding after gas, down from 51% before it. A median gas bill of 67 cents was enough.

  5. 68%

    Of all winnings went to 100 wallets out of 17,406. The top four took 22%, not the 91% we first reported.

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.

Where the money wentall LP positions on the eight pools, 14 Oct 2025 to 13 Oct 2026, vs holding the same tokens
Waterfall chart: fees earned plus 41.6 million dollars, price moves minus 60.6 million, gas minus 1.4 million, result minus 20.4 million dollars against holding.
Fees are what LPs collected in the year. Price moves are the gap between the tokens that came back out of each position and the tokens that went in, both valued at the exit price. Positions still open on 13 October are valued at that day's price.

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.

When ETH trended, LPs lostETH monthly average price (top) and LP result vs holding by the month a position opened (bottom), WETH pools
Top: ETH monthly average falling from about 3,960 dollars in October 2025 to about 1,690 in June 2026, then rising to about 2,600. Bottom: monthly LP result bars, mostly negative, worst for January openings, positive for February.
ETH price from the USDC/WETH 0.05% pool. Bottom panel: fees plus price moves minus gas for positions opened in each month in the four WETH pools, excluding one-block bot trips. Only February and March openings finished ahead.

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.

No range width beat a coin flipshare of regular positions that beat holding after gas, by price-range width
Bar chart of win rate by range width: 29 percent within 1 percent, 37 percent for 1 to 10, 33 percent for 10 to 50, 44 percent for 50 to 200, 38 percent over 200, 13 percent for full range. All below the 50 percent coin-flip line.
Regular positions closed inside the window, one-block bot trips excluded. Width is the price range from its bottom to its top: "within 1%" means the top of the range is less than 1% above the bottom.

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.

PoolRegular 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.

Fees go to the patientshare of all fee income, by how long the position was held
Bar chart of fee share by holding time: 3 percent same block, 2 percent under one hour, 10 percent one hour to one day, 13 percent one to seven days, 32 percent seven to 30 days, 39 percent over 30 days.
All positions on the eight pools, including one-block bot trips and positions open at the end of the window. "Same block" means the position was opened and closed in the same Ethereum block.

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.

Most of the capital, almost none of the feesshare of capital put to work and of fees earned, one-block bot trips vs everyone else
Two stacked bars. Capital put to work: same-block bots 93 percent, everyone else 7 percent. Fees earned: bots 3 percent, everyone else 97 percent.
Capital is the dollar value deposited into each position, summed. A bot that re-deposits the same $1M a thousand times counts $1B, which is why one-block trips dominate this measure.

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.

Gas outweighed the bot's liquidity gainsjaredfromsubway.eth one-block liquidity trips: gain vs holding against gas, and share of trips ahead
Left: bars for gain versus holding 846 thousand dollars, of which fees 97 thousand, and gas paid 1.1 million dollars. Right: 93 percent of trips ahead before gas, 41 percent after gas.
Gain is the value that came out of each trip minus what went in, both priced at the closing price of that block. Gas is what the sending transactions paid, counted once per transaction; those transactions also carried the bot's other trades.

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.

Gas flips the small positionsshare of regular positions that beat holding, before and after gas, by deposit size
Paired bars by deposit size, before and after gas: under 1,000 dollars 51 and 18 percent; 1,000 to 10,000 dollars 45 and 36; 10,000 to 100,000 dollars 50 and 45; 100,000 to 1 million 55 and 51; over 1 million 60 and 59 percent.
Regular positions closed inside the window. Size is the dollar value deposited. Gas is the fee each position's own transactions paid.

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%.

A hundred wallets, two thirds of the winningscumulative share of all winning LP results, by the top wallets
Curve of cumulative share of winnings by the top wallets on a log scale: top 4 take 22 percent, top 100 take 68 percent, top 1,000 take 94 percent.
A wallet's winnings are the sum of its positions that beat holding after gas. Wallets are the owner of each position. For positions held through Uniswap's position contract, that is the holder of the position's NFT.

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.

Run it yourself

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.

Track new positions and withdrawals on any Uniswap poolValue positions and fees in dollars at any hourSpot one-block liquidity trips around big swapsPull the trade history behind any pool
Explore Bitquery MCP →Figures measured on 15 October 2026 from Bitquery's Ethereum archive, window 14 October 2025 to 13 October 2026. Written by Bitquery Research; AI tools ran the queries and helped draft the text. The three main numbers were worked out a second time, independently, from the raw events before publishing.
How we measured, and the limits

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.

Legal disclaimer

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.