diff --git a/go.mod b/go.mod index 3ef01fe8..fc642c3a 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/Layr-Labs/eigenlayer-contracts v0.3.2-mainnet-rewards github.com/Layr-Labs/eigenlayer-rewards-proofs v0.2.12 github.com/Layr-Labs/eigenpod-proofs-generation v0.0.14-stable.0.20240730152248-5c11a259293e - github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241212003044-37139a7d8ea8 + github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241213014620-7831a35a43a7 github.com/blang/semver/v4 v4.0.0 github.com/consensys/gnark-crypto v0.12.1 github.com/ethereum/go-ethereum v1.14.5 diff --git a/go.sum b/go.sum index 45f374c0..8ad71882 100644 --- a/go.sum +++ b/go.sum @@ -24,6 +24,8 @@ github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241211204646-f49e96f7ee7a h1:U1pibF github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241211204646-f49e96f7ee7a/go.mod h1:aYdNURUhaqeYOS+Cq12TfSdPbjFfiLaHkxPdR4Exq/s= github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241212003044-37139a7d8ea8 h1:flOwiF9Z9xburwDodNbd6VBi8rzzNSbRy2KG5kqoAak= github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241212003044-37139a7d8ea8/go.mod h1:aYdNURUhaqeYOS+Cq12TfSdPbjFfiLaHkxPdR4Exq/s= +github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241213014620-7831a35a43a7 h1:58JjbKZs0oaGRQv/AU+XtqWvD3+dyKM4NIbqjACANN0= +github.com/Layr-Labs/eigensdk-go v0.1.14-0.20241213014620-7831a35a43a7/go.mod h1:aYdNURUhaqeYOS+Cq12TfSdPbjFfiLaHkxPdR4Exq/s= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= diff --git a/pkg/user/appointee/appointee.go b/pkg/user/appointee/appointee.go index d9db68b4..2c063953 100644 --- a/pkg/user/appointee/appointee.go +++ b/pkg/user/appointee/appointee.go @@ -20,7 +20,6 @@ func AppointeeCmd(prompter utils.Prompter) *cli.Command { &flags.VerboseFlag, }, Subcommands: []*cli.Command{ - BatchSetCmd(), canCallCmd(generateCanCallReader), ListCmd(generateListAppointeesReader), ListPermissionsCmd(generateListAppointeePermissionsReader), diff --git a/pkg/user/appointee/batch_set.go b/pkg/user/appointee/batch_set.go deleted file mode 100644 index 0861807e..00000000 --- a/pkg/user/appointee/batch_set.go +++ /dev/null @@ -1,40 +0,0 @@ -package appointee - -import ( - "sort" - - "github.com/Layr-Labs/eigenlayer-cli/pkg/internal/common/flags" - "github.com/Layr-Labs/eigenlayer-cli/pkg/telemetry" - "github.com/urfave/cli/v2" -) - -func BatchSetCmd() *cli.Command { - batchSetCmd := &cli.Command{ - Name: "batch set", - Usage: "user appointee batch-set --batch-set-file ", - UsageText: "Appoint multiple users permissions at a time.", - Description: ` - Appoint multiple users permissions at a time. - `, - After: telemetry.AfterRunAction(), - Flags: batchSetFlags(), - } - - return batchSetCmd -} - -func batchSetFlags() []cli.Flag { - cmdFlags := []cli.Flag{ - &flags.VerboseFlag, - &BatchSetFileFlag, - // TODO: any other flags related to command inputs. - &PermissionControllerAddressFlag, - &flags.NetworkFlag, - &flags.EnvironmentFlag, - &flags.ETHRpcUrlFlag, - &flags.BroadcastFlag, - } - cmdFlags = append(cmdFlags, flags.GetSignerFlags()...) - sort.Sort(cli.FlagsByName(cmdFlags)) - return cmdFlags -} diff --git a/pkg/user/appointee/can_call.go b/pkg/user/appointee/can_call.go index e13f7be6..ff9ed223 100644 --- a/pkg/user/appointee/can_call.go +++ b/pkg/user/appointee/can_call.go @@ -59,10 +59,10 @@ func canCall(cliCtx *cli.Context, generator func(logging.Logger, *canCallConfig) return err } - result, err := elReader.CanCall(ctx, config.AppointeeAddress, config.AccountAddress, config.Target, config.Selector) + result, err := elReader.CanCall(ctx, config.AccountAddress, config.AppointeeAddress, config.Target, config.Selector) fmt.Printf("CanCall Result: %v\n", result) fmt.Printf( - "Selector, Target and Appointee: %s, %x, %s\n", + "Target, Selector and Appointee: %s, %x, %s\n", config.Target, string(config.Selector[:]), config.AppointeeAddress, diff --git a/pkg/user/appointee/list.go b/pkg/user/appointee/list.go index c65e52d8..7d244764 100644 --- a/pkg/user/appointee/list.go +++ b/pkg/user/appointee/list.go @@ -77,10 +77,11 @@ func printResults(config *listAppointeesConfig, appointees []gethcommon.Address) string(config.Selector[:]), config.AccountAddress, ) + fmt.Println() fmt.Println(strings.Repeat("=", 60)) for _, appointee := range appointees { - fmt.Printf("Appointee address: %s\n", appointee) + fmt.Printf("%s\n", appointee) } } diff --git a/pkg/user/appointee/list_permissions.go b/pkg/user/appointee/list_permissions.go index 4a9ecbcb..470f4184 100644 --- a/pkg/user/appointee/list_permissions.go +++ b/pkg/user/appointee/list_permissions.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "sort" + "strings" "github.com/Layr-Labs/eigenlayer-cli/pkg/internal/common" "github.com/Layr-Labs/eigenlayer-cli/pkg/internal/common/flags" @@ -118,13 +119,10 @@ func readAndValidateListAppointeePermissionsConfig( func printPermissions(config *listAppointeePermissionsConfig, targets []gethcommon.Address, selectors [][4]byte) { fmt.Printf("Appointee address: %s\n", config.AppointeeAddress) fmt.Printf("Appointed by: %s\n", config.AccountAddress) - fmt.Println("====================================================================================") - - for _, target := range targets { - for _, selector := range selectors { - fmt.Printf("Target: %s, Selector: %x\n", target, selector) - } + fmt.Println(strings.Repeat("=", 60)) + for index := range targets { + fmt.Printf("Target: %s, Selector: %x\n", targets[index], selectors[index]) } } diff --git a/pkg/user/appointee/remove.go b/pkg/user/appointee/remove.go index a3fe6cdb..4789a2c2 100644 --- a/pkg/user/appointee/remove.go +++ b/pkg/user/appointee/remove.go @@ -2,6 +2,7 @@ package appointee import ( "context" + "fmt" "sort" "github.com/Layr-Labs/eigenlayer-cli/pkg/internal/common" @@ -23,6 +24,9 @@ type RemoveAppointeePermissionWriter interface { ctx context.Context, request elcontracts.RemovePermissionRequest, ) (*gethtypes.Receipt, error) + NewRemovePermissionTx( + request elcontracts.RemovePermissionRequest, + ) (*gethtypes.Transaction, error) } func RemoveCmd(generator func(logging.Logger, *removeConfig) (RemoveAppointeePermissionWriter, error)) *cli.Command { @@ -59,15 +63,79 @@ func removeAppointeePermission( if err != nil { return err } + removePermissionRequest := elcontracts.RemovePermissionRequest{ + AccountAddress: config.AccountAddress, + AppointeeAddress: config.AppointeeAddress, + Target: config.Target, + Selector: config.Selector, + WaitForReceipt: true, + } + if config.Broadcast { + return broadcastRemoveAppointeeTx(ctx, permissionWriter, config, removePermissionRequest) + } + return printRemoveAppointeeResult(logger, permissionWriter, config, removePermissionRequest) +} + +func printRemoveAppointeeResult( + logger logging.Logger, + permissionWriter RemoveAppointeePermissionWriter, + config *removeConfig, + request elcontracts.RemovePermissionRequest, +) error { + ethClient, err := ethclient.Dial(config.RPCUrl) + if err != nil { + return err + } + noSendTxOpts := common.GetNoSendTxOpts(config.AccountAddress) + if common.IsSmartContractAddress(config.AccountAddress, ethClient) { + // address is a smart contract + noSendTxOpts.GasLimit = 150_000 + } + unsignedTx, err := permissionWriter.NewRemovePermissionTx(request) + if err != nil { + return eigenSdkUtils.WrapError("failed to create unsigned tx", err) + } + + if config.OutputType == string(common.OutputType_Calldata) { + calldataHex := gethcommon.Bytes2Hex(unsignedTx.Data()) + if !common.IsEmptyString(config.OutputFile) { + err = common.WriteToFile([]byte(calldataHex), config.OutputFile) + if err != nil { + return err + } + logger.Infof("Call data written to file: %s", config.OutputFile) + } else { + fmt.Println(calldataHex) + } + } else { + if !common.IsEmptyString(config.OutputType) { + fmt.Println("output file not supported for pretty output type") + fmt.Println() + } + fmt.Printf( + "Appointee %s will be lose permission to target %s selector %s by account %s\n", + config.AppointeeAddress, + config.Target, + config.Selector, + config.AccountAddress, + ) + } + txFeeDetails := common.GetTxFeeDetails(unsignedTx) + fmt.Println() + txFeeDetails.Print() + fmt.Println("To broadcast the transaction, use the --broadcast flag") + return nil +} + +func broadcastRemoveAppointeeTx( + ctx context.Context, + permissionWriter RemoveAppointeePermissionWriter, + config *removeConfig, + request elcontracts.RemovePermissionRequest, +) error { receipt, err := permissionWriter.RemovePermission( ctx, - elcontracts.RemovePermissionRequest{ - AccountAddress: config.AccountAddress, - AppointeeAddress: config.AppointeeAddress, - Target: config.Target, - Selector: config.Selector, - WaitForReceipt: true, - }, + request, ) if err != nil { return err @@ -108,6 +176,9 @@ func readAndValidateRemoveConfig(cliContext *cli.Context, logger logging.Logger) ethRpcUrl := cliContext.String(flags.ETHRpcUrlFlag.Name) network := cliContext.String(flags.NetworkFlag.Name) environment := cliContext.String(flags.EnvironmentFlag.Name) + outputFile := cliContext.String(flags.OutputFileFlag.Name) + outputType := cliContext.String(flags.OutputTypeFlag.Name) + broadcast := cliContext.Bool(flags.BroadcastFlag.Name) target := gethcommon.HexToAddress(cliContext.String(TargetAddressFlag.Name)) selector := cliContext.String(SelectorFlag.Name) selectorBytes, err := common.ValidateAndConvertSelectorString(selector) @@ -155,6 +226,9 @@ func readAndValidateRemoveConfig(cliContext *cli.Context, logger logging.Logger) PermissionManagerAddress: gethcommon.HexToAddress(permissionManagerAddress), ChainID: chainID, Environment: environment, + Broadcast: broadcast, + OutputType: outputType, + OutputFile: outputFile, }, nil } @@ -170,6 +244,8 @@ func removeCommandFlags() []cli.Flag { &flags.EnvironmentFlag, &flags.ETHRpcUrlFlag, &flags.BroadcastFlag, + &flags.OutputFileFlag, + &flags.OutputTypeFlag, } cmdFlags = append(cmdFlags, flags.GetSignerFlags()...) sort.Sort(cli.FlagsByName(cmdFlags)) diff --git a/pkg/user/appointee/remove_test.go b/pkg/user/appointee/remove_test.go index 108c33dc..cd25e379 100644 --- a/pkg/user/appointee/remove_test.go +++ b/pkg/user/appointee/remove_test.go @@ -15,7 +15,8 @@ import ( ) type mockRemoveAppointeePermissionWriter struct { - removePermissionFunc func(ctx context.Context, request elcontracts.RemovePermissionRequest) (*gethtypes.Receipt, error) + removePermissionFunc func(ctx context.Context, request elcontracts.RemovePermissionRequest) (*gethtypes.Receipt, error) + newRemovePermissionTxFunc func(request elcontracts.RemovePermissionRequest) (*gethtypes.Transaction, error) } func (m *mockRemoveAppointeePermissionWriter) RemovePermission( @@ -25,12 +26,21 @@ func (m *mockRemoveAppointeePermissionWriter) RemovePermission( return m.removePermissionFunc(ctx, request) } +func (m *mockRemoveAppointeePermissionWriter) NewRemovePermissionTx( + request elcontracts.RemovePermissionRequest, +) (*gethtypes.Transaction, error) { + return m.newRemovePermissionTxFunc(request) +} + func generateMockRemoveWriter(err error) func(logging.Logger, *removeConfig) (RemoveAppointeePermissionWriter, error) { return func(logger logging.Logger, config *removeConfig) (RemoveAppointeePermissionWriter, error) { return &mockRemoveAppointeePermissionWriter{ removePermissionFunc: func(ctx context.Context, request elcontracts.RemovePermissionRequest) (*gethtypes.Receipt, error) { return &gethtypes.Receipt{}, err }, + newRemovePermissionTxFunc: func(request elcontracts.RemovePermissionRequest) (*gethtypes.Transaction, error) { + return &gethtypes.Transaction{}, err + }, }, nil } } @@ -51,6 +61,7 @@ func TestRemoveCmd_Success(t *testing.T) { "--network", "holesky", "--eth-rpc-url", "https://ethereum-holesky.publicnode.com/", "--ecdsa-private-key", "0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd", + "--broadcast", } err := app.Run(args) @@ -76,31 +87,7 @@ func TestRemoveCmd_GeneratorError(t *testing.T) { "--network", "holesky", "--eth-rpc-url", "https://ethereum-holesky.publicnode.com/", "--ecdsa-private-key", "0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd", - } - - err := app.Run(args) - assert.Error(t, err) - assert.Contains(t, err.Error(), expectedError) -} - -func TestRemoveCmd_RemovePermissionError(t *testing.T) { - expectedError := "error removing permission" - app := cli.NewApp() - app.Commands = []*cli.Command{ - RemoveCmd(generateMockRemoveWriter(errors.New(expectedError))), - } - - args := []string{ - "TestRemoveCmd_RemovePermissionError", - "remove", - "--account-address", "0x1234567890abcdef1234567890abcdef12345678", - "--appointee-address", "0xabcdef1234567890abcdef1234567890abcdef12", - "--target-address", "0x9876543210fedcba9876543210fedcba98765432", - "--selector", "0x1A2B3C4D", - "--network", "holesky", - "--eth-rpc-url", "https://ethereum-holesky.publicnode.com/", - "--ecdsa-private-key", "0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd", - "--path-to-key-store", "/path/to/keystore.json", + "--broadcast", } err := app.Run(args) diff --git a/pkg/user/appointee/set.go b/pkg/user/appointee/set.go index 166d1971..4f85cc68 100644 --- a/pkg/user/appointee/set.go +++ b/pkg/user/appointee/set.go @@ -2,6 +2,7 @@ package appointee import ( "context" + "fmt" "sort" "github.com/Layr-Labs/eigenlayer-cli/pkg/internal/common" @@ -23,6 +24,9 @@ type SetAppointeePermissionWriter interface { ctx context.Context, request elcontracts.SetPermissionRequest, ) (*gethtypes.Receipt, error) + NewSetPermissionTx( + request elcontracts.SetPermissionRequest, + ) (*gethtypes.Transaction, error) } func SetCmd(generator func(logging.Logger, *setConfig) (SetAppointeePermissionWriter, error)) *cli.Command { @@ -31,7 +35,7 @@ func SetCmd(generator func(logging.Logger, *setConfig) (SetAppointeePermissionWr Usage: "user appointee set --account-address --appointee-address --target-address --selector ", UsageText: "Grant an appointee a permission.", Description: ` - Grant an appointee a permission.'. + Grant an appointee a permission. `, Action: func(c *cli.Context) error { return setAppointeePermission(c, generator) @@ -59,16 +63,35 @@ func setAppointeePermission( if err != nil { return err } - receipt, err := permissionWriter.SetPermission( - ctx, - elcontracts.SetPermissionRequest{ - AccountAddress: config.AccountAddress, - AppointeeAddress: config.AppointeeAddress, - Target: config.Target, - Selector: config.Selector, - WaitForReceipt: true, - }, - ) + return broadcastOrPrint(ctx, logger, permissionWriter, config) +} + +func broadcastOrPrint( + ctx context.Context, + logger logging.Logger, + permissionWriter SetAppointeePermissionWriter, + config *setConfig, +) error { + permissionRequest := elcontracts.SetPermissionRequest{ + AccountAddress: config.AccountAddress, + AppointeeAddress: config.AppointeeAddress, + Target: config.Target, + Selector: config.Selector, + WaitForReceipt: true, + } + if config.Broadcast { + return broadcastSetAppointeeTx(ctx, permissionWriter, config, permissionRequest) + } + return printSetAppointeeResults(logger, permissionWriter, config, permissionRequest) +} + +func broadcastSetAppointeeTx( + ctx context.Context, + permissionWriter SetAppointeePermissionWriter, + config *setConfig, + request elcontracts.SetPermissionRequest, +) error { + receipt, err := permissionWriter.SetPermission(ctx, request) if err != nil { return err } @@ -76,12 +99,60 @@ func setAppointeePermission( return nil } -func generateSetAppointeePermissionWriter( - prompter utils.Prompter, -) func( +func printSetAppointeeResults( logger logging.Logger, + permissionWriter SetAppointeePermissionWriter, config *setConfig, -) (SetAppointeePermissionWriter, error) { + request elcontracts.SetPermissionRequest, +) error { + ethClient, err := ethclient.Dial(config.RPCUrl) + if err != nil { + return err + } + noSendTxOpts := common.GetNoSendTxOpts(config.AccountAddress) + if common.IsSmartContractAddress(config.AccountAddress, ethClient) { + // address is a smart contract + noSendTxOpts.GasLimit = 150_000 + } + tx, err := permissionWriter.NewSetPermissionTx(request) + if err != nil { + return eigenSdkUtils.WrapError("failed to create unsigned tx", err) + } + + if config.OutputType == string(common.OutputType_Calldata) { + calldataHex := gethcommon.Bytes2Hex(tx.Data()) + if !common.IsEmptyString(config.OutputFile) { + err = common.WriteToFile([]byte(calldataHex), config.OutputFile) + if err != nil { + return err + } + logger.Infof("Call data written to file: %s", config.OutputFile) + } else { + fmt.Println(calldataHex) + } + } else { + if !common.IsEmptyString(config.OutputType) { + fmt.Println("output file not supported for pretty output type") + fmt.Println() + } + fmt.Printf( + "Appointee %s will be given permission to target %s selector %s by account %s\n", + config.AppointeeAddress, + config.Target, + config.Selector, + config.AccountAddress, + ) + } + txFeeDetails := common.GetTxFeeDetails(tx) + fmt.Println() + txFeeDetails.Print() + fmt.Println("To broadcast the transaction, use the --broadcast flag") + return nil +} + +func generateSetAppointeePermissionWriter( + prompter utils.Prompter, +) func(logger logging.Logger, config *setConfig) (SetAppointeePermissionWriter, error) { return func(logger logging.Logger, config *setConfig) (SetAppointeePermissionWriter, error) { ethClient, err := ethclient.Dial(config.RPCUrl) if err != nil { @@ -108,6 +179,9 @@ func readAndValidateSetConfig(cliContext *cli.Context, logger logging.Logger) (* ethRpcUrl := cliContext.String(flags.ETHRpcUrlFlag.Name) network := cliContext.String(flags.NetworkFlag.Name) environment := cliContext.String(flags.EnvironmentFlag.Name) + outputType := cliContext.String(flags.OutputTypeFlag.Name) + outputFile := cliContext.String(flags.OutputFileFlag.Name) + broadcast := cliContext.Bool(flags.BroadcastFlag.Name) target := gethcommon.HexToAddress(cliContext.String(TargetAddressFlag.Name)) selector := cliContext.String(SelectorFlag.Name) selectorBytes, err := common.ValidateAndConvertSelectorString(selector) @@ -155,6 +229,9 @@ func readAndValidateSetConfig(cliContext *cli.Context, logger logging.Logger) (* PermissionManagerAddress: gethcommon.HexToAddress(permissionManagerAddress), ChainID: chainID, Environment: environment, + OutputFile: outputFile, + OutputType: outputType, + Broadcast: broadcast, }, nil } @@ -170,6 +247,8 @@ func setCommandFlags() []cli.Flag { &flags.EnvironmentFlag, &flags.ETHRpcUrlFlag, &flags.BroadcastFlag, + &flags.OutputTypeFlag, + &flags.OutputFileFlag, } cmdFlags = append(cmdFlags, flags.GetSignerFlags()...) sort.Sort(cli.FlagsByName(cmdFlags)) diff --git a/pkg/user/appointee/set_test.go b/pkg/user/appointee/set_test.go index b17d3be2..e049ad36 100644 --- a/pkg/user/appointee/set_test.go +++ b/pkg/user/appointee/set_test.go @@ -5,17 +5,17 @@ import ( "errors" "testing" - gethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/Layr-Labs/eigensdk-go/chainio/clients/elcontracts" "github.com/Layr-Labs/eigensdk-go/logging" + gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/assert" "github.com/urfave/cli/v2" ) type mockSetAppointeePermissionWriter struct { - setPermissionFunc func(ctx context.Context, request elcontracts.SetPermissionRequest) (*gethtypes.Receipt, error) + setPermissionFunc func(ctx context.Context, request elcontracts.SetPermissionRequest) (*gethtypes.Receipt, error) + newSetPermissionTxFunc func(request elcontracts.SetPermissionRequest) (*gethtypes.Transaction, error) } func (m *mockSetAppointeePermissionWriter) SetPermission( @@ -25,12 +25,21 @@ func (m *mockSetAppointeePermissionWriter) SetPermission( return m.setPermissionFunc(ctx, request) } +func (m *mockSetAppointeePermissionWriter) NewSetPermissionTx( + request elcontracts.SetPermissionRequest, +) (*gethtypes.Transaction, error) { + return m.newSetPermissionTxFunc(request) +} + func generateMockSetWriter(err error) func(logging.Logger, *setConfig) (SetAppointeePermissionWriter, error) { return func(logger logging.Logger, config *setConfig) (SetAppointeePermissionWriter, error) { return &mockSetAppointeePermissionWriter{ setPermissionFunc: func(ctx context.Context, request elcontracts.SetPermissionRequest) (*gethtypes.Receipt, error) { return &gethtypes.Receipt{}, err }, + newSetPermissionTxFunc: func(request elcontracts.SetPermissionRequest) (*gethtypes.Transaction, error) { + return &gethtypes.Transaction{}, err + }, }, nil } } @@ -51,6 +60,7 @@ func TestSetCmd_Success(t *testing.T) { "--network", "holesky", "--eth-rpc-url", "https://ethereum-holesky.publicnode.com/", "--ecdsa-private-key", "0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd", + "--broadcast", } err := app.Run(args) @@ -76,6 +86,7 @@ func TestSetCmd_GeneratorError(t *testing.T) { "--network", "holesky", "--eth-rpc-url", "https://ethereum-holesky.publicnode.com/", "--ecdsa-private-key", "0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd", + "--broadcast", } err := app.Run(args) @@ -100,6 +111,7 @@ func TestSetCmd_SetPermissionError(t *testing.T) { "--network", "holesky", "--eth-rpc-url", "https://ethereum-holesky.publicnode.com/", "--ecdsa-private-key", "0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd", + "--broadcast", } err := app.Run(args) diff --git a/pkg/user/appointee/types.go b/pkg/user/appointee/types.go index d91496d0..6ac8c6b1 100644 --- a/pkg/user/appointee/types.go +++ b/pkg/user/appointee/types.go @@ -51,6 +51,9 @@ type removeConfig struct { PermissionManagerAddress gethcommon.Address ChainID *big.Int Environment string + OutputFile string + OutputType string + Broadcast bool } type setConfig struct { @@ -64,4 +67,7 @@ type setConfig struct { PermissionManagerAddress gethcommon.Address ChainID *big.Int Environment string + OutputFile string + OutputType string + Broadcast bool }