System architecture

Binance $6.3B hack explained: how EIP-7702 delegation emptied a hot wallet, and how to guard your signer

How 50 pre-signed EIP-7702 authorizations emptied a Binance hot wallet, what Binance has said, and the signer checks that would have refused them.

Kemo
10 min read
A round steel bank vault door with radial locking bolts and a central combination mechanism, set into a pale wall.
On this page
  1. What has Binance said about how the hack happened?
  2. What is EIP-7702, and what does a delegation authorization let someone do?
  3. How 50 pre-signed authorizations emptied the Ethereum hot wallet
  4. Which chains lost the most?
  5. How a hot-wallet signer should refuse delegation requests
  6. How to detect an EIP-7702 delegation on your own wallets
  7. How this compares with the Bybit hack
  8. Questions people ask about the Binance hack
  9. Sources and further reading

On 29 October 2026 attackers took roughly $6.3 billion out of Binance's hot wallets in about four hours, across ten chains. The largest single drain used no stolen private key and no contract bug: a Binance Ethereum hot wallet had signed 50 EIP-7702 authorizations that pointed it at the attacker's sweeper contract, and one transaction at 20:20 UTC put them on chain (TRM Labs).

This article explains what Binance has confirmed, how EIP-7702 delegation works at the protocol level, why fifty signatures for consecutive nonces were enough to empty the wallet, and the checks a signing service and a monitoring job should run so a request like that is refused. It is written for engineers who run or build anything that signs transactions on behalf of a service, not only exchanges.

Date29 October 2026, main drains from about 20:05 UTC (TRM Labs)
Total takenAbout 6.3 billion per [Binance](https://www.binance.com/en/support/announcement/detail/c5a8729a97ac486d963784d96c5642d7); 6.36 billion at transfer-time prices per TRM
Ethereum methodEIP-7702 delegation to a sweeper contract, 50 signed authorizations (TRM Labs)
Root causeUnder investigation; started with "a compromised DevOps engineer's laptop", with additional breach points found later (Binance, Binance on X)
Private keys"No evidence of any wallet private key leak" (Binance)
Frozen so farAbout $2.7 billion by issuers and the Arbitrum Security Council (TRM Labs)
AttributionTraderTraitor (North Korea), high confidence per TRM and Chainalysis; not confirmed by Binance (The Hacker News)
The Binance hack at a glance, as reported by 31 October 2026

What has Binance said about how the hack happened?

Binance's incident update says its initial investigation suggests the incident may involve a compromised DevOps engineer's laptop, which the attacker used to reach a service container and submit unauthorised withdrawal transactions. It found no evidence that wallet private keys leaked, revoked the affected address authorization and suspended withdrawals.

A day later Binance said it had "uncovered additional points of breach" (Binance on X). Co-CEO Richard Teng wrote that the attacker "did not simply use one engineer's permissions" and that this was not a one-click action (Teng on X). CoinDesk reports that the attackers used EIP-7702 to take control of a hot wallet "without going through Binance's normal approval procedures", used a self-destruct mechanism to erase evidence, and that Binance is reviewing transaction signing, key management, cloud systems and employee devices. A full post-mortem has been promised but not yet published.

So the honest summary is: entry through an engineer's machine, then something inside Binance's withdrawal and signing path produced signatures the attacker wanted. TRM's assessment is that a compromise of the hot-wallet signing infrastructure is the most likely explanation, because phishing would explain the Ethereum activity but not the nine other chains drained the same evening (TRM Labs).

What is EIP-7702, and what does a delegation authorization let someone do?

EIP-7702, shipped in Ethereum's Pectra upgrade in May 2025, lets an ordinary externally owned account (EOA) point its code at a smart contract. Once set, any call to the EOA runs that contract's code in the EOA's context: its balance, its storage, its token holdings (EIP-7702).

The permission is a signed tuple [chain_id, address, nonce]. The account signs keccak(0x05 || rlp([chain_id, address, nonce])), and the tuple travels in the authorization_list of a new transaction type, 0x04. The important detail for this incident is that anyone can submit a signed tuple and pay its gas; the account that signed it does not have to send anything.

When a type-4 transaction is processed, each tuple is checked and applied on its own:

  1. The chain ID must be 0 or the current chain. A chain ID of 0 makes the authorization valid on every EVM chain that implements the EIP.
  2. The signer is recovered with ecrecover, and its code must be empty or already a delegation.
  3. The tuple's nonce must equal the signer's current account nonce; if not, the tuple is skipped and processing moves to the next one.
  4. The signer's code is set to 0xef0100 || address, and its nonce goes up by one. An address of zero clears the delegation instead.

The specification is blunt about the consequence: the delegated code has unrestricted access to the account, and "there is no safe way to provide this interface" for asking users to sign arbitrary authorizations (EIP-7702). An authorization carries no amount and no recipient. It hands over the whole account.

How 50 pre-signed authorizations emptied the Ethereum hot wallet

A busy exchange hot wallet sends withdrawals all day, so its nonce moves constantly. An attacker cannot know which nonce the wallet will be on when their transaction lands. The fix was to get signatures for fifty consecutive nonces, 18,914,775 to 18,914,824, all delegating to the same sweeper contract (TRM Labs, Tibane Labs via PandaSecurity). Whichever nonce the wallet had reached at 20:20:59 UTC matched one tuple; the others were simply skipped.

BinanceDevOps laptopcompromisedWithdrawal service containerHot-wallet signerAttacker operatorBinance 14 hot walletEOASweeper contractcaller-checkedAttacker addressaccess50authorizationssigned tuplestype-4 tx, 20:20UTCcode = 0xef0100+ sweepersweep(), 20:24UTCETH, USDT, 63tokens
  • DevOps laptop → Withdrawal service container: access
  • Withdrawal service container → Hot-wallet signer: 50 authorizations
  • Hot-wallet signer → Attacker operator: signed tuples
  • Attacker operator → Binance 14 hot wallet: type-4 tx, 20:20 UTC
  • Binance 14 hot wallet → Sweeper contract: code = 0xef0100 + sweeper
  • Attacker operator → Sweeper contract: sweep(), 20:24 UTC
  • Sweeper contract → Attacker address: ETH, USDT, 63 tokens
The attacker never needed the hot wallet's key: the signing path produced the authorizations, and once one applied, the wallet ran the sweeper's code.

About three and a half minutes later the operator called the sweeper, which checks that only the hard-coded operator address can call it, and moved 167,464 ETH and 63 tokens including 1.615 billion USDT to an attacker address. The delegation stayed in place for nearly four hours, so the attacker swept new deposits as Binance's own automation topped the wallet up, at 20:41, 20:59, 21:04, 21:44, 22:39 and 23:56 UTC (TRM Labs). The wallet cleared it at 00:10:35 UTC on 30 October by sending a type-4 transaction delegating to the zero address (PandaSecurity).

The sweeper also had a general execute(target, value, data) function. Because the drained wallet was the executor for a separate Binance smart account, the attacker could make it instruct that account to release 823 million USDC (TRM Labs, PandaSecurity). Delegation turns every permission the EOA holds elsewhere into the attacker's permission too.

No key was stolen, and none needed to be: a signer that signs what the service asks is as good as the key.

Which chains lost the most?

EIP-7702 explains the biggest single drain, not the whole night. Between 20:05 and 23:05 UTC, Binance wallets on the XRP Ledger, Bitcoin, Tron, Solana, Optimism, Avalanche and Polygon also sent their balances to attacker addresses with ordinary signed transfers, and a second Ethereum hot wallet sent 28,006 ETH the same way (TRM Labs). That spread is why TRM points at the signing infrastructure rather than one tricked approver.

Value taken from Binance by chainApproximate, at transfer-time prices
Ethereum3,790 $mBitcoin1,470 $mTron628 $mXRP Ledger296 $mSolana96 $mArbitrum, Optimism, Base39 $mAvalanche28 $mPolygon10 $m

Source: TRM Labs, onchain data as of 30 October 2026 00:30 UTC, at transfer-time prices (https://www.trmlabs.com/resources/blog/north-korea-steals-usd-6-36-billion-from-binance-in-the-largest-hack-in-history)

Value taken from Binance by chain
USD millions
Ethereum3,790 $m
Bitcoin1,470 $m
Tron628 $m
XRP Ledger296 $m
Solana96 $m
Arbitrum, Optimism, Base39 $m
Avalanche28 $m
Polygon10 $m

How a hot-wallet signer should refuse delegation requests

If a hot wallet has no reason to delegate, the signer should never produce a type-4 authorization for it. If it does need delegation, the target should come from a short allowlist that changes only through a separate, multi-party approval, and a request for many authorizations covering a run of future nonces should be treated as an attack, because no legitimate flow needs one.

Here is that policy as a small, dependency-free check to run in the signer before any key material is touched. The example at the bottom replays the shape of the 29 October request.

signing-policy.mjsJavaScript
// A pre-signing check for a hot-wallet signer. Run it on every request before the key is touched.const ALLOWED_DELEGATES = new Set([]); // empty: this wallet never delegates export function reviewSigningRequest(req) {  const problems = [];  if (req.kind === "eip7702-authorization") {    for (const auth of req.authorizations) {      if (!ALLOWED_DELEGATES.has(auth.address.toLowerCase())) {        problems.push(`delegation to ${auth.address} is not on the allowlist`);      }      if (auth.chainId === 0n) problems.push("chain_id 0 makes the authorization valid on every chain");    }    if (req.authorizations.length > 1) {      const nonces = req.authorizations.map((a) => a.nonce).sort((a, b) => (a < b ? -1 : 1));      const consecutive = nonces.every((n, i) => i === 0 || n === nonces[i - 1] + 1n);      if (consecutive) problems.push(`${nonces.length} authorizations for consecutive nonces ${nonces[0]}..${nonces.at(-1)}`);    }  }  return { allow: problems.length === 0, problems };} // The shape of the request seen on 29 October: 50 authorizations, one delegate, nonces in a row.const batch = Array.from({ length: 50 }, (_, i) => ({  chainId: 1n,  address: "0x63e842b054bd624a465454d533c33f573e9c6fae",  nonce: 18_914_775n + BigInt(i),}));const verdict = reviewSigningRequest({ kind: "eip7702-authorization", authorizations: batch });console.log(verdict.allow ? "SIGN" : "REFUSE");console.log(verdict.problems.slice(0, 1).concat(verdict.problems.slice(-1)).join("\n"));
Node 22.23.4Shell
$ node signing-policy.mjsREFUSEdelegation to 0x63e842b054bd624a465454d533c33f573e9c6fae is not on the allowlist50 authorizations for consecutive nonces 18914775..18914824

Put the check where the attacker cannot route around it: inside the signing service or HSM policy layer, not in the withdrawal service that calls it. In this incident the withdrawal path itself was the compromised component, and CoinDesk reports the attackers bypassed the normal approval procedures (CoinDesk).

How to detect an EIP-7702 delegation on your own wallets

A delegated EOA has 23 bytes of code: 0xef0100 followed by the delegate's address. A plain EOA returns 0x from eth_getCode. Polling your hot wallets for that change, every block or every few seconds, turns a four-hour sweep window into an alert within a block or two, and the remedy is the same one Binance used: send a delegation to the zero address and pause the automation that refills the wallet.

check-delegation.mjsJavaScript
// Usage: RPC_URL=https://your-node node check-delegation.mjs 0xHotWallet [0xAnother ...]const RPC_URL = process.env.RPC_URL;if (!RPC_URL) throw new Error("Set RPC_URL to an Ethereum JSON-RPC endpoint"); // EIP-7702 delegation indicator: 0xef0100 followed by the 20-byte delegate address.export function parseDelegation(code) {  const hex = code.toLowerCase();  if (hex === "0x") return { state: "plain EOA" };  if (hex.startsWith("0xef0100") && hex.length === 2 + 2 * 23) {    return { state: "DELEGATED", to: "0x" + hex.slice(8) };  }  return { state: "contract code" };} async function getCode(address) {  const res = await fetch(RPC_URL, {    method: "POST",    headers: { "content-type": "application/json" },    body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "eth_getCode", params: [address, "latest"] }),  });  const { result, error } = await res.json();  if (error) throw new Error(`${address}: ${error.message}`);  return result;} let alarm = false;for (const address of process.argv.slice(2)) {  const verdict = parseDelegation(await getCode(address));  if (verdict.state !== "plain EOA") alarm = true;  console.log(address, verdict.state, verdict.to ?? "");}process.exit(alarm ? 1 : 0);
Run against a local mock RPC with two placeholder addresses; point RPC_URL at your own nodeShell
$ RPC_URL=http://127.0.0.1:8545 node check-delegation.mjs 0x1111111111111111111111111111111111111111 0x22222222222222222222222222222222222222220x1111111111111111111111111111111111111111 plain EOA 0x2222222222222222222222222222222222222222 DELEGATED 0x63e842b054bd624a465454d533c33f573e9c6fae$ echo $?1

Contract authors have a related job. EIP-7702 means an EOA can now have code, so checks like tx.origin == msg.sender or extcodesize(caller) == 0 no longer prove the caller is a simple key-holding wallet; the specification lists this break explicitly (EIP-7702). Any privilege granted to an EOA, such as being the executor of another account, is now reachable by whatever code that EOA delegates to.

How this compares with the Bybit hack

Bybit, February 2025Binance, October 2026
AmountAbout $1.5 billion (The Hacker News)About $6.3 billion
AttributionTraderTraitor, attributed by the FBI (TRM Labs)TraderTraitor, per TRM and Chainalysis; Binance has not confirmed
Entry pointA developer laptop at Safe{Wallet}, then a stolen AWS session token (Aikido)A DevOps engineer's laptop, then a service container, plus further breach points
How funds movedSigners approved a malicious transaction they were shownPre-signed EIP-7702 authorizations and direct transfers on ten chains
Laundering so farBridge-heavy (TRM Labs)Swaps and lending protocols first
The two largest exchange thefts, compared on what has been published

The pattern repeats: an engineer's workstation is the way in, and the thing that fails is a signing step that trusted its caller. Hardware wallets, multi-party approval and cold storage all assume the request reaching them is honest. Both incidents show that the request is the attack surface.

The one thing to remember: in a post-Pectra world, an EIP-7702 authorization is a full transfer of control, so treat a request to sign one as you would a request to export the key, and refuse it unless a separate, human-approved policy says otherwise.

Questions people ask about the Binance hack

How much was stolen in the Binance hack?

Binance puts the impact at about 6.3 billion. TRM Labs counts 6.36 billion at transfer-time prices, Elliptic 6.43 billion and Chainalysis about 5.9 billion, making it the largest crypto theft on record.

Were Binance's private keys stolen?

Binance says it found no evidence of a wallet private key leak. The Ethereum drain worked with authorizations signed through Binance's own signing path, which is just as damaging as a stolen key.

What is EIP-7702 in simple terms?

It is a feature added in Ethereum's Pectra upgrade that lets a normal wallet temporarily run a smart contract's code. The wallet signs an authorization naming the contract, and anyone can submit it on chain.

Why did the attacker sign 50 authorizations instead of one?

An authorization only applies if its nonce equals the wallet's current nonce, and a busy hot wallet's nonce changes with every withdrawal. Signing 50 consecutive nonces guaranteed one would match when the transaction landed.

Is EIP-7702 a vulnerability in Ethereum?

No. It worked as specified. The failure was that a hot wallet whose job is withdrawals could be made to sign a delegation at all, and that nothing alerted on the delegation for nearly four hours.

Who was behind the Binance hack?

TRM Labs and Chainalysis attribute it with high confidence to TraderTraitor, a North Korean group also blamed for the 2025 Bybit theft. Elliptic has urged caution, and Binance has not confirmed an attribution.

Are Binance customers' funds safe?

Binance says it will cover all losses from its SAFU fund and company funds and has set aside more than $6.34 billion. It suspended withdrawals while it rebuilds its withdrawal service and has said it hopes to resume them within about 48 hours.

Sources and further reading

Discussion

Join the discussion

Sign in with Google, Apple or an email code to comment and reply.

One practical article a week

Follow k13 in any RSS reader. No account needed.