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.
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 OptimismMintableERC20 tokens that are compatible with either StandardBridge |
ProxyAdmin |
- | Contract that can upgrade L1 contracts |
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 OptimismMintableERC20 tokens that are compatible with either StandardBridge |
L2ProxyAdmin |
- | Contract that can upgrade L2 contracts when sent a transaction from L1 |
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 |
We export contract ABIs, contract source code, and contract deployment information for this package via npm
:
npm install @eth-optimism/contracts-bedrock
We work on this repository with a combination of Hardhat and Foundry.
-
Install Foundry by following the instructions located here. A specific version must be used.
foundryup -C da2392e58bb8a7fefeba46b40c4df1afad8ccd22
-
Install node modules with yarn (v1) and Node.js (16+):
yarn install
yarn build
yarn test
You must have Echidna installed.
Contracts targetted for Echidna testing are located in ./contracts/echidna
Each target contract is tested with a separate yarn command, for example:
yarn echidna:aliasing
- Create or modify a file
<network-name>.ts
inside of thedeploy-config
folder. - Fill out this file according to the
deployConfigSpec
located inside of the `hardhat.config.ts - Optionally: Run
npx hardhat generate-deploy-config --network <network-name>
to generate the associated JSON file. This is required if usingop-chain-ops
.
- Copy
.env.example
into.env
- Fill out the
L1_RPC
andPRIVATE_KEY_DEPLOYER
environment variables in.env
- Run
npx hardhat deploy --network <network-name>
to deploy the L1 contracts - Run
npx hardhat etherscan-verify --network <network-name> --sleep
to verify contracts on Etherscan
We use a system called "layout locking" as a safety mechanism to prevent certain contract variables from being moved to different storage slots accidentally.
To lock a contract variable, add it to the layout-lock.json
file which has the following format:
{
"MyContractName": {
"myVariableName": {
"slot": 1,
"offset": 0,
"length": 32
}
}
}
With the above config, the validate-spacers
hardhat task will check that we have a contract called MyContractName
, that the contract has a variable named myVariableName
, and that the variable is in the correct position as defined in the lock file.
You should add things to the layout-lock.json
file when you want those variables to never change.
Layout locking should be used in combination with diffing the .storage-layout
file in CI.