PnL limitations and refusal states
When SquirtFi will not give you a number, and why that is the correct answer.
The principle
Every PnL result is either a full breakdown or an explicit refusal with a machine- readable reason. There is no third branch that returns a plausible-looking number from incomplete data.
A refusal is not an error state to be hidden. It is the honest answer to a question the available data cannot support, and it always says what is missing and what would fix it.
The refusal reasons
| Reason | What happened |
|---|---|
| History incomplete | The indexed window does not cover the whole life of the position, so cost basis cannot be established. |
| Transferred in | The position NFT arrived from another address. Its history before that belongs to someone else. |
| Missing historical mark | No usable price existed for a block an event happened in. |
| No current mark | No usable price exists right now to value the position. |
| Stale current mark | A price exists but is too old to value with, given the market session and the feed’s update behaviour. |
| Claimable unavailable | Uncollected fees could not be read, so unrealized PnL would be understated. |
| No deposits | There is no deposit history to compute a basis from. |
What you still get
A refusal can still carry facts that are certain: collected fee amounts, current liquidity, whether the position is in range. Those are shown. What is never shown is a PnL figure derived from the gap.
Gas specifically
Gas is attributed to a transaction and counted exactly once, valued at the ETH mark for that transaction’s own block time rather than at today’s price. A missing historical mark makes that cost unknown, and unknown propagates: gross PnL is still reported, net PnL is not.
Where one transaction touches several positions, any per-position allocation is explicit, deterministic, and reconciles back to the total.
Rebalancing continuity
Closing one position and opening another is two positions on-chain. SquirtFi tracks the link so a rebalance does not read as a realized loss followed by an unrelated new deposit, but the continuity has to be established from indexed events. Where it cannot be, the positions are reported separately rather than merged on an assumption. See Understanding your Portfolio.
