Uniswap V3 introduced concentrated liquidity, NFTs for positions, and a much more expressive — but also more subtle — event model.


One consequence of this design is that on-chain events can be perfectly correct, yet still semantically confusing for end-users.


A common example is the Collect action.


The Common Assumption


For many users (and even some dashboards):


`collect() = collect earned fees`



What Actually Happens in Uniswap V3 when user fully exits a position


A Uniswap V3 position is an NFT that tracks:



When a user wants to exit a position, the flow usually looks like:




From the protocol’s point of view, this is perfectly valid:


everything owed to the position is paid out


all values are emitted correctly in event logs


But semantically, fees and principal are very different concepts.



Why Explorers Look “Misleading” (But Aren’t Wrong)


Most explorers (Etherscan included) do the right thing at the log level:



The problem is not decoding accuracy.


The problem is that:



For an end-user, seeing:



raises a very different interpretation than:



Sample transaction:

https://etherscan.io/tx/0x77613b2370de015fdf904effea3da3671ead1284279be7b5e0138d3409c51069



Why This Is Harder Than It Looks


You cannot reliably separate fees vs liquidity by:




To do this correctly, you need to:





A Broader Takeaway for On-Chain Data



Events remain low-level and composable


Meaning emerges only when state is reconstructed


UX gaps grow between “what happened” and “what users think happened”


For data builders, this is a reminder:


Accurate decoding is the baseline.

Semantic decoding is where real understanding begins.