Community Investigation

Across Protocol domain hijack: from aWETH to Bitcoin and Solana

Philippark
Philippark

November 12, 2026

Across Protocol domain hijack and fund tracing.

On November 10, 2026, an Ethereum wallet lost 148.599522645 aWETH across four transactions during the Across Protocol domain hijack. Roughly four fifths went to one wallet and one fifth went to a second, which Bitquery identified as the drainer fee wallet. The collector later funded a wallet that sent the funds out on three routes. A downstream Bitcoin payment records the exact hash of its Ethereum input, giving investigators a way to verify one of those routes. A day later, the same address bridged 40,659.841619 USDT from X Layer to Ethereum. The bridge records identify who initiated that transfer. Four earlier liquidity withdrawals and two later swaps explain how the wallet assembled the amount bridged. A link to an Across reimbursement remains unverified.

Verified route segments. Ethereum victim → collector and fee wallet in aWETH. Separately, the collector → splitting wallet in ETH → a THORChain-linked input → Bitcoin output. The splitter’s second verified cross-chain branch reached Solana via Chainflip. The third branch went through Arbitrum to two Hyperliquid accounts, where the USDC was used to buy XMR1.

Scope

Detail

Incident

10 November 2026 UTC

Evidence cutoff

12 November 2026, 00:06 UTC

Incident-wide estimate

Bitquery reported about $348,000 from nine wallets on Ethereum, Arbitrum, Base, BNB Chain and Optimism. Its observed outflows ran from 19:02 to 21:53 UTC. This report independently reconciles the Ethereum wallet below and checks selected downstream records.

Compensation

Across pledged reimbursement. Payment to a verified incident victim from an authenticated Across source remains unverified.

How the incident began

Across attributed the takeover of its official website address to social engineering at its domain registrar. Control of the address allowed a phishing page to appear where users expected the bridge interface. The project later reported that it had restored access and committed to compensating affected users. Bitquery's investigation describes a wallet drainer, software that uses permissions obtained from a victim to move assets. The records examined here show wallet transfers and their destinations. The registrar account compromise is described in the project's account of the incident. Across restoration update, Bitquery incident investigation.

What left the victim wallet

Aave issues aWETH to represent a WETH deposit. WETH is an Ethereum token representing ETH. Transferring the receipt token moves the claim on the deposited asset. Redeeming it or converting the proceeds later moves value already accounted for in the original loss.

Start at the top of Figure 1 and follow the two arrows to the addresses that received the aWETH. The wallet that submitted the first transaction is different from the victim address recorded in the token logs. The amounts below use the token logs to identify the source and recipients.

Four Ethereum transactions moved approximately 118.88 aWETH to the collector and 29.72 aWETH to the fee wallet.

Figure 1. Each solid arrow represents the aggregate of four verified transfers to one recipient. Amounts are rounded for the diagram. Arrow width and spacing are schematic. The table preserves the exact amounts.

10 Nov UTC

Collector aWETH

Fee wallet aWETH

Evidence

20:09:23

115.231418566299253672

28.807854641574813418

First transfer pair

20:12:11

3.442513123017073531

0.860628280754268382

Second pair

20:12:23

0.102843213357567411

0.025710803339391852

Third pair

20:12:23

0.102843213357567411

0.025710803339391852

Fourth pair

Total

118.879618116031462025

29.719904529007865504

148.599522645039327529 aWETH

Both 20:12:23 transactions succeeded and had distinct hashes. The calculation excludes Aave accounting mints, unrelated tokens in the same receipts and later conversions. The repeated split supports the collector and fee roles assigned by Bitquery. The logs identify the receiving addresses.

The two recipients converted and moved funds separately

After the first split, Ethereum execution traces record 28.823367170220056748 ETH and 0.912049936711908441 ETH entering the fee wallet from the WETH contract. These transfers are conversion evidence. Their amounts include activity at the wallet level, so they cannot be counted as additional victim losses. The fee wallet also had ETH receipts before the incident. An incident-wide loss total cannot be derived from its balance. First WETH-to-ETH trace, second trace, pre-incident receipt.

At 20:11:35 UTC, an execution trace records 115.185264363588230966 ETH entering the collector. At 20:17:59 UTC the collector sent 146.268685820 ETH to a splitting wallet. The collector had additional inflows, including a 20.733627715165981828 ETH trace at 20:06:47 UTC whose funding origin was not established. The downstream route therefore tracks value from the collector without assigning every unit to the Ethereum victim above. Collector conversion trace, splitter funding, unattributed ETH trace.

UTC

Ethereum transfer

Evidence

10 Nov, 20:36:59

Splitter → wallet later observed sending ETH to two Hyperliquid-linked addresses, 48.809535430 ETH

Transaction

10 Nov, 20:37:23

Splitter → wallet later observed sending 48.8 ETH to a reported Chainflip deposit, 48.809535430 ETH

Splitter transfer, 48.8 ETH send

10 Nov, 20:51:35

Splitter → THORChain-linked Ethereum input, 47.000201860 ETH

Transaction

10 Nov, 20:54:11

Collector → side wallet, 11.636137960 ETH

Transaction

11 Nov, 01:20:47

Collector → second side wallet, 3.425730160 ETH

Transaction

11 Nov, 18:43:11

Splitter → another Ethereum address, 1.436231320 ETH

Transaction

Start at either Ethereum input in Figure 2 and read down to the corresponding settlement. The Bitcoin payment and the Chainflip swap use different records to connect the two chains.

Two matched cross-chain settlements from Ethereum, one on Bitcoin and one on Solana.

Figure 2. Solid arrows show transaction-level matches. Each pair is a separate settlement. Blue marks the Ethereum input and the other colors distinguish the destination networks. The diagram omits intermediate protocol activity. The records below show how each match was made.

The Bitcoin output identifies the Ethereum transaction in its own data. The Solana payout is tied back through a separate Chainflip record.

The Bitcoin payment names its Ethereum input

A Bitcoin transaction can include a data-only output. Here that output contains the word OUT followed by the exact Ethereum transaction hash for the 47.000201860 ETH send. Bitquery attributes the swap to THORChain. Both Bitcoin sources show output 0 paid 1.30506375 BTC to the same address in block 975354 at 22:36:46 UTC on November 10. The output was unspent when queried. Ethereum input, Bitcoin transaction and data output, independent Bitcoin transaction view.

Solana records show both onward payments

Chainflip records a successful 48.8 ETH deposit and names the matching Solana payout signature in swap 2053940. The destination received 1,197.033564583 SOL after the broadcast fee. The two subsequent pairs of transfers are independently visible on Solana. Chainflip swap 2053940.

10 Nov UTC

Solana movement

Evidence

21:14:06

1,197.033564583 SOL → initial Solana recipient

Receipt

23:50:22 and 23:58:18

Initial recipient → intermediate wallet, 1,197.032754476 SOL across two transfers

First send, second send

23:50:44 and 23:58:38

Intermediate wallet → final observed address, 1,197.032734399 SOL across two transfers

First send, second send

Bitquery labels the final address as a Rainbet wallet. The transfer is verifiable on Solana. Account ownership, a customer credit and any further withdrawal would require additional records. Bitquery service attribution.

Hyperliquid records show USDC deposits and XMR1 trades

The Ethereum funding wallet sent 25 ETH to the first address and 23.8 ETH to the second. Both addresses then used the LI.FI router with Layerswap. LI.FI's completed-route records link the Ethereum sends to the Arbitrum receipts. Each Arbitrum address then sent its exact USDC receipt amount to Hyperliquid's deposit contract. Hyperliquid's account records identify the same deposit hashes and the spot trades that followed.

Ethereum input

Arbitrum USDC received

Hyperliquid deposit

25 ETH via LI.FI

51,378.430969 USDC

Same 51,378.430969 USDC

23.8 ETH via LI.FI

48,985.187209 USDC

Same 48,985.187209 USDC

The accounts bought 91.96 and 87.59 XMR1, respectively, before spot fees. XMR1 is a Hyperliquid token associated with Monero exposure. The verified route ends at the spot fills, with any redemption or withdrawal on Monero still unverified. Hyperliquid public API.

Three additional bridge settlements

All three transfers settled to the same collector address on their destination networks. The Ethereum and Arbitrum addresses have the same hexadecimal value. Each row links the transaction that started the transfer to the one that delivered the ETH.

Route and source transaction

ETH received and destination transaction

Recipient

deBridge · Ethereum → Arbitrum · Source

0.009992001600000002 ETH · 10 Nov, 19:06:00 UTC · Arbitrum payout

0x2846e69d3298e99eddf2fd8116e952844da11fde

deBridge · Arbitrum → Ethereum · Source

2.997600480000000002 ETH · 10 Nov, 19:07:59 UTC · Ethereum payout

0x2846e69d3298e99eddf2fd8116e952844da11fde

Relay · Arbitrum → Ethereum · Source

0.205660219009733071 ETH · 10 Nov, 19:52:35 UTC · Ethereum payout

0x2846e69d3298e99eddf2fd8116e952844da11fde

The deBridge order IDs match the source and destination event logs. Both destination contracts forwarded ETH to the collector in internal calls. The Relay request matches both hashes and the same request data, and the Ethereum transaction paid the collector directly. These receipts establish movement of existing funds across chains.

Where the swap’s WETH came from

The 3.197251591561056299 ETH credit came from converting 3.199811440713627200 WETH taken from a separate Arbitrum victim wallet that Bitquery identified in the Across domain hijack. The collector held zero WETH at the end of the block before the victim transfer, held exactly the amount received through the block before the conversion, and returned to zero after the conversion. The ETH amount is the gross credit before gas. Incident research · Conversion receipt.

Event (UTC, 10 Nov)

Confirmed movement

Receipt

17:04:47 · Ethereum funding

The victim wallet 0xbc7a2346a146188bf0049b3ffe4f1fc6f9a9d276 sent 5 ETH to a contract that holds funds for a later step.

5 ETH funding transaction

17:04:59 · Ethereum deposit

The funding contract released the same 5 ETH using the same funding identifier. An execution contract wrapped the ETH and sent all 5 WETH to the Across SpokePool.

Ethereum deposit

17:05:02 · Earlier bridge payout

0x7fb0be7fcce8cb60a20f050771b53134148dac10 paid 4.999764300892033999 WETH to the victim. The token transfer identifies the wallet that actually received the payout.

Payout

19:02:57 · Victim funds split

0xbc7a2346a146188bf0049b3ffe4f1fc6f9a9d276 sent 3.199811440713627200 WETH to the collector and 0.799952860178406799 WETH to the fee recipient. Together these transfers account for the victim’s entire pre-transfer balance of 3.999764300892033999 WETH.

Victim transfer

The victim had 30.919486837431786978 ETH just before the funding transfer. Its indexed Ethereum history includes two large credits from 0x1d43041cbc400ce74e54a3abf4ea93dc5fb19cf9 on July 20, 2023, totaling 112.5 ETH. Those credits establish an earlier funding source. Once ETH enters a wallet balance, the chain records what the wallet spends without assigning that spend to a particular earlier credit. 112 ETH · 0.5 ETH.

The Ethereum deposit and Arbitrum fill share the same Across deposit ID. Their chain IDs, depositor, token addresses and amounts agree. The Across status API returns both transaction hashes for that ID. The bridge funded the victim before the incident. The later ETH conversion traces the collector’s share of the loss, which is already counted in WETH. Across status record.

How much of the first Arbitrum receipt was spent?

The collector's ETH balance was zero immediately before the first payout. Before the next inflow, two approval transactions consumed 0.000003556878 ETH from that first receipt. The WETH conversion above credited 3.197251591561056299 ETH and pooled it with the remaining ETH. Arbitrum wallet history, swap and internal transfer.

Arbitrum checkpoint

Block

ETH balance

Before first payout

523066430

0

After first payout

523066431

0.009992001600000002

After the two approvals

523066572

0.009988444722000002

After the swap and its gas charge

523066725

3.207234052203056301

Before deBridge send

523066861

3.207231896571936301

After deBridge send

523066862

0.206076008898686789

Before Relay send

523076186

0.206066984696066789

After Relay send

523076187

0.000285059834944066

The twelve transaction receipts account for 0.000027314746100000 ETH in gas, including two reverted transactions. The successful deBridge and Relay sends carried 3.001150300868641512 ETH and 0.205780917711370723 ETH on Arbitrum. Those are the native values attached on the source chain. The payout table above shows what arrived on Ethereum.

Even if the first receipt covered every gas charge and the entire ending balance, at least 0.009679627018955936 ETH from it had to enter the two bridge sends combined. The upper bound is 0.009988444722000002 ETH, the amount left from the first receipt after the two approvals. The later swap supplied enough ETH for either bridge send individually, so the ledger cannot tell which send used the first receipt or how much each used. The bounds use the collector's native ETH balance and exclude separate token movements.

Did the victim receive compensation?

Across committed to making affected users whole. A payment can be counted when a successful transaction credits an identified victim and the payer or payment batch is independently attributable to Across. The official updates reviewed by the cutoff supplied no payer or batch identifier. A fresh check of the main victim’s indexed Ethereum transactions, internal transfers and token transfers did not show a newer payout candidate. This check covers one victim address and the public records available for it. Across announcement.

Record examined

What the record shows

Compensation status

11 Nov, 17:49:35 UTC, 40,659.841619 USDT

The USDT0 adapter released genuine Ethereum USDT. LayerZero maps the release to a successful X Layer transaction initiated by the same victim address at 15:18:39 UTC.

Classified as the destination leg of a self-initiated bridge transfer. Upstream funding is unverified. Bridge message, receipt

11 Nov, 17:50:23 UTC, same amount shown by a token index

No matching transfer from the genuine USDT contract in the checked receipt

Excluded from payment counts. Receipt

11 Nov, 17:50:23 UTC, zero-value USDT entry

Genuine contract log shows a value of zero

No value transferred. Receipt

11 Nov, 17:54–17:55 UTC

Victim exchanged USDT for USDC and used USDC in an Aave repayment

These transactions establish the victim's subsequent use of funds. The funding purpose remains open. Swap, Aave repayment

The X Layer receipts explain how the wallet assembled the transfer. Before the two swaps it held 12,705.278479 USDT0. At 15:17:23 UTC the wallet swapped USDC for 16,061.785784 USDT0. At 15:17:54 UTC it swapped USDG for 11,892.777356 USDT0. The three amounts add up to 40,659.841619 USDT0, which the wallet then bridged to Ethereum. A historical balance check traced most of that funding to four Uniswap v4 liquidity removals initiated by the victim address on November 10. A liquidity position holds tokens in a trading pool. Removing liquidity returns tokens to the position holder. In each receipt the PoolManager records a negative liquidity change and sends assets to the victim address. Uniswap X Layer deployments. USDC swap, USDG swap.

10 Nov UTC

Amounts returned to the victim on X Layer

Evidence

20:24:58

5,186.401209 USDT0 and 10,443.039964 USDC

Position withdrawal

20:25:22

3,091.935957 USDT0 and 10,940.097312 USDG

Position withdrawal

20:26:37

3,903.503505 USDT0 and 5,447.652268 USDC

Position withdrawal

20:27:39

285.654001 USDT0 and 707.894753 USDG

Position withdrawal

The withdrawals account for 12,467.494672 USDT0, 15,890.692232 USDC and 11,647.992065 USDG before the swaps. The wallet already held smaller balances in all three tokens. The records establish the immediate sources of the bridged funds. An authenticated Across payer or batch hash would be needed to identify separate reimbursements. A subsequent Hyperliquid withdrawal would need its own receipt and, for a claim about native XMR, a matching Monero-side record.

Evidence appendix

Role

Address

Ethereum victim

0x42e7ab48d5ae0ed6941a89492d1c5dfb06b8483c

Collector

0x2846e69d3298e99eddf2fd8116e952844da11fde

Fee recipient

0x0c7c656126aa62625fdd8051eb69dc14aee8d37b

ETH splitter

0x38d7e8b3c9561caf096c06c62c7561f8ab6e514c

aWETH token contract

0x4d5f47fa6a74757f35c14fd3a6ef8e3c9bc514e8

Bitcoin destination

3EQ9Rqrtvco4nKmskv2jQRXvWKkpUGfAQs

Initial SOL recipient

G47n6dbUor1WFweLvKPrUi5beW4yjRoFG3cJZU6a4uSa

SOL intermediate wallet

2K7fueB3tqYBb5Z2Ubnnpf2rF3sJr1fJDKXtsocTAWmk

Final observed SOL address

5HQZd9ovzAF1TLnHRAq1zcSnXC9HAp3EwhoxMHvo8rxB

Hyperliquid account 1

0x09360fe2e18fdfa49beb7592b9f24f94c5465533

Hyperliquid account 2

0xf229f808fe21911f8bcc24ebb30a85bd2e4c00f0

Chainflip funding wallet

0x0f67a21780699bb5c5e6b5f986c0bab26bfffe5c

Hyperliquid branch funding wallet

0xf10a482fbc02195f2dafca5d9dfd19c871b0f4a5

First Ethereum side wallet

0xa490cde73adcd40475025ee8710f3a5ab7393194

Second Ethereum side wallet

0xbca05d20dbb271fd607e69fdc8d955be3bfc8120

Ethereum USDT0 adapter

0x6c96de32cea08842dcc4058c14d3aaad7fa41dee

Reproduction. Ethereum: inspect successful receipts for the exact aWETH contract and standard Transfer event, then sum base units by recipient. For native ETH moved inside a contract call, inspect execution traces. Bitcoin: compare the source hash embedded in the data output with the Ethereum input and read output 0 separately. Solana: inspect parsed system transfer instructions. Hyperliquid: query userNonFundingLedgerUpdates and userFillsByTime for the two accounts and match the deposits with the subsequent spot fills. The dollar figure is Bitquery's historical estimate. Values from successive stages describe movements of funds and should never be summed as new victim losses.

post_like_sub0
post_total_comment_sub0

24 reads

0/500 bytes