Uniswap v3 positions: separating fee income from principal
Uniswap v3 keeps LP fees apart from principal on-chain. Here is how that works, and why your books should keep them apart too.
If your treasury provides liquidity on Uniswap v3, each position is a unique token whose trading fees build up separately from the capital you deposited. That separation is visible on-chain, so you can usually split fee income from the return of principal when you withdraw, instead of booking one blended number.
Positions are NFTs, not fungible LP tokens
In Uniswap v3 a liquidity provider chooses a price range rather than spreading capital across all prices. Because every range is different, positions cannot be pooled into one interchangeable token the way v1 and v2 LP tokens were, and the core pool contract does not issue an ERC-20 LP token at all [1]. Instead, the standard periphery contract wraps each position as an ERC-721 non-fungible token with its own ID [4].
For the books, this means each position is a distinct asset with its own range, its own liquidity amount and its own fee history. Two positions in the same pool are not interchangeable and should not be averaged together.
Fees accrue separately and do not compound
In v2, fees were added back to the pool and quietly grew the LP's share. The v3 whitepaper says this is no longer possible: fee earnings are stored separately and held in the tokens in which they were paid [1]. Uniswap's developer documentation adds that fees must be claimed manually by the position owner and only accrue while the pool price sits inside the position's range [2].
Mechanically, each position records its liquidity, a fee-growth snapshot, and two balances called tokensOwed0 and tokensOwed1 for the fees owed in each token [3]. Whenever the position is touched, the contract works out fees earned since the last snapshot and adds them to those balances [3].
Withdrawal is a two-step process
Removing liquidity does not send tokens to your wallet. The pool's burn function moves the withdrawn principal into the same tokensOwed balances, and a separate collect function actually transfers what is owed to a recipient [5]. The position manager mirrors this with decreaseLiquidity followed by collect, and the NFT itself can only be burned once liquidity and both owed balances are zero [4].
This is the key practical point. If you decrease liquidity and collect in one go, the single transfer you see contains both accrued fees and returned principal. To split them, collect fees in a step before decreasing liquidity, or work out the fees owed at that point from the position data. Because stored balances only update when a position is touched [3], a raw read can lag. Whatever is owed just before the decrease is fees; what the decrease adds is principal.
Impermanent loss changes what comes back
The mix of tokens in a position shifts as the price moves. If the price leaves the range, the position stops earning fees and ends up holding only one of the two assets [1]. So the principal you withdraw is rarely the same quantities you put in. The shortfall compared with simply holding the original tokens is commonly called impermanent loss. It sits inside the principal leg, not the fee leg, which is another reason not to net the two.
Deposit: disposal or continuity is a policy choice
There is no FASB or IASB pronouncement written specifically for AMM liquidity positions, so the treatment of a deposit is a policy judgement that should be documented and applied consistently. Two approaches are common:
- Disposal approach: the tokens deposited are treated as disposed of at fair value, any gain or loss is recognised, and the position is recorded at that fair value.
- Continuity approach: the position takes over the carrying amounts of the tokens deposited, with no gain or loss at deposit, and the result is recognised on withdrawal.
Tax rules can differ from book policy. HMRC's current manual asks whether beneficial ownership passes when tokens go into a DeFi arrangement; for liquidity providers who receive platform tokens in return, it treats the deposit as a token-for-token exchange measured at market value [6]. In July 2026 the UK government published draft legislation that would treat lending, borrowing and automated market maker deposits by individuals and trustees as no gain, no loss, from 6 April 2027 [7]. As of October 2026 that is draft, not law, and it excludes companies, so corporate treasuries should not assume it applies to them [7].
Why split fees from principal on withdrawal
- Fees are a return for providing liquidity and are usually presented as income, while principal is the recovery of the investment and drives any gain or loss on the position.
- Netting them can hide a loss: strong fee income can mask impermanent loss on the principal.
- Fee tokens collected become new holdings. Recording their value at collection gives them a clear starting basis.
- Auditors can trace the split back to on-chain owed balances, which is far easier to support than an estimate made later.
| Account | Debit | Credit |
|---|---|---|
| Deposit: tokens with carrying amount 40,000 go into a new position NFT | ||
| LP position (NFT #1234) | 40,000 | |
| ETH | 20,000 | |
| USDC | 20,000 | |
| Withdraw: owed fees before decrease = 2,050; principal returned = 41,500 | ||
| ETH and USDC received (fees) | 2,050 | |
| LP fee income | 2,050 | |
| ETH and USDC received (principal) | 41,500 | |
| LP position (NFT #1234) | 40,000 | |
| Realised gain on LP position | 1,500 | |
Under a disposal approach the deposit would instead recognise gains or losses on the tokens going in, and the position would start at fair value. The fee line is the same either way.
What to do
- Treat each v3 position NFT as its own asset, tracked by token ID.
- Pick and document a deposit policy, disposal or continuity, with input from your auditors and tax advisers.
- Collect fees, or capture fees owed, before each liquidity decrease so fees and principal can be separated from on-chain data.
- Record fee collections as income at fair value when collected, or as your policy defines, and give the received tokens that basis.
- Keep tax workings separate from book entries, and monitor the UK draft rules and any guidance in your own jurisdiction.
Sources
- Uniswap v3 Core (whitepaper, March 2021) (Uniswap)
- Fees (Uniswap developer documentation)
- v3-core/contracts/libraries/Position.sol (Uniswap (GitHub))
- v3-periphery/contracts/NonfungiblePositionManager.sol (Uniswap (GitHub))
- v3-core/contracts/UniswapV3Pool.sol (Uniswap (GitHub))
- CRYPTO61620 - Decentralised Finance: Lending and staking: Chargeable Gains: Making a DeFi loan (HMRC)
- Cryptoasset loans and liquidity pools: Draft legislation (accessible version) (HM Revenue & Customs, GOV.UK)
General information for finance teams, current as of publication. Not legal, tax or accounting advice.