ETH Bridging

Table of Contents

Overview

ETH is bridged between chains within the Superchain interop set by using the SuperchainETHBridge predeploy for message passing and the ETHLiquidity contract for supplying native ETH liquidity.

Constants

NameValue
SuperchainETHBridge Address0x4200000000000000000000000000000000000024
ETHLiquidity Address0x4200000000000000000000000000000000000025

Design

See the SuperchainETHBridge spec for the design of the SuperchainETHBridge predeploy and the ETHLiquidity spec for the design of the ETHLiquidity contract.

Diagram

The following diagram depicts a cross-chain ETH transfer.

---
config:
  theme: dark
  fontSize: 48
---
sequenceDiagram
  participant from as from (Chain A)
  participant L2SBA as SuperchainETHBridge (Chain A)
  participant ETHLiquidity_A as ETHLiquidity (Chain A)
  participant Messenger_A as L2ToL2CrossDomainMessenger (Chain A)
  participant Inbox as CrossL2Inbox
  participant Messenger_B as L2ToL2CrossDomainMessenger (Chain B)
  participant L2SBB as SuperchainETHBridge (Chain B)
  participant ETHLiquidity_B as ETHLiquidity (Chain B)
  participant recipient as recipient (Chain B)

  from->>L2SBA: sendETH{value: amount}(to, chainId)
  L2SBA->>ETHLiquidity_A: burn{value: amount}()
  ETHLiquidity_A-->ETHLiquidity_A: emit LiquidityBurned(from, amount)
  L2SBA->>Messenger_A: sendMessage(chainId, message)
  Messenger_A->>L2SBA: return msgHash_
  L2SBA-->L2SBA: emit SendETH(from, to, amount, destination)
  L2SBA->>from: return msgHash_
  Inbox->>Messenger_B: relayMessage()
  Messenger_B->>L2SBB: relayETH(from, to, amount)
  L2SBB->>ETHLiquidity_B: mint(amount)
  ETHLiquidity_B-->ETHLiquidity_B: emit LiquidityMinted(SuperchainETHBridge address, amount)
  L2SBB->>recipient: new SafeSend{value: amount}(to)
  L2SBB-->L2SBB: emit RelayETH(from, to, amount, source)