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.
| Group | Currencies | Tokens | Pairs |
|---|---|---|---|
Liquidity { … } | yes (summed over pools) | yes (summed over pools) | yes (one pool) |
RankingDetail { … } | – | yes | yes |
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.
| Field | Type | Meaning |
|---|---|---|
Usd | Float | USD liquidity: the quote-leg reserve valued in USD, the depth that backs the price. Summed over pools at token and currency level. |
BaseReserve | Float | Post-event base-token reserve, as a UI amount. Pair level only. |
QuoteReserve | Float | Post-event quote-token reserve, as a UI amount. Pair level only. |
QuoteReserveUsd | Float | QuoteReserve valued in USD. Equals Usd for a single pool. |
UpdatedAt | DateTime | Time of the reserve snapshot behind Usd, for judging freshness. Pair level only (see below). |
Source | String | Where 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. |
RealShare | Float | Fraction of Usd backed by a reserve snapshot: 1 or 0 for a single pool, in between for a token or currency summed over pools. |
DepthUsd | Float | Quote-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. |
NetQuoteUsd | Float | A 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
| Value | Meaning | How often (all chains, one-minute Pairs rows, 2 h sample) |
|---|---|---|
real | A reserve snapshot inside the freshness window. | 81 % |
real_stale | A snapshot past the freshness window, still the best known. | 0.2 % |
retired | A launch curve its token has left. | < 0.1 % |
migration | A curve's cumulative net quote, or the amount that migrated to its venue. Usd equals NetQuoteUsd. | 1.7 % |
impact | Depth estimated from net flow against the price move. | not observed in the sample |
volume | Turnover-scaled trade volume. | 17 % |
none | No 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 valuesA 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.
Usdvalues the quote leg only. A pool that explorers show at $2 M total value locked reports roughly $1 M here. The base leg is inBaseReserve, 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.UsdwithSupply.MarketCapbefore showing either. - Not the chain-level pool cube.
DEXPoolson the chain schemas carries full pool state; this is the index's view of the reserve that prices the token.
Token and currency level
Usdis the sum over the pools the blend considered — including pools that did not trade in the interval and therefore have noPairsrow. Do not expect it to equal the sum of visiblePairsrows.Sourceis the leading pool's source. A token can showSource: "volume"withRealShare: 0.67: two thirds of the sum is real reserves, but the pool that sets the price has none.RealShareis the quality signal above pair level.RealShare: 1means every dollar is a measured reserve.UpdatedAtis1970-01-01T00:00:00Zon every token and currency row — there is no single snapshot behind a sum. Filter on it at pair level only.BaseReserve,QuoteReserve,QuoteReserveUsd,DepthUsdandNetQuoteUsdare0, notnull, on token and currency rows.
Chain coverage
| Chain | Reserve data |
|---|---|
| Solana, Ethereum, BSC, Base, Arbitrum, Optimism, Matic, Robinhood | real on most rows |
| Arc | volume only |
| Tron | volume 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.
| Field | Type | Meaning |
|---|---|---|
Verdict | String | What happened to this part's price in the batch's blend. Values below. |
StaleMultiplier | Float | Staleness 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
| Value | Meaning | Share of one-minute Pairs rows (10 min sample) |
|---|---|---|
priced | Accepted into the blend. | 97.2 % |
clamped | Accepted, but bounded to the blend cap (2× of the recently-traded median). | < 0.1 % |
outlier | Rejected by the outlier band. Contributes neither price nor volume to the token. | < 0.1 % |
ineligible | Refused by the eligibility gate: too little money or history. Its volume still counts, its price does not. | 2.2 % |
no_price | No price in the window; ranked by weight 0. | 0.3 % |
retired | A 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 % |
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.
| Field | Type | Meaning |
|---|---|---|
MarketId | String | Market.Id of the leading pool's pair. |
QuoteTokenId | String | QuoteToken.Id of that pair. |
PoolAddress | String | Pool.Address of that pair. Empty where the market has no pool address. |
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
- Two timestamps.
Block.Timeis the last write to the row (a trade or a re-rank);Liquidity.UpdatedAtis the reserve snapshot. They differ by minutes on quiet pools. Networkfilters take display names, case-sensitive:"Solana","Ethereum","Binance Smart Chain","Matic","Tron"."solana"returns nothing.- Pump.fun's curve protocol is
pump; the post-graduation AMM ispump_amm. - A retired curve keeps a non-zero
Liquidity.Usd(its last snapshot) withSource: "retired"andWeight: 0. CheckVerdict/Source, notUsd, to know it is out of the price. - Aggregates use field arguments, as elsewhere on the Trading cubes:
Liquidity { Usd(maximum: Liquidity_Usd) }, andorderBy: { descending: Liquidity_Usd }for ordering. - Subscriptions return
nullfor a whole group from a producer that does not yet emit it. Null-checkLiquidity,RankingDetailandLeadingPool; do not read a missing group as0.
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.
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
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.
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.
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
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.
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.
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
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.
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:
| Message | Field | Number |
|---|---|---|
PairUpdate | Liquidity Liquidity | 11 |
PairUpdate | RankingDetail RankingDetail | 12 |
TokenUpdate | Liquidity Liquidity | 6 |
TokenUpdate | RankingDetail RankingDetail | 7 |
TokenUpdate | LeadingPool LeadingPool | 8 |
CurrencyUpdate | Liquidity Liquidity | 4 |
Differences from GraphQL:
Liquidity.UpdatedAtis auint32unix second (0at token and currency level).SourceandVerdictare plain strings with the same values as above; an unranked part has an emptyVerdict.- A message from a producer that does not emit the group yet has the protobuf default — an unset message — not a zeroed one; check
HasFieldbefore reading.
TradeIndex is a GraphQL-only field on Trading.Trades today: market/trades.proto does not carry it.
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.