Sandwich attacks on Elysium

Elysium opened as a private mainnet with early-access trading and went public on Nov 9 at 13:00. Since the private launch, bots have sandwiched more than 13,000 trades. 99% of them came before the public launch; since then, sandwiching has almost stopped.

Data
Every Elysium mainnet block up to block 4,076,763 (Nov 10 at 14:40)
Times
UTC
Dollars
HYPE converted at each day's median price in Elysium's HYPE/USDC pools. K is thousand, M is million
Sandwich
A bot buys just before a victim's buy and sells right after it, so the victim pays a higher price
Operator
One attacker: the wallets that send its transactions and the bot contracts they call. The five that caused the most loss are labeled Operator A to E
Victims lost
What the victim's trade would have returned without the bot's buy, minus what it returned. For 2.4% of sandwiches it can't be measured, and they count as zero (why)
Bots kept
The operator's net gain in HYPE, WHYPE and USDC over its two transactions, after gas
Same block
The bot's buy, the victim's trade and the bot's sell are in one block. Otherwise the bot sold 1⁠–⁠2 blocks later
Victims lost$153K2,101 HYPE
median 3.3% of a trade
Bots kept, after gas$86K1,178 HYPE
56% of the loss
Trades sandwiched$4.0M13,061 trades
by 4,315 wallets
After public launch$1.2Klost in 160 sandwiches
since Nov 9 at 13:00

Three operators caused 86% of the losses. Users of one trading-bot router, 0x9b60…3333, took 65%. The timeline follows Operator A: it alone caused 51% of the losses, more than the next three operators together.

  1. Nov 421:43First sandwich. Until Nov 8, bots mostly sell 1⁠–⁠2 blocks after the victim.
  2. Nov 705:53Operator A starts and soon becomes the largest attacker.
  3. Nov 820:00Losses peak: $8.5K in one hour.
  4. Nov 823:04Operator A starts putting its buy, the victim and its sell in one block.
  5. Nov 903:00Losses fall under $900 an hour and stay there.
  6. Nov 913:00Public launch. Operator A stops at 15:09.

What does a sandwich look like?

In both, the bot saw the victim's buy before it reached a block.

Private mainnet, Nov 8: the victim lost 9.1% of the trade

Block 2,784,446 on Nov 8 at 23:29, ISLAND / HYPE on Uniswap V4, run by Operator A.

  1. 1. Bot buys with 9.3 HYPE. Its tip is 1 wei above the victim's, so it goes first.

    0xd193…6292
  2. 2. Victim buys with 2.9 HYPE at the raised price and gets 9.1% fewer tokens, a loss of 0.268 HYPE.

    0x0853…7edc
  3. 3. Bot sells everything with a zero tip, so it goes right after the victim. It keeps 0.083 HYPE; pool and launchpad fees take the rest of the victim's loss.

    0xbaaa…84af

Public mainnet, Nov 10: the victim lost 3.9% of the trade

Block 3,931,121 on Nov 10 at 10:11, BUTTERFLY / HYPE on Uniswap V4, run by 0x2593…2b5a.

  1. 1. Bot buys with 3.5 HYPE. Its tip is 1 wei above the victim's, so it goes first.

    0x5c0a…1948
  2. 2. Victim buys with 18.8 HYPE at the raised price and gets 3.9% fewer tokens, a loss of 0.735 HYPE.

    0x9d98…966f
  3. 3. Bot sells everything 2 blocks later. It keeps 0.739 HYPE.

    0xc6dc…5e2c

When did it happen?

Operators took turns, then Operator A caused most losses from Nov 8

Victims' losses per day, by operator. On the worst day, Nov 8, sandwiched trades were 8.4% of all HYPE traded on Elysium.

Operator AOperator BOperator COperator DOperator EOthers
Private mainnetPublic mainnetNov 4, Operator E: $868$868Nov 4Nov 5, Others: $174Nov 5, Operator E: $4.3K$4.5KNov 5Nov 6, Others: $446Nov 6, Operator E: $1.0KNov 6, Operator C: $21K$23KNov 6Nov 7, Others: $550Nov 7, Operator D: $11KNov 7, Operator C: $3.9KNov 7, Operator B: $19KNov 7, Operator A: $12K$46KNov 7Nov 8, Others: $495Nov 8, Operator D: $1.0KNov 8, Operator B: $9.9KNov 8, Operator A: $56K$67KNov 8Nov 9, Others: $777Nov 9, Operator D: $231Nov 9, Operator B: $65Nov 9, Operator A: $11K$12KNov 9Nov 10, Others: $166$166Nov 10

Losses peaked on Nov 8 and fell 10 hours before the public launch

Victims' losses per hour. At the peak, $8.5K at 20:00, Operator A was still selling 1⁠–⁠2 blocks after the victim.

Same blockBot sold 1⁠–⁠2 blocks later
$0$2.5K$5K$7.5K$10KNov 4Nov 4, 21:00, 1⁠–⁠2 blocks later: $42Nov 4, 22:00, 1⁠–⁠2 blocks later: $479Nov 4, 23:00, 1⁠–⁠2 blocks later: $348Nov 5, 00:00, 1⁠–⁠2 blocks later: $334Nov 5Nov 5, 01:00, 1⁠–⁠2 blocks later: $214Nov 5, 02:00, 1⁠–⁠2 blocks later: $74Nov 5, 03:00, 1⁠–⁠2 blocks later: $62Nov 5, 04:00, 1⁠–⁠2 blocks later: $284Nov 5, 05:00, 1⁠–⁠2 blocks later: $398Nov 5, 06:00, 1⁠–⁠2 blocks later: $223Nov 5, 07:00, 1⁠–⁠2 blocks later: $91Nov 5, 08:00, 1⁠–⁠2 blocks later: $186Nov 5, 09:00, 1⁠–⁠2 blocks later: $159Nov 5, 10:00, 1⁠–⁠2 blocks later: $54Nov 5, 11:00, 1⁠–⁠2 blocks later: $166Nov 5, 12:00, 1⁠–⁠2 blocks later: $65Nov 5, 13:00, 1⁠–⁠2 blocks later: $245Nov 5, 14:00, 1⁠–⁠2 blocks later: $16Nov 5, 15:00, 1⁠–⁠2 blocks later: $17Nov 5, 17:00, 1⁠–⁠2 blocks later: $287Nov 5, 19:00, 1⁠–⁠2 blocks later: $343Nov 5, 20:00, 1⁠–⁠2 blocks later: $379Nov 5, 21:00, 1⁠–⁠2 blocks later: $406Nov 5, 22:00, 1⁠–⁠2 blocks later: $357Nov 5, 23:00, 1⁠–⁠2 blocks later: $93Nov 6, 00:00, 1⁠–⁠2 blocks later: $202Nov 6Nov 6, 02:00, 1⁠–⁠2 blocks later: $14Nov 6, 03:00, 1⁠–⁠2 blocks later: $79Nov 6, 04:00, 1⁠–⁠2 blocks later: $72Nov 6, 05:00, 1⁠–⁠2 blocks later: $133Nov 6, 06:00, 1⁠–⁠2 blocks later: $181Nov 6, 07:00, 1⁠–⁠2 blocks later: $832Nov 6, 08:00, 1⁠–⁠2 blocks later: $2.3KNov 6, 09:00, 1⁠–⁠2 blocks later: $1.7KNov 6, 10:00, 1⁠–⁠2 blocks later: $1.6KNov 6, 11:00, 1⁠–⁠2 blocks later: $2.1KNov 6, 12:00, 1⁠–⁠2 blocks later: $1.7KNov 6, 13:00, 1⁠–⁠2 blocks later: $407Nov 6, 14:00, 1⁠–⁠2 blocks later: $984Nov 6, 15:00, 1⁠–⁠2 blocks later: $1.2KNov 6, 16:00, 1⁠–⁠2 blocks later: $578Nov 6, 17:00, 1⁠–⁠2 blocks later: $1.6KNov 6, 18:00, 1⁠–⁠2 blocks later: $1.8KNov 6, 19:00, 1⁠–⁠2 blocks later: $1.7KNov 6, 20:00, 1⁠–⁠2 blocks later: $982Nov 6, 21:00, 1⁠–⁠2 blocks later: $826Nov 6, 22:00, 1⁠–⁠2 blocks later: $1.4KNov 6, 23:00, 1⁠–⁠2 blocks later: $529Nov 7, 00:00, 1⁠–⁠2 blocks later: $539Nov 7Nov 7, 01:00, 1⁠–⁠2 blocks later: $514Nov 7, 01:00, Same block: $11Nov 7, 02:00, 1⁠–⁠2 blocks later: $341Nov 7, 02:00, Same block: $4Nov 7, 03:00, 1⁠–⁠2 blocks later: $492Nov 7, 04:00, 1⁠–⁠2 blocks later: $1.4KNov 7, 05:00, 1⁠–⁠2 blocks later: $784Nov 7, 05:00, Same block: $50Nov 7, 06:00, 1⁠–⁠2 blocks later: $875Nov 7, 07:00, 1⁠–⁠2 blocks later: $875Nov 7, 08:00, 1⁠–⁠2 blocks later: $1.1KNov 7, 09:00, 1⁠–⁠2 blocks later: $955Nov 7, 09:00, Same block: $8Nov 7, 10:00, 1⁠–⁠2 blocks later: $1.1KNov 7, 11:00, 1⁠–⁠2 blocks later: $1.6KNov 7, 11:00, Same block: $7Nov 7, 12:00, 1⁠–⁠2 blocks later: $2.0KNov 7, 13:00, 1⁠–⁠2 blocks later: $2.1KNov 7, 13:00, Same block: $6Nov 7, 14:00, 1⁠–⁠2 blocks later: $2.0KNov 7, 14:00, Same block: $6Nov 7, 15:00, 1⁠–⁠2 blocks later: $3.2KNov 7, 15:00, Same block: $4Nov 7, 16:00, 1⁠–⁠2 blocks later: $4.5KNov 7, 17:00, 1⁠–⁠2 blocks later: $3.6KNov 7, 18:00, 1⁠–⁠2 blocks later: $2.5KNov 7, 18:00, Same block: $309Nov 7, 19:00, 1⁠–⁠2 blocks later: $2.4KNov 7, 20:00, 1⁠–⁠2 blocks later: $4.0KNov 7, 21:00, 1⁠–⁠2 blocks later: $2.1KNov 7, 22:00, 1⁠–⁠2 blocks later: $2.1KNov 7, 23:00, 1⁠–⁠2 blocks later: $4.9KNov 8, 00:00, 1⁠–⁠2 blocks later: $2.3KNov 8Nov 8, 01:00, 1⁠–⁠2 blocks later: $1.8KNov 8, 02:00, 1⁠–⁠2 blocks later: $1.2KNov 8, 03:00, 1⁠–⁠2 blocks later: $2.0KNov 8, 04:00, 1⁠–⁠2 blocks later: $2.3KNov 8, 05:00, 1⁠–⁠2 blocks later: $1.9KNov 8, 06:00, 1⁠–⁠2 blocks later: $2.2KNov 8, 07:00, 1⁠–⁠2 blocks later: $1.6KNov 8, 08:00, 1⁠–⁠2 blocks later: $1.0KNov 8, 09:00, 1⁠–⁠2 blocks later: $622Nov 8, 10:00, 1⁠–⁠2 blocks later: $1.1KNov 8, 11:00, 1⁠–⁠2 blocks later: $1.3KNov 8, 12:00, 1⁠–⁠2 blocks later: $3.2KNov 8, 12:00, Same block: $7Nov 8, 13:00, 1⁠–⁠2 blocks later: $1.7KNov 8, 14:00, 1⁠–⁠2 blocks later: $2.2KNov 8, 14:00, Same block: $13Nov 8, 15:00, 1⁠–⁠2 blocks later: $3.0KNov 8, 15:00, Same block: $9Nov 8, 16:00, 1⁠–⁠2 blocks later: $3.5KNov 8, 16:00, Same block: $0Nov 8, 17:00, 1⁠–⁠2 blocks later: $3.3KNov 8, 17:00, Same block: $5Nov 8, 18:00, 1⁠–⁠2 blocks later: $5.4KNov 8, 18:00, Same block: $1Nov 8, 19:00, 1⁠–⁠2 blocks later: $5.4KNov 8, 20:00, 1⁠–⁠2 blocks later: $8.5KNov 8, 21:00, 1⁠–⁠2 blocks later: $4.5KNov 8, 22:00, 1⁠–⁠2 blocks later: $4.5KNov 8, 23:00, 1⁠–⁠2 blocks later: $481Nov 8, 23:00, Same block: $1.7KNov 9, 00:00, 1⁠–⁠2 blocks later: $143Nov 9, 00:00, Same block: $1.6KNov 9Nov 9, 01:00, 1⁠–⁠2 blocks later: $274Nov 9, 01:00, Same block: $2.3KNov 9, 02:00, 1⁠–⁠2 blocks later: $306Nov 9, 02:00, Same block: $2.1KNov 9, 03:00, 1⁠–⁠2 blocks later: $100Nov 9, 03:00, Same block: $233Nov 9, 04:00, 1⁠–⁠2 blocks later: $24Nov 9, 04:00, Same block: $178Nov 9, 05:00, 1⁠–⁠2 blocks later: $5Nov 9, 05:00, Same block: $820Nov 9, 06:00, 1⁠–⁠2 blocks later: $4Nov 9, 06:00, Same block: $844Nov 9, 07:00, 1⁠–⁠2 blocks later: $43Nov 9, 07:00, Same block: $597Nov 9, 08:00, 1⁠–⁠2 blocks later: $103Nov 9, 08:00, Same block: $329Nov 9, 09:00, 1⁠–⁠2 blocks later: $15Nov 9, 09:00, Same block: $191Nov 9, 10:00, 1⁠–⁠2 blocks later: $76Nov 9, 10:00, Same block: $101Nov 9, 11:00, 1⁠–⁠2 blocks later: $26Nov 9, 11:00, Same block: $67Nov 9, 12:00, 1⁠–⁠2 blocks later: $47Nov 9, 12:00, Same block: $67Nov 9, 13:00, 1⁠–⁠2 blocks later: $16Nov 9, 13:00, Same block: $69Nov 9, 14:00, 1⁠–⁠2 blocks later: $199Nov 9, 14:00, Same block: $102Nov 9, 15:00, 1⁠–⁠2 blocks later: $59Nov 9, 15:00, Same block: $11Nov 9, 16:00, 1⁠–⁠2 blocks later: $4Nov 9, 17:00, 1⁠–⁠2 blocks later: $7Nov 9, 17:00, Same block: $2Nov 9, 18:00, 1⁠–⁠2 blocks later: $1Nov 9, 19:00, 1⁠–⁠2 blocks later: $22Nov 9, 20:00, 1⁠–⁠2 blocks later: $488Nov 9, 23:00, 1⁠–⁠2 blocks later: $7Nov 10Nov 10, 01:00, 1⁠–⁠2 blocks later: $7Nov 10, 02:00, 1⁠–⁠2 blocks later: $4Nov 10, 03:00, 1⁠–⁠2 blocks later: $18Nov 10, 04:00, 1⁠–⁠2 blocks later: $4Nov 10, 06:00, 1⁠–⁠2 blocks later: $45Nov 10, 07:00, 1⁠–⁠2 blocks later: $1Nov 10, 08:00, 1⁠–⁠2 blocks later: $1Nov 10, 09:00, 1⁠–⁠2 blocks later: $5Nov 10, 10:00, 1⁠–⁠2 blocks later: $71Nov 10, 11:00, 1⁠–⁠2 blocks later: $6Nov 10, 12:00, 1⁠–⁠2 blocks later: $1Nov 10, 13:00, 1⁠–⁠2 blocks later: $1Nov 10, 14:00, 1⁠–⁠2 blocks later: $2First sandwichOperator A startsA goes same-blockPublic launchA stops
Day by day
DayHYPE price ($)SandwichesTraded ($)Victims lost ($)Bots kept ($)
Nov 477.552713,524868518
Nov 571.5713781,0714,4533,103
Nov 667.312,057488,81622,93412,621
Nov 774.064,3881,277,97846,45725,447
Nov 874.195,2241,843,80266,97337,475
Nov 974.971,128287,11111,5946,741
Nov 1074.2410016,927166135

Who did it?

Operator A caused 51% of all losses

All 12 operators, by victims' loss. Same block is the share of an operator's sandwiches with its buy, the victim's trade and its sell in one block; in the rest it sold 1⁠–⁠2 blocks later. Bots kept 56% of what victims lost, because each sandwich pays pool and launchpad fees on two trades.

OperatorSandwichesSame blockVictims lost ($)Kept ($)FirstLast
Operator A6,82215%77,67144,067Nov 705:53Nov 915:09
Operator B1,9972%29,33415,574Nov 713:17Nov 902:47
Operator C2,248<1%25,35513,706Nov 607:02Nov 706:27
Operator D1,4481%12,3177,067Nov 705:37Nov 906:29
Operator E1820%6,1604,167Nov 421:43Nov 623:15
0x5d82…c2a9770%699338Nov 714:21Nov 919:58
0xf31c…6074550%613298Nov 616:27Nov 709:20
0x0b8d…8471293%558363Nov 917:53Nov 1010:58
0x2593…2b5a940%546365Nov 605:26Nov 1014:13
0x800c…589e250%17490Nov 510:27Nov 514:55
0x3cca…5a3e820%186Nov 1002:06Nov 1014:30
0x32d1…0bfd2100%01Nov 913:29Nov 913:31
Total13,061153,44586,041

Addresses of the five largest operators

Wallets are the accounts that sign and send an operator's transactions; one operator can run several, for example to send many transactions at once. Bot contracts are the contracts those transactions call to trade. Operator B has none: its wallet trades through an app contract that also holds the funds. Largest sandwich links the bot's buy, the victim's trade and the bot's sell.

Who got hurt, and how badly?

The median victim lost 3.3% of the trade

Sandwiched trades, by the share of the trade's value the victim lost. 1,961 trades lost 10% or more.

0–1%2,5361–2%1,2432–3%2,1393–4%1,1704–5%1,8545–6%3376–7%3617–8%4448–9%2759–10%43010% or more1,961

Users of one trading-bot router took 65% of the losses

Victims' losses by the contract their transaction called. Users of Uniswap's router and other unrelated apps were hit too, so the leak was on a path these apps share, not inside one app.

ContractNameTradesWalletsLost ($)
0x9b60…3333Unnamed trading-bot router8,1052,004100,029
0xc6e9…a1572,1121,16312,105
0x1b34…3c1aUniswap Universal Router 2.2.08595579,299
0x751c…b43076304,630
0xaf8d…a2954891814,627
0xa13f…4b45Uniswap Universal Router 2.1.22521194,433
0xca11…ca11Multicall31681033,401
0x6506…acf9146622,959
99 other contracts97935511,962
Ten largest victims
WalletTradesTraded ($)Lost ($)
0x2435…cbab47114,4512,835
0x9356…92623363,6802,112
0xef5b…500a566,7751,500
0x1b78…685b7714,2691,388
0xdfc2…2ed63212,0081,274
0xe83b…a2a64013,5021,096
0x7b3d…8d611918,4111,061
0xf979…923d253,447953
0xfc3f…9637287,730890
0xc183…d8c3427,743847

Where did it happen?

Most targets were new tokens paired with HYPE on Uniswap V4

The ten pools with the largest losses. 1,610 pools were hit; these ten took 22% of all losses. Operator A was the main attacker in all ten.

PoolSandwichesTraded ($)Lost ($)Example
BLOB / HYPE135265,4947,562buy · victim · sell
e/acc / WHYPE133347,1094,547buy · victim · sell
EACCAT / HYPE123298,3494,298buy · victim · sell
CHAMELEON / HYPE150194,2932,905buy · victim · sell
AGORA / HYPE161158,7722,790buy · victim · sell
LIQUITTY / HYPE11434,4522,449buy · victim · sell
YIELDEX / HYPE12779,6182,439buy · victim · sell
AETHER / WHYPE3234,0962,368buy · victim · sell
VOID / HYPE9086,5802,142buy · victim · sell
NMEOWS / WHYPE11597,2171,974buy · victim · sell

How do we know?

Venues

All swap events of the common AMM formats, from block 1.

VenueSwap eventsSandwichesNote
Uniswap V4 pools, including launchpad hooks1,842,76312,827
Uniswap V2 and V3 pools and forks303,820234
Bin AMM pools (USDC/WHYPE, from Nov 9)95,6520swaps rebuilt from token transfers
Liquidity Book pools (USDC/WHYPE, from Nov 9)69,0820swaps rebuilt from token transfers
Aggregator Exchange events48,543trades land in the pools above
Bonding-curve Buy and Sell events121too few to matter
Algebra, PancakeSwap V3, Curve, Balancer0

Finding sandwiches

  1. In one pool: a buy, then other wallets buying in the same direction, then a sell by the first buyer of about what it bought (within 5%), all within 2 blocks.
  2. The buy and the sell come from the same wallet, each victim from a different one.
  3. Same block: 1,101 sandwiches, all counted. Sold 1⁠–⁠2 blocks later: 12,002 candidates; 11,960 counted, from operators that profit from this pattern overall.

Evidence that bots saw pending transactions

Elysium has no public mempool. Yet in 576 of 594 sandwiches with the three transactions next to each other, the bot's buy pays a higher tip than the victim and its sell no more than the victim; usually the buy pays the victim's tip plus 1 wei. In all 1,101 same-block sandwiches, the bot signed its sell together with its buy (consecutive nonces). Operator A's contract refuses to sell unless it gets back more than it paid, which only works if it knows a buy will land in between.

Losses and profits

  • Victims lost: the victim's transaction is re-run with eth_simulateV1 on the state just before the bot's buy and compared with what it really received.
  • Not measured: 309 sandwiches (2.4%). 270 are in pools of two tokens with neither HYPE nor USDC, so their loss has no price; for the other 39 the re-run failed or its result could not be valued. They count as zero, so the totals are a floor.
  • Bots kept: both bot transactions are traced with debug_traceTransaction, summing every HYPE, WHYPE and USDC movement in and out of the operator's addresses, minus gas. Swap events alone overstate it, because launchpad hooks take fees outside the event.

Grouping wallets into operators

A wallet joins the bot contract it calls for its trades. Bot contracts with the same code, once hard-coded addresses are blanked, are joined. An address that repeatedly receives most of an operator's sell proceeds joins as its profit address. A contract that 5 or more other wallets use for their own trades is a public app, not a bot.

Out of scope

  • Sandwiches with more than 2 blocks between the bot's buy and sell; launch sniping, arbitrage and back-running.
  • Profit moved to an address that the transactions don't link to the operator, or kept in tokens other than HYPE, WHYPE and USDC.