Exploring Bridging Behaviors with EIP-7702

To avoid the risk of potential fund loss, always use the L1StandardBridge and L2StandardBridge contracts when bridging ETH and ERC-20 tokens, and use the L1ERC721Bridge and L2ERC721Bridge contracts when bridging ERC-721 tokens.

EIP-7702 enables EOAs to execute smart contract code directly. However, this comes with some nuances to be wary of when it comes to bridging.

Bridging ETH

  • ETH may be temporarily locked on the destination network if the receiving delegated account lacks a function to accept ETH (e.g., receive() external payable). To resolve this, either undelegate the code or update it to include an ETH-receiving function, then replay the message on the destination network.

  • The L1StandardBridge and L2StandardBridge contracts include a convenience receive() function that initiates the bridging process with a fixed gas limit for the destination network. If the receiving delegated account implements a receive() function with complex logic that consumes significant gas, it may trigger an out-of-gas error. To avoid unexpected behavior in such cases, use bridgeETH or bridgeETHTo instead, specifying a custom gas limit that ensures successful execution on the destination chain.

Bridging ERC-721

  • ERC-721 may be temporarily locked on the destination network if the receiving delegated account lacks a correctly implemented onERC721Received() function. To resolve this, either undelegate the code or update it to include an onERC721Received() function, then replay the message on the destination network.

Recovering Temporarily Locked ETH/ERC-721 on L1

  1. For delegated 7702 EOAs on L1, unset the code first.

  2. Go to the OptimismPortalProxy page on Etherscan. You can find the Mainnet link here.

  3. Open the transaction hash page where the proveWithdrawalTransaction errors occurred.

  4. Go to the Internal Txns tab.

  5. Open and decode input data for the Relay Message method.

  6. Go to the L1CrossDomainMessengerProxy page on Etherscan. You can find the Mainnet link here.

  7. Send a relayMessage transaction using the exact same decoded input data from Step 6. Set the payableAmount to 0. Once the transaction is confirmed, the funds should appear in your wallet.

Recovering Temporarily Locked ETH/ERC-721 on L2

  1. For delegated 7702 EOAs on L2, unset the code first.

  2. Go to the L2CrossDomainMessenger page on Zircuit explorer. You can find the Mainnet link here.

  3. Open the transaction hash page where the relayMessage error occurred.

  4. Copy the Input Data and run the folllowing command:

    cast calldata-decode "relayMessage(uint256,address,address,uint256,uint256,bytes)" $INPUT_DATA
  5. Go to the L2CrossDomainMessenger page on Etherscan. You can find the Mainnet link here.

  6. Send a relayMessage transaction using the exact same decoded input data from Step 4. Set the payableAmount to 0. Once the transaction is confirmed, the funds should appear in your wallet.

Last updated