The Bootstrap Commands

Bootstrap commands are used to deploy global singletons and implementation contracts for use with future invocations of apply. Most users won't need to use these commands, since op-deployer apply will automatically use predeployed contracts if they are available. However, you may need to use bootstrap commands if you're deploying chains to an L1 that isn't natively supported by op-deployer.

There are several bootstrap commands available, which you can view by running op-deployer bootstrap --help. We'll focus on the most important ones below.

Implementations

You can bootstrap implementations by running a command like this:

op-deployer bootstrap implementations \
  --artifacts-locator <locator> \ 
  --l1-contracts-release op-contracts/<your-release> \
  --l1-rpc-url <rpc url> \
  --mips-version <1 or 2, for MIPS32 or MIPS64> \
  --private-key <some private key> \ 
  --protocol-versions-proxy <protocol versions proxy address> \
  --superchain-config-proxy <superchain config proxy address> \
  --upgrade-controller <upgrade controller address>

This command will deploy implementations, blueprints, and the OPCM. Deployments are (for the most part) deterministic, so contracts will only be deployed once per chain as long as the implementation and constructor args remain the same. This applies to the op-deployer apply pipeline - that is, if someone else ran op-deployer boostrap implementations at some point on a given L1 chain, then the apply pipeline will re-use those implementations.

The command will output a JSON like the one below:

{
  "Opcm": "0x4eeb114aaf812e21285e5b076030110e7e18fed9",
  "DelayedWETHImpl": "0x5e40b9231b86984b5150507046e354dbfbed3d9e",
  "OptimismPortalImpl": "0x2d7e764a0d9919e16983a46595cfa81fc34fa7cd",
  "PreimageOracleSingleton": "0x1fb8cdfc6831fc866ed9c51af8817da5c287add3",
  "MipsSingleton": "0xf027f4a985560fb13324e943edf55ad6f1d15dc1",
  "SystemConfigImpl": "0x760c48c62a85045a6b69f07f4a9f22868659cbcc",
  "L1CrossDomainMessengerImpl": "0x3ea6084748ed1b2a9b5d4426181f1ad8c93f6231",
  "L1ERC721BridgeImpl": "0x276d3730f219f7ec22274f7263180b8452b46d47",
  "L1StandardBridgeImpl": "0x78972e88ab8bbb517a36caea23b931bab58ad3c6",
  "OptimismMintableERC20FactoryImpl": "0x5493f4677a186f64805fe7317d6993ba4863988f",
  "DisputeGameFactoryImpl": "0x4bba758f006ef09402ef31724203f316ab74e4a0",
  "AnchorStateRegistryImpl": "0x7b465370bb7a333f99edd19599eb7fb1c2d3f8d2",
  "SuperchainConfigImpl": "0x4da82a327773965b8d4d85fa3db8249b387458e7",
  "ProtocolVersionsImpl": "0x37e15e4d6dffa9e5e320ee1ec036922e563cb76c"
}

It is safe to call this command from a hot wallet. None of the contracts deployed by this command are "ownable," so the deployment address has no further control over the system.