Incident Summary

A mismatch in the gas refund logic of EIP-7702's implementation between the geth and reth Ethereum client implementations resulted in inconsistent gas accounting on OP Mainnet, causing a chain split between op-geth and op-reth.

User assets are safe, and this issue only affects OP Mainnet node operators running op-reth.

Incident Details

The discrepancy originated from how each client handled refunds during transaction processing. Specifically:

This resulted in a 12,500 difference in gasUsed, causing inconsistencies between clients’ view of the chain.

Reth correctly implemented the EIP-7702 specification, checking if an account is "empty" (per EIP-161's definition,) whereas geth's implementation of the EIP-7702 pre-execution checks checked if the account existed within the state. This discrepancy cannot affect Ethereum Mainnet, because empty accounts are unable to be persisted within the state following EIP-161 (included within the Spurious Dragon hardfork,) and all known empty accounts were cleared from the state with https://etherscan.io/tx/0xf955834bfa097458a9cf6b719705a443d32e7f43f20b9b0294098c205b4bcc3d.

Root Cause Analysis

The issue was traced back to legacy empty accounts that originated from Optimistic Virtual Machine (OVM) prior to the November 2021 regenesis and persisted through the Bedrock migration. Four known empty accounts were identified: