Normalized pool snapshot — the exact field set the CLI’s output::PoolView
renders. Families that have no fee-tier field (ramses) or recompute fee in
the renderer (velodrome) set fee: 0; the CLI render path is unaffected.
Per-position fee data produced by Phase 2 + fee-growth math.
None on pool / fees indicates the corresponding pool read
reverted (uninitialized pool, NFPM mismatch, etc.) — entry’s
position data still emits, just without fee augmentation.
Faithful Rust mirror of the Ramses-family NFPM 10-field positions()
return tuple, plus the caller-supplied token_id echoed as the first
field for round-tripping.
Async: resolve gauges + reward tokens + per-position earned for
positions ((pool, token_id) across any pools), prune per-pair zeros,
and encode ONE batched claimClGaugeRewards. Returns Ok(None) when
nothing is claimable (ungauged / empty reward tokens / all-zero earned).
Never gates on isAlive.