diff --git a/op-challenger/cmd/main_test.go b/op-challenger/cmd/main_test.go index aa3b7ef3a20..94fff227f07 100644 --- a/op-challenger/cmd/main_test.go +++ b/op-challenger/cmd/main_test.go @@ -503,6 +503,48 @@ func TestAsteriscKonaRequiredArgs(t *testing.T) { }) } +// validateCustomNetworkFlagsProhibitedWithNetworkFlag ensures custom network flags are not used simultaneously with the network flag. +// It validates disallowed flag combinations for a given trace type and trace type prefix configuration. +func validateCustomNetworkFlagsProhibitedWithNetworkFlag(t *testing.T, traceType types.TraceType, traceTypeForFlagPrefix types.TraceType, customNetworkFlag string) { + expectedError := fmt.Sprintf("flag network can not be used with rollup-config/%v-rollup-config, l2-genesis/%v-l2-genesis, l1-genesis/%v-l1-genesis or %v", traceTypeForFlagPrefix, traceTypeForFlagPrefix, traceTypeForFlagPrefix, customNetworkFlag) + + // Test the custom l2 flag + t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAndCustomL2Flag-%v", traceType), func(t *testing.T) { + verifyArgsInvalid( + t, + expectedError, + addRequiredArgs(traceType, fmt.Sprintf("--%v=true", customNetworkFlag))) + }) + + // Now test flags with trace-specific permutations + customNetworkFlags := map[string]string{ + "RollupConfig": "rollup-config", + "L2Genesis": "l2-genesis", + "L1Genesis": "l1-genesis", + } + for testName, flag := range customNetworkFlags { + for _, withTraceSpecificPrefix := range []bool{true, false} { + var postFix string + if withTraceSpecificPrefix { + postFix = "-withTraceSpecificPrefix" + } + + t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAnd%v-%v%v", testName, traceType, postFix), func(t *testing.T) { + var prefix string + if withTraceSpecificPrefix { + prefix = fmt.Sprintf("%v-", traceTypeForFlagPrefix) + } + flagName := fmt.Sprintf("%v%v", prefix, flag) + + verifyArgsInvalid( + t, + expectedError, + addRequiredArgs(traceType, fmt.Sprintf("--%v=somevalue.json", flagName))) + }) + } + } +} + func TestAsteriscBaseRequiredArgs(t *testing.T) { for _, traceType := range []types.TraceType{types.TraceTypeAsterisc, types.TraceTypeAsteriscKona} { traceType := traceType @@ -581,12 +623,7 @@ func TestAsteriscBaseRequiredArgs(t *testing.T) { addRequiredArgsExcept(traceType, "--network", "--l2-genesis=gensis.json")) }) - t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAndRollup-%v", traceType), func(t *testing.T) { - verifyArgsInvalid( - t, - "flag network can not be used with rollup-config, l2-genesis or asterisc-kona-l2-custom", - addRequiredArgs(traceType, "--rollup-config=rollup.json")) - }) + validateCustomNetworkFlagsProhibitedWithNetworkFlag(t, traceType, types.TraceTypeAsteriscKona, "asterisc-kona-l2-custom") t.Run(fmt.Sprintf("TestNetwork-%v", traceType), func(t *testing.T) { t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) { @@ -669,26 +706,7 @@ func TestCannonCustomConfigArgs(t *testing.T) { addRequiredArgsExcept(traceType, "--network", "--cannon-l2-genesis=gensis.json")) }) - t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAndRollup-%v", traceType), func(t *testing.T) { - verifyArgsInvalid( - t, - "flag network can not be used with cannon-rollup-config, l2-genesis or cannon-l2-custom", - addRequiredArgs(traceType, "--cannon-rollup-config=rollup.json")) - }) - - t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAndRollup-%v", traceType), func(t *testing.T) { - args := requiredArgs(traceType) - delete(args, "--network") - delete(args, "--game-factory-address") - args["--network"] = network - args["--cannon-rollup-config"] = "rollup.json" - args["--cannon-l2-genesis"] = "gensis.json" - args["--cannon-l2-custom"] = "true" - verifyArgsInvalid( - t, - "flag network can not be used with cannon-rollup-config, cannon-l2-genesis or cannon-l2-custom", - toArgList(args)) - }) + validateCustomNetworkFlagsProhibitedWithNetworkFlag(t, traceType, types.TraceTypeCannon, "cannon-l2-custom") t.Run(fmt.Sprintf("TestNetwork-%v", traceType), func(t *testing.T) { t.Run("NotRequiredWhenRollupAndGenesIsSpecified", func(t *testing.T) { @@ -762,26 +780,7 @@ func TestSuperCannonCustomConfigArgs(t *testing.T) { addRequiredArgsExcept(traceType, "--network", "--cannon-rollup-config=rollup.json", "--cannon-l2-genesis=gensis.json")) }) - t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAndRollup-%v", traceType), func(t *testing.T) { - verifyArgsInvalid( - t, - "flag network can not be used with cannon-rollup-config, l2-genesis or cannon-l2-custom", - addRequiredArgs(traceType, "--cannon-rollup-config=rollup.json")) - }) - - t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAndRollup-%v", traceType), func(t *testing.T) { - args := requiredArgs(traceType) - delete(args, "--network") - delete(args, "--game-factory-address") - args["--network"] = network - args["--cannon-rollup-config"] = "rollup.json" - args["--cannon-l2-genesis"] = "gensis.json" - args["--cannon-l2-custom"] = "true" - verifyArgsInvalid( - t, - "flag network can not be used with cannon-rollup-config, cannon-l2-genesis or cannon-l2-custom", - toArgList(args)) - }) + validateCustomNetworkFlagsProhibitedWithNetworkFlag(t, traceType, types.TraceTypeCannon, "cannon-l2-custom") t.Run(fmt.Sprintf("TestNetwork-%v", traceType), func(t *testing.T) { t.Run("NotRequiredWhenRollupGenesisAndDepsetIsSpecified", func(t *testing.T) { @@ -868,26 +867,7 @@ func TestSuperAsteriscKonaCustomConfigArgs(t *testing.T) { addRequiredArgsExcept(traceType, "--network", "--asterisc-kona-rollup-config=rollup.json", "--asterisc-kona-l2-genesis=gensis.json")) }) - t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAndRollup-%v", traceType), func(t *testing.T) { - verifyArgsInvalid( - t, - "flag network can not be used with asterisc-kona-rollup-config, l2-genesis or asterisc-kona-l2-custom", - addRequiredArgs(traceType, "--asterisc-kona-rollup-config=rollup.json")) - }) - - t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAndRollup-%v", traceType), func(t *testing.T) { - args := requiredArgs(traceType) - delete(args, "--network") - delete(args, "--game-factory-address") - args["--network"] = network - args["--asterisc-kona-rollup-config"] = "rollup.json" - args["--asterisc-kona-l2-genesis"] = "gensis.json" - args["--asterisc-kona-l2-custom"] = "true" - verifyArgsInvalid( - t, - "flag network can not be used with asterisc-kona-rollup-config, asterisc-kona-l2-genesis or asterisc-kona-l2-custom", - toArgList(args)) - }) + validateCustomNetworkFlagsProhibitedWithNetworkFlag(t, traceType, types.TraceTypeAsteriscKona, "asterisc-kona-l2-custom") t.Run(fmt.Sprintf("TestNetwork-%v", traceType), func(t *testing.T) { t.Run("NotRequiredWhenRollupGenesisAndDepsetIsSpecified", func(t *testing.T) { diff --git a/op-challenger/flags/flags.go b/op-challenger/flags/flags.go index a911eaaf1bf..20fa1980304 100644 --- a/op-challenger/flags/flags.go +++ b/op-challenger/flags/flags.go @@ -44,11 +44,6 @@ var ( Usage: "Address of L1 Beacon API endpoint to use", EnvVars: prefixEnvVars("L1_BEACON"), } - L1GenesisFlag = &cli.StringFlag{ - Name: "l1-genesis-path", - Usage: "Path to the L1 genesis file. Only required if the L1 is not mainnet, sepolia, holesky, or hoodi.", - EnvVars: prefixEnvVars("L1_GENESIS_PATH"), - } SupervisorRpcFlag = &cli.StringFlag{ Name: "supervisor-rpc", Usage: "Provider URL for supervisor RPC", @@ -148,6 +143,13 @@ var ( EnvVars: envVars, } }) + L1GenesisFlag = NewVMFlag("l1-genesis", EnvVarPrefix, faultDisputeVMs, func(name string, envVars []string, traceTypeInfo string) cli.Flag { + return &cli.StringFlag{ + Name: name, + Usage: "Path to the L1 genesis file. Only required if the L1 is not mainnet, sepolia, holesky, or hoodi.", + EnvVars: envVars, + } + }) DepsetConfigFlag = NewVMFlag("depset-config", EnvVarPrefix, faultDisputeVMs, func(name string, envVars []string, traceTypeInfo string) cli.Flag { return &cli.StringFlag{ Name: name, @@ -329,13 +331,13 @@ var optionalFlags = []cli.Flag{ UnsafeAllowInvalidPrestate, ResponseDelayFlag, ResponseDelayAfterFlag, - L1GenesisFlag, } func init() { optionalFlags = append(optionalFlags, oplog.CLIFlags(EnvVarPrefix)...) optionalFlags = append(optionalFlags, PreStatesURLFlag.Flags()...) optionalFlags = append(optionalFlags, RollupConfigFlag.Flags()...) + optionalFlags = append(optionalFlags, L1GenesisFlag.Flags()...) optionalFlags = append(optionalFlags, L2GenesisFlag.Flags()...) optionalFlags = append(optionalFlags, DepsetConfigFlag.Flags()...) optionalFlags = append(optionalFlags, txmgr.CLIFlagsWithDefaults(EnvVarPrefix, txmgr.DefaultChallengerFlagValues)...) @@ -357,9 +359,9 @@ func checkOutputProviderFlags(ctx *cli.Context) error { func CheckCannonBaseFlags(ctx *cli.Context) error { if ctx.IsSet(flags.NetworkFlagName) && - (RollupConfigFlag.IsSet(ctx, types.TraceTypeCannon) || L2GenesisFlag.IsSet(ctx, types.TraceTypeCannon) || ctx.Bool(CannonL2CustomFlag.Name)) { - return fmt.Errorf("flag %v can not be used with %v, %v or %v", - flags.NetworkFlagName, RollupConfigFlag.SourceFlagName(ctx, types.TraceTypeCannon), L2GenesisFlag.SourceFlagName(ctx, types.TraceTypeCannon), CannonL2CustomFlag.Name) + (RollupConfigFlag.IsSet(ctx, types.TraceTypeCannon) || L2GenesisFlag.IsSet(ctx, types.TraceTypeCannon) || L1GenesisFlag.IsSet(ctx, types.TraceTypeCannon) || ctx.Bool(CannonL2CustomFlag.Name)) { + return fmt.Errorf("flag %v can not be used with %v, %v, %v or %v", + flags.NetworkFlagName, RollupConfigFlag.EitherFlagName(types.TraceTypeCannon), L2GenesisFlag.EitherFlagName(types.TraceTypeCannon), L1GenesisFlag.EitherFlagName(types.TraceTypeCannon), CannonL2CustomFlag.Name) } if ctx.Bool(CannonL2CustomFlag.Name) && !(RollupConfigFlag.IsSet(ctx, types.TraceTypeCannon) && L2GenesisFlag.IsSet(ctx, types.TraceTypeCannon)) { return fmt.Errorf("flag %v and %v must be set when %v is true", @@ -417,9 +419,9 @@ func CheckCannonKonaBaseFlags(ctx *cli.Context, traceType types.TraceType) error flags.NetworkFlagName, RollupConfigFlag.EitherFlagName(traceType), L2GenesisFlag.EitherFlagName(traceType)) } if ctx.IsSet(flags.NetworkFlagName) && - (RollupConfigFlag.IsSet(ctx, types.TraceTypeCannonKona) || L2GenesisFlag.IsSet(ctx, types.TraceTypeCannonKona) || ctx.Bool(CannonKonaL2CustomFlag.Name)) { - return fmt.Errorf("flag %v can not be used with %v, %v or %v", - flags.NetworkFlagName, RollupConfigFlag.SourceFlagName(ctx, types.TraceTypeCannonKona), L2GenesisFlag.SourceFlagName(ctx, types.TraceTypeCannonKona), CannonKonaL2CustomFlag.Name) + (RollupConfigFlag.IsSet(ctx, types.TraceTypeCannonKona) || L2GenesisFlag.IsSet(ctx, types.TraceTypeCannonKona) || L1GenesisFlag.IsSet(ctx, types.TraceTypeCannonKona) || ctx.Bool(CannonKonaL2CustomFlag.Name)) { + return fmt.Errorf("flag %v can not be used with %v, %v, %v or %v", + flags.NetworkFlagName, RollupConfigFlag.EitherFlagName(types.TraceTypeCannonKona), L2GenesisFlag.EitherFlagName(types.TraceTypeCannonKona), L1GenesisFlag.EitherFlagName(types.TraceTypeCannonKona), CannonKonaL2CustomFlag.Name) } if !ctx.IsSet(CannonBinFlag.Name) { return fmt.Errorf("flag %s is required", CannonBinFlag.Name) @@ -450,9 +452,9 @@ func CheckAsteriscBaseFlags(ctx *cli.Context, traceType types.TraceType) error { flags.NetworkFlagName, RollupConfigFlag.EitherFlagName(traceType), L2GenesisFlag.EitherFlagName(traceType)) } if ctx.IsSet(flags.NetworkFlagName) && - (RollupConfigFlag.IsSet(ctx, types.TraceTypeAsteriscKona) || L2GenesisFlag.IsSet(ctx, types.TraceTypeAsteriscKona) || ctx.Bool(AsteriscKonaL2CustomFlag.Name)) { - return fmt.Errorf("flag %v can not be used with %v, %v or %v", - flags.NetworkFlagName, RollupConfigFlag.SourceFlagName(ctx, types.TraceTypeAsteriscKona), L2GenesisFlag.SourceFlagName(ctx, types.TraceTypeAsteriscKona), AsteriscKonaL2CustomFlag.Name) + (RollupConfigFlag.IsSet(ctx, types.TraceTypeAsteriscKona) || L2GenesisFlag.IsSet(ctx, types.TraceTypeAsteriscKona) || L1GenesisFlag.IsSet(ctx, types.TraceTypeAsteriscKona) || ctx.Bool(AsteriscKonaL2CustomFlag.Name)) { + return fmt.Errorf("flag %v can not be used with %v, %v, %v or %v", + flags.NetworkFlagName, RollupConfigFlag.EitherFlagName(types.TraceTypeAsteriscKona), L2GenesisFlag.EitherFlagName(types.TraceTypeAsteriscKona), L1GenesisFlag.EitherFlagName(types.TraceTypeAsteriscKona), AsteriscKonaL2CustomFlag.Name) } if !ctx.IsSet(AsteriscBinFlag.Name) { return fmt.Errorf("flag %s is required", AsteriscBinFlag.Name) @@ -714,7 +716,6 @@ func NewConfigFromCLI(ctx *cli.Context, logger log.Logger) (*config.Config, erro RollupRpc: ctx.String(RollupRpcFlag.Name), SupervisorRPC: ctx.String(SupervisorRpcFlag.Name), Cannon: vm.Config{ - L1GenesisPath: ctx.String(L1GenesisFlag.Name), VmType: types.TraceTypeCannon, L1: l1EthRpc, L1Beacon: l1Beacon, @@ -725,6 +726,7 @@ func NewConfigFromCLI(ctx *cli.Context, logger log.Logger) (*config.Config, erro Networks: networks, L2Custom: ctx.Bool(CannonL2CustomFlag.Name), RollupConfigPaths: RollupConfigFlag.StringSlice(ctx, types.TraceTypeCannon), + L1GenesisPath: L1GenesisFlag.String(ctx, types.TraceTypeCannon), L2GenesisPaths: L2GenesisFlag.StringSlice(ctx, types.TraceTypeCannon), DepsetConfigPath: DepsetConfigFlag.String(ctx, types.TraceTypeCannon), SnapshotFreq: ctx.Uint(CannonSnapshotFreqFlag.Name), @@ -735,7 +737,6 @@ func NewConfigFromCLI(ctx *cli.Context, logger log.Logger) (*config.Config, erro CannonAbsolutePreState: ctx.String(CannonPreStateFlag.Name), CannonAbsolutePreStateBaseURL: cannonPreStatesURL, CannonKona: vm.Config{ - L1GenesisPath: ctx.String(L1GenesisFlag.Name), VmType: types.TraceTypeCannonKona, L1: l1EthRpc, L1Beacon: l1Beacon, @@ -746,6 +747,7 @@ func NewConfigFromCLI(ctx *cli.Context, logger log.Logger) (*config.Config, erro Networks: networks, L2Custom: ctx.Bool(CannonKonaL2CustomFlag.Name), RollupConfigPaths: RollupConfigFlag.StringSlice(ctx, types.TraceTypeCannonKona), + L1GenesisPath: L1GenesisFlag.String(ctx, types.TraceTypeCannonKona), L2GenesisPaths: L2GenesisFlag.StringSlice(ctx, types.TraceTypeCannonKona), DepsetConfigPath: DepsetConfigFlag.String(ctx, types.TraceTypeCannonKona), SnapshotFreq: ctx.Uint(CannonSnapshotFreqFlag.Name), @@ -757,7 +759,6 @@ func NewConfigFromCLI(ctx *cli.Context, logger log.Logger) (*config.Config, erro CannonKonaAbsolutePreStateBaseURL: cannonKonaPreStatesURL, Datadir: ctx.String(DatadirFlag.Name), Asterisc: vm.Config{ - L1GenesisPath: ctx.String(L1GenesisFlag.Name), VmType: types.TraceTypeAsterisc, L1: l1EthRpc, L1Beacon: l1Beacon, @@ -767,6 +768,7 @@ func NewConfigFromCLI(ctx *cli.Context, logger log.Logger) (*config.Config, erro Server: ctx.String(AsteriscServerFlag.Name), Networks: networks, RollupConfigPaths: RollupConfigFlag.StringSlice(ctx, types.TraceTypeAsterisc), + L1GenesisPath: L1GenesisFlag.String(ctx, types.TraceTypeAsterisc), L2GenesisPaths: L2GenesisFlag.StringSlice(ctx, types.TraceTypeAsterisc), DepsetConfigPath: DepsetConfigFlag.String(ctx, types.TraceTypeAsterisc), SnapshotFreq: ctx.Uint(AsteriscSnapshotFreqFlag.Name), @@ -776,7 +778,6 @@ func NewConfigFromCLI(ctx *cli.Context, logger log.Logger) (*config.Config, erro AsteriscAbsolutePreState: ctx.String(AsteriscPreStateFlag.Name), AsteriscAbsolutePreStateBaseURL: asteriscPreStatesURL, AsteriscKona: vm.Config{ - L1GenesisPath: ctx.String(L1GenesisFlag.Name), VmType: types.TraceTypeAsteriscKona, L1: l1EthRpc, L1Beacon: l1Beacon, @@ -787,6 +788,7 @@ func NewConfigFromCLI(ctx *cli.Context, logger log.Logger) (*config.Config, erro Networks: networks, L2Custom: ctx.Bool(AsteriscKonaL2CustomFlag.Name), RollupConfigPaths: RollupConfigFlag.StringSlice(ctx, types.TraceTypeAsteriscKona), + L1GenesisPath: L1GenesisFlag.String(ctx, types.TraceTypeAsteriscKona), L2GenesisPaths: L2GenesisFlag.StringSlice(ctx, types.TraceTypeAsteriscKona), DepsetConfigPath: DepsetConfigFlag.String(ctx, types.TraceTypeAsteriscKona), SnapshotFreq: ctx.Uint(AsteriscSnapshotFreqFlag.Name),