◎ UniClaim Open the app

Guide · Uniswap v3 & v4

How to collect Uniswap fees from multiple positions at once

If you provide liquidity on Uniswap for long enough, you end up with a lot of positions — a few on Arbitrum, a few on Base, some on mainnet, some newer v4 ones. Collecting the fees they earn is a chore: the Uniswap interface does it one position at a time. This guide explains why, what it costs you, and how to collect from all of them with one transaction per chain.

Why it usually takes one transaction per position

Every Uniswap v3 and v4 liquidity position is an NFT with its own token id, and the fee it earns belongs to that id. The interface collects fees from the position page you are looking at, so claiming twenty positions means opening twenty pages, signing twenty transactions, waiting for each to confirm — and switching networks in between if your positions are spread across chains.

Every one of those transactions pays the fixed 21,000-gas base cost of a transaction on top of the work itself, plus your time. On a cheap chain that is mostly an annoyance; on mainnet it is a real share of what small positions earn.

The contracts already allow batching

Nothing in Uniswap forces one claim per transaction. Both versions let a single call touch many positions — the interface just does not use it for claiming.

Uniswap v3

The v3 NonfungiblePositionManager has a multicall(bytes[]) function. You encode one collect() call per position — token id, recipient, and maxUint128 for both amounts — and send them all in one transaction. Each collect pays the position's owner, so the batch can only ever pay you.

Uniswap v4

v4 has no collect at all. Fees are realised by decreasing liquidity by zero, which settles everything the position has accrued into the caller's credit, and then taking that credit. The v4 position manager accepts a list of actions inside one modifyLiquidities call, so a batch is one DECREASE_LIQUIDITY per position followed by one CLOSE_CURRENCY per distinct token. Closing per currency rather than per pool matters: two positions sharing a token would otherwise try to withdraw the same credit twice.

One catch: v3 and v4 are separate contracts, so a selection that includes both needs one transaction for each. And very large batches are split so a single transaction cannot exceed the block gas limit.

Finding every position first

Batching is the easy half. The harder half is knowing which positions you have. v3's position manager can list the token ids an address owns. v4's cannot — it is not ERC721Enumerable, so no contract call answers "which positions does this address hold". The practical answer is to ask a public block explorer for candidate ids and then confirm each one on chain with ownerOf, treating the explorer as a hint rather than a source of truth.

The fee amounts need care too. The tokensOwed field stored for a position goes stale the moment it is touched, so the live figure has to be computed from the pool's fee growth accumulators — and on v3 the result is an upper bound, since the pool's own rounding can pay a wei or two less.

Doing it with UniClaim

UniClaim is a free tool that does all of the above in the browser:

  1. Connect your wallet, or paste any address or ENS name to look first without connecting anything.
  2. It scans 10 chains — Ethereum, Arbitrum, Optimism, Polygon, Base, BNB Chain, Avalanche, Blast, Celo and Robinhood Chain — and lists every v3 and v4 position with its unclaimed fees, grouped by chain and sorted by value.
  3. Select positions and review. Before your wallet opens, you see which contract each transaction calls, that the payout goes to your address, what you will receive and what gas costs. The exact transaction is simulated against the chain first.
  4. Sign once per chain. Every selected position on a chain goes out in one batched transaction.

Is it safe?

The things that make a claiming tool dangerous are token approvals, signed messages and contracts that can redirect funds. UniClaim uses none of them: there is no approve, nothing to sign except the claim itself, and it only calls Uniswap's own position managers — whose claim paths have no recipient field the app could point elsewhere. It runs entirely in your browser with no backend, and the source is public, including scripts that check the fee maths against the chain to the wei.

Questions

Does claiming fees close my position?

No. Only the accrued fees move. Your liquidity, range and position stay as they are and keep earning.

Why did I receive WETH instead of ETH?

A v3 pool holds wrapped ETH, and that is what collect pays. v4 pools that use native ETH pay native ETH.

When is claiming not worth it?

When the gas for a transaction is more than the fees it collects. Batching lowers the cost per position, but dust on mainnet can still cost more to claim than it is worth — the review shows the network fee next to the payout, and warns when the fee is larger.

Find your unclaimed Uniswap fees →