 README
      ¶
      README
      ¶
    
    
      Optimism Smart Contracts (Bedrock)
This package contains the smart contracts that compose the on-chain component of Optimism's upcoming Bedrock upgrade. We've tried to maintain 100% backwards compatibility with the existing system while also introducing new useful features. You can find detailed specifications for the contracts contained within this package here.
A style guide we follow for writing contracts can be found here.
Contracts Overview
Contracts deployed to L1
| Name | Proxy Type | Description | 
|---|---|---|
| L1CrossDomainMessenger | ResolvedDelegateProxy | High-level interface for sending messages to and receiving messages from Optimism | 
| L1StandardBridge | L1ChugSplashProxy | Standardized system for transfering ERC20 tokens to/from Optimism | 
| L2OutputOracle | Proxy | Stores commitments to the state of Optimism which can be used by contracts on L1 to access L2 state | 
| OptimismPortal | Proxy | Low-level message passing interface | 
| OptimismMintableERC20Factory | Proxy | Deploys standard OptimismMintableERC20tokens that are compatible with eitherStandardBridge | 
| ProxyAdmin | - | Contract that can upgrade L1 contracts | 
Contracts deployed to L2
| Name | Proxy Type | Description | 
|---|---|---|
| GasPriceOracle | Proxy | Stores L2 gas price configuration values | 
| L1Block | Proxy | Stores L1 block context information (e.g., latest known L1 block hash) | 
| L2CrossDomainMessenger | Proxy | High-level interface for sending messages to and receiving messages from L1 | 
| L2StandardBridge | Proxy | Standardized system for transferring ERC20 tokens to/from L1 | 
| L2ToL1MessagePasser | Proxy | Low-level message passing interface | 
| SequencerFeeVault | Proxy | Vault for L2 transaction fees | 
| OptimismMintableERC20Factory | Proxy | Deploys standard OptimismMintableERC20tokens that are compatible with eitherStandardBridge | 
| L2ProxyAdmin | - | Contract that can upgrade L2 contracts when sent a transaction from L1 | 
Legacy and deprecated contracts
| Name | Location | Proxy Type | Description | 
|---|---|---|---|
| AddressManager | L1 | - | Legacy upgrade mechanism (unused in Bedrock) | 
| DeployerWhitelist | L2 | Proxy | Legacy contract for managing allowed deployers (unused since EVM Equivalence upgrade) | 
| L1BlockNumber | L2 | Proxy | Legacy contract for accessing latest known L1 block number, replaced by L1Block | 
Installation
We export contract ABIs, contract source code, and contract deployment information for this package via npm:
npm install @eth-optimism/contracts-bedrock
Contributing
For all information about working on and contributing to Optimism's smart contracts, please see CONTRIBUTING.md
Deployment
The smart contracts are deployed using foundry with a hardhat-deploy compatibility layer. When the contracts are deployed,
they will write a temp file to disk that can then be formatted into a hardhat-deploy style artifact by calling another script.
Configuration
Create or modify a file <network-name>.json inside of the deploy-config folder.
By default, the network name will be selected automatically based on the chainid. Alternatively, the DEPLOYMENT_CONTEXT env var can be used to override the network name.
The spec for the deploy config is defined by the deployConfigSpec located inside of the hardhat.config.ts.
Execution
- Set the env vars ETH_RPC_URL,PRIVATE_KEYandETHERSCAN_API_KEYif contract verification is desired
- Deploy the contracts with forge script -vvv scripts/Deploy.s.sol:Deploy --rpc-url $ETH_RPC_URL --broadcast --private-key $PRIVATE_KEYPass the--verifyflag to verify the deployments automatically with Etherscan.
- Generate the hardhat deploy artifacts with forge script -vvv scripts/Deploy.s.sol:Deploy --sig 'sync()' --rpc-url $ETH_RPC_URL --broadcast --private-key $PRIVATE_KEY
Deploying a single contract
All of the functions for deploying a single contract are public meaning that the --sig argument to forge script can be used to
target the deployment of a single contract.