1inch Aqua solvency
Aqua lets one wallet quote the same liquidity over and over, so the depth you see isn't always depth you can trade. This adds up how much is actually there, one position at a time.
Coverage by chain
| Chain | Coverage | Quoted | Backed | Phantom | Positions |
|---|---|---|---|---|---|
| Ethereum | 6.3% | $25.3M | $1.6M | $23.9M | 1,485 |
| Base | 51.7% | $88K | $45K | $71K | 134 |
Base's makers keep their wallets a lot healthier than Ethereum's, which is exactly why one global number would be misleading. You have to look chain by chain. (We also cross-checked Base's count against a keyless Blockscout sweep and it lined up.)
How coverage is computed
phantom = max(0, committed − backed)
Aqua keeps a maker's tokens in their own wallet instead of a shared pool. Neat idea, but it means one balance can prop up a bunch of positions at once, so a position can advertise far more than the maker could ever pay out. And once a position ships you can't edit it, so a broken one just keeps quoting.
To be clear, this isn't a bug in Aqua (it's been through eight audits). Most of these positions just hold zero of what they promised. Nobody had bothered to add the gap up, so we did.
Positions
worst coverage first| Maker | Token | Coverage | Quoted | Backed | Phantom | Binding |
|---|
Degenerate positions (these quote more than the token's entire supply, so we leave them out of the headline)
Guarded swap demo
Grab a real position, punch in a swap size, and watch the SwapVM run it step by step. If the maker can't actually cover it, the guard kills the trade before anything moves.SwapVM instruction trace
This pulls the maker's real backing straight off-chain with a public-node eth_call, and the yes/no comes from the exact logic in our deployed, fork-tested instruction (opcode 0x22). Nothing gets sent to the chain.
What we built
Four pieces. Here's what each one does, and which prize track it's aimed at.| Tool | What it is | Track | Evidence |
|---|---|---|---|
| Measure | The coverage engine. It pulls every position from The Graph, reads each maker's actual backing off-chain (min(balanceOf, allowance→Aqua)), prices it in USD with DefiLlama, and flags the junk. |
just the plumbing | 15 / 15 match on-chain rawBalances |
| Verify | The Honesty Probe, run on a mainnet fork. When the maker's good for it, the quote matches the fill down to the wei. When it isn't (it quoted 15,818 but only held about 11,298), the swap blows up at settlement. | 1inchBuild an Aqua App | 0 wei quote vs. executed reverts SafeTransferFromFailed |
| Fix | SolvencyGuard, our own SwapVM instruction (opcode 0x22). Without it, a position happily quotes 90,909 WETH on 5 WETH of backing. With it, that same quote reverts InsufficientCoverage up front. Makers who are actually funded never get touched. |
1inchBuild an Aqua App | reverts InsufficientCoverage 4 / 4 fork tests pass |
| Serve | One Substreams module and one Subgraph schema, reused across chains (Firehose-only ones included), plus an MCP server and SKILL so an agent can just ask about Aqua solvency in plain English over live Graph data. | The GraphComposable / StandardizedThe GraphAI Tooling | running subgraph + MCP |
Data flow
The Graph handles the listing. The backing is always read fresh off-chain.
Query it with the MCP
- "Total phantom depth on Ethereum right now?"aqua_coverage_summary(ethereum)
- "Which makers are most over-committed on Base?"aqua_most_overcommitted(base, limit)
- "Does maker 0x21cb… back what it quotes?"aqua_maker_coverage(ethereum, 0x21cb…)
It's packaged as a reusable SKILL called aqua-coverage. Point SUBGRAPH_URL at our subgraph and any agent can pick it up. To run it yourself: cd apps/mcp && npm i && node src/server.js.
Verify the claims
Don't take our word for any of it. Here's how to rerun the whole thing.# reproduce the Ethereum coverage scan + headline
# (keyless: Blockscout + public RPC + DefiLlama)
cd packages/coverage && npm install
node src/run.js --chain ethereum --deep
# reconstruct a real position's Order from on-chain bytes
cd spikes/order && npx tsx recover-order.mjs
# on-chain coverage cross-check on a mainnet fork
cd contracts && forge test -vv