Vanish drained: 3,014 SOL, three bridge hops, and a Bybit withdrawal nine days earlier
· 4 min read
On September 20, an attacker borrowed from Vanish's trading pools 77 times and never paid back. We followed the 3,014 SOL from Solana to Ethereum and back twice, to Tornado Cash and FixedFloat, and to a wallet funded from Bybit before the attack.
On September 20, 2026, an attacker emptied the trading pools of Vanish, the private trading layer that runs private trades on Axiom, in a little over five hours. They walked away with 3,014.07 SOL (about $360,000 at today's price), then bridged it from Solana to Ethereum, back to Solana, and back to Ethereum again, to shake off anyone following.
We followed it all the way in Iris. The trail ends in Tornado Cash, FixedFloat, SideShift and NEAR Intents, with about 16 ETH still sitting in two wallets. On the way, it runs into a wallet that was funded from Bybit, nine days before the attack.
Everything below links back to its transactions: see the Explorer board and the case report.
How Vanish trades
To keep a trade private, Vanish runs it from a brand-new wallet that exists for a single transaction. Inside that transaction, its program (vanshF62…mhey) does three things:
- Loan. It lends the trade amount from one of Vanish's trading accounts to the fresh wallet (
VanishLoanSolorVanishLoanToken). - Trade. The fresh wallet makes the swap.
- Repay. It sweeps the fresh wallet's token account back into the pool and closes it (
VanishRepayToken).
Vanish's relayer (BxEp…eJDD) pays the fee and co-signs every one of these transactions.
The bug
The attacker kept the loan and the repay, and swapped the trade in the middle for a plain transfer to their own wallet, 66Td…Ujkx.
The repay step sends back whatever is in the token account, and never compares it with what was lent. The attacker's token account had been opened a moment earlier and held nothing. So the program "repaid" 0, closed it, and the transaction succeeded.
Here is one of them, read straight from the chain: 5xVyUv8F…878B3, at 19:08:24 UTC. It is signed by Vanish's relayer and a throwaway wallet. VanishLoanSol takes 160 SOL out of Trading Account 1 (7ozo…xKeG), a transfer sends it to 66Td…Ujkx, and VanishRepayToken puts nothing back.
No keys were stolen. The whole drain went through Vanish's normal trading flow, 77 times, each from a new throwaway signer: 23 of them are on the board as one group.
Timeline (September 20, UTC)
- 18:27 and 18:57. Two test drains: 0.008 SOL, then 0.005 SOL.
- 18:58 to 19:10. 50 SOL, 110 SOL, then ten drains of about 160 SOL each.
- 19:30 to 19:42. Two 5 USDC tests, then five drains of about 14,100 USDC each: 70,573 USDC in all.
- 19:15 to 23:49. Dozens of smaller drains, emptying what was left in Trading Accounts 1, 3, 4, 7, 8 and 10.
- 23:49. The last drain, in the same minute Vanish's relayer stopped signing.
Cashing out on Solana
Everything landed in 66Td…Ujkx: 3,015.6 SOL in all. That is SOL taken directly, plus 663.6 SOL from selling the 70,573 USDC on Raydium, and 384.4 SOL from selling 709 USDT and a basket of memecoins.
66Td…Ujkx then sent 3,014.07 SOL to 9WY4…yQjU in 12 transfers.
Hop 1: Solana to Ethereum
From 9WY4…yQjU:
- 2,914.58 SOL through Mayan, in three transfers, arriving as 121.85 ETH at
0x8fe3…3150on Ethereum. - 98.48 SOL through the Chainpool bridge.
The new Ethereum wallet needed gas first. It got it from Tornado Cash: a 0.098 ETH withdrawal.
0x8fe3…3150 then moved 126.06 ETH through 0x9065…50f0 into 0x850f…9604, the attacker's main Ethereum wallet.
A lead: a wallet funded from Bybit
0x850f…9604 is not a fresh wallet. On September 11, nine days before the drain, it received 1.5092 ETH from 0x6242…dc9f (tx). That address is on Bybit's own proof-of-reserves list, so the ETH left from Bybit.
That doesn't make it the attacker's own Bybit account: it could also be a swap service or another platform paying out through its account at Bybit. Either way, Bybit's records show who requested that withdrawal, and the trail goes on from there.
Hops 2 and 3: back to Solana, back to Ethereum
From 0x850f…9604, 60 ETH went through Relay back to Solana, in 28 transfers between 05:57 and 06:57 UTC on September 21. Relay's own records show the destination: 2hCH…SUYp, which received 1,303.19 SOL.
Minutes later, 2hCH…SUYp sent 1,232.19 SOL into Relay again, back to Ethereum:
- 1,184.8 SOL became 49.49 ETH at
0x333d…1F62, in 22 transfers; - 47.37 SOL became 1.98 ETH at
0xDe84…569D.
Three bridge crossings in under 24 hours, with the same money coming back to the same chain under new addresses.
Where it ended up
- FixedFloat: 41.29 ETH, deposited through four one-time wallets (17.2, 10, 7.7 and 6.385 ETH). FixedFloat then paid at least 24.47 ETH back out to
0x333d…1F62, the attacker's wallet from hop 3. Those orders tie both ends together on FixedFloat's side. - Tornado Cash: 10 ETH, through
0x6f4c…b7e3and0x2e95…ff6c. - NEAR Intents: 2.5 ETH, and SideShift: 2.5 ETH, split across small one-time wallets from
0xabab…6e80. SideShift also paid 0.1 ETH back into0x850f…9604on October 2 (tx). 0x333d…1F62spread the rest of its ETH over a handful of new wallets, which we are still following.
Still sitting there
0x850f…9604: 8.00 ETH.0x0b2f…34d9: 7.97 ETH, received in one transfer and never moved.
About 16 ETH ($43,000) that can still be frozen if it touches an exchange.
What would have stopped it
- Check the repay amount. The repay should fail unless the pool gets back at least what it lent.
- Check what runs between loan and repay. The program can read the transaction's other instructions and only allow the swap programs it expects.
- Simulate before co-signing. A relayer that simulates each transaction and refuses any in which the pool loses money would have caught the first test, at 18:27.
For exchanges and services
- Bybit: who requested the withdrawal of 1.5092 ETH to
0x850f5d13341b8d71f1a0efacd25f2579239b9604on September 11, 15:43 UTC. - FixedFloat, SideShift, NEAR Intents: the deposits from the wallets on the board, and the payouts to
0x333dFDf69294eaeDEa1BA59F0f4882b717701F62and0x850f5d13341b8d71f1a0efacd25f2579239b9604. - Everyone: watch
0x850f5d13341b8d71f1a0efacd25f2579239b9604and0x0b2f0c0ca12f7343c4c7e0e3cba7bdf6e1e634d9.
Thanks to @endbosss for flagging the drain.
Iris traces stolen funds across Solana, Ethereum and Bitcoin, through bridges, mixers and instant swap services. Paste any wallet at iriscan.app to start.