# 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](https://etherscan.io/address/0x17bfAfA932d2e23Bd9B909Fd5B4D2e2a27043fb1).
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](https://etherscan.io/address/0x2a721cBE81a128be0F01040e3353c3805A5EA091#writeProxyContract).
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](https://explorer.zircuit.com/address/0x4200000000000000000000000000000000000007).
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](https://explorer.zircuit.com/address/0x4200000000000000000000000000000000000007?activeTab=3).
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.
