Skip to main content

Liquidity, RankingDetail and LeadingPool fields

What it is​

A pool holds two tokens, a pair. A Pairs row reads that pool from one side: Token is the token being priced, QuoteToken is the token it is priced in. Liquidity.Usd is the amount of money, in USD, that the pool holds in the row's quote token.

That number is also the weight each pool gets in the token's price blend. RankingDetail says what the blend did with the pool's price, and LeadingPool names the pool that leads the blend.

How to get it​

The three groups are selectable and filterable on the Trading cubes, in queries and subscriptions, and carried on the trading.prices Kafka topic (see Kafka).

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

Select them next to Price, Volume and Ranking. Always set Interval.Time.Duration and a Block.Time window. When ranking or filtering on Liquidity.Usd, add Liquidity.Source and RankingDetail.Verdict filters; the sample query shows the shape.

How it is derived​

Liquidity is the blend weight. Since 2026-10-19 the price index weights each of a token's pools by its liquidity after the staleness discount:

Ranking.Weight = Liquidity.Usd × RankingDetail.StaleMultiplier
÷ Σ over the token's pools (Liquidity.Usd × StaleMultiplier)

Rows before 2026-10-19 in the 30-day history are volume-weighted and carry Liquidity fields of 0. How the weighted prices become one token price is on the Price Index Algorithm page.

For every pool the index tries four cases in order and takes the first that applies. Liquidity.Source tells you which case produced the number, so always read Source next to Usd.

CaseWhenUsd isSource
1reserve knownQuoteReserve × quote token USD pricereal, real_stale
2launch curve, no reserveNetQuoteUsd (quote paid in − quote paid out)migration, retired
3reserve unknownestimate from the last hour of tradingvolume
4nothing traded in 1 h0none

Only case 1 is a measurement. Cases 2 and 3 are estimates. Never compare Usd across cases (see the warning below).

Case 1: the reserve is known (real, real_stale)​

The indexer watches the pool contract. Every swap, add or remove changes the pool's balances, and after each event it records how much of each of the pair's two tokens the pool holds. The balance of the row's quote token, times that token's USD price, is Usd. A SOL/USDC pool holding 1 000 000 USDC reports Usd of $1 000 000 on the row where USDC is the quote token. Nothing is estimated.

  • The snapshot is under an hour old: Source is real.
  • The snapshot is more than an hour old: Source is real_stale. The value is the same reserve, unchanged; only the label differs. A pool that stops trading loses weight through RankingDetail.StaleMultiplier, not through its liquidity.

Two adjustments apply to a measured reserve.

Capped by depth. If the snapshot carries a slippage table, Usd is capped at a multiple of the amount sellable within 1 % slippage, so liquidity parked far from the current price does not count in full. QuoteReserveUsd keeps the uncapped figure.

Example: a Base cbBTC/WETH pool with QuoteReserveUsd of $2.07 B reports Usd of $306 M after the depth cap.

The quote token needs an independent price. A reserve is only valued through a stablecoin, the chain's native coin or a listed currency. A pair whose quote token is anything else falls through to case 3.

Example, on Solana: real rows have WSOL, USDC, USDT, PUMP, RAY and the like as quote token. volume rows are the ones whose quote token is a fresh meme token.

Case 2: a launch curve with no reserve (migration, retired)​

Bonding curves (pump.fun, four.meme and the like) have no pool reserve to read, but every buy and sell is known. Usd is the curve's lifetime net quote in USD, quote paid in minus quote paid out, which is both its reserve and its progress to graduation. The same number is in NetQuoteUsd. The pool a curve has just graduated to is also migration until it has a reserve snapshot of its own.

Once the token has moved on to a real pool, the curve row becomes retired: it keeps its last curve balance in Usd, but Ranking.Weight is 0 and it no longer prices the token.

Case 3: the reserve is unknown (volume)​

There is no balance to read: the chain's pool events are not indexed (Tron, Arc), the "pool" is a router or order engine with no vault (Tessera on Solana), or the quote token has no USD price. The only thing known is the pool's trades, so liquidity is estimated from the last hour of trading, with recent trades counting more, valued at the token's reference price across all its pools rather than the pool's own last print, and scaled up by a turnover factor: how much reserve a typical pool holds per hour of trading. The factor is set per chain, and when the token has at least one pool with a measured reserve, that token's own measured turnover is used instead, so an unmeasured pool weighs against the measured ones in proportion to how much it trades against them. Reserve fields stay 0.

You can see the two regimes in the data: Liquidity.Usd / Volume.Usd on one-hour rows of tokens with no measured pool sits at one value per chain, while pools of tokens that do have a measured pool land anywhere from well below 1 to several thousand.

The estimate is a ranking tool, not a measurement

It orders the pools of one token well: the pool that trades more against the others gets more weight, which is what the price index needs it for. It cannot tell you how many dollars sit in a pool nobody has measured, and it should not be shown as such. On established pools the raw chain-factor estimate runs around a tenth of the real reserve; on brand-new pools it runs well above it. Filter on Source: { in: ["real", "real_stale"] } when you need a dollar figure.

Case 4: nothing traded (none)​

The pool traded nothing in the last hour and has no reserve snapshot. Usd is 0.

Usd is not comparable across sources​

danger

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.

Token and currency level​

On a Pair the fields describe one pool, read from the row's quote token. The same pool appears once per quote token, so its two rows value different tokens and report different QuoteReserve and Usd. On a Token or Currency:

  • 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.

What Liquidity is not​

  • Not TVL. Usd values one of the pool's two tokens, the row's quote token. A pool that explorers show at $2 M total value locked reports roughly $1 M here. The other token's balance 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.

Fields​

Liquidity​

FieldTypeMeaning
UsdFloatUSD liquidity: the pool's balance of the row's quote token, valued in USD, the depth that backs the price. Summed over pools at token and currency level. Calculated as described above.
SourceStringWhich case produced Usd: real, real_stale, migration, retired, volume or none. At token and currency level it is the source of the leading (Position 1) pool. Details in Source values.
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.
BaseReserveFloatPost-event balance of the row's Token, the token being priced, as a UI amount. Pair level only.
QuoteReserveFloatPost-event balance of the row's QuoteToken, as a UI amount. Pair level only.
QuoteReserveUsdFloatQuoteReserve valued in USD, before any cap. Equals Usd for a single pool unless the depth cap applied.
UpdatedAtDateTimeTime of the reserve snapshot behind Usd, for judging freshness. Pair level only.
DepthUsdFloatHow much quote, in USD, can be sold into the pool before the price moves 1 %. The pool pays that trade out in base, so the ceiling is the base leg, not QuoteReserveUsd: on a pegged pair (USDC/USDT, PYUSD/USDS) it is close to the whole base leg and can exceed QuoteReserveUsd; on a volatile pair the curve stops it far below either leg. 0 when the 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​

ValueWhen it appliesWhat Usd isShare of one-minute Pairs rows (8 chains, 5 min sample)
realA reserve snapshot of the pool exists and is under an hour old.The pool's balance of the row's quote token, valued in USD.82 %
real_staleThe snapshot is more than an hour old.The same reserve, unchanged; only the label differs.1.4 %
migrationA launch curve (pump.fun, four.meme and the like) with no reserve snapshot, or the pool it just graduated to.Money paid into the curve minus money taken out. Usd equals NetQuoteUsd.2.8 %
volumeNo reserve and not a launch curve.An estimate from the last hour's trading, see case 3.14 %
noneThe pool traded nothing in the last hour.00.1 %
retiredA launch curve whose token has moved on to a real pool.Its last curve balance (see pitfall 4).< 0.1 %
impactDefined by engineering as depth estimated from net flow against the price move. Not observed in data as of October 2026.–not observed

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, falling the longer it stays quiet beyond that rhythm. 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 a cap around the recently-traded consensus.< 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 the most weight, not necessarily the deepest measured pool

LeadingPool is the pool at Ranking.Position: 1: the pool with the most weight in the blend. Since 2026-10-19 that is the largest share of Liquidity.Usd × StaleMultiplier among the token's pools; on rows before that date it is the largest volume share. Estimates count, so the leading pool can be a router or order engine with no reserves at all (Liquidity.Source: "volume") whose estimate outweighs the measured pools. It can change every batch.

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.

Examples​

Which pools price a token with measured liquidity?​

Every pool pricing SOL on Solana with more than $10 000 of measured reserve in its quote token, accepted into the blend, deepest first. This is the shape to start from: it selects every Liquidity field, and the where clause applies the two filters that make Usd safe to rank on.

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
}
}
}
}

First row returned on 2026-10-22 (SOL/USDC on Raydium AMM v4):

{
"Block": { "Time": "2026-10-22T05:38:51Z" },
"Market": { "Id": "bid:solana:675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8:58oQChx4yWmvKdwLLZzBi4ChoCc2fqCUWBkwMihLYQo2", "Name": "raydium_amm" },
"Pool": { "Address": "58oQChx4yWmvKdwLLZzBi4ChoCc2fqCUWBkwMihLYQo2" },
"QuoteToken": { "Symbol": "USDC" },
"Price": { "Ohlc": { "Close": 105.49534 } },
"Volume": { "Usd": 399.11612 },
"Liquidity": {
"Usd": 9697858,
"BaseReserve": 92157.13,
"QuoteReserve": 9699468,
"QuoteReserveUsd": 9697858,
"UpdatedAt": "2026-10-22T05:38:51Z",
"Source": "real",
"RealShare": 1,
"DepthUsd": 0,
"NetQuoteUsd": 0
},
"Ranking": { "Position": 2, "Weight": 0.17664543 },
"RankingDetail": { "Verdict": "priced", "StaleMultiplier": 1 }
}

How to read it:

  • Source: "real" means case 1 applied. The pool holds 9 699 468 USDC (QuoteReserve); at USDC's price of just under $1 that is Usd of $9 697 858. The 92 157 SOL on the other side (BaseReserve) is not valued.
  • QuoteReserveUsd equals Usd because no depth cap applied. DepthUsd is 0: Solana snapshots carry no slippage table.
  • UpdatedAt is when the reserve was last read. Here it matches Block.Time; on a quiet pool it can be minutes earlier.
  • Verdict: "priced" means this pool's price went into SOL's token price, with Weight 0.18 of the blend at Position 2. Weight follows liquidity, not volume: the pool traded only $399 in the minute, but its $9.7 M reserve is what earns it 18 % of the blend.
  • NetQuoteUsd is 0 because this is an AMM pool, not a launch curve. RealShare is 1 on every pair row with a measured reserve.

To make the same query estimate-tolerant, drop the Source filter and show Source next to Usd so a reader can tell a reserve from an estimate. To run it for another token, change Token.Id; the id carries the chain (bid:solana:<mint>, bid:base:<contract>, bid:bsc:<contract>), so no separate Network filter is needed.

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.6 (0.59 on 2026-10-22).
  • The pool that sets the price has no reserves; its volume-derived estimate outweighs the measured pools, while well over half of the summed liquidity is measured.

Which tokens on a chain have the most 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
}
}
}
}

How far along is a pump.fun curve?​

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
}
}
}
}

Which pools did the blend reject or bound?​

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
}
}
}
}

Which pools are 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
}
}
}
}

What reserves and depth do Ethereum's leading pools hold?​

DepthUsd is the quote amount, in USD, 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
}
}
}
}

How much liquidity does a currency have across chains?​

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
}
}
}
}

How do I 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
}
}
}
}

Pitfalls​

Chain coverage​

ChainReserve dataPools with a measured reserve (real + real_stale, pools that traded in a 5 min window)
Solanareal on most rows81 %
Ethereum, BSC, Arbitrumreal on most rows80–84 %
Base, Optimism, Maticreal on most rows60–72 %
Robinhoodreal on most rowssmall sample
Arcvolume only0
Tronvolume only: no reserve events are indexed, so RealShare is 0 chain-wide0

These shares count pools that traded recently; across all pools the index knows, including quiet ones, the measured share on EVM chains is lower. DepthUsd was non-zero only on EVM pools in the sample (Uniswap v2 / v3 families); Solana rows carry 0.

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.
  7. History before 2026-10-19 has no liquidity. Rows older than that carry Liquidity fields of 0 and volume-based Ranking.Weight.

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.

On trading.trades, TradeIndex is field 4 of TradeTransaction in market/transaction.proto, read as Trade.Transaction.TradeIndex.

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.