Skip to content

Latest commit

 

History

History
342 lines (216 loc) · 11.6 KB

cross-dom-bridge-erc20.mdx

File metadata and controls

342 lines (216 loc) · 11.6 KB
title lang description
Bridging ERC-20 tokens with the Optimism SDK
en-US
Learn how to use the Optimism SDK to transfer ERC-20 tokens between Layer 1 (Ethereum or Sepolia) and Layer 2 (OP Mainnet or OP Sepolia).

import { Callout, Steps } from 'nextra/components'

Bridging ERC-20 Tokens to OP Mainnet With the Optimism SDK

Please **do not rely** on the content of this page as it is currently undergoing maintenance. **Code samples and solutions may not function as expected.** Please check back for an update or [signup to help us revise this page]( tutorial new tutorial request or revision to existing tutorial ). We welcome your contribution! ❤️

This tutorial explains how you can use the Optimism SDK to bridge ERC-20 tokens from L1 (Ethereum or Sepolia) to L2 (OP Mainnet or OP Sepolia). The Optimism SDK is an easy way to add bridging functionality to your javascript-based application. It also provides some safety rails to prevent common mistakes that could cause tokens to be made inaccessible.

Behind the scenes, the Optimism SDK uses the Standard Bridge contracts to transfer tokens. Make sure to check out the Standard Bridge guide if you want to learn more about how the bridge works under the hood.

The Standard Bridge **does not** support [**fee on transfer tokens**](https://github.com/d-xo/weird-erc20#fee-on-transfer) or [**rebasing tokens**](https://github.com/d-xo/weird-erc20#balance-modifications-outside-of-transfers-rebasingairdrops) because they can cause bridge accounting errors.

Supported Networks

The Optimism SDK supports any of the Superchain networks. Some Superchain networks are already included in the SDK by default. If you want to use a network that isn't included by default, you can simply instantiate the SDK with the appropriate contract addresses.

Dependencies

Create a Demo Project

You're going to use the Optimism SDK for this tutorial. Since the Optimism SDK is a Node.js library, you'll need to create a Node.js project to use it.

{

Make a Project Folder

}

mkdir op-sample-project
cd op-sample-project

{

Initialize the Project

}

pnpm init

{

Install the Optimism SDK

}

pnpm add @eth-optimism/sdk

{

Install ethers.js

}

pnpm add ethers@^5
Want to create a new wallet for this tutorial? If you have [`cast`](https://book.getfoundry.sh/getting-started/installation) installed you can run `cast wallet new` in your terminal to create a new wallet and get the private key.

Get ETH on Sepolia and OP Sepolia

This tutorial explains how to bridge tokens from Sepolia to OP Sepolia. You will need to get some ETH on both of these testnets.

You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. You can use the [Superchain Faucet](https://app.optimism.io/faucet?utm_source=docs) to get ETH on OP Sepolia.

Add a Private Key to Your Environment

You need a private key to sign transactions. Set your private key as an environment variable with the export command. Make sure this private key corresponds to an address that has ETH on both Sepolia and OP Sepolia.

export TUTORIAL_PRIVATE_KEY=0x...

Start the Node REPL

You're going to use the Node REPL to interact with the Optimism SDK. To start the Node REPL, run the following command in your terminal:

node

This will bring up a Node REPL prompt that allows you to run javascript code.

Import Dependencies

You need to import some dependencies into your Node REPL session.

{

Import the Optimism SDK

}

{

Import ethers.js

}

Set Session Variables

You'll need a few variables throughout this tutorial. Let's set those up now.

{

Load your private key

}

{

Create the RPC providers and wallets

}

{

Set the L1 and L2 ERC-20 addresses

}

This tutorial uses existing ERC-20 tokens that have been deployed on Sepolia and OP Sepolia. These tokens are designed for testing the bridging process.

If you're coming from the [Bridging Your Standard ERC-20 Token to OP Mainnet Using the Standard Bridge](./standard-bridge-standard-token) or [Bridging Your Custom ERC-20 Token to OP Mainnet Using the Standard Bridge](./standard-bridge-custom-token) tutorials, you can use the addresses of your own ERC-20 tokens here instead.

Get L1 Tokens

You're going to need some tokens on L1 that you can bridge to L2. The L1 testing token located at 0x5589BB8228C07c4e15558875fAf2B859f678d129 has a faucet function that makes it easy to get tokens.

{

Set the ERC20 ABI

}

{

Create a Contract instance for the L1 token

}

{

Request some tokens

}

{

Check your token balance

}

Deposit Tokens

Now that you have some tokens on L1, you can deposit those tokens into the L1StandardBridge contract. You'll then receive the same number of tokens on L2 in return.

{

Define the amount to deposit

}

The testing token has 18 decimal places, so you'll want to define a variable that represents one token.

{

Create a CrossChainMessenger instance

}

The Optimism SDK exports a CrossChainMessenger class that makes it easy to interact with the L1StandardBridge contract.

Create an instance of the CrossChainMessenger class:

{

Allow the Standard Bridge to access your tokens

}

Before you can deposit your tokens, you'll need to give the Standard Bridge contract an allowance of tokens on L1. This will allow the Standard Bridge to pull these tokens out of your address and escrow inside the bridge.

{

Deposit your tokens

}

Now you can deposit your tokens into the Standard Bridge contract.

Using a smart contract wallet? As a safety measure, `depositERC20` will fail if you try to deposit ETH from a smart contract wallet without specifying a `recipient`. Add the `recipient` option to the `depositERC20` call to fix this. Check out the [Optimism SDK docs](https://sdk.optimism.io/classes/crosschainmessenger#depositERC20-2) for more info on the options you can pass to `depositERC20`.

{

Wait for the deposit to be relayed

}

You can use the waitForMessageStatus function to wait for the deposit to be relayed to L2.

{

Check your token balance on L1

}

You should now have one less token on L1.

{

Create a Contract instance for the L2 token

}

{

Check your token balance on L2

}

You should now have one more token on L2.

Withdraw Tokens

You just bridged some tokens from L1 to L2. Nice! Now you're going to repeat the process in reverse to bridge some tokens from L2 to L1.

{

Start your withdrawal on L2

}

The first step to withdrawing tokens from L2 to L1 is to start the withdrawal on L2.

{

Check your token balance on L2

}

You should now have one less token on L2, but your token balance on L1 will not have changed yet.

{

Wait until the withdrawal is ready to prove

}

The second step to withdrawing tokens from L2 to L1 is to prove to the bridge on L1 that the withdrawal happened on L2. You first need to wait until the withdrawal is ready to prove.

This step can take a few minutes. Feel free to take a quick break while you wait.

{

Prove the withdrawal on L1

}

Once the withdrawal is ready to be proven, you'll send an L1 transaction to prove that the withdrawal happened on L2.

{

Wait until the withdrawal is ready for relay

}

The final step to withdrawing tokens from L2 to L1 is to relay the withdrawal on L1. This can only happen after the fault proof period has elapsed. On OP Mainnet, this takes 7 days.

We're currently testing fault proofs on OP Sepolia, so withdrawal times reflect Mainnet times.

{

Relay the withdrawal on L1

}

Once the withdrawal is ready to be relayed, you can finally complete the withdrawal process.

{

Wait until the withdrawal is relayed

}

Now you simply wait until the message is relayed.

{

Check your token balance on L1

}

You should now have one more token on L1.

Next Steps

Congrats! You've just deposited and withdrawn tokens using the Optimism SDK. You should now be able to write applications that use the Optimism SDK to transfer ERC-20 tokens between L1 and L2. Although this tutorial used Sepolia and OP Sepolia, the same process works for Ethereum and OP Mainnet.