Skip to content
Liquidity Lens

Poolscope, Pool earnings and flow analytics

Know what every pool of your pair earned, hour by hour, and who traded through it.

Every tracked pool of a token pair with its fee model, TVL and liquidity near the price. Exact hourly fees and volumes for any pool. Each pool's flow split into aggregator, bot, organic and unclassified traffic.

  • ALMs and vault managers
  • DEX teams
  • Market makers

Which pools carry the flow, at each size

Live data· block 53,134,715

How the production router splits a WETH trade across venues right now, from $1K to $10M. Small trades take the cheapest pool; large ones spread across every pool with depth. Poolscope tells you what each of those pools earned from it.

$1K
$10K
$100K
$1M
$10M
  • Aerodrome Slipstream

Live from the public Truefill stream: the first hop's split of each route, by venue. Hover a segment for its pool count. Poolscope's keyed API adds every tracked pool of the pair with TVL, liquidity near the price and exact hourly fees.

Who trades through the pool, hour by hour

Sample response · illustrative numbers

A pool's USD volume per hour split into aggregator, bot, organic and unclassified flow. No wallet addresses, only the mix. Watch the bot share jump late in the day: that is what a Tripwire traffic-jump alert catches.

Share of the day's volume

  • Aggregators47.7% · $42.8M
  • Bots (MEV and others)42.1% · $37.8M
  • Organic7.8% · $7.03M
  • Unclassified2.3% · $2.07M

Sample day in the shape of GET /ext/traffic/series (one Uniswap v3 WETH/USDC pool on Base); a key returns the real hours.

Every pool of the pair, side by side

Sample response · illustrative numbers

One call lists every tracked pool of a pair across DEXes: fee model, TVL, how much liquidity sits close to the price, and exact 7-day swaps and fees.

PoolFeeTVLUSDC within ±0.1%±0.5%±1%Swaps, 7 days
Uniswap v3
0xd0b5…f224
5 bp static
$12.2M
$415K$1.60M$2.36M61,840
Aerodrome Slipstream
0xb2cc…dc59
4.5 bp dynamic
$30.9M
$1.60M$5.25M$7.82M214,411
Aerodrome v2
0xcdac…5c43
30 bp static
$4.21M
$1.05K$5.25K$10.5K3,922

Example response of GET /ext/market/pair-pools for WETH/USDC on Base.

Do the fees cover the arbitrage loss?

Sample response · illustrative numbers

Each pool's swap fees per unit of active liquidity over the loss its LPs give up to arbitrage (LVR, on the pair's reference price), over 72 hours. Gross counts every swap fee; LP-net keeps the DEX's documented LP share. Sort any column.

F/LVR per pool
Fees by flowFlags
uniswap-v3
0x6c56…1372
30 bp0.980.81Fees do not cover the benchmark arbitrage loss83.3%covers at gross ≥ 1.20
100% of F split
$769.3K$787.5Kderived-l
solidly-v3
0x551a…221b
5 bp0.560.45Fees do not cover the benchmark arbitrage loss80.0%covers at gross ≥ 1.25
100% of F split
$4.29$7.67derived-l
  • Good> 100
  • Fine10–100
  • Watch2–10
  • Thin1–2
  • Not covered< 1
  • Routed
  • Direct
  • Unclassified
  • Arbitrage

Token view: every pair of WETH

Fees
$769.3K
Benchmark LVR
$787.6K
Σ fees $ / Σ LVR $
0.98
gross, all pairs
Pairs' gross ratios
0.98–0.98
median 0.98 · 1 pair
Token view per pair
WETH/USDC2$769.3K$787.6K$3.46B0.980.81
Gross F/LVR
All swap fees over the benchmark loss to arbitrage (LVR) on the pair's reference price.
LP-net F/LVR
Gross × the DEX's documented LP share. At 1 or more, LP fees cover the benchmark loss.
Expected position return
Needs a range and capital: Headroom's capital curve.
Realised position return
One position's actual P&L: not modelled.

Sample in the shape of GET /ext/market/fee-lvr (WETH/USDC on Base, 3 days to 2026-10-22 19:00 UTC; the flow split is illustrative). The token figure is a ratio of dollar sums, not an average of pool ratios. LVR is a benchmark (Milionis et al.): what a rebalancing portfolio would have kept, not a realised P&L.

What Poolscope gives you

Every competing pool, side by side

One call lists every tracked pool of a pair across DEXes, with its fee model, TVL and how much liquidity sits within 0.1 %, 0.5 % and 1 % of the price.

Fees you can reconcile

Fees are computed swap by swap the way each pool contract computes them, including concentrated pools, which are replayed on their exact state. Each row names its fee model. A fee we cannot compute exactly is left empty with the reason, never estimated.

Know who your flow is

See how much of a pool's volume comes from aggregators, bots and organic traders, hour by hour, in raw token amounts and USD. No wallet addresses are exposed.

Fees against the arbitrage benchmark

F/LVR compares what a pool's liquidity earned in fees with what it gave up to arbitrage on the pair's reference price, for any pool, pair or token. Each pool shows the gross ratio, the ratio net of its documented LP share, and its fees split into routed, direct and arbitrage flow.

Fetch only what is new

Hourly reads take a cursor, so a client keeps its own copy and asks only for newer hours. Every answer says how far the data has been computed.

How it works

  1. 01

    Every swap, decoded

    Every swap of every tracked pool comes from the indexed on-chain events, in block and log order.

  2. 02

    Fees replayed per swap

    Each swap's fee is computed as the contract does it, on the state it actually met, and summed per pool and hour.

  3. 03

    Served by the hour

    Hourly rows for 14 days, plus a live view of every pool of a pair computed at the latest block.

Call it from code

Every tracked pool of a token pair at the latest block: DEX, family, fee model, reserves, TVL, liquidity within ±0.1 %, ±0.5 % and ±1 % of mid, and exact 7-day fees.

GET /api/v1/ext/market/pair-pools · 50 CU + 1 CU per pool

Send your key in x-api-key and a compute budget in x-compute-budget-ms (1 to 5000 ms; the example uses 2000).

inRange amounts are what the pool holds between its mid price and each band edge, computed with the pool's own price math.

Example values are illustrative. Token addresses are real Base contracts; amounts are raw integer units as decimal strings.

curl -s "https://llens.abanchev.com/api/v1/ext/market/pair-pools?chainId=8453&tokenA=0x4200000000000000000000000000000000000006&tokenB=0x833589fcd6edb6e08f4c7c32d4f71b54bda02913" \
  -H "x-api-key: $LL_API_KEY" \
  -H "x-compute-budget-ms: 2000"
Example response
{
  "chainId": "8453",
  "sequence": "1843207",
  "blockNumber": "52914031",
  "blockHash": "0x7c1e5f0b9a2d43e8c6f1a0b7d9e2c4f6a8b0d1e3f5a7c9b2d4e6f8a0c2e4b6d8",
  "stateDigest": "4b9e0c7f2a1d3e5b8c6a9f0d2e4b7c1a3f5e8d0b2c4a6e9f1d3b5c7a0e2f4d6b",
  "blockTimestamp": "1792419821",
  "stateAgeMs": 412,
  "canonicalStable": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
  "tokenA": "0x4200000000000000000000000000000000000006",
  "tokenB": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
  "pools": [
    {
      "pool": "0xd0b53d9277642d899df5c87a3966a349a798f224",
      "dex": "Uniswap v3",
      "family": "univ3",
      "token0": "0x4200000000000000000000000000000000000006",
      "token1": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
      "decimals0": 18,
      "decimals1": 6,
      "feeModel": {
        "kind": "static",
        "feeZeroToOneBps": "5",
        "feeOneToZeroBps": "5",
        "reason": null
      },
      "reserves": {
        "amount0": "2412881934772001827733",
        "amount1": "5904127733812"
      },
      "inRange": [
        {
          "bandBps": 10,
          "amount0": "158204411902884511744",
          "amount1": "414992881403"
        },
        {
          "bandBps": 50,
          "amount0": "611930277018322041856",
          "amount1": "1602208114570"
        },
        {
          "bandBps": 100,
          "amount0": "902417730551930634240",
          "amount1": "2361830902216"
        }
      ],
      "unavailable": null,
      "tvlUsd": "12222004.28",
      "tvlUnavailable": null,
      "fees7d": {
        "fees0": "41205118930214471680",
        "fees1": "107912440912",
        "swaps": 61840,
        "computedHours": 168,
        "from": "2026-10-12T14:00:00.000Z"
      }
    },
    {
      "pool": "0xb2cc224c1c9fee385f8ad6a55b4d94e92359dc59",
      "dex": "Aerodrome Slipstream",
      "family": "slipstream",
      "token0": "0x4200000000000000000000000000000000000006",
      "token1": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
      "decimals0": 18,
      "decimals1": 6,
      "feeModel": {
        "kind": "dynamic",
        "feeZeroToOneBps": "4.5",
        "feeOneToZeroBps": "4.5",
        "reason": "current-fee-of-a-dynamic-fee-pool"
      },
      "reserves": {
        "amount0": "6120774410200019312640",
        "amount1": "14833190277418"
      },
      "inRange": [
        {
          "bandBps": 10,
          "amount0": "611207741020001931264",
          "amount1": "1600443290112"
        },
        {
          "bandBps": 50,
          "amount0": "2004113908210771443712",
          "amount1": "5247730118804"
        },
        {
          "bandBps": 100,
          "amount0": "2988201554871200563200",
          "amount1": "7824409118230"
        }
      ],
      "unavailable": null,
      "tvlUsd": "30860195.66",
      "tvlUnavailable": null,
      "fees7d": {
        "fees0": "118440271934017310720",
        "fees1": "310115288140",
        "swaps": 214411,
        "computedHours": 168,
        "from": "2026-10-12T14:00:00.000Z"
      }
    },
    {
      "pool": "0xcdac0d6c6c59727a65f871236188350531885c43",
      "dex": "Aerodrome v2",
      "family": "solidly-v2",
      "token0": "0x4200000000000000000000000000000000000006",
      "token1": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
      "decimals0": 18,
      "decimals1": 6,
      "feeModel": {
        "kind": "static",
        "feeZeroToOneBps": "30",
        "feeOneToZeroBps": "30",
        "reason": null
      },
      "reserves": {
        "amount0": "803311902117480263680",
        "amount1": "2103418877410"
      },
      "inRange": [
        {
          "bandBps": 10,
          "amount0": "401455890211304448",
          "amount1": "1051446918"
        },
        {
          "bandBps": 50,
          "amount0": "2003788201117392896",
          "amount1": "5251972011"
        },
        {
          "bandBps": 100,
          "amount0": "3994613190027460608",
          "amount1": "10490762018"
        }
      ],
      "unavailable": null,
      "tvlUsd": "4206808.20",
      "tvlUnavailable": null,
      "fees7d": {
        "fees0": "2914002711840092160",
        "fees1": "7630127440",
        "swaps": 3922,
        "computedHours": 168,
        "from": "2026-10-12T14:00:00.000Z"
      }
    }
  ]
}

Plans

  • Builder
  • Pro
  • Enterprise

Per-pool reads are included with a key. Chain-wide rankings are available by arrangement.

Pricing on request.

Good to know

  • Hourly rows cover the last 14 days and exist for hours with swaps.
  • TVL and in-range history are sampled for registered pools only (up to 50 per organization), from registration on.
  • Fees are gross: protocol, community and gauge shares are not split out, and a v4 hook's own take is excluded.
  • F/LVR covers concentrated, constant-product and stable pools; LP-net figures exist only where the DEX documents its LP share.
  • Live on Base and Sonic.
Liquidity LensPrices are informational and instantaneous. They are not investment advice or a guarantee of execution.