Commit e8f0b356 authored by Mark Tyneway's avatar Mark Tyneway Committed by GitHub

Merge pull request #8102 from ethereum-optimism/feat/op-node-genesis

op-node: flexible L2 genesis generation
parents 8158ef07 fb0d08f3
...@@ -388,41 +388,28 @@ func (d *DeployConfig) SetDeployments(deployments *L1Deployments) { ...@@ -388,41 +388,28 @@ func (d *DeployConfig) SetDeployments(deployments *L1Deployments) {
} }
// GetDeployedAddresses will get the deployed addresses of deployed L1 contracts // GetDeployedAddresses will get the deployed addresses of deployed L1 contracts
// required for the L2 genesis creation. Legacy systems use the `Proxy__` prefix // required for the L2 genesis creation.
// while modern systems use the `Proxy` suffix. First check for the legacy
// deployments so that this works with upgrading a system.
func (d *DeployConfig) GetDeployedAddresses(hh *hardhat.Hardhat) error { func (d *DeployConfig) GetDeployedAddresses(hh *hardhat.Hardhat) error {
var err error
if d.L1StandardBridgeProxy == (common.Address{}) { if d.L1StandardBridgeProxy == (common.Address{}) {
var l1StandardBridgeProxyDeployment *hardhat.Deployment l1StandardBridgeProxyDeployment, err := hh.GetDeployment("L1StandardBridgeProxy")
l1StandardBridgeProxyDeployment, err = hh.GetDeployment("Proxy__OVM_L1StandardBridge") if err != nil {
if errors.Is(err, hardhat.ErrCannotFindDeployment) { return fmt.Errorf("cannot find L1StandardBridgeProxy artifact: %w", err)
l1StandardBridgeProxyDeployment, err = hh.GetDeployment("L1StandardBridgeProxy")
if err != nil {
return err
}
} }
d.L1StandardBridgeProxy = l1StandardBridgeProxyDeployment.Address d.L1StandardBridgeProxy = l1StandardBridgeProxyDeployment.Address
} }
if d.L1CrossDomainMessengerProxy == (common.Address{}) { if d.L1CrossDomainMessengerProxy == (common.Address{}) {
var l1CrossDomainMessengerProxyDeployment *hardhat.Deployment l1CrossDomainMessengerProxyDeployment, err := hh.GetDeployment("L1CrossDomainMessengerProxy")
l1CrossDomainMessengerProxyDeployment, err = hh.GetDeployment("Proxy__OVM_L1CrossDomainMessenger") if err != nil {
if errors.Is(err, hardhat.ErrCannotFindDeployment) { return fmt.Errorf("cannot find L1CrossDomainMessengerProxy artifact: %w", err)
l1CrossDomainMessengerProxyDeployment, err = hh.GetDeployment("L1CrossDomainMessengerProxy")
if err != nil {
return err
}
} }
d.L1CrossDomainMessengerProxy = l1CrossDomainMessengerProxyDeployment.Address d.L1CrossDomainMessengerProxy = l1CrossDomainMessengerProxyDeployment.Address
} }
if d.L1ERC721BridgeProxy == (common.Address{}) { if d.L1ERC721BridgeProxy == (common.Address{}) {
// There is no legacy deployment of this contract
l1ERC721BridgeProxyDeployment, err := hh.GetDeployment("L1ERC721BridgeProxy") l1ERC721BridgeProxyDeployment, err := hh.GetDeployment("L1ERC721BridgeProxy")
if err != nil { if err != nil {
return err return fmt.Errorf("cannot find L1ERC721BridgeProxy artifact: %w", err)
} }
d.L1ERC721BridgeProxy = l1ERC721BridgeProxyDeployment.Address d.L1ERC721BridgeProxy = l1ERC721BridgeProxyDeployment.Address
} }
...@@ -430,7 +417,7 @@ func (d *DeployConfig) GetDeployedAddresses(hh *hardhat.Hardhat) error { ...@@ -430,7 +417,7 @@ func (d *DeployConfig) GetDeployedAddresses(hh *hardhat.Hardhat) error {
if d.SystemConfigProxy == (common.Address{}) { if d.SystemConfigProxy == (common.Address{}) {
systemConfigProxyDeployment, err := hh.GetDeployment("SystemConfigProxy") systemConfigProxyDeployment, err := hh.GetDeployment("SystemConfigProxy")
if err != nil { if err != nil {
return err return fmt.Errorf("cannot find SystemConfigProxy artifact: %w", err)
} }
d.SystemConfigProxy = systemConfigProxyDeployment.Address d.SystemConfigProxy = systemConfigProxyDeployment.Address
} }
...@@ -438,7 +425,7 @@ func (d *DeployConfig) GetDeployedAddresses(hh *hardhat.Hardhat) error { ...@@ -438,7 +425,7 @@ func (d *DeployConfig) GetDeployedAddresses(hh *hardhat.Hardhat) error {
if d.OptimismPortalProxy == (common.Address{}) { if d.OptimismPortalProxy == (common.Address{}) {
optimismPortalProxyDeployment, err := hh.GetDeployment("OptimismPortalProxy") optimismPortalProxyDeployment, err := hh.GetDeployment("OptimismPortalProxy")
if err != nil { if err != nil {
return err return fmt.Errorf("cannot find OptimismPortalProxy artifact: %w", err)
} }
d.OptimismPortalProxy = optimismPortalProxyDeployment.Address d.OptimismPortalProxy = optimismPortalProxyDeployment.Address
} }
......
...@@ -28,7 +28,7 @@ var Subcommands = cli.Commands{ ...@@ -28,7 +28,7 @@ var Subcommands = cli.Commands{
Flags: []cli.Flag{ Flags: []cli.Flag{
&cli.StringFlag{ &cli.StringFlag{
Name: "deploy-config", Name: "deploy-config",
Usage: "Path to hardhat deploy config file", Usage: "Path to deploy config file",
Required: true, Required: true,
}, },
&cli.StringFlag{ &cli.StringFlag{
...@@ -91,18 +91,26 @@ var Subcommands = cli.Commands{ ...@@ -91,18 +91,26 @@ var Subcommands = cli.Commands{
{ {
Name: "l2", Name: "l2",
Usage: "Generates an L2 genesis file and rollup config suitable for a deployed network", Usage: "Generates an L2 genesis file and rollup config suitable for a deployed network",
Description: "Generating the L2 genesis depends on knowledge of L1 contract addresses for the bridge to be secure. " +
"A deploy config and either a deployment directory or an L1 deployments file are used to create the L2 genesis. " +
"The deploy directory and L1 deployments file are generated by the L1 contract deployments.",
Flags: []cli.Flag{ Flags: []cli.Flag{
&cli.StringFlag{ &cli.StringFlag{
Name: "l1-rpc", Name: "l1-rpc",
Usage: "L1 RPC URL", Usage: "L1 RPC URL",
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "deploy-config", Name: "deploy-config",
Usage: "Path to deploy config file", Usage: "Path to deploy config file",
Required: true,
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "deployment-dir", Name: "deployment-dir",
Usage: "Path to network deployment directory", Usage: "Path to network deployment directory. Cannot be used with --l1-deployments",
},
&cli.StringFlag{
Name: "l1-deployments",
Usage: "Path to L1 deployments JSON file. Cannot be used with --deployment-dir",
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "outfile.l2", Name: "outfile.l2",
...@@ -122,20 +130,36 @@ var Subcommands = cli.Commands{ ...@@ -122,20 +130,36 @@ var Subcommands = cli.Commands{
} }
deployDir := ctx.String("deployment-dir") deployDir := ctx.String("deployment-dir")
if deployDir == "" { l1Deployments := ctx.String("l1-deployments")
return errors.New("Must specify --deployment-dir")
if deployDir != "" && l1Deployments != "" {
return errors.New("cannot specify both --deployment-dir and --l1-deployments")
}
if deployDir == "" && l1Deployments == "" {
return errors.New("must specify either --deployment-dir or --l1-deployments")
} }
log.Info("Deployment directory", "path", deployDir) if deployDir != "" {
depPath, network := filepath.Split(deployDir) log.Info("Deployment directory", "path", deployDir)
hh, err := hardhat.New(network, nil, []string{depPath}) depPath, network := filepath.Split(deployDir)
if err != nil { hh, err := hardhat.New(network, nil, []string{depPath})
return err if err != nil {
return err
}
// Read the appropriate deployment addresses from disk
if err := config.GetDeployedAddresses(hh); err != nil {
return err
}
} }
// Read the appropriate deployment addresses from disk if l1Deployments != "" {
if err := config.GetDeployedAddresses(hh); err != nil { log.Info("L1 deployments", "path", l1Deployments)
return err deployments, err := genesis.NewL1Deployments(l1Deployments)
if err != nil {
return err
}
config.SetDeployments(deployments)
} }
client, err := ethclient.Dial(ctx.String("l1-rpc")) client, err := ethclient.Dial(ctx.String("l1-rpc"))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment