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.

of the quoted depth is actually backed

Loading…

Coverage by chain

ChainCoverageQuotedBackedPhantomPositions
Ethereum6.3%$25.3M$1.6M$23.9M1,485
Base51.7%$88K$45K$71K134

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

coverage = min(wallet, allowance→Aqua) / Σ virtual committed
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
Per-position coverage, worst first
Maker Token Coverage Quoted Backed Phantom Binding
Maker links open the block explorer. Coverage = backed ÷ committed.

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.

$
You receive (pay ÷ token price)
0token
SolvencyGuard: ON

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.
    ToolWhat it isTrackEvidence
    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

    Aqua registry16 chains Subgraph + Substreamsone schema Coverage engine+ live eth_call MCP + this dashboard

    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