Commit d6106dde authored by Matthew Slipper's avatar Matthew Slipper Committed by GitHub

op-deployer: Support output files in bootstrap (#13302)

* op-deployer: Support output files in bootstrap

* lint
parent a2e7d852
...@@ -73,6 +73,7 @@ func AsteriscCLI(cliCtx *cli.Context) error { ...@@ -73,6 +73,7 @@ func AsteriscCLI(cliCtx *cli.Context) error {
l := oplog.NewLogger(oplog.AppOut(cliCtx), logCfg) l := oplog.NewLogger(oplog.AppOut(cliCtx), logCfg)
oplog.SetGlobalLogHandler(l.Handler()) oplog.SetGlobalLogHandler(l.Handler())
outfile := cliCtx.String(OutfileFlagName)
l1RPCUrl := cliCtx.String(deployer.L1RPCURLFlagName) l1RPCUrl := cliCtx.String(deployer.L1RPCURLFlagName)
privateKey := cliCtx.String(deployer.PrivateKeyFlagName) privateKey := cliCtx.String(deployer.PrivateKeyFlagName)
artifactsURLStr := cliCtx.String(ArtifactsLocatorFlagName) artifactsURLStr := cliCtx.String(ArtifactsLocatorFlagName)
...@@ -85,18 +86,27 @@ func AsteriscCLI(cliCtx *cli.Context) error { ...@@ -85,18 +86,27 @@ func AsteriscCLI(cliCtx *cli.Context) error {
ctx := ctxinterrupt.WithCancelOnInterrupt(cliCtx.Context) ctx := ctxinterrupt.WithCancelOnInterrupt(cliCtx.Context)
return Asterisc(ctx, AsteriscConfig{ dao, err := Asterisc(ctx, AsteriscConfig{
L1RPCUrl: l1RPCUrl, L1RPCUrl: l1RPCUrl,
PrivateKey: privateKey, PrivateKey: privateKey,
Logger: l, Logger: l,
ArtifactsLocator: artifactsLocator, ArtifactsLocator: artifactsLocator,
PreimageOracle: preimageOracle, PreimageOracle: preimageOracle,
}) })
if err != nil {
return fmt.Errorf("failed to deploy Asterisc: %w", err)
}
if err := jsonutil.WriteJSON(dao, ioutil.ToStdOutOrFileOrNoop(outfile, 0o755)); err != nil {
return fmt.Errorf("failed to write output: %w", err)
}
return nil
} }
func Asterisc(ctx context.Context, cfg AsteriscConfig) error { func Asterisc(ctx context.Context, cfg AsteriscConfig) (opcm.DeployAsteriscOutput, error) {
var dao opcm.DeployAsteriscOutput
if err := cfg.Check(); err != nil { if err := cfg.Check(); err != nil {
return fmt.Errorf("invalid config for Asterisc: %w", err) return dao, fmt.Errorf("invalid config for Asterisc: %w", err)
} }
lgr := cfg.Logger lgr := cfg.Logger
...@@ -106,7 +116,7 @@ func Asterisc(ctx context.Context, cfg AsteriscConfig) error { ...@@ -106,7 +116,7 @@ func Asterisc(ctx context.Context, cfg AsteriscConfig) error {
artifactsFS, cleanup, err := artifacts.Download(ctx, cfg.ArtifactsLocator, progressor) artifactsFS, cleanup, err := artifacts.Download(ctx, cfg.ArtifactsLocator, progressor)
if err != nil { if err != nil {
return fmt.Errorf("failed to download artifacts: %w", err) return dao, fmt.Errorf("failed to download artifacts: %w", err)
} }
defer func() { defer func() {
if err := cleanup(); err != nil { if err := cleanup(); err != nil {
...@@ -116,12 +126,12 @@ func Asterisc(ctx context.Context, cfg AsteriscConfig) error { ...@@ -116,12 +126,12 @@ func Asterisc(ctx context.Context, cfg AsteriscConfig) error {
l1Client, err := ethclient.Dial(cfg.L1RPCUrl) l1Client, err := ethclient.Dial(cfg.L1RPCUrl)
if err != nil { if err != nil {
return fmt.Errorf("failed to connect to L1 RPC: %w", err) return dao, fmt.Errorf("failed to connect to L1 RPC: %w", err)
} }
chainID, err := l1Client.ChainID(ctx) chainID, err := l1Client.ChainID(ctx)
if err != nil { if err != nil {
return fmt.Errorf("failed to get chain ID: %w", err) return dao, fmt.Errorf("failed to get chain ID: %w", err)
} }
signer := opcrypto.SignerFnFromBind(opcrypto.PrivateKeySignerFn(cfg.privateKeyECDSA, chainID)) signer := opcrypto.SignerFnFromBind(opcrypto.PrivateKeySignerFn(cfg.privateKeyECDSA, chainID))
...@@ -135,12 +145,12 @@ func Asterisc(ctx context.Context, cfg AsteriscConfig) error { ...@@ -135,12 +145,12 @@ func Asterisc(ctx context.Context, cfg AsteriscConfig) error {
From: chainDeployer, From: chainDeployer,
}) })
if err != nil { if err != nil {
return fmt.Errorf("failed to create broadcaster: %w", err) return dao, fmt.Errorf("failed to create broadcaster: %w", err)
} }
l1RPC, err := rpc.Dial(cfg.L1RPCUrl) l1RPC, err := rpc.Dial(cfg.L1RPCUrl)
if err != nil { if err != nil {
return fmt.Errorf("failed to connect to L1 RPC: %w", err) return dao, fmt.Errorf("failed to connect to L1 RPC: %w", err)
} }
l1Host, err := env.DefaultForkedScriptHost( l1Host, err := env.DefaultForkedScriptHost(
...@@ -152,27 +162,23 @@ func Asterisc(ctx context.Context, cfg AsteriscConfig) error { ...@@ -152,27 +162,23 @@ func Asterisc(ctx context.Context, cfg AsteriscConfig) error {
l1RPC, l1RPC,
) )
if err != nil { if err != nil {
return fmt.Errorf("failed to create script host: %w", err) return dao, fmt.Errorf("failed to create script host: %w", err)
} }
dgo, err := opcm.DeployAsterisc( dao, err = opcm.DeployAsterisc(
l1Host, l1Host,
opcm.DeployAsteriscInput{ opcm.DeployAsteriscInput{
PreimageOracle: cfg.PreimageOracle, PreimageOracle: cfg.PreimageOracle,
}, },
) )
if err != nil { if err != nil {
return fmt.Errorf("error deploying asterisc VM: %w", err) return dao, fmt.Errorf("error deploying asterisc VM: %w", err)
} }
if _, err := bcaster.Broadcast(ctx); err != nil { if _, err := bcaster.Broadcast(ctx); err != nil {
return fmt.Errorf("failed to broadcast: %w", err) return dao, fmt.Errorf("failed to broadcast: %w", err)
} }
lgr.Info("deployed asterisc VM") lgr.Info("deployed asterisc VM")
return dao, nil
if err := jsonutil.WriteJSON(dgo, ioutil.ToStdOut()); err != nil {
return fmt.Errorf("failed to write output: %w", err)
}
return nil
} }
...@@ -71,6 +71,7 @@ func DelayedWETHCLI(cliCtx *cli.Context) error { ...@@ -71,6 +71,7 @@ func DelayedWETHCLI(cliCtx *cli.Context) error {
l := oplog.NewLogger(oplog.AppOut(cliCtx), logCfg) l := oplog.NewLogger(oplog.AppOut(cliCtx), logCfg)
oplog.SetGlobalLogHandler(l.Handler()) oplog.SetGlobalLogHandler(l.Handler())
outfile := cliCtx.String(OutfileFlagName)
config, err := NewDelayedWETHConfigFromClI(cliCtx, l) config, err := NewDelayedWETHConfigFromClI(cliCtx, l)
if err != nil { if err != nil {
return err return err
...@@ -78,7 +79,15 @@ func DelayedWETHCLI(cliCtx *cli.Context) error { ...@@ -78,7 +79,15 @@ func DelayedWETHCLI(cliCtx *cli.Context) error {
ctx := ctxinterrupt.WithCancelOnInterrupt(cliCtx.Context) ctx := ctxinterrupt.WithCancelOnInterrupt(cliCtx.Context)
return DelayedWETH(ctx, config) dwo, err := DelayedWETH(ctx, config)
if err != nil {
return fmt.Errorf("failed to deploy DelayedWETH: %w", err)
}
if err := jsonutil.WriteJSON(dwo, ioutil.ToStdOutOrFileOrNoop(outfile, 0o755)); err != nil {
return fmt.Errorf("failed to write output: %w", err)
}
return nil
} }
func NewDelayedWETHConfigFromClI(cliCtx *cli.Context, l log.Logger) (DelayedWETHConfig, error) { func NewDelayedWETHConfigFromClI(cliCtx *cli.Context, l log.Logger) (DelayedWETHConfig, error) {
...@@ -100,9 +109,10 @@ func NewDelayedWETHConfigFromClI(cliCtx *cli.Context, l log.Logger) (DelayedWETH ...@@ -100,9 +109,10 @@ func NewDelayedWETHConfigFromClI(cliCtx *cli.Context, l log.Logger) (DelayedWETH
return config, nil return config, nil
} }
func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error { func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) (opcm.DeployDelayedWETHOutput, error) {
var dwo opcm.DeployDelayedWETHOutput
if err := cfg.Check(); err != nil { if err := cfg.Check(); err != nil {
return fmt.Errorf("invalid config for DelayedWETH: %w", err) return dwo, fmt.Errorf("invalid config for DelayedWETH: %w", err)
} }
lgr := cfg.Logger lgr := cfg.Logger
...@@ -112,7 +122,7 @@ func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error { ...@@ -112,7 +122,7 @@ func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error {
artifactsFS, cleanup, err := artifacts2.Download(ctx, cfg.ArtifactsLocator, progressor) artifactsFS, cleanup, err := artifacts2.Download(ctx, cfg.ArtifactsLocator, progressor)
if err != nil { if err != nil {
return fmt.Errorf("failed to download artifacts: %w", err) return dwo, fmt.Errorf("failed to download artifacts: %w", err)
} }
defer func() { defer func() {
if err := cleanup(); err != nil { if err := cleanup(); err != nil {
...@@ -122,26 +132,26 @@ func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error { ...@@ -122,26 +132,26 @@ func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error {
l1Client, err := ethclient.Dial(cfg.L1RPCUrl) l1Client, err := ethclient.Dial(cfg.L1RPCUrl)
if err != nil { if err != nil {
return fmt.Errorf("failed to connect to L1 RPC: %w", err) return dwo, fmt.Errorf("failed to connect to L1 RPC: %w", err)
} }
chainID, err := l1Client.ChainID(ctx) chainID, err := l1Client.ChainID(ctx)
if err != nil { if err != nil {
return fmt.Errorf("failed to get chain ID: %w", err) return dwo, fmt.Errorf("failed to get chain ID: %w", err)
} }
chainIDU64 := chainID.Uint64() chainIDU64 := chainID.Uint64()
superCfg, err := standard.SuperchainFor(chainIDU64) superCfg, err := standard.SuperchainFor(chainIDU64)
if err != nil { if err != nil {
return fmt.Errorf("error getting superchain config: %w", err) return dwo, fmt.Errorf("error getting superchain config: %w", err)
} }
proxyAdmin, err := standard.ManagerOwnerAddrFor(chainIDU64) proxyAdmin, err := standard.ManagerOwnerAddrFor(chainIDU64)
if err != nil { if err != nil {
return fmt.Errorf("error getting superchain proxy admin: %w", err) return dwo, fmt.Errorf("error getting superchain proxy admin: %w", err)
} }
delayedWethOwner, err := standard.SystemOwnerAddrFor(chainIDU64) delayedWethOwner, err := standard.SystemOwnerAddrFor(chainIDU64)
if err != nil { if err != nil {
return fmt.Errorf("error getting superchain system owner: %w", err) return dwo, fmt.Errorf("error getting superchain system owner: %w", err)
} }
signer := opcrypto.SignerFnFromBind(opcrypto.PrivateKeySignerFn(cfg.privateKeyECDSA, chainID)) signer := opcrypto.SignerFnFromBind(opcrypto.PrivateKeySignerFn(cfg.privateKeyECDSA, chainID))
...@@ -155,12 +165,12 @@ func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error { ...@@ -155,12 +165,12 @@ func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error {
From: chainDeployer, From: chainDeployer,
}) })
if err != nil { if err != nil {
return fmt.Errorf("failed to create broadcaster: %w", err) return dwo, fmt.Errorf("failed to create broadcaster: %w", err)
} }
l1RPC, err := rpc.Dial(cfg.L1RPCUrl) l1RPC, err := rpc.Dial(cfg.L1RPCUrl)
if err != nil { if err != nil {
return fmt.Errorf("failed to connect to L1 RPC: %w", err) return dwo, fmt.Errorf("failed to connect to L1 RPC: %w", err)
} }
host, err := env.DefaultForkedScriptHost( host, err := env.DefaultForkedScriptHost(
...@@ -172,7 +182,7 @@ func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error { ...@@ -172,7 +182,7 @@ func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error {
l1RPC, l1RPC,
) )
if err != nil { if err != nil {
return fmt.Errorf("failed to create script host: %w", err) return dwo, fmt.Errorf("failed to create script host: %w", err)
} }
var release string var release string
...@@ -186,7 +196,7 @@ func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error { ...@@ -186,7 +196,7 @@ func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error {
superchainConfigAddr := common.Address(*superCfg.Config.SuperchainConfigAddr) superchainConfigAddr := common.Address(*superCfg.Config.SuperchainConfigAddr)
dwo, err := opcm.DeployDelayedWETH( dwo, err = opcm.DeployDelayedWETH(
host, host,
opcm.DeployDelayedWETHInput{ opcm.DeployDelayedWETHInput{
Release: release, Release: release,
...@@ -198,17 +208,13 @@ func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error { ...@@ -198,17 +208,13 @@ func DelayedWETH(ctx context.Context, cfg DelayedWETHConfig) error {
}, },
) )
if err != nil { if err != nil {
return fmt.Errorf("error deploying DelayedWETH: %w", err) return dwo, fmt.Errorf("error deploying DelayedWETH: %w", err)
} }
if _, err := bcaster.Broadcast(ctx); err != nil { if _, err := bcaster.Broadcast(ctx); err != nil {
return fmt.Errorf("failed to broadcast: %w", err) return dwo, fmt.Errorf("failed to broadcast: %w", err)
} }
lgr.Info("deployed DelayedWETH") lgr.Info("deployed DelayedWETH")
return dwo, nil
if err := jsonutil.WriteJSON(dwo, ioutil.ToStdOut()); err != nil {
return fmt.Errorf("failed to write output: %w", err)
}
return nil
} }
...@@ -83,12 +83,22 @@ func DisputeGameCLI(cliCtx *cli.Context) error { ...@@ -83,12 +83,22 @@ func DisputeGameCLI(cliCtx *cli.Context) error {
l := oplog.NewLogger(oplog.AppOut(cliCtx), logCfg) l := oplog.NewLogger(oplog.AppOut(cliCtx), logCfg)
oplog.SetGlobalLogHandler(l.Handler()) oplog.SetGlobalLogHandler(l.Handler())
outfile := cliCtx.String(OutfileFlagName)
cfg, err := NewDisputeGameConfigFromCLI(cliCtx, l) cfg, err := NewDisputeGameConfigFromCLI(cliCtx, l)
if err != nil { if err != nil {
return err return err
} }
ctx := ctxinterrupt.WithCancelOnInterrupt(cliCtx.Context) ctx := ctxinterrupt.WithCancelOnInterrupt(cliCtx.Context)
return DisputeGame(ctx, cfg) dgo, err := DisputeGame(ctx, cfg)
if err != nil {
return fmt.Errorf("failed to deploy dispute game: %w", err)
}
if err := jsonutil.WriteJSON(dgo, ioutil.ToStdOutOrFileOrNoop(outfile, 0o755)); err != nil {
return fmt.Errorf("failed to write output: %w", err)
}
return nil
} }
func NewDisputeGameConfigFromCLI(cliCtx *cli.Context, l log.Logger) (DisputeGameConfig, error) { func NewDisputeGameConfigFromCLI(cliCtx *cli.Context, l log.Logger) (DisputeGameConfig, error) {
...@@ -123,9 +133,10 @@ func NewDisputeGameConfigFromCLI(cliCtx *cli.Context, l log.Logger) (DisputeGame ...@@ -123,9 +133,10 @@ func NewDisputeGameConfigFromCLI(cliCtx *cli.Context, l log.Logger) (DisputeGame
return cfg, nil return cfg, nil
} }
func DisputeGame(ctx context.Context, cfg DisputeGameConfig) error { func DisputeGame(ctx context.Context, cfg DisputeGameConfig) (opcm.DeployDisputeGameOutput, error) {
var dgo opcm.DeployDisputeGameOutput
if err := cfg.Check(); err != nil { if err := cfg.Check(); err != nil {
return fmt.Errorf("invalid config for DisputeGame: %w", err) return dgo, fmt.Errorf("invalid config for DisputeGame: %w", err)
} }
lgr := cfg.Logger lgr := cfg.Logger
...@@ -135,7 +146,7 @@ func DisputeGame(ctx context.Context, cfg DisputeGameConfig) error { ...@@ -135,7 +146,7 @@ func DisputeGame(ctx context.Context, cfg DisputeGameConfig) error {
artifactsFS, cleanup, err := artifacts2.Download(ctx, cfg.ArtifactsLocator, progressor) artifactsFS, cleanup, err := artifacts2.Download(ctx, cfg.ArtifactsLocator, progressor)
if err != nil { if err != nil {
return fmt.Errorf("failed to download artifacts: %w", err) return dgo, fmt.Errorf("failed to download artifacts: %w", err)
} }
defer func() { defer func() {
if err := cleanup(); err != nil { if err := cleanup(); err != nil {
...@@ -145,22 +156,22 @@ func DisputeGame(ctx context.Context, cfg DisputeGameConfig) error { ...@@ -145,22 +156,22 @@ func DisputeGame(ctx context.Context, cfg DisputeGameConfig) error {
l1Client, err := ethclient.Dial(cfg.L1RPCUrl) l1Client, err := ethclient.Dial(cfg.L1RPCUrl)
if err != nil { if err != nil {
return fmt.Errorf("failed to connect to L1 RPC: %w", err) return dgo, fmt.Errorf("failed to connect to L1 RPC: %w", err)
} }
l1Rpc, err := rpc.Dial(cfg.L1RPCUrl) l1Rpc, err := rpc.Dial(cfg.L1RPCUrl)
if err != nil { if err != nil {
return fmt.Errorf("failed to connect to L1 RPC: %w", err) return dgo, fmt.Errorf("failed to connect to L1 RPC: %w", err)
} }
chainID, err := l1Client.ChainID(ctx) chainID, err := l1Client.ChainID(ctx)
if err != nil { if err != nil {
return fmt.Errorf("failed to get chain ID: %w", err) return dgo, fmt.Errorf("failed to get chain ID: %w", err)
} }
chainIDU64 := chainID.Uint64() chainIDU64 := chainID.Uint64()
standardVersionsTOML, err := standard.L1VersionsDataFor(chainIDU64) standardVersionsTOML, err := standard.L1VersionsDataFor(chainIDU64)
if err != nil { if err != nil {
return fmt.Errorf("error getting standard versions TOML: %w", err) return dgo, fmt.Errorf("error getting standard versions TOML: %w", err)
} }
signer := opcrypto.SignerFnFromBind(opcrypto.PrivateKeySignerFn(cfg.privateKeyECDSA, chainID)) signer := opcrypto.SignerFnFromBind(opcrypto.PrivateKeySignerFn(cfg.privateKeyECDSA, chainID))
...@@ -174,7 +185,7 @@ func DisputeGame(ctx context.Context, cfg DisputeGameConfig) error { ...@@ -174,7 +185,7 @@ func DisputeGame(ctx context.Context, cfg DisputeGameConfig) error {
From: chainDeployer, From: chainDeployer,
}) })
if err != nil { if err != nil {
return fmt.Errorf("failed to create broadcaster: %w", err) return dgo, fmt.Errorf("failed to create broadcaster: %w", err)
} }
host, err := env.DefaultForkedScriptHost( host, err := env.DefaultForkedScriptHost(
...@@ -186,7 +197,7 @@ func DisputeGame(ctx context.Context, cfg DisputeGameConfig) error { ...@@ -186,7 +197,7 @@ func DisputeGame(ctx context.Context, cfg DisputeGameConfig) error {
l1Rpc, l1Rpc,
) )
if err != nil { if err != nil {
return fmt.Errorf("failed to create L1 script host: %w", err) return dgo, fmt.Errorf("failed to create L1 script host: %w", err)
} }
var release string var release string
...@@ -197,7 +208,8 @@ func DisputeGame(ctx context.Context, cfg DisputeGameConfig) error { ...@@ -197,7 +208,8 @@ func DisputeGame(ctx context.Context, cfg DisputeGameConfig) error {
} }
lgr.Info("deploying dispute game", "release", release) lgr.Info("deploying dispute game", "release", release)
dgo, err := opcm.DeployDisputeGame(
dgo, err = opcm.DeployDisputeGame(
host, host,
opcm.DeployDisputeGameInput{ opcm.DeployDisputeGameInput{
Release: release, Release: release,
...@@ -218,17 +230,13 @@ func DisputeGame(ctx context.Context, cfg DisputeGameConfig) error { ...@@ -218,17 +230,13 @@ func DisputeGame(ctx context.Context, cfg DisputeGameConfig) error {
}, },
) )
if err != nil { if err != nil {
return fmt.Errorf("error deploying dispute game: %w", err) return dgo, fmt.Errorf("error deploying dispute game: %w", err)
} }
if _, err := bcaster.Broadcast(ctx); err != nil { if _, err := bcaster.Broadcast(ctx); err != nil {
return fmt.Errorf("failed to broadcast: %w", err) return dgo, fmt.Errorf("failed to broadcast: %w", err)
} }
lgr.Info("deployed dispute game") lgr.Info("deployed dispute game")
return dgo, nil
if err := jsonutil.WriteJSON(dgo, ioutil.ToStdOut()); err != nil {
return fmt.Errorf("failed to write output: %w", err)
}
return nil
} }
...@@ -11,6 +11,7 @@ import ( ...@@ -11,6 +11,7 @@ import (
) )
const ( const (
OutfileFlagName = "outfile"
ArtifactsLocatorFlagName = "artifacts-locator" ArtifactsLocatorFlagName = "artifacts-locator"
WithdrawalDelaySecondsFlagName = "withdrawal-delay-seconds" WithdrawalDelaySecondsFlagName = "withdrawal-delay-seconds"
MinProposalSizeBytesFlagName = "min-proposal-size-bytes" MinProposalSizeBytesFlagName = "min-proposal-size-bytes"
...@@ -44,6 +45,12 @@ const ( ...@@ -44,6 +45,12 @@ const (
) )
var ( var (
OutfileFlag = &cli.StringFlag{
Name: OutfileFlagName,
Usage: "Output file. Use - for stdout.",
EnvVars: deployer.PrefixEnvVar("OUTFILE"),
Value: "-",
}
ArtifactsLocatorFlag = &cli.StringFlag{ ArtifactsLocatorFlag = &cli.StringFlag{
Name: ArtifactsLocatorFlagName, Name: ArtifactsLocatorFlagName,
Usage: "Locator for artifacts.", Usage: "Locator for artifacts.",
...@@ -221,6 +228,7 @@ var OPCMFlags = []cli.Flag{ ...@@ -221,6 +228,7 @@ var OPCMFlags = []cli.Flag{
deployer.L1RPCURLFlag, deployer.L1RPCURLFlag,
deployer.PrivateKeyFlag, deployer.PrivateKeyFlag,
ReleaseFlag, ReleaseFlag,
OutfileFlag,
} }
var ImplementationsFlags = []cli.Flag{ var ImplementationsFlags = []cli.Flag{
...@@ -235,6 +243,7 @@ var ImplementationsFlags = []cli.Flag{ ...@@ -235,6 +243,7 @@ var ImplementationsFlags = []cli.Flag{
var DelayedWETHFlags = []cli.Flag{ var DelayedWETHFlags = []cli.Flag{
deployer.L1RPCURLFlag, deployer.L1RPCURLFlag,
deployer.PrivateKeyFlag, deployer.PrivateKeyFlag,
OutfileFlag,
ArtifactsLocatorFlag, ArtifactsLocatorFlag,
DelayedWethImplFlag, DelayedWethImplFlag,
} }
...@@ -242,6 +251,7 @@ var DelayedWETHFlags = []cli.Flag{ ...@@ -242,6 +251,7 @@ var DelayedWETHFlags = []cli.Flag{
var DisputeGameFlags = []cli.Flag{ var DisputeGameFlags = []cli.Flag{
deployer.L1RPCURLFlag, deployer.L1RPCURLFlag,
deployer.PrivateKeyFlag, deployer.PrivateKeyFlag,
OutfileFlag,
ArtifactsLocatorFlag, ArtifactsLocatorFlag,
MinProposalSizeBytesFlag, MinProposalSizeBytesFlag,
ChallengePeriodSecondsFlag, ChallengePeriodSecondsFlag,
...@@ -263,6 +273,7 @@ var DisputeGameFlags = []cli.Flag{ ...@@ -263,6 +273,7 @@ var DisputeGameFlags = []cli.Flag{
var BaseFPVMFlags = []cli.Flag{ var BaseFPVMFlags = []cli.Flag{
deployer.L1RPCURLFlag, deployer.L1RPCURLFlag,
deployer.PrivateKeyFlag, deployer.PrivateKeyFlag,
OutfileFlag,
ArtifactsLocatorFlag, ArtifactsLocatorFlag,
PreimageOracleFlag, PreimageOracleFlag,
} }
...@@ -274,6 +285,7 @@ var AsteriscFlags = BaseFPVMFlags ...@@ -274,6 +285,7 @@ var AsteriscFlags = BaseFPVMFlags
var ProxyFlags = []cli.Flag{ var ProxyFlags = []cli.Flag{
deployer.L1RPCURLFlag, deployer.L1RPCURLFlag,
deployer.PrivateKeyFlag, deployer.PrivateKeyFlag,
OutfileFlag,
ArtifactsLocatorFlag, ArtifactsLocatorFlag,
ProxyOwnerFlag, ProxyOwnerFlag,
} }
...@@ -281,6 +293,7 @@ var ProxyFlags = []cli.Flag{ ...@@ -281,6 +293,7 @@ var ProxyFlags = []cli.Flag{
var SuperchainFlags = []cli.Flag{ var SuperchainFlags = []cli.Flag{
deployer.L1RPCURLFlag, deployer.L1RPCURLFlag,
deployer.PrivateKeyFlag, deployer.PrivateKeyFlag,
OutfileFlag,
ArtifactsLocatorFlag, ArtifactsLocatorFlag,
SuperchainProxyAdminOwnerFlag, SuperchainProxyAdminOwnerFlag,
ProtocolVersionsOwnerFlag, ProtocolVersionsOwnerFlag,
......
...@@ -84,6 +84,7 @@ func MIPSCLI(cliCtx *cli.Context) error { ...@@ -84,6 +84,7 @@ func MIPSCLI(cliCtx *cli.Context) error {
l1RPCUrl := cliCtx.String(deployer.L1RPCURLFlagName) l1RPCUrl := cliCtx.String(deployer.L1RPCURLFlagName)
privateKey := cliCtx.String(deployer.PrivateKeyFlagName) privateKey := cliCtx.String(deployer.PrivateKeyFlagName)
outfile := cliCtx.String(OutfileFlagName)
artifactsURLStr := cliCtx.String(ArtifactsLocatorFlagName) artifactsURLStr := cliCtx.String(ArtifactsLocatorFlagName)
artifactsLocator := new(artifacts2.Locator) artifactsLocator := new(artifacts2.Locator)
if err := artifactsLocator.UnmarshalText([]byte(artifactsURLStr)); err != nil { if err := artifactsLocator.UnmarshalText([]byte(artifactsURLStr)); err != nil {
...@@ -95,7 +96,7 @@ func MIPSCLI(cliCtx *cli.Context) error { ...@@ -95,7 +96,7 @@ func MIPSCLI(cliCtx *cli.Context) error {
ctx := ctxinterrupt.WithCancelOnInterrupt(cliCtx.Context) ctx := ctxinterrupt.WithCancelOnInterrupt(cliCtx.Context)
return MIPS(ctx, MIPSConfig{ dmo, err := MIPS(ctx, MIPSConfig{
L1RPCUrl: l1RPCUrl, L1RPCUrl: l1RPCUrl,
PrivateKey: privateKey, PrivateKey: privateKey,
Logger: l, Logger: l,
...@@ -103,11 +104,20 @@ func MIPSCLI(cliCtx *cli.Context) error { ...@@ -103,11 +104,20 @@ func MIPSCLI(cliCtx *cli.Context) error {
MipsVersion: mipsVersion, MipsVersion: mipsVersion,
PreimageOracle: preimageOracle, PreimageOracle: preimageOracle,
}) })
if err != nil {
return fmt.Errorf("failed to deploy MIPS: %w", err)
}
if err := jsonutil.WriteJSON(dmo, ioutil.ToStdOutOrFileOrNoop(outfile, 0o755)); err != nil {
return fmt.Errorf("failed to write output: %w", err)
}
return nil
} }
func MIPS(ctx context.Context, cfg MIPSConfig) error { func MIPS(ctx context.Context, cfg MIPSConfig) (opcm.DeployMIPSOutput, error) {
var dmo opcm.DeployMIPSOutput
if err := cfg.Check(); err != nil { if err := cfg.Check(); err != nil {
return fmt.Errorf("invalid config for MIPS: %w", err) return dmo, fmt.Errorf("invalid config for MIPS: %w", err)
} }
lgr := cfg.Logger lgr := cfg.Logger
...@@ -117,7 +127,7 @@ func MIPS(ctx context.Context, cfg MIPSConfig) error { ...@@ -117,7 +127,7 @@ func MIPS(ctx context.Context, cfg MIPSConfig) error {
artifactsFS, cleanup, err := artifacts2.Download(ctx, cfg.ArtifactsLocator, progressor) artifactsFS, cleanup, err := artifacts2.Download(ctx, cfg.ArtifactsLocator, progressor)
if err != nil { if err != nil {
return fmt.Errorf("failed to download artifacts: %w", err) return dmo, fmt.Errorf("failed to download artifacts: %w", err)
} }
defer func() { defer func() {
if err := cleanup(); err != nil { if err := cleanup(); err != nil {
...@@ -127,14 +137,14 @@ func MIPS(ctx context.Context, cfg MIPSConfig) error { ...@@ -127,14 +137,14 @@ func MIPS(ctx context.Context, cfg MIPSConfig) error {
l1RPC, err := rpc.Dial(cfg.L1RPCUrl) l1RPC, err := rpc.Dial(cfg.L1RPCUrl)
if err != nil { if err != nil {
return fmt.Errorf("failed to connect to L1 RPC: %w", err) return dmo, fmt.Errorf("failed to connect to L1 RPC: %w", err)
} }
l1Client := ethclient.NewClient(l1RPC) l1Client := ethclient.NewClient(l1RPC)
chainID, err := l1Client.ChainID(ctx) chainID, err := l1Client.ChainID(ctx)
if err != nil { if err != nil {
return fmt.Errorf("failed to get chain ID: %w", err) return dmo, fmt.Errorf("failed to get chain ID: %w", err)
} }
signer := opcrypto.SignerFnFromBind(opcrypto.PrivateKeySignerFn(cfg.privateKeyECDSA, chainID)) signer := opcrypto.SignerFnFromBind(opcrypto.PrivateKeySignerFn(cfg.privateKeyECDSA, chainID))
...@@ -148,7 +158,7 @@ func MIPS(ctx context.Context, cfg MIPSConfig) error { ...@@ -148,7 +158,7 @@ func MIPS(ctx context.Context, cfg MIPSConfig) error {
From: chainDeployer, From: chainDeployer,
}) })
if err != nil { if err != nil {
return fmt.Errorf("failed to create broadcaster: %w", err) return dmo, fmt.Errorf("failed to create broadcaster: %w", err)
} }
host, err := env.DefaultForkedScriptHost( host, err := env.DefaultForkedScriptHost(
...@@ -160,7 +170,7 @@ func MIPS(ctx context.Context, cfg MIPSConfig) error { ...@@ -160,7 +170,7 @@ func MIPS(ctx context.Context, cfg MIPSConfig) error {
l1RPC, l1RPC,
) )
if err != nil { if err != nil {
return fmt.Errorf("failed to create script host: %w", err) return dmo, fmt.Errorf("failed to create script host: %w", err)
} }
var release string var release string
...@@ -172,7 +182,7 @@ func MIPS(ctx context.Context, cfg MIPSConfig) error { ...@@ -172,7 +182,7 @@ func MIPS(ctx context.Context, cfg MIPSConfig) error {
lgr.Info("deploying dispute game", "release", release) lgr.Info("deploying dispute game", "release", release)
dgo, err := opcm.DeployMIPS( dmo, err = opcm.DeployMIPS(
host, host,
opcm.DeployMIPSInput{ opcm.DeployMIPSInput{
MipsVersion: cfg.MipsVersion, MipsVersion: cfg.MipsVersion,
...@@ -180,17 +190,14 @@ func MIPS(ctx context.Context, cfg MIPSConfig) error { ...@@ -180,17 +190,14 @@ func MIPS(ctx context.Context, cfg MIPSConfig) error {
}, },
) )
if err != nil { if err != nil {
return fmt.Errorf("error deploying dispute game: %w", err) return dmo, fmt.Errorf("error deploying dispute game: %w", err)
} }
if _, err := bcaster.Broadcast(ctx); err != nil { if _, err := bcaster.Broadcast(ctx); err != nil {
return fmt.Errorf("failed to broadcast: %w", err) return dmo, fmt.Errorf("failed to broadcast: %w", err)
} }
lgr.Info("deployed dispute game") lgr.Info("deployed dispute game")
if err := jsonutil.WriteJSON(dgo, ioutil.ToStdOut()); err != nil { return dmo, nil
return fmt.Errorf("failed to write output: %w", err)
}
return nil
} }
...@@ -73,6 +73,7 @@ func OPCMCLI(cliCtx *cli.Context) error { ...@@ -73,6 +73,7 @@ func OPCMCLI(cliCtx *cli.Context) error {
l1RPCUrl := cliCtx.String(deployer.L1RPCURLFlagName) l1RPCUrl := cliCtx.String(deployer.L1RPCURLFlagName)
privateKey := cliCtx.String(deployer.PrivateKeyFlagName) privateKey := cliCtx.String(deployer.PrivateKeyFlagName)
outfile := cliCtx.String(OutfileFlagName)
release := cliCtx.String(ReleaseFlagName) release := cliCtx.String(ReleaseFlagName)
ctx := ctxinterrupt.WithCancelOnInterrupt(cliCtx.Context) ctx := ctxinterrupt.WithCancelOnInterrupt(cliCtx.Context)
...@@ -87,7 +88,7 @@ func OPCMCLI(cliCtx *cli.Context) error { ...@@ -87,7 +88,7 @@ func OPCMCLI(cliCtx *cli.Context) error {
return fmt.Errorf("failed to deploy OPCM: %w", err) return fmt.Errorf("failed to deploy OPCM: %w", err)
} }
if err := jsonutil.WriteJSON(out, ioutil.ToStdOut()); err != nil { if err := jsonutil.WriteJSON(out, ioutil.ToStdOutOrFileOrNoop(outfile, 0o755)); err != nil {
return fmt.Errorf("failed to write output: %w", err) return fmt.Errorf("failed to write output: %w", err)
} }
return nil return nil
......
...@@ -75,6 +75,7 @@ func ProxyCLI(cliCtx *cli.Context) error { ...@@ -75,6 +75,7 @@ func ProxyCLI(cliCtx *cli.Context) error {
l1RPCUrl := cliCtx.String(deployer.L1RPCURLFlagName) l1RPCUrl := cliCtx.String(deployer.L1RPCURLFlagName)
privateKey := cliCtx.String(deployer.PrivateKeyFlagName) privateKey := cliCtx.String(deployer.PrivateKeyFlagName)
outfile := cliCtx.String(OutfileFlagName)
artifactsURLStr := cliCtx.String(ArtifactsLocatorFlagName) artifactsURLStr := cliCtx.String(ArtifactsLocatorFlagName)
artifactsLocator := new(artifacts.Locator) artifactsLocator := new(artifacts.Locator)
if err := artifactsLocator.UnmarshalText([]byte(artifactsURLStr)); err != nil { if err := artifactsLocator.UnmarshalText([]byte(artifactsURLStr)); err != nil {
...@@ -85,18 +86,27 @@ func ProxyCLI(cliCtx *cli.Context) error { ...@@ -85,18 +86,27 @@ func ProxyCLI(cliCtx *cli.Context) error {
ctx := ctxinterrupt.WithCancelOnInterrupt(cliCtx.Context) ctx := ctxinterrupt.WithCancelOnInterrupt(cliCtx.Context)
return Proxy(ctx, ProxyConfig{ dpo, err := Proxy(ctx, ProxyConfig{
L1RPCUrl: l1RPCUrl, L1RPCUrl: l1RPCUrl,
PrivateKey: privateKey, PrivateKey: privateKey,
Logger: l, Logger: l,
ArtifactsLocator: artifactsLocator, ArtifactsLocator: artifactsLocator,
Owner: owner, Owner: owner,
}) })
if err != nil {
return fmt.Errorf("failed to deploy Proxy: %w", err)
}
if err := jsonutil.WriteJSON(dpo, ioutil.ToStdOutOrFileOrNoop(outfile, 0o755)); err != nil {
return fmt.Errorf("failed to write output: %w", err)
}
return nil
} }
func Proxy(ctx context.Context, cfg ProxyConfig) error { func Proxy(ctx context.Context, cfg ProxyConfig) (opcm.DeployProxyOutput, error) {
var dpo opcm.DeployProxyOutput
if err := cfg.Check(); err != nil { if err := cfg.Check(); err != nil {
return fmt.Errorf("invalid config for Proxy: %w", err) return dpo, fmt.Errorf("invalid config for Proxy: %w", err)
} }
lgr := cfg.Logger lgr := cfg.Logger
...@@ -106,7 +116,7 @@ func Proxy(ctx context.Context, cfg ProxyConfig) error { ...@@ -106,7 +116,7 @@ func Proxy(ctx context.Context, cfg ProxyConfig) error {
artifactsFS, cleanup, err := artifacts.Download(ctx, cfg.ArtifactsLocator, progressor) artifactsFS, cleanup, err := artifacts.Download(ctx, cfg.ArtifactsLocator, progressor)
if err != nil { if err != nil {
return fmt.Errorf("failed to download artifacts: %w", err) return dpo, fmt.Errorf("failed to download artifacts: %w", err)
} }
defer func() { defer func() {
if err := cleanup(); err != nil { if err := cleanup(); err != nil {
...@@ -116,12 +126,12 @@ func Proxy(ctx context.Context, cfg ProxyConfig) error { ...@@ -116,12 +126,12 @@ func Proxy(ctx context.Context, cfg ProxyConfig) error {
l1Client, err := ethclient.Dial(cfg.L1RPCUrl) l1Client, err := ethclient.Dial(cfg.L1RPCUrl)
if err != nil { if err != nil {
return fmt.Errorf("failed to connect to L1 RPC: %w", err) return dpo, fmt.Errorf("failed to connect to L1 RPC: %w", err)
} }
chainID, err := l1Client.ChainID(ctx) chainID, err := l1Client.ChainID(ctx)
if err != nil { if err != nil {
return fmt.Errorf("failed to get chain ID: %w", err) return dpo, fmt.Errorf("failed to get chain ID: %w", err)
} }
signer := opcrypto.SignerFnFromBind(opcrypto.PrivateKeySignerFn(cfg.privateKeyECDSA, chainID)) signer := opcrypto.SignerFnFromBind(opcrypto.PrivateKeySignerFn(cfg.privateKeyECDSA, chainID))
...@@ -135,12 +145,12 @@ func Proxy(ctx context.Context, cfg ProxyConfig) error { ...@@ -135,12 +145,12 @@ func Proxy(ctx context.Context, cfg ProxyConfig) error {
From: chainDeployer, From: chainDeployer,
}) })
if err != nil { if err != nil {
return fmt.Errorf("failed to create broadcaster: %w", err) return dpo, fmt.Errorf("failed to create broadcaster: %w", err)
} }
l1RPC, err := rpc.Dial(cfg.L1RPCUrl) l1RPC, err := rpc.Dial(cfg.L1RPCUrl)
if err != nil { if err != nil {
return fmt.Errorf("failed to connect to L1 RPC: %w", err) return dpo, fmt.Errorf("failed to connect to L1 RPC: %w", err)
} }
l1Host, err := env.DefaultForkedScriptHost( l1Host, err := env.DefaultForkedScriptHost(
...@@ -152,27 +162,23 @@ func Proxy(ctx context.Context, cfg ProxyConfig) error { ...@@ -152,27 +162,23 @@ func Proxy(ctx context.Context, cfg ProxyConfig) error {
l1RPC, l1RPC,
) )
if err != nil { if err != nil {
return fmt.Errorf("failed to create script host: %w", err) return dpo, fmt.Errorf("failed to create script host: %w", err)
} }
dgo, err := opcm.DeployProxy( dpo, err = opcm.DeployProxy(
l1Host, l1Host,
opcm.DeployProxyInput{ opcm.DeployProxyInput{
Owner: cfg.Owner, Owner: cfg.Owner,
}, },
) )
if err != nil { if err != nil {
return fmt.Errorf("error deploying proxy: %w", err) return dpo, fmt.Errorf("error deploying proxy: %w", err)
} }
if _, err := bcaster.Broadcast(ctx); err != nil { if _, err := bcaster.Broadcast(ctx); err != nil {
return fmt.Errorf("failed to broadcast: %w", err) return dpo, fmt.Errorf("failed to broadcast: %w", err)
} }
lgr.Info("deployed new ERC-1967 proxy") lgr.Info("deployed new ERC-1967 proxy")
return dpo, nil
if err := jsonutil.WriteJSON(dgo, ioutil.ToStdOut()); err != nil {
return fmt.Errorf("failed to write output: %w", err)
}
return nil
} }
...@@ -98,6 +98,7 @@ func SuperchainCLI(cliCtx *cli.Context) error { ...@@ -98,6 +98,7 @@ func SuperchainCLI(cliCtx *cli.Context) error {
paused := cliCtx.Bool(PausedFlagName) paused := cliCtx.Bool(PausedFlagName)
requiredVersionStr := cliCtx.String(RequiredProtocolVersionFlagName) requiredVersionStr := cliCtx.String(RequiredProtocolVersionFlagName)
recommendedVersionStr := cliCtx.String(RecommendedProtocolVersionFlagName) recommendedVersionStr := cliCtx.String(RecommendedProtocolVersionFlagName)
outfile := cliCtx.String(OutfileFlagName)
cfg := SuperchainConfig{ cfg := SuperchainConfig{
L1RPCUrl: l1RPCUrl, L1RPCUrl: l1RPCUrl,
...@@ -124,7 +125,7 @@ func SuperchainCLI(cliCtx *cli.Context) error { ...@@ -124,7 +125,7 @@ func SuperchainCLI(cliCtx *cli.Context) error {
return fmt.Errorf("failed to deploy superchain: %w", err) return fmt.Errorf("failed to deploy superchain: %w", err)
} }
if err := jsonutil.WriteJSON(dso, ioutil.ToStdOut()); err != nil { if err := jsonutil.WriteJSON(dso, ioutil.ToStdOutOrFileOrNoop(outfile, 0o755)); err != nil {
return fmt.Errorf("failed to write output: %w", err) return fmt.Errorf("failed to write output: %w", err)
} }
return nil return nil
......
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