|=[ HOW CONFIDENTIAL IS ZAMA'S CONFIDENTIAL VAULT? :: METHODOLOGY ]=

METHODOLOGY.

How every number in How confidential is Zama's Confidential cUSDC Morpho Vault? was produced: the dataset, the boundary analysis, and the yield maths.

DATA · 19.06.2026 → 19.08.2026 · ETHEREUM MAINNET

THE DATASET

Every action in the Zama x Morpho system emits a public event. I re-indexed all of them from the contracts, covering 19.06.2026 to 19.08.2026 (blocks ~25.35M–25.79M, data fetched 19.08.2026):

  • 657 Joined events from the deposit batcher, from 379 unique addresses, across batches 2–193
  • 597 Claimed events by 377 unique addresses; 2 depositors never claimed
  • 26 Quit (cancelled deposit) events
  • 58 batch settlements: BatchFinalized matched 1:1 to the 58 public USDC aggregate deposits into the vault
  • 729 steakcUSDC share Transfer events: mints are batch deposits, burns are public redemptions
  • 2,739 USDC transfers into the cUSDC wrapper since deployment (the wrap boundary) and 1,409 out (the exit boundary)
  • Pre-deposit state for every depositor: ETH balance, USDC balance, and nonce at the block before their first join (1,137 archive calls)

The contracts, all with verified source on Etherscan:

  • Vault: 0xbEEF00A5…F542B — Steakhouse Confidential Prime USDC, a Morpho Vault V2
  • Deposit batcher: 0x324ea89f…f40cc — Zama's DepositVaultBatcherConfidential
  • cUSDC wrapper: 0xe978f221…72b2 — the ERC-7984 confidential token
  • Share wrapper: 0x66bf74e9…c458 — Zama's ConfidentialWrapperV3, behind an ERC1967 proxy
  • Morpho adapter: 0x17BC9Aa1…8718, routing vault funds into Morpho Blue

The hypothesis: the public record alone is enough to reconstruct nearly every depositor's amount, timing, funding, and yield, without touching the encryption.

THE ANALYSIS

01 The wrap boundary.

Every USDC transfer into the cUSDC wrapper is a plain, public ERC-20 event. Intersecting the 379 depositor addresses with wrapper inflows shows 372 of them (98.1%) wrapped their own USDC from the same address they joined with: $81,768,356 traced at the wrap. The remaining seven received cUSDC from somewhere else and leave no amount trace at this step. For the one-wrap, one-join case the inference is exact: the wrapped amount is the deposit.

02 Batch composition.

61 distinct batches were joined; 58 finalized with public USDC aggregates totaling $76.0M. Batch sizes: mean 10.8 joiners, median 8, max 68. BatchIds 4–19 never had joiners, batch 193 was pending at the snapshot, and batches 2 and 3 were solo joins by Zama's own deployer before the BatchFinalized event existed. Exactly one usable singleton remains: batch 185, one joiner, exactly $49,990, where the public aggregate is their deposit.

03 The exit boundary.

Share burns against the vault identify direct redeemers: 100 addresses burned 34,402,099 shares for ~$34.9M paid in the clear. The confidential exit path ends publicly too: 81 depositors unwrapped $4,365,445 of cUSDC back to plain USDC. For users who wrapped and unwrapped, realized yield is arithmetic, not estimation: unwrap minus wrap. The worked example in the essay held ~19 days and gained $3,782.05 on $1M, verified transaction by transaction.

04 Funding-source tracing.

15 depositors were selected and their funding walked back: first ETH funder, top USDC senders, checked against publicly labeled exchange hot wallets. At least seven trace directly to Binance hot wallets, three received USDC from the null address (direct Circle mints), and two share a gas funder and a USDC intermediary, a near-certain common operator. For the seven depositors with no wrap trace, cUSDC's public ConfidentialTransfer(from, to, handle) events still expose the graph: six of the seven were funded by other depositors, the seventh by a wallet outside the depositor set. Only the handles are encrypted; the shape of the flow is not.

05 Timing.

For each of the 372 self-wrappers, the gap between their wrap and their first join: median 96 seconds, 247 (66%) within five minutes. Join-to-finalize runs on a strict ~24 hour cadence (median 82,122 seconds, about 22.8 hours) after the launch batch. To measure what patience buys, I counted how many wraps an observer must consider as the gap widens: a one hour gap hides you among a median of 9 wraps, 24 hours among 180, a week among 970. Filtering to wraps within ±10% of your size cuts the 24-hour crowd to a median of 6 (excluding self-matches), about one in ten wraps has no amount twin after a week, and roughly one in five wraps are globally unique.

THE MATHS

The vault's share price is public and accrues smoothly, from 1 at launch to 1.015567 at my snapshot. With a public entry date (the join) and a public size (the wrap), each depositor's position reconstructs as:

  • shares ≈ wrapped amount ÷ share price at first join
  • redemptions valued at the burn-date share price
  • unwraps valued at face
  • remainder marked at the snapshot share price of 1.015567

Summing estimated yield across the 371 estimable depositors gives the essay's $684,354. For fully-exited users the realized yield is exact (out − in); everything else is an estimate bounded by the wrap. A handful of users who received cUSDC from third parties are excluded as unestimable.

The same ledger reconciles the whole vault: estimated positions sum to $42.47M against an actual TVL of $41.57M, a 2.1% gap explained by yield accrual and cUSDC sitting idle.