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
Array of asset-to-bridge mappings
Address of the Optimism standard bridge contract
registerOptimismBridge
Registers a new bridge for a specific asset.
function registerOptimismBridge(address assetId, address bridge) external
Token address to register
Bridging Functions
startBridgeTokensViaOptimismBridge
Bridges tokens from Ethereum to Optimism.
function startBridgeTokensViaOptimismBridge(
BridgeData _bridgeData,
OptimismData _optimismData
) external payable
Standard bridge data containing transaction details
Optimism-specific bridging parameters
Token address on Optimism (L2)
Gas limit for L2 execution
Whether using Synthetix bridge
swapAndStartBridgeTokensViaOptimismBridge
Performs a token swap on Ethereum before bridging to Optimism.
function swapAndStartBridgeTokensViaOptimismBridge(
BridgeData _bridgeData,
SwapData[] _swapData,
OptimismData _optimismData
) external payable
Array of swap operations to execute before bridging
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