Supporting Optimism in your wallet


# Overview

This guide is intended for wallet developers who want to give their users the ability to send transactions on the Optimism network. Optimism generally behaves like any other EVM-based chain with the exception of minor discrepancies related to transaction fees. These fee discrepancies are an inherent result of the fact that Optimism is a Layer 2 blockchain network that must publish transaction data to Ethereum.

# Connecting to Optimism

Optimism shares the Ethereum JSON-RPC API (opens new window) with only a few minor differences. You'll find all of the important information about each Optimism network on our Networks page. You can choose to connect to Optimism via our rate-limited public endpoints, private endpoints from infrastructure providers, or by running your own node. Because of throughput limits, we recommend using private node providers (particularly Alchemy (opens new window)) or running your own node for production applications.

# Canonical token addresses

The ERC-20 contract address for a token on Optimism may be different from the address for the same token on Ethereum. Optimism maintains a token list (opens new window) that includes known addresses for many popular tokens. You can see the same list with a nicer user interface here (opens new window).

For example, looking at the SNX token, the Optimism token list (opens new window) returns the following addresses:

ChainID Network Address
1 Ethereum 0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f
10 Optimism 0x8700daec35af8ff88c16bdf0418774cb3d7599b4
5 Goerli (test network) 0x51f44ca59b867E005e48FA573Cb8df83FC7f7597
420 Optimistic Goerli (test network) 0x2E5ED97596a8368EB9E44B1f3F25B2E813845303

# Transaction status

A transaction in Optimism can be in one of two states:

  1. Sequencer Confirmed: The transaction has been accepted by the sequencer on Optimism (L2)
  2. Confirmed On-Chain: The transaction has been written to Ethereum (L1)

We're still working on the tooling to easily detect when a given transaction has been published to Ethereum. For the moment, we recommend wallets consider transactions final after they are "Sequencer Confirmed". Transactions are considered "Sequencer Confirmed" as soon as their transaction receipt shows at least one confirmation.

# Transaction Fees

We aim to be EVM equivalent (opens new window), meaning we aim to minimize the differences between Optimism and Ethereum. You can see a summary of the few differences between Optimism and Ethereum here. One of the most important discrepancies can be found within Optimism's fee model. As a wallet developer, you must be aware of this difference.

# Estimating total fees

Most of the cost of a transaction on Optimism comes from the cost of publishing the transaction to Ethereum. This publication step is what makes Optimism a Layer 2 blockchain. Unlike with the standard execution gas fee, users cannot specify a particular gas price or gas limit for this portion of their transaction cost. Instead, this fee is automatically deducted from the user's ETH balance on Optimism when the transaction is executed.

You can read more about this subject here, or use this tutorial (opens new window). The total fee paid by a transaction will be a combination of the normal fee estimation formula (gasPrice * gasLimit) in addition to the estimated L1 fee.

# Displaying fees

We highly recommend displaying fees on Optimism as one unified fee to minimize user confusion. You can do this by combining both portions of the fee (the L2 execution fee and the L1 data fee) into a single value presented to the end user.

# Sending "max" ETH

Many wallets allow users to send the maximum amount of ETH available in the user's balance. Of course, this requires that the predicted fee for the send transaction be deducted from the ETH balance being sent. You MUST deduct both the L2 execution fee and the L1 data fee or the charged fee plus the balance sent will exceed the user's balance and the transaction will fail.

# Displaying the gas prices

If you want to display the current gas prices, you can use the rollup_gasPrices RPC method prior to Bedrock, or eth_gasPrice in Bedrock.