> ## Documentation Index
> Fetch the complete documentation index at: https://docs.defiloops.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Surveying ranges

> What a range you name would have collected, walked day by day across every chain and fee tier at once

**Tool:** `get_lp_yield`

It tells you what a price range would have earned in fees, from each pool's own
daily history.

Name two tokens and the ranges you are weighing. It walks every pool that trades
them, on every network and at every fee tier, and reports what each range would
have collected.

That answers the three questions an advertised rate cannot: which network, which
fee tier, and which range.

## Why an advertised rate cannot answer this

A pool's quoted APY is the last twenty-four hours, across the pool's whole book,
for liquidity spread everywhere. Your position is not spread everywhere. It sits
in a band, and on any day the price is outside that band it earns **nothing**,
while the quoted rate keeps being quoted.

So this walks history a day at a time: the pool's fees that day, times your share
of the liquidity that was in range, and zero on the days the price had left.

<Note>
  Pass **every range you are weighing in one call**. `ranges` is a list and each
  costs nothing extra, against a round trip per range otherwise. Omit it and you
  get the widest band that held the price for the whole window: the ceiling any
  narrower band is measured against.
</Note>

## A range is quote per one base

With one stablecoin in the pair that is dollars per coin and needs no thought.
On WBTC/WETH or USDC/USDT it does: 25–40 and 0.025–0.04 are the same band from
opposite ends. Set `priced_in` to say which, and the answer always reports the
direction it used.

## It answers with two halves, never one

The table is **fees only**. Beneath it comes CASH IN HAND: what the deposit is
worth at the end, the impermanent loss, and the total against simply holding the
same two tokens.

Fees alone are the number people read as the outcome, and they are half a
ledger. A position can collect 31% in fees and still finish behind the coins it
was made of.

## Standing findings it reports

Measured across 2024–2026 on all three networks, and repeated with every answer
because they are the conclusions people most often reach the other way:

* **One wide band beats several narrow ones** at the same total capital.
  Splitting lost money at every division tested, at 2, 3, 5, 10 and 20 bands,
  on every chain and both assets. A narrow band sits near its own edge more often, and a
  position at its edge holds one asset and earns least.
* **Fee tier depends on the asset *and* the band.** On single wide bands 0.05%
  beat 0.30% on BTC and lost to it on ETH, by about 13% each way. Narrow the band
  and it flips. Compare tiers within one band; across bands the comparison means
  nothing.
* **If a band is too large for the pool, spread across chains, not across
  ranges.** Splitting the range does not reduce your share of any pool. It only
  idles capital.

## Where the history comes from

[The pool history stream](/data/streams). 41 pools across Ethereum, Base and
Arbitrum, reaching back to 2021-05-05.

<Warning>
  There is one copy of that history and this reads it over the network.

  There used to be two: this system kept its own synced copy beside the
  backtester's. They drifted to 39 pools against 32, 30 in common, because the two
  syncs ran on different schedules against an indexer that backfills. Two copies of
  one history is not redundancy. It is two answers to the same question, and which
  one you see depends on which service you happened to ask.

  A survey and a [backtest](/tools/run-lp-backtest) of the same pool disagreeing
  about what it earned is not a defect somebody would find. It is one they would
  believe.
</Warning>

## When it cannot answer

A pool with no stored history is reported as **unread**, never as a pool that
earned nothing. The two must never read the same way, and for a while they did:
the survey once answered "no WETH/USDC pool with liquidity" for a pair with three
live pools and 1,956 days of history, because it was asking a database that held
no pools at all.

That sentence was false, it was said confidently, and it was said to somebody
deciding where to put money. An empty answer is now an error that names the
reason.


## Related topics

- [FAQ](/faq.md)
- [What we hold](/data/streams.md)
- [DeFiLoops](/index.md)
- [Backtesting a position](/tools/run-lp-backtest.md)
- [Words we use](/concepts.md)
