Skip to main content

Liquidity, RankingDetail and LeadingPool fields reference

Three field groups on the price index cubes say how much money backs a price, what the blend did with each pool, and which pool sets the token price. They are selectable and filterable in queries and subscriptions, and carried on the trading.prices Kafka topic.

GroupCurrenciesTokensPairs
Liquidity { … }yes (summed over pools)yes (summed over pools)yes (one pool)
RankingDetail { … }–yesyes
LeadingPool { … }–yes–

TradeIndex, the fourth field added in the same release, is on the Trades cube only — see Trades of a transaction in execution order.

For how prices are blended across pools, see the Price Index Algorithm. For Ranking { Position Weight }, which these fields explain, see Ranking on Pairs.

Liquidity​

The quote-leg reserve that backs the price, how much of it is tradable, and where the number came from. On a Pair it describes that pool. On a Token or Currency it is summed over the pools in the blend, and the per-pool fields are 0.

FieldTypeMeaning
UsdFloatUSD liquidity: the quote-leg reserve valued in USD, the depth that backs the price. Summed over pools at token and currency level.
BaseReserveFloatPost-event base-token reserve, as a UI amount. Pair level only.
QuoteReserveFloatPost-event quote-token reserve, as a UI amount. Pair level only.
QuoteReserveUsdFloatQuoteReserve valued in USD. Equals Usd for a single pool.
UpdatedAtDateTimeTime of the reserve snapshot behind Usd, for judging freshness. Pair level only (see below).
SourceStringWhere Usd came from, so a real reserve can be told from an estimate. At token and currency level it is the source of the leading (Position 1) pool. Values below.
RealShareFloatFraction of Usd backed by a reserve snapshot: 1 or 0 for a single pool, in between for a token or currency summed over pools.
DepthUsdFloatQuote-side amount, in USD, that can be sold into the pool inside the 1 % slippage tier: the part of the reserve actually tradable at spot. 0 when the reserve snapshot carried no slippage table. Pair level only.
NetQuoteUsdFloatA launch curve's lifetime net quote in USD (quote paid in minus quote paid out) — for a bonding curve, its reserve and its progress to graduation. On a retired curve, the amount that migrated to the venue. 0 for a pool that is not a configured launcher. Pair level only.

Source values​

ValueMeaningHow often (all chains, one-minute Pairs rows, 2 h sample)
realA reserve snapshot inside the freshness window.81 %
real_staleA snapshot past the freshness window, still the best known.0.2 %
retiredA launch curve its token has left.< 0.1 %
migrationA curve's cumulative net quote, or the amount that migrated to its venue. Usd equals NetQuoteUsd.1.7 %
impactDepth estimated from net flow against the price move.not observed in the sample
volumeTurnover-scaled trade volume.17 %
noneNo estimate available. Usd is 0.0.2 %

Only real and real_stale are measured reserves. Everything else is an estimate or a curve balance.

Liquidity.Usd is not comparable across Source values

A volume estimate is turnover-scaled and can be far larger than any reserve. Routers and order engines without a pool (Tessera on Solana, for example) report volume liquidity in the tens of millions on top-market pairs, and a dead pool whose quote token has a nonsense price can report billions. Rank or filter by Liquidity.Usd only together with Source: { in: ["real", "real_stale"] }, or at token level with a RealShare floor.

What Liquidity is not​

  • Not TVL. Usd values the quote leg only. A pool that explorers show at $2 M total value locked reports roughly $1 M here. The base leg is in BaseReserve, unvalued.
  • Not a trust signal. A token with $1 000 of real USDC-side reserve and a $80 000 price gets a market cap in the trillions. Pair Liquidity.Usd with Supply.MarketCap before showing either.
  • Not the chain-level pool cube. DEXPools on the chain schemas carries full pool state; this is the index's view of the reserve that prices the token.

Token and currency level​

  • Usd is the sum over the pools the blend considered — including pools that did not trade in the interval and therefore have no Pairs row. Do not expect it to equal the sum of visible Pairs rows.
  • Source is the leading pool's source. A token can show Source: "volume" with RealShare: 0.67: two thirds of the sum is real reserves, but the pool that sets the price has none.
  • RealShare is the quality signal above pair level. RealShare: 1 means every dollar is a measured reserve.
  • UpdatedAt is 1970-01-01T00:00:00Z on every token and currency row — there is no single snapshot behind a sum. Filter on it at pair level only.
  • BaseReserve, QuoteReserve, QuoteReserveUsd, DepthUsd and NetQuoteUsd are 0, not null, on token and currency rows.

Chain coverage​

ChainReserve data
Solana, Ethereum, BSC, Base, Arbitrum, Optimism, Matic, Robinhoodreal on most rows
Arcvolume only
Tronvolume only — no reserve events are indexed, so RealShare is 0 chain-wide

DepthUsd was non-zero only on EVM pools in the sample (Uniswap v2 / v3 families); Solana rows carry 0.

RankingDetail​

Explains the Ranking a pool (or, on Tokens, a token's part in its currency) received. Ranking { Position Weight } is unchanged; RankingDetail says why.

FieldTypeMeaning
VerdictStringWhat happened to this part's price in the batch's blend. Values below.
StaleMultiplierFloatStaleness discount applied to the weight, in (0, 1]: 1 for a part trading at its own rhythm, halving every stale half-life past its threshold. Ranking.Weight is already the share of the discounted weights — do not apply the multiplier again.

Verdict values​

ValueMeaningShare of one-minute Pairs rows (10 min sample)
pricedAccepted into the blend.97.2 %
clampedAccepted, but bounded to the blend cap (2× of the recently-traded median).< 0.1 %
outlierRejected by the outlier band. Contributes neither price nor volume to the token.< 0.1 %
ineligibleRefused by the eligibility gate: too little money or history. Its volume still counts, its price does not.2.2 %
no_priceNo price in the window; ranked by weight 0.0.3 %
retiredA launch curve its token has left. Ranking.Weight is 0, StaleMultiplier is the floor (2⁻²⁰).< 0.1 %
"" (empty)The row was not ranked in this batch. Ranking.Position and Weight are 0 too. About 0.2 % of pair rows and 2 % of token rows. Treat as "unknown", not as a verdict.0.2 %
Rejected is not removed

An outlier or ineligible pool still has a Pairs row, a Ranking.Position and a Liquidity block. Filter on RankingDetail.Verdict when you want only the pools whose price the token actually uses.

LeadingPool (Tokens only)​

Identifies the pair update that leads the token's blend, so a client can follow the token's price to the pool that sets it without joining to Pairs.

FieldTypeMeaning
MarketIdStringMarket.Id of the leading pool's pair.
QuoteTokenIdStringQuoteToken.Id of that pair.
PoolAddressStringPool.Address of that pair. Empty where the market has no pool address.
"Leading" means Position 1 by volume, not the deepest pool

LeadingPool is the pool at Ranking.Position: 1 — the largest share of decay-weighted traded volume, after the staleness discount. It is not the pool with the most liquidity, and it is not the venue's "main" pool. It can change every batch, and it can be a router or order engine with no reserves at all (Liquidity.Source: "volume").

Match on MarketId plus QuoteTokenId, not on PoolAddress: the same pool address appears once per quote token, and PoolAddress is observed empty on some updates and filled on the next for the same market.

Pitfalls to design around​

  1. Two timestamps. Block.Time is the last write to the row (a trade or a re-rank); Liquidity.UpdatedAt is the reserve snapshot. They differ by minutes on quiet pools.
  2. Network filters take display names, case-sensitive: "Solana", "Ethereum", "Binance Smart Chain", "Matic", "Tron". "solana" returns nothing.
  3. Pump.fun's curve protocol is pump; the post-graduation AMM is pump_amm.
  4. A retired curve keeps a non-zero Liquidity.Usd (its last snapshot) with Source: "retired" and Weight: 0. Check Verdict / Source, not Usd, to know it is out of the price.
  5. Aggregates use field arguments, as elsewhere on the Trading cubes: Liquidity { Usd(maximum: Liquidity_Usd) }, and orderBy: { descending: Liquidity_Usd } for ordering.
  6. Subscriptions return null for a whole group from a producer that does not yet emit it. Null-check Liquidity, RankingDetail and LeadingPool; do not read a missing group as 0.

Examples​

Pools of a token with real liquidity, accepted into the blend​

Every pool pricing SOL on Solana with more than $10 000 of measured quote-side reserve, deepest first.

Run query ➤

query TokenPoolsWithRealLiquidity {
Trading {
Pairs(
limit: {count: 10}
orderBy: {descending: Liquidity_Usd}
where: {
Token: {Id: {is: "bid:solana:So11111111111111111111111111111111111111112"}}
Interval: {Time: {Duration: {eq: 60}}}
Block: {Time: {since_relative: {minutes_ago: 5}}}
Liquidity: {Usd: {gt: 10000}, Source: {in: ["real", "real_stale"]}}
RankingDetail: {Verdict: {is: "priced"}}
}
) {
Block {
Time
}
Market {
Id
Name
}
Pool {
Address
}
QuoteToken {
Symbol
}
Price {
Ohlc {
Close
}
}
Volume {
Usd
}
Liquidity {
Usd
BaseReserve
QuoteReserve
QuoteReserveUsd
UpdatedAt
Source
RealShare
DepthUsd
NetQuoteUsd
}
Ranking {
Position
Weight
}
RankingDetail {
Verdict
StaleMultiplier
}
}
}
}

Which pool sets a token's price, and how much backs it​

Run query ➤

query TokenLeadingPoolAndLiquidity {
Trading {
Tokens(
limit: {count: 1}
orderBy: {descending: Block_Time}
where: {
Token: {Id: {is: "bid:solana:So11111111111111111111111111111111111111112"}}
Interval: {Time: {Duration: {eq: 60}}}
Block: {Time: {since_relative: {minutes_ago: 10}}}
}
) {
Block {
Time
}
Token {
Id
Symbol
}
Price {
Average {
Mean
}
Ohlc {
Close
}
}
Liquidity {
Usd
RealShare
Source
}
LeadingPool {
MarketId
PoolAddress
QuoteTokenId
}
Ranking {
Position
Weight
}
RankingDetail {
Verdict
StaleMultiplier
}
}
}
}

The row for SOL shows LeadingPool pointing at a Tessera market with Source: "volume" and RealShare around 0.67: the pool that sets the price has no reserves, while two thirds of the summed liquidity is measured.

Top tokens on a chain by measured liquidity​

RealShare: { ge: 0.9 } keeps out tokens whose sum is mostly estimates. limitBy collapses to one row per token.

Run query ➤

query TopSolanaTokensByRealLiquidity {
Trading {
Tokens(
limit: {count: 20}
limitBy: {by: Token_Id, count: 1}
orderBy: {descending: Liquidity_Usd}
where: {
Token: {Network: {is: "Solana"}}
Interval: {Time: {Duration: {eq: 60}}}
Block: {Time: {since_relative: {minutes_ago: 5}}}
Liquidity: {Source: {is: "real"}, RealShare: {ge: 0.9}}
}
) {
Token {
Id
Symbol
}
Price {
Average {
Mean
}
}
Liquidity {
Usd
RealShare
Source
}
LeadingPool {
MarketId
PoolAddress
}
}
}
}

Bonding-curve progress with NetQuoteUsd​

Live pump.fun curves, ordered by how much quote has flowed in net — the curve's progress to graduation. Usd equals NetQuoteUsd while Source is migration.

Run query ➤

query PumpFunCurveProgressNetQuoteUsd {
Trading {
Pairs(
limit: {count: 20}
limitBy: {by: Pool_Address, count: 1}
orderBy: {descending: Liquidity_NetQuoteUsd}
where: {
Market: {Network: {is: "Solana"}, Protocol: {is: "pump"}}
Interval: {Time: {Duration: {eq: 60}}}
Block: {Time: {since_relative: {minutes_ago: 10}}}
Liquidity: {Source: {is: "migration"}}
}
) {
Block {
Time
}
Token {
Id
Symbol
}
Pool {
Address
}
Price {
Ohlc {
Close
}
}
Liquidity {
Usd
NetQuoteUsd
Source
RealShare
UpdatedAt
}
Ranking {
Position
Weight
}
RankingDetail {
Verdict
}
}
}
}

Pools the blend rejected or bounded​

Run query ➤

query PoolsRejectedFromTokenBlend {
Trading {
Pairs(
limit: {count: 20}
orderBy: {descending: Block_Time}
where: {
Interval: {Time: {Duration: {eq: 60}}}
Block: {Time: {since_relative: {minutes_ago: 10}}}
RankingDetail: {Verdict: {in: ["outlier", "clamped", "ineligible"]}}
}
) {
Block {
Time
}
Market {
Network
Name
}
Pool {
Address
}
Token {
Id
Symbol
}
Price {
Ohlc {
Close
}
}
Volume {
Usd
}
Liquidity {
Usd
Source
}
Ranking {
Position
Weight
}
RankingDetail {
Verdict
StaleMultiplier
}
}
}
}

Pools losing weight for going quiet​

Lowest StaleMultiplier first. Liquidity.UpdatedAt shows how long ago the reserve was last seen.

Run query ➤

query StalePoolsDiscountedInRanking {
Trading {
Pairs(
limit: {count: 20}
orderBy: {ascending: RankingDetail_StaleMultiplier}
where: {
Interval: {Time: {Duration: {eq: 60}}}
Block: {Time: {since_relative: {minutes_ago: 10}}}
RankingDetail: {StaleMultiplier: {lt: 1}, Verdict: {is: "priced"}}
Liquidity: {Usd: {gt: 1000}}
}
) {
Block {
Time
}
Market {
Network
Name
}
Pool {
Address
}
Token {
Symbol
}
Liquidity {
Usd
UpdatedAt
Source
}
Ranking {
Position
Weight
}
RankingDetail {
Verdict
StaleMultiplier
}
}
}
}

Pool reserves and tradable depth on Ethereum​

DepthUsd is the quote-side amount sellable within 1 % slippage. It can exceed Usd on a concentrated-liquidity pool.

Run query ➤

query EthereumTopPoolsReservesAndDepth {
Trading {
Pairs(
limit: {count: 10}
limitBy: {by: Pool_Address, count: 1}
orderBy: {descending: Liquidity_DepthUsd}
where: {
Market: {Network: {is: "Ethereum"}}
Interval: {Time: {Duration: {eq: 60}}}
Block: {Time: {since_relative: {minutes_ago: 10}}}
Ranking: {Position: {eq: 1}}
Liquidity: {Source: {is: "real"}, DepthUsd: {gt: 0}}
}
) {
Block {
Time
}
Market {
Name
}
Pool {
Address
}
Token {
Symbol
}
QuoteToken {
Symbol
}
Price {
Ohlc {
Close
}
}
Liquidity {
Usd
BaseReserve
QuoteReserve
QuoteReserveUsd
DepthUsd
UpdatedAt
Source
}
Ranking {
Position
Weight
}
}
}
}

Liquidity summed across chains for a currency​

Run query ➤

query CurrencyLiquidityAcrossChains {
Trading {
Currencies(
limit: {count: 1}
orderBy: {descending: Block_Time}
where: {
Currency: {Id: {is: "bid:bitcoin"}}
Interval: {Time: {Duration: {eq: 60}}}
Block: {Time: {since_relative: {minutes_ago: 10}}}
}
) {
Block {
Time
}
Currency {
Id
Symbol
}
Price {
Average {
Mean
}
}
Liquidity {
Usd
RealShare
Source
}
}
}
}

Stream liquidity and verdicts for a token's pools​

The same selections work in a subscription; Block.Time carries sub-second precision on the stream.

Run stream ➤

subscription TokenPoolLiquidityStream {
Trading {
Pairs(
where: {
Token: {Id: {is: "bid:solana:So11111111111111111111111111111111111111112"}}
Interval: {Time: {Duration: {eq: 1}}}
}
) {
Block {
Time
}
Market {
Name
}
Pool {
Address
}
QuoteToken {
Symbol
}
Price {
Ohlc {
Close
}
}
Liquidity {
Usd
QuoteReserveUsd
UpdatedAt
Source
RealShare
}
Ranking {
Position
Weight
}
RankingDetail {
Verdict
StaleMultiplier
}
}
}
}

Kafka: trading.prices​

The same groups are on the trading.prices topic, defined in market/price_index.proto:

MessageFieldNumber
PairUpdateLiquidity Liquidity11
PairUpdateRankingDetail RankingDetail12
TokenUpdateLiquidity Liquidity6
TokenUpdateRankingDetail RankingDetail7
TokenUpdateLeadingPool LeadingPool8
CurrencyUpdateLiquidity Liquidity4

Differences from GraphQL:

  • Liquidity.UpdatedAt is a uint32 unix second (0 at token and currency level).
  • Source and Verdict are plain strings with the same values as above; an unranked part has an empty Verdict.
  • A message from a producer that does not emit the group yet has the protobuf default — an unset message — not a zeroed one; check HasField before reading.

TradeIndex is a GraphQL-only field on Trading.Trades today: market/trades.proto does not carry it.

Build with Bitquery

Ready to run this in production?

Get an API key and run these queries in minutes, or talk to us about plans and enterprise delivery.