Positions and fees
What the Positions page reads, where the numbers come from, and why some fields are blank.
Where positions come from
Positions are enumerated from the position manager contract, not from a database. Anything you minted on any interface appears here, because the source of truth is the chain rather than our records.
The cost of that choice is speed — reading the chain is slower than reading a table — and it is worth paying, because a positions page that only knows about positions it created is not a positions page.
Fees owed
Each position stores a counter of fees owed. Reading it is one cheap call, and it is wrong: the counter only updates when the position is touched, so it reports zero for positions that genuinely have fees waiting.
Otter instead simulates a collection as though you were performing it, which returns exactly what would arrive if you did. This is one call per position rather than one batched call for all of them, because the collection function checks who is calling and a batching contract is not you.
Range status
A position is in range when the pool's current step falls between its boundaries. Out of range means it holds a single token and is earning nothing. Closed means its liquidity is zero but the token still exists, usually with fees still claimable inside it.
Profit against entry
Shown for positions opened through Otter, where the deposit was recorded at the time. For positions opened elsewhere the field says so.
It would be possible to reconstruct an approximate entry from historical events, and that reconstruction would be wrong often enough to be worse than nothing. A blank you can trust beats a number you cannot.
Very large holders
Enumeration is capped. At least one address on this chain holds over a quarter of a million positions — a contract, not a person — and without a cap the page would attempt hundreds of thousands of calls. When the cap is hit, the interface says so and reports the real total.