[range]bounddocs Open the app
Using rangebound

How position performance is measured

Every position figure on rangebound is built from the position's own on-chain history, not from a price feed or an indexer's estimate. This page explains how.

Reading a position's life

A concentrated liquidity position is an account on chain. It is touched only when it is opened, when liquidity is added or removed, when fees are claimed, and when it is closed. rangebound reads each of those transactions and records, for every event:

  • how much of each token went in or came out,
  • how much of that was fees rather than principal,
  • and the pool price at that moment.

Positions are re-read automatically when the hourly scan sees that one has changed.

Pricing each flow without a price feed

Each deposit and withdrawal is valued at the pool price at the moment it happened, recovered from the transaction itself:

  • Two-sided flows. When both tokens move, the amounts and the range together pin down the exact pool price.
  • One-sided flows. When only one token moves, the position was out of range and the amounts alone don't give the price. On Raydium the pool states its price in the transaction's own event. On Orca, rangebound uses the price of the pool's most recent swap before the transaction.
  • approx. In the rare case where no swap is close enough to price a one-sided flow, it is valued at the edge of the range and the figure is marked approx.

The figures

Deposits. Everything put in, each valued at the pool price when it went in.

Fees. Split by where they sit:

  • Collected: fees already withdrawn, taken from each claim or withdrawal.
  • Uncollected: fees the position could claim right now. A position's own fee counter only updates when the position is touched, so it can read zero for a position that has earned for months. rangebound adds the fees earned since the last touch from the pool's running fee totals, so uncollected fees are right even for positions left alone.

Divergence. What came out, plus what the position holds now, minus the deposited tokens valued at today's price. It isolates what being in the pool did, compared with holding the same tokens.

P&L. Fees plus divergence.

Price effect. The deposited tokens' own move in dollars, whether or not they were in a pool.

Total P&L. P&L plus price effect: the result against holding dollars instead.

APR. P&L divided by capital × time, as a yearly rate. Each deposit counts for as long as it was in the position, so a top-up late in a position's life counts for less than the first deposit.

Fee APR. The same with fees only.

ROI. P&L divided by total deposits.

When a position changes

When the hourly scan sees that a position changed (a top-up, a partial withdrawal, a claim), its history is queued for a fresh read. Until the new read lands, rangebound shows the last complete figures and marks them changed since read · updating, rather than mixing an old history with a new balance. That keeps a top-up from showing as a sudden gain.

Worked example

A wallet opens a ±2% NVDAx/USDC range with $10,000 when NVDAx is $180, roughly half in each token.

  • A week later it has collected $120 in fees and has $60 uncollected. Fees are $180.
  • The price is now $183, still inside the range. The position holds $10,040 of tokens. The deposited tokens, held instead, would be worth $10,083. Divergence is −$43.
  • P&L is $180 − $43 = +$137. ROI is 1.37%.
  • The deposited tokens rose from $10,000 to $10,083. Price effect is +$83, so total P&L is +$220.
  • APR is $137 ÷ ($10,000 × 168 hours) × 8,760 hours ≈ 71%.

Illustrative numbers.