CRIUS
LiquidityTVLDEX volumeMethodology

How to Calculate Robinhood Chain Liquidity, TVL and DEX Volume

How Robinhood Chain liquidity, TVL and DEX volume are measured: per-pool USD liquidity, quote-side valuation, thin pools, volume windows, wash trades.

Crius 7 min read

Short answer: a pool’s USD liquidity is twice the value of its quote side (the ETH, WETH or USDG in it), counting only in-range liquidity for Uniswap v3 and v4; a token’s liquidity is the sum over its pools, and chain TVL is the sum over all pools. Volume is the USD value of every swap, valued at the block it happened, summed over a window (5 minutes to all time); chain-wide volume leaves out same-transaction wash round trips and reports them separately.

This article explains the methodology behind the numbers the Crius API returns, shows how to reproduce them yourself and covers the pitfalls that make liquidity figures disagree between data providers. Figures are from October 2026.

Pool liquidity: why “2× the quote side”

A pool holds two assets. The obvious way to value it, adding both sides at market price, breaks on Robinhood Chain for one reason: the token’s own price comes from that same pool. A freshly launched token can have a pool with $10,000 of ETH and a billion tokens, and if you value those tokens at the pool’s own price you can make the pool look as large as you like. Anyone can create a token, mint supply and pair it with a little ETH.

So Crius values only the side whose price is known independently, the quote side (ETH, WETH or USDG), and doubles it:

pool liquidity (USD) = 2 × quote reserve × quote USD price

For a balanced constant-product pool (Uniswap v2) this is exactly the two-sided value, because both sides are worth the same at the pool’s price. For a manipulated pool it can’t be inflated without adding real ETH or USDG.

Uniswap v3 and v4 pools are concentrated: liquidity providers choose price ranges, and only liquidity whose range covers the current price can be traded against. Crius counts in-range liquidity for these pools, the depth a trade actually meets. Out-of-range positions are idle until the price moves into them.

You can see both numbers on any pool:

Terminal window
curl "https://api.crius.sh/v1/robinhood/token/0xc9675fe679c7d4e1b94416f66d61c96127eb964a/pools?limit=2" \
-H "x-api-key: $CRIUS_API_KEY"
[
{ "pool": "0xe96c…d448", "dex": "uniswap_v4", "quote": { "symbol": "ETH" }, "fee": 0,
"liquidity_usd": 83035.7, "quote_liquidity_usd": 41517.8, "price_usd": 0.00120715,
"is_price_pool": true, "swaps_indexed": 78246 },
{ "pool": "0xea71…350d", "dex": "uniswap_v4", "quote": { "symbol": "USDG" }, "fee": 34250,
"liquidity_usd": 35773.4, "quote_liquidity_usd": 17886.7, "price_usd": 0.00118472,
"is_price_pool": false }
]

liquidity_usd is twice quote_liquidity_usd, and is_price_pool marks the pool the token’s price comes from: its deepest pool with a usable quote.

Token liquidity: summing pools

A token’s liquidity is the sum of its pools’ liquidity. GIGATENEV, a popular memecoin, has 95 pools, and the distribution is typical:

const API = "https://api.crius.sh/v1/robinhood";
const KEY = process.env.CRIUS_API_KEY;
const TOKEN = "0xc9675fe679c7d4e1b94416f66d61c96127eb964a";
const get = async (p) => (await fetch(`${API}${p}`, { headers: { "x-api-key": KEY } })).json();
const pools = [];
for (let cursor = "0"; cursor !== null; ) {
const r = await get(`/token/${TOKEN}/pools?limit=50&cursor=${cursor}`);
pools.push(...r.data);
cursor = r.meta.next_cursor ?? null;
}
const tvl = pools.reduce((s, p) => s + (p.liquidity_usd ?? 0), 0);
const priced = pools.filter((p) => p.liquidity_usd > 0).sort((a, b) => b.liquidity_usd - a.liquidity_usd);
const thin = priced.filter((p) => p.liquidity_usd < 1000);
const ref = pools.find((p) => p.is_price_pool)?.price_usd;
const gaps = priced.filter((p) => p.liquidity_usd >= 1000).map((p) => Math.abs(p.price_usd / ref - 1) * 100);
console.log(`${pools.length} pools, ${priced.length} with liquidity, ${thin.length} under $1k`);
console.log(`TVL $${Math.round(tvl)}; deepest pool holds ${(priced[0].liquidity_usd / tvl * 100).toFixed(1)}%`);
console.log(`price gap across pools ≥ $1k: max ${Math.max(...gaps).toFixed(2)}%`);
GIGATENEV: 95 pools, 17 with liquidity, 13 under $1k
TVL $144430 · profile market.liquidity_usd $144430 · deepest pool uniswap_v4 ETH $80893 (56.0%)
price gap across pools ≥ $1k: max 3.39%, median 3.02%

Our sum matches the market.liquidity_usd field of the token profile exactly, which is the point of documenting the method. Three observations hold for most tokens:

  1. Most pools are empty or tiny. 78 of the 95 pools hold nothing, and 13 more hold under $1,000. Pools are cheap to create; liquidity isn’t.
  2. One pool dominates. The deepest pool holds 56% of the liquidity, and slippage for a real trade is set mainly by that pool.
  3. Prices differ between pools. Arbitrage keeps meaningful pools within a few percent of each other (3% here, roughly their fee tiers), but thin pools can sit far away. This is why Crius builds prices and candles only from pools that hold real liquidity and agree with the main price.

Chain TVL

Chain-wide TVL applies the same rule to every pool on the chain, and the method is stated in the response:

Terminal window
curl "https://api.crius.sh/v1/robinhood/stats?window=24h" -H "x-api-key: $CRIUS_API_KEY"
{
"liquidity": {
"tvl_usd": 254071816,
"locked_lp_usd": 44450481,
"method": "2x quote side (ETH/WETH/USDG) of every pool; V3/V4 in-range"
},
"dex": {
"volume_usd": 535567865, "wash_volume_usd": 265668, "trades": 1652155, "traders": 130091,
"by_dex": { "uniswap_v4": 286128529, "uniswap_v3": 237063266, "uniswap_v2": 6389536,
"pons_curve": 5975499, "launch_curve": 11035.9 }
},
"eth_usd": 2365.85
}

At the time of writing, Robinhood Chain held about $254 million of DEX liquidity, of which $44 million was in locked LP positions, and traded $536 million over 24 hours across 1.65 million swaps by 130,000 wallets. Uniswap v4 and v3 carried 98% of the volume; bonding curves (Pons and other launchpads) about 1%.

Why TVL from different providers disagrees. Most differences come from four choices: valuing both sides (inflated by manipulated tokens), counting out-of-range v3/v4 positions (counts idle capital), including bonding-curve reserves, and how ETH is priced. When you compare, check what each provider counts.

Volume: windows and valuation

Every swap is valued in USD at the block it happened, using the quote asset’s price at that block. ETH moves, and valuing last week’s ETH-quoted trades at today’s ETH price would distort historical volume.

Token statistics come in rolling windows from 1 second to 24 hours, plus all-time:

volume: 5m $4574 · 1h $56758 · 24h $1243571 · all-time $19230511
24h volume / TVL = 8.61x

Windows are rolling (“the last 24 hours ending now”), not calendar days. For calendar-aligned history, sum daily candles: GET /token/{address}/candles?interval=1d gives volume per UTC day in v, with buy volume in bv.

Volume-to-liquidity (8.6× here) is a useful health signal. A turnover of a few times liquidity per day is normal for an active memecoin. Very high multiples on thin liquidity often mean a small group trading back and forth.

Wash trading

Volume is easy to fake. The cheapest way is a round trip: buy and sell the same token in the same pool inside one transaction, which adds volume and moves nothing. Crius flags these: a buy and a sell of one token in one pool within the same transaction, equal within 2%, are marked as wash.

Chain-wide volume in /stats excludes wash round trips and statistical outliers, and reports the wash part on its own (wash_volume_usd, $265,668 of the 24-hour total in the example above), so you can see how much was removed. Detection is deliberately narrow: it catches the mechanical pattern with certainty and doesn’t guess about trades spread across wallets and blocks. For those, compare volume with the number of distinct traders, which is much harder to inflate than volume.

Locked, burned and unlocked liquidity

Liquidity that its owner can withdraw at any moment is not the same as liquidity that can’t be pulled. The token liquidity endpoint breaks each pool down by who holds the LP position:

Terminal window
curl "https://api.crius.sh/v1/robinhood/token/0xc9675fe679c7d4e1b94416f66d61c96127eb964a/liquidity" \
-H "x-api-key: $CRIUS_API_KEY"
{
"status": "unlocked",
"summary": { "burned_pct": 0, "locked_pct": 0, "unlocked_in_wallets_pct": 90.1456, "weighting": "by pool liquidity_usd" },
"pools": [
{ "pool": "0xe96c…d448", "dex": "uniswap_v4", "liquidity_usd": 82465.4, "lp_type": "nft_positions",
"breakdown": [ { "holder": "0x3ce8…76b4", "kind": "wallet", "pct": 98.39, "position_id": "3691194" } ] }
]
}

For this token, 98% of the main pool’s liquidity is one wallet’s position, which could be withdrawn in one transaction. For Uniswap v2 pools the breakdown comes from LP-token balances; for v3 and v4, from the current owner of each position NFT. Lockers and burns are recognised and reported as locked and burned, with the unlock time when there is one.

Frequently asked questions

Why doesn’t Crius value both sides of a pool? Because the token side is priced by the pool itself and can be inflated at will. Quote-side valuation can only grow if someone adds real ETH, WETH or USDG.

Are bonding-curve reserves counted in TVL? No: chain TVL counts DEX pools. Bonding-curve volume is reported in dex.by_dex (for example pons_curve), and a token’s curve progress is in its launch data.

How fresh are these numbers? Pool liquidity updates with every block. /stats aggregates are cached for up to 30 seconds.

How do I get liquidity history? Daily candles give price and volume history. For a token’s liquidity over time, sample market.liquidity_usd from the token profile on a schedule. Holder snapshots at any past block are available from /holders/snapshot.

What does it cost? /pools and /stats are 1 credit per call; /liquidity is 5 credits and needs the Free plan or above.

Next steps

Questions go to support@crius.sh.

Build with Crius

Robinhood Chain data in one API

Free plan with 1M credits a month. Your key in under a minute.

Related APIs

More from the blog