# 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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.zircuit.com/infra/bridges/canonical/bridging-behaviors-with-eip-7702.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
