Uniswap V3 · liquidity

Uniswap V3 liquidity accounting, done from the position — not the Transfer legs.

When you add liquidity to a Uniswap V3 pool, two tokens leave your wallet and you receive an NFT. A tool that reads only ERC-20 Transfer logs sees the two outflows and books two disposals to nowhere — and never records the position you actually acquired. Intentio reads the protocol's own events instead, and books the one economic event: a liquidity provision.

The problem

A V3 position is an NFT, so the logs lie.

Uniswap V3 liquidity isn't a fungible LP token — it's a position NFT minted by the NonfungiblePositionManager (NPM, 0xC364…fe88). Your two tokens flow to the NPM, not to a counterparty, and the position's size and range live inside the contract's state — not in any Transfer log.

So a log-only importer mis-books the add three ways at once: it treats each token outflow as a sale (inventing gains/losses and gross disposal volume), it shows the NPM as your counterparty, and it leaves the LP position itself entirely off your books. At month-end someone reverses all of that by hand.

What Intentio resolves

One liquidity-provision event, read from the NPM's own event.

For a V3 liquidity add, Intentio decodes the NPM's own IncreaseLiquidity event and calls positions() to recover the position — then books a single liquidity-add row: the two underlying tokens are surrendered into a position you now hold, not disposed to a third party. No phantom counterparty, no invented disposal volume, and the position is on the books where it belongs.

Real transaction

Verify it on a real mainnet add.

This isn't a mockup — it's a real Ethereum mainnet transaction run through the same live engine the demo serves. Open it on Etherscan and you'll see the two token transfers a naive importer would book as two disposals; Intentio resolves it to one.

0x5e3a0957…8471ceblock 25,407,779
resolvedUniswap V3 · liquidity

Provided 0.0171 WETH + 9,019 STRK — one position event, not two disposals

Where the line is

It gets the shape right; you keep the policy calls.

Intentio gives you the correct economic event and clean, categorized rows. Whether a liquidity add is a taxable disposal in your jurisdiction, which cost-basis method applies, how to treat impermanent loss, and when fee income is recognized are policy and tax decisions you keep. It's the evidence and normalization layer, not your accounting brain — and it abstains, with a reason, on anything outside coverage rather than guess.

Today the live path resolves liquidity adds. Removals and fee collection read from the same NPM events (DecreaseLiquidity, Collect) and are next on the same approach.

The handoff

Into the accounting tool you already use.

The resolved row exports as a standard CSV / journal, ready to review and upload to your accounting service (tool-specific import profiles as we go). It's read-only: public addresses only, no wallet connect, no signing, no custody.