# Liquidity ranges

> Hold liquidity on Uniswap V2, V3 and V4 pools or Solana pools with rules that move it, backtested on the pool's real swaps first, on paper or minted on chain.

## Ranges with rules

A project can hold liquidity positions on a Uniswap V2, V3 or V4 pool, or on a Solana pool (PumpSwap, Raydium, Orca, Meteora), with rules for where the range sits and when it moves. On a live project they're minted on chain from their wallet and follow their rules there.

## Backtest the rules first

`backtest_lp_ranges` replays a pool's real swaps against your rules: fees earned, time in range, impermanent loss and how often it moved. Try widths and triggers there before any money goes in.

## Run and control

Each position can be started, stopped, closed, added to, taken from, collected and compounded. `list_lp_positions` (and the project's Liquidity widget) shows each one's value, range, whether it's in range and fees owed.

## Ranges in strategies

A strategy can hold a range itself with `lp.range({ widthPct })` and read it with `lp.inRange()`, `lp.value()` and `lp.fees()`, so a range can move on any signal Flowscript can read, and be hedged on a perp. The **Hedged LP** and **Hedged range** starters do both. See [Hedged and multi-market](https://docs.ftw.trade/strategies/multi-market).

## Make a pool

A workflow's `pool` step makes a Uniswap V3 or V4 pool on Robinhood Chain at a price (or finds the one there), and the steps after it trade it.
