Iris

Case report10 wallets on the board

Base vault drain: 1,783 wstETH, gas from Tornado Cash, 1,000 wstETH in Base's wi

By the Iris teamUpdated October 7, 2026

Base vault drain: 1,783 wstETH, gas from Tornado Cash, 1,000 wstETH in Base's withdrawal window

Chain: Base (funding on Ethereum). Date: October 4, 2026. Type: an exploit (access control: an unclaimed vault's whitelist). Board: board_base.json.

What happened

An unclaimed vault on Base, 0xcdfe91301356da873562ef513828a60dba1f569d, held Aave aBaswstETH. It is governed by an anonymous seven-signer Safe. Public reports (CryptoTimes, Crypto Briefing, Bitcoin.com, Oct 4 to 5) say the Safe whitelisted a new borrower shortly before the drain. About $31.7M stayed in the vault under the same multisig.

On-chain:

  • 08:56 to 09:15 UTC. The attacker 0x0b5126e1bc27c0de77e02e97945760a674edb034 called the vault directly (function 0xcb984317, 8 calls). The vault paid it 1,783.067 aBaswstETH: a test of 1, then 100, 500, 500, 500, 182 and 0.067. The calls start with 0x6001ea94… and continue with 0x2c69397f….

  • 09:23 UTC. It redeemed the 1,783.067 aBaswstETH for wstETH on Aave V3 (0x557bfd0e…).

The trail

  1. Gas from Tornado Cash. On Oct 4 at 06:43:59 UTC, 0x707877ce44282896e417ebbdc5e7d4620a3366ef, a 3-day-old wallet, withdrew a 0.1 ETH note from Tornado Cash and got 0.0979 ETH after the relayer fee (0x0b522445…).

  2. Into the Base bridge 3 minutes later. 0x7078 sent 0.05 ETH into the Base bridge at 06:46:47 UTC (0x6eecb695…). It reached the attacker on Base at 06:49:43 UTC (0x29aba031…). The deposit's calldata names 0x7078 as the sender. That was 2 hours before the drain.

  3. The drain: 1,783.067 aBaswstETH from the vault, redeemed for wstETH (above).

  4. To a second wallet. The attacker sent 1 wstETH as a test at 09:24 UTC (0xe824b27c…), then 1,782.067 wstETH at 10:47 UTC (0x20fb64ee…), to 0xc73448432a05deea5ea18a07d3b5d9ccf6297f8d. It also sent 0.03 ETH for gas (0x311b36b6…).

  5. 1,000 wstETH withdrawn toward Ethereum.

  • At 12:10:59 UTC, 0xc734 burned 1,000 wstETH through Lido's wstETH bridge on Base (0xac9d11cd…), to the same address on Ethereum (0x7b856099…, sent through Superbridge).

  • The withdrawal (hash 0xf0f9b4a1…371d) was proven on Ethereum on Oct 4 at 13:44:11 UTC (0xc53a6c1e…).

  • It has not been finalized: no finalization event on Base's OptimismPortal as of Oct 7. Base's 7-day window means it can't be finalized before about Oct 11, 13:44 UTC.

  1. Poisoners swarm the attacker. Look-alikes of 0xc734…7f8d sent fake 0 wstETH transfers from the attacker's address within minutes:

  • 0xc7343adb…7f8d (0xc106b21c…)

  • 0xc734821f…7f8d

  • 0xc7349436…7f8d

  • 0xc73a068a…7f8d

Where the money is now

  • 782.067 wstETH is still at 0xc73448432a05deea5ea18a07d3b5d9ccf6297f8d on Base (balanceOf on Oct 7; Iris's Follow the funds: "782.07 wstETH still sitting here since 2026-10-04").

  • 1,000 wstETH is in Base's withdrawal window to the same address on Ethereum. Earliest finalization is about Oct 11, 13:44 UTC. There is still time to warn Lido, Base and the exchanges.

  • The attacker's wallet holds 0.02 ETH and no wstETH.

What Iris shows that a block explorer doesn't

  • The funder is a mixer user. Iris flags 0x7078 "Uses a privacy pool: 1 withdrawal from Tornado Cash", and labels the Base bridge as its only other counterparty. That walks the attacker's gas back to Tornado Cash in two clicks, across two chains.

  • "At rest", with the amount. Follow the funds stops at the second wallet and says how much wstETH is still there. That's the number a freeze or a warning needs.

  • The swap, labeled in Iris's connections: aBaswstETH to wstETH, 1,783 for 1,783.

Caveats and Iris gaps

  • The Tornado withdrawal can't be tied to a depositor. Iris's backward trace read 1,779 deposits and found an anonymity set of 880, with no usable lead (1% confidence).

  • Bug: that trace listed deposits made *after* the withdrawal (for example 06:45 and 07:01 UTC) as "2 min before" and "18 min before".

  • Some links were read from the chain, not from Iris. Iris's bridge lookup returned nothing for the Base deposit (0x29aba031…) or the Lido withdrawal (0x7b856099…). The L1 sender, the proof and the "not finalized" status come from the chain (Base's L2 deposit calldata and OptimismPortal logs). Iris doesn't yet resolve OP Stack withdrawals or track their status, and that's the most actionable fact in this case.

  • The vault and whitelist details are from press reports. The vault's owner is unknown. On-chain, the attacker's own wallet called the vault, so it may itself be the whitelisted borrower; this wasn't decoded.

  • No dollar value on the board for wstETH. Iris doesn't price it, so token arrows carry the amount only. Reports put the loss at about $6M.