
Blog · Turnstile series, part 9
TVL is not depth: what a Uniswap pool can actually trade
Why a pool's total value locked says little about whether it can take a trade or pay its LPs, and how a paid analyst measures depth, compares it with TVL and says how sure it is.
TL;DR
Turnstile sells AI agents one answer per payment: is this Uniswap pool a sensible place to provide liquidity?
The obvious shortcut is TVL, the total value locked in the pool. But TVL only counts what the pool holds. What matters is depth: how big a trade the pool can fill before the price moves too much. A deep pool attracts trades, and trades are what pay the fees an LP earns. TVL and depth are not the same number, and they can be far apart.
- TVL can be fake. The three largest pools by TVL on our subgraph were worthless, one of them claiming $1.9 trillion.
- TVL can be real and idle. In Uniswap v3, most capital sits outside the current price and earns nothing.
- Depth is measured, not read. We simulate trades from $1k to $10M against the live pool and record what each one costs.
- The answer is the ratio. Take the largest trade the pool fills while losing under 1% to price movement, and divide it by TVL. USDC/WETH holds about $106M, and the largest such trade was $1M: about 0.94% of its TVL. In v3 that is normal, because most of the money sits outside the current price. A scam pool claiming billions can't fill even a $1,000 trade, so it fails outright.
Part 9 of 9 in the Turnstile series: building a paid lane for onchain data agents.
The question an LP actually asks
A liquidity provider deposits two tokens into a pool and earns a share of the fee on every trade that passes through it. In Uniswap v3 they also choose a price range, and they only earn while the price stays inside it. In exchange, they hold whatever the traders leave behind. When one token falls, traders sell it into the pool, and the LP ends up holding more of it. If the price drops out of their range, they hold only the token that fell, and earn nothing until the price comes back.
So an LP is asking three things. Does the pool hold a real two-sided market? Does trade actually flow through it? Is the fee worth the risk? "How big is the pool?" is a stand-in for all three, and TVL is the number people normally reach for. An agent with a list of pools will sort by totalValueLockedUSD unless something stops it.
Why TVL misleads
Fake TVL
Here are the three largest Uniswap v3 pools on Ethereum mainnet by TVL, as our subgraph reported them at block 25,835,635. A subgraph is an index of onchain data, built with The Graph, that you can query like a database.
| TVL | Pool | Volume, all time |
|---|---|---|
| $1,945.56B | Uniswap v3 USDT/USDT 1% | $0.00 |
| $3.20B | Uniswap v3 TRUMP/WETH 0.3% | $1.53 |
| $1.24B | Uniswap v3 USDT/WETH 1% | $4.93 |
None of these is a real venue. The first pairs a scam token that calls itself USDT against the real USDT. It holds two trillion of the fake and none of the real one.
The indexer's arithmetic isn't wrong. To price a token with no market of its own, the indexer borrows the price of what it's paired with. Pair a worthless token with a dollar and it inherits a plausible price. A plausible price times an absurd balance is an absurd TVL.
Real but idle TVL
The second failure looks the same and is harder to spot, because the money is real.
Those price ranges are what Uniswap calls concentrated liquidity. Instead of spreading their tokens across every possible price, LPs put them where they expect trading to happen, say WETH between $2,000 and $3,000. Inside that range their capital works much harder. Outside it, it does nothing. In Uniswap's words: "when the price exits a position's interval, the position's liquidity is no longer active and no longer earns fees."
TVL counts every position, in range or not. A trade only meets the ones around the current price. So even on a healthy pool, most of the TVL is not what a trader or a new LP is dealing with. What counts is how much liquidity sits around the current price: its depth.
Measuring depth
Depth is how much a pool can absorb before the price moves too far. You can't read it from an index. You ask the pool.
Uniswap's QuoterV2 contract lets you simulate "if I swapped this much, what would I get back?" without making the trade. The analyst asks it five times, at $1k, $10k, $100k, $1M and $10M, all against the same block so the five answers describe one state of the pool. We call that a depth ladder.
The quoter works in tokens, not dollars, so each size is converted with the token's price first: $1k of USDC is about 1,000 USDC.
Here is the real ladder for USDC/WETH 0.05% at block 25,925,794:
| Trade size | WETH out | Slippage | Initialized ticks crossed |
|---|---|---|---|
| $1k | 0.398654 | 0.000% | 1 |
| $10k | 3.986406 | 0.003% | 1 |
| $100k | 39.850218 | 0.038% | 2 |
| $1M | 397.118445 | 0.385% | 9 |
| $10M | 3,793.724629 | 4.837% | 125 |
- Slippage is how much worse the price got compared with the $1k trade, which is small enough to move the price barely at all. We compare against the pool's own price rather than a market price from elsewhere, because the question is what this pool does to a trade, not whether it's priced fairly.
- Ticks are the price steps v3 divides its range into, and an initialized tick is one where some LP's range starts or ends. Crossing 125 of them means the $10M trade walked through 125 boundaries of LP ranges to get filled. That turns "the price got worse" into a picture of where the liquidity sits.
The direction of the quote matters too. The analyst always quotes the trade that drains the scarcer token. Quote the scam pool the other way, selling real USDT to buy the fake, and two trillion tokens make it look bottomless.
The ratio neither source gives alone
The subgraph supplies the claimed TVL. The quoter supplies the usable depth: the largest trade on the ladder that stays within 1% slippage. Divide one by the other.
On USDC/WETH, $1M was the largest trade inside 1%, against a TVL of about $106M. That is 0.944%.
| Depth over TVL | What it says | Signal |
|---|---|---|
| 1% or more | TVL and depth agree within a plausible ratio | pass |
| 0.1% to 1% | Most of the TVL isn't reachable: normal for v3, but worth knowing | warn |
| below 0.1%, or nothing fills | TVL isn't describing the pool | fail |
USDC/WETH lands in the middle. That's not a red flag: it's what concentrated liquidity looks like. But an LP sizing a position off the headline TVL is looking at a number about a hundred times the depth that actually wins trades. The scam pools land at the bottom, because a pool claiming $1.9 trillion can't fill $1,000.
The ratio moves. Within three hours the same pool's TVL read $106.68M, $105.90M and $105.72M, and the ratio went from 0.944% to 0.946%. That's why every number here carries the block it was read at.
The denominator can also come from the chain instead of an indexer. We published the analyst as a Bazantic Recipe, which chains it with a tool that reads the pool's token balances on chain. On USDC/WETH 0.3% that found $32.36M actually held against $32.73M claimed: close, as it should be for a healthy pool.
History still matters
The quote says what the pool can do now. The subgraph says what it has done, and some risks only show up over time. The analyst checks seven signals.
| Signal | What it asks | Source | Structural |
|---|---|---|---|
| Inventory balance | Is the pool two-sided, or a pile of one token? | subgraph | yes |
| Executable depth | Does a real-size trade execute, and at what cost? | quoter | yes |
| Depth vs TVL | How much of the TVL can a trade reach? | both | yes |
| Trading continuity | Does it trade steadily, or in bursts and silence? | subgraph | yes |
| Slippage curve | Does the cost grow smoothly, or fall off a cliff? | quoter | no |
| Fee return | What are LPs actually earning, per year? | subgraph | no |
| LP concentration | How many positions are open? One is someone's inventory. | subgraph | no |
The structural signals decide whether the pool is a market at all, so any one of them failing means AVOID, whatever the rest say. A big TVL doesn't buy that back, because it comes from the same reserves that failed the test. TRUMP/WETH fails two on its history alone: it holds 1.5 billion TRUMP against 0.00063 WETH, and it traded in 3 hours out of 24.
The other three can't sink a pool on their own. One failure among them, or two warnings anywhere, make the verdict CAUTION. Otherwise it's ACCEPTABLE. USDC/WETH, with its one depth warning, came out ACCEPTABLE.
An answer that says what it doesn't know
The buyer is an agent. It can't ask a follow-up question, so everything it would want to ask has to be in the answer. Each verdict comes with a confidence score and a list of caveats, and the confidence drops for stated reasons:
- A signal couldn't be measured. Each unknown costs confidence. If two structural signals are unknown, there is no verdict at all: the rating is
INSUFFICIENT_DATA, so a missing measurement never passes for a measured concern. - No live quote. A large cut, because nothing was checked against the pool as it is now.
- Short history. Fewer hours of data than the analyst wants.
- A stale index. A subgraph can fall behind the chain. That never fails a pool, because "the data is old" is a different problem from "the pool is bad". It lowers confidence and the summary says so: "Where the live quote and the history disagree, believe the quote."
- Circular prices. The ladder's dollar sizes come from the subgraph's price for the token, which for a thin pool was derived from that same pool. The token amounts are exact; the dollar labels are only as good as that price.
The USDC/WETH verdict was ACCEPTABLE at 75% confidence. Our subgraph was 13.1 days behind at the time, and the ladder was priced with the subgraph's own price. Both are in the caveats.
The same logic shapes the two tiers Turnstile sells. Standard ($0.07) answers from the subgraph alone. Without a quote, executable depth and depth-vs-TVL are both unknown, and both are structural, so this tier can reject a pool on its history but can never approve one. That's the point: screen cheaply, and only pay for a live quote on pools history hasn't ruled out. Premium ($0.35) adds the live ladder and the full evidence behind the verdict, about 9KB of JSON. Part 8 covers how a hash of that evidence goes on chain.
Limitations
- Prices still come from the indexer. The ratio catches a fake TVL by its missing depth, but every dollar figure is still the subgraph's price. For thin pools that price can be circular.
- One pool at a time. QuoterV2 quotes one pool, which is the question an LP asks. A trader routing across many pools gets a better price than this ladder shows.
- Five rungs are coarse. Usable depth is the largest rung within 1%, so the real figure for USDC/WETH lies somewhere between $1M and $10M.
- A snapshot. Depth changes with every swap and every LP who moves a range. The verdict is true at its block.
More from this series: x402 on Hedera, gasless nanopayments on Arc, ERC-8004 discovery with Substreams, Privy spending mandates, World ID as abuse control, Chainlink CRE Confidential Workflows.
Sources
- Turnstile repository: the analyst in
seller/analyst/, with the scorer inscoring.tsand the dated verification notes behind every figure here. - Uniswap docs: Concentrated liquidity: range-bound liquidity that stops earning fees out of range.
- Uniswap v3-periphery IQuoterV2.sol:
quoteExactInputSingle, which returns the amount out and the initialized ticks crossed. - The Graph docs: Subgraphs: what a subgraph is.
- Messari schema-dex-amm-extended.graphql: the standard DEX schema our subgraph implements.
- Bazantic docs: Recipes and the published Recipe: the analyst chained with an on-chain balance read.
That was the last part of the series. Start again from part 1, x402 on Hedera: what a paid HTTP request is made of, or read the Turnstile project page for the whole build.


