Supported networks
Viem supports any of the Superchain networks. The OP Stack networks are included in Viem by default. If you want to use a network that isn’t included by default, you can add it to Viem’s chain configurations.Dependencies
Create a demo project
You’re going to use Viem for this tutorial. Since Viem is a Node.js library, you’ll need to create a Node.js project to use it.Want to create a new wallet for this tutorial?
If you have
cast installed you can run cast wallet new in your terminal to create a new wallet and get the private key.Get ETH on Sepolia
This tutorial explains how to bridge ETH from Sepolia to OP Sepolia. You will need to get some ETH on Sepolia to follow along.You can use this faucet to get ETH on Sepolia.
Add a private key to your environment
You need a private key in order 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 Sepolia.Start the Node REPL
You’re going to use the Node REPL to interact with Viem. To start the Node REPL run the following command in your terminal:Import dependencies
You need to import some dependencies into your Node REPL session.Get ETH on Sepolia
You’re going to need some ETH on L1 that you can bridge to L2. You can get some Sepolia ETH from this faucet.Deposit ETH
Now that you have some ETH on L1 you can deposit that ETH into theOptimismPortalProxy contract. You’ll then receive the same number of ETH on L2 in return.
- depositETH
- Full Code
Check your wallet balance on L1
See how much ETH you have on L1 so you can confirm that the deposit worked later on.
We used
formatEther method from viem to format the balance to ether.Create the deposit transaction
Use
buildDepositTransaction to build the deposit transaction parameters on the L2.Extract the L2 transaction hash
Extracts the corresponding L2 transaction hash from the L1 receipt, and logs it.
This hash represents the deposit transaction on L2.
Withdraw ETH
You just bridged some ETH from L1 to L2. Nice! Now you’re going to repeat the process in reverse to bridge some ETH from L2 to L1.- withdrawETH
- Full Code
Create the withdrawal transaction
Uses
buildInitiateWithdrawal to create the withdrawal parameters.
Converts the withdrawal amount to wei and specifies the recipient on L1.Executing the withdrawal
This sends the withdrawal transaction on L2, which initiates the withdrawal process on L2 and logs a transaction hash for tracking the withdrawal.
Confirming L2 transaction
Wait one hour (max) for the L2 Output containing the transaction to be proposed, and log the receipt, which contains important details like the block number etc.
Wait for withdrawal prove
Next, is to prove to the bridge on L1 that the withdrawal happened on L2. To achieve that, you first need to wait until the withdrawal is ready to prove.Build parameters to prove the withdrawal on the L2.
Prove the withdrawal on the L1
Once the withdrawal is ready to be proven, you’ll send an L1 transaction to prove that the withdrawal happened on L2.
Wait for withdrawal finalization
Before a withdrawal transaction can be finalized, you will need to wait for the finalization period.
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.
Recommend checking with
[getWithdrawalStatus](https://viem.sh/op-stack/actions/getWithdrawalStatus) before the waitToProve and waitToFinalize actions.Important Considerations
- Challenge period: The 7-day withdrawal challenge Period is crucial for security.
- Gas costs: Withdrawals involve transactions on both L2 and L1, each incurring gas fees.
- Private Key handling: Use secure key management practices in real applications.
- RPC endpoint security: Keep your API key (or any RPC endpoint) secure.
Next Steps
- Develop a user interface for easier interaction with these bridging functions.
- Implement robust error handling and retry mechanisms for production use.
viem/op-stack.
You should now be able to write applications that use viem/op-stack to transfer ETH between L1 and L2.
Although this tutorial used Sepolia and OP Sepolia, the same process works for Ethereum and OP Mainnet.