Skip to main content

Overview

The OptimismBridgeFacet enables bridging of ETH and ERC20 tokens from Ethereum mainnet to Optimism using the official Optimism bridge infrastructure.

Contract Interface

Configuration Functions

initOptimism

Initializes Optimism bridge configurations for supported assets.
function initOptimism(
  Config[] configs,
  address standardBridge
) external
configs
Config[]
Array of asset-to-bridge mappings
standardBridge
address
Address of the Optimism standard bridge contract

registerOptimismBridge

Registers a new bridge for a specific asset.
function registerOptimismBridge(address assetId, address bridge) external
assetId
address
Token address to register
bridge
address
Bridge contract address

Bridging Functions

startBridgeTokensViaOptimismBridge

Bridges tokens from Ethereum to Optimism.
function startBridgeTokensViaOptimismBridge(
  BridgeData _bridgeData,
  OptimismData _optimismData
) external payable
_bridgeData
BridgeData
Standard bridge data containing transaction details
_optimismData
OptimismData
Optimism-specific bridging parameters

swapAndStartBridgeTokensViaOptimismBridge

Performs a token swap on Ethereum before bridging to Optimism.
function swapAndStartBridgeTokensViaOptimismBridge(
  BridgeData _bridgeData,
  SwapData[] _swapData,
  OptimismData _optimismData
) external payable
_bridgeData
BridgeData
Standard bridge data
_swapData
SwapData[]
Array of swap operations to execute before bridging
_optimismData
OptimismData
Optimism-specific parameters

Data Structures

OptimismData

struct OptimismData {
  address assetIdOnL2;    // Token address on L2
  uint32 l2Gas;           // L2 gas limit
  bool isSynthetix;       // Use Synthetix bridge
}

Config

struct Config {
  address assetId;  // Token address on L1
  address bridge;   // Bridge contract address
}

Usage Example

Bridging ETH to Optimism

import { OptimismBridgeFacet } from '@lifi/contract-types';

const optimismFacet = OptimismBridgeFacet__factory.connect(facetAddress, signer);

const bridgeData = {
  transactionId: '0x...',
  bridge: 'optimism',
  integrator: 'my-dapp',
  referrer: '0x0000000000000000000000000000000000000000',
  sendingAssetId: '0x0000000000000000000000000000000000000000', // Native ETH
  receiver: '0x...',
  minAmount: ethers.utils.parseEther('1'),
  destinationChainId: 10, // Optimism
  hasSourceSwaps: false,
  hasDestinationCall: false
};

const optimismData = {
  assetIdOnL2: '0x0000000000000000000000000000000000000000', // ETH on L2
  l2Gas: 200000, // Gas for L2 deposit
  isSynthetix: false
};

const tx = await optimismFacet.startBridgeTokensViaOptimismBridge(
  bridgeData,
  optimismData,
  { value: bridgeData.minAmount }
);

await tx.wait();

Bridging ERC20 Tokens

const bridgeData = {
  transactionId: '0x...',
  bridge: 'optimism',
  integrator: 'my-dapp',
  referrer: '0x0000000000000000000000000000000000000000',
  sendingAssetId: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // USDC on L1
  receiver: '0x...',
  minAmount: ethers.utils.parseUnits('1000', 6),
  destinationChainId: 10,
  hasSourceSwaps: false,
  hasDestinationCall: false
};

const optimismData = {
  assetIdOnL2: '0x7F5c764cBc14f9669B88837ca1490cCa17c31607', // USDC on Optimism
  l2Gas: 200000,
  isSynthetix: false
};

const tx = await optimismFacet.startBridgeTokensViaOptimismBridge(
  bridgeData,
  optimismData,
  { value: 0 }
);

await tx.wait();

Using Synthetix Bridge

For certain assets bridged via Synthetix:
const optimismData = {
  assetIdOnL2: '0x...', // SNX on Optimism
  l2Gas: 200000,
  isSynthetix: true // Use Synthetix bridge
};

Events

  • OptimismInitialized(Config[] configs) - Emitted when Optimism is initialized
  • OptimismBridgeRegistered(address assetId, address bridge) - Emitted when a bridge is registered
  • LiFiTransferStarted(BridgeData bridgeData)
  • AssetSwapped (when using swapAndStart variant)

Notes

  • This facet only supports bridging FROM Ethereum mainnet TO Optimism
  • Bridging typically takes ~20 minutes for finality on Optimism
  • The l2Gas parameter should typically be set to 200,000 for standard deposits
  • For custom tokens, you may need to register the bridge mapping first
  • The Synthetix bridge is used for specific Synthetix ecosystem tokens

See Also

Build docs developers (and LLMs) love