[rangebound]docs 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.

Under an hour old, both are annualised from minutes: shown in grey and tagged early. APR is then mostly the price's own move since the open, and fee APR the pool's activity rather than a rate to expect.

ROI. P&L divided by total deposits.

Vol harvested and VRP

A position in range sells volatility: it earns fees, and every move of the price through its range costs it something. The position page puts a number on how well it was paid for that.

Swing cost. What the price's moves cost the position: the loss the same position would take if it were hedged back to no price exposure every five minutes. It is realised LVR, measured on the pool's own price.

Vol harvested. Fees minus swing cost, in dollars: what the position kept for the risk it carried.

VRP (volatility risk premium). The same premium in vol points: the volatility its fees paid for, minus the volatility that happened. Fees that paid for 25% volatility while the price moved at 11% score +14 points. Width does not change it: two positions in range over the same hours score the same, however wide.

  • The last 7 days. Scores come from the pool's minute-by-minute record, which reaches back a week. A position older than that is scored on its last 7 days, and the page says so.
  • Young positions lean on their pool. In its first hours in range, a position's own reading is mostly noise, so it is blended with its pool's. It is marked pool for its first minutes, then early, and gets a verdict after about a day in range: over +5 points well paid, 0 to +5 fair, below 0 underpaid.
  • Out of range, it fades. A position out of range still carries the risk it sold, the moment the price comes back, and earns nothing meanwhile. So its VRP fades toward zero until it is back in range or closed. The page says fading after an hour outside, and in and out for one crossing its edge back and forth.
  • Orders wait. A position opened out of range - a limit order, a level at support or resistance, or one token placed to avoid swapping - counts only from the first time the price reaches it. Until then it shows as waiting.
  • Price direction. Vol harvested plus the price's direction is the P&L against holding the tokens. The direction part is luck, and averages to zero. It is shown when the score covers the position's whole life.
  • Not on DLMM yet. Meteora DLMM pools keep their liquidity bin by bin, which the pool record this is measured from does not hold.

Under the range bar, the position page also shows what the position holds right now (its split between the token and USDC), how far away the nearer edge is, and the chance the price is still inside in 7 days - or, out of range, the chance it gets back - at the pool's own volatility, with no drift. A warning appears only when a typical US market open would carry the price most of the way to the nearer edge within the next day.

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.

Compare to: Hold or USD

Every position figure answers "compared with what?", and the Compare to switch sets the answer. It sits on the Top positions page, on a pool's open positions, on a wallet and on a position, and your choice follows you between them.

  • Hold (the default) compares the position with holding the tokens it was opened with. Divergence is then the cost of being an LP rather than a holder, and P&L is fees plus that. This is the honest measure of what LPing itself did.
  • USD compares it with holding dollars. The tokens' own move joins divergence, so a position in a stock that rose looks better and one in a stock that fell looks worse. This is what your account balance did.

Both come from the same parts, so nothing is counted twice:

price move    = the deposited tokens' own move, in dollars
divergence    = vs Hold: LP against holding those tokens
                vs USD:  that, plus the price move
P&L           = fees + divergence, on whichever basis is selected
APR, ROI      = built from that P&L

Fees, and fee APR, are the same on either basis.

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.