diff --git a/cli/chain.go b/cli/chain.go index 0c25a881c6b..d48c56730de 100644 --- a/cli/chain.go +++ b/cli/chain.go @@ -1299,6 +1299,10 @@ var SlashConsensusFault = &cli.Command{ a := srv.FullNodeAPI() ctx := ReqContext(cctx) + if cctx.NArg() != 2 { + return IncorrectNumArgs(cctx) + } + c1, err := cid.Parse(cctx.Args().Get(0)) if err != nil { return xerrors.Errorf("parsing cid 1: %w", err) diff --git a/cli/disputer.go b/cli/disputer.go index f6680daec66..d24e1b2ff8e 100644 --- a/cli/disputer.go +++ b/cli/disputer.go @@ -55,7 +55,16 @@ var disputerMsgCmd = &cli.Command{ Name: "dispute", Usage: "Send a specific DisputeWindowedPoSt message", ArgsUsage: "[minerAddress index postIndex]", - Flags: []cli.Flag{}, + Flags: []cli.Flag{ + &cli.Uint64Flag{ + Name: "max-fee", + Usage: "maximum fees to spend on a dispute message", + }, + &cli.StringFlag{ + Name: "from", + Usage: "the address to send dispute messages from if not the default wallet address", + }, + }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 3 { return IncorrectNumArgs(cctx) @@ -63,6 +72,10 @@ var disputerMsgCmd = &cli.Command{ ctx := ReqContext(cctx) + if cctx.NArg() != 3 { + return IncorrectNumArgs(cctx) + } + api, closer, err := GetFullNodeAPI(cctx) if err != nil { return err @@ -137,8 +150,16 @@ var disputerStartCmd = &cli.Command{ ArgsUsage: "[minerAddress]", Flags: []cli.Flag{ &cli.Uint64Flag{ - Name: "start-epoch", - Usage: "only start disputing PoSts after this epoch ", + Name: "height", + Usage: "only start disputing PoSts after this height ", + }, + &cli.Uint64Flag{ + Name: "max-fee", + Usage: "maximum fees to spend on a dispute message", + }, + &cli.StringFlag{ + Name: "from", + Usage: "the address to send dispute messages from if not the default wallet address", }, }, Action: func(cctx *cli.Context) error { @@ -150,6 +171,10 @@ var disputerStartCmd = &cli.Command{ ctx := ReqContext(cctx) + if cctx.NArg() != 0 { + return IncorrectNumArgs(cctx) + } + fromAddr, err := getSender(ctx, api, cctx.String("from")) if err != nil { return err diff --git a/cli/evm.go b/cli/evm.go index 612dd5cc116..f0dbec7e3b3 100644 --- a/cli/evm.go +++ b/cli/evm.go @@ -217,8 +217,8 @@ var EvmDeployCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if argc := cctx.Args().Len(); argc != 1 { - return xerrors.Errorf("must pass the contract init code") + if cctx.NArg() != 1 { + return IncorrectNumArgsWithHint(cctx, "contract init code required") } contract, err := os.ReadFile(cctx.Args().First()) @@ -338,8 +338,8 @@ var EvmInvokeCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if argc := cctx.Args().Len(); argc != 2 { - return xerrors.Errorf("must pass the address and calldata") + if cctx.NArg() != 2 { + return IncorrectNumArgsWithHint(cctx, "address and calldata requried") } addr, err := address.NewFromString(cctx.Args().Get(0)) diff --git a/cli/f3.go b/cli/f3.go index 966c6f3d681..0ffb984054f 100644 --- a/cli/f3.go +++ b/cli/f3.go @@ -316,8 +316,8 @@ var f3SubCmdCerts = &cli.Command{ f3FlagOutput, }, Before: func(cctx *cli.Context) error { - if count := cctx.NArg(); count > 1 { - return fmt.Errorf("too many arguments: expected at most 1 but got %d", count) + if cctx.NArg() > 1 { + return IncorrectNumArgsWithHint(cctx, "expected 1 at most") } return nil }, @@ -397,8 +397,8 @@ Examples: f3FlagReverseOrder, }, Before: func(cctx *cli.Context) error { - if count := cctx.NArg(); count > 1 { - return fmt.Errorf("too many arguments: expected at most 1 but got %d", count) + if cctx.NArg() > 1 { + return IncorrectNumArgsWithHint(cctx, "expected 1 at most") } return nil }, diff --git a/cli/helper.go b/cli/helper.go index 551422983b9..5bcdaa16c23 100644 --- a/cli/helper.go +++ b/cli/helper.go @@ -37,6 +37,10 @@ func IncorrectNumArgs(cctx *ufcli.Context) error { return ShowHelp(cctx, fmt.Errorf("incorrect number of arguments, got %d", cctx.NArg())) } +func IncorrectNumArgsWithHint(cctx *ufcli.Context, hint string) error { + return ShowHelp(cctx, fmt.Errorf("incorrect number of arguments, got %d, %s", cctx.NArg(), hint)) +} + func RunApp(app *ufcli.App) { c := make(chan os.Signal, 1) signal.Notify(c, syscall.SIGTERM, syscall.SIGINT) diff --git a/cli/log.go b/cli/log.go index 7b223aa17a6..224a9f6a07d 100644 --- a/cli/log.go +++ b/cli/log.go @@ -81,8 +81,8 @@ var LogSetLevel = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if !cctx.Args().Present() { - return fmt.Errorf("level is required") + if cctx.NArg() != 1 { + return IncorrectNumArgsWithHint(cctx, "level required") } systems := cctx.StringSlice("system") diff --git a/cli/multisig.go b/cli/multisig.go index 4abb0c1543e..13ecf6bf37e 100644 --- a/cli/multisig.go +++ b/cli/multisig.go @@ -201,8 +201,8 @@ var msigInspectCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if !cctx.Args().Present() { - return ShowHelp(cctx, fmt.Errorf("must specify address of multisig to inspect")) + if cctx.NArg() != 1 { + return IncorrectNumArgsWithHint(cctx, "specify address of multisig") } api, closer, err := GetFullNodeAPI(cctx) diff --git a/cli/net.go b/cli/net.go index 249a6c4b7db..7cffecd3666 100644 --- a/cli/net.go +++ b/cli/net.go @@ -275,6 +275,10 @@ var NetDisconnect = &cli.Command{ defer closer() ctx := ReqContext(cctx) + if cctx.NArg() == 0 { + return IncorrectNumArgsWithHint(cctx, "must provide at least one peerID") + } + ids := cctx.Args().Slice() for _, id := range ids { pid, err := peer.Decode(id) @@ -399,8 +403,7 @@ var NetFindPeer = &cli.Command{ ArgsUsage: "[peerId]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - fmt.Println("Usage: findpeer [peer ID]") - return nil + return IncorrectNumArgsWithHint(cctx, "must provide a peerID") } pid, err := peer.Decode(cctx.Args().First()) @@ -585,6 +588,10 @@ var NetBlockAddPeer = &cli.Command{ Usage: "Block a peer", ArgsUsage: " ...", Action: func(cctx *cli.Context) error { + if cctx.NArg() < 1 { + return IncorrectNumArgs(cctx) + } + api, closer, err := GetFullNodeAPI(cctx) if err != nil { return err @@ -611,6 +618,10 @@ var NetBlockAddIP = &cli.Command{ Usage: "Block an IP address", ArgsUsage: " ...", Action: func(cctx *cli.Context) error { + if cctx.NArg() < 1 { + return IncorrectNumArgs(cctx) + } + api, closer, err := GetFullNodeAPI(cctx) if err != nil { return err @@ -627,6 +638,10 @@ var NetBlockAddSubnet = &cli.Command{ Usage: "Block an IP subnet", ArgsUsage: " ...", Action: func(cctx *cli.Context) error { + if cctx.NArg() < 1 { + return IncorrectNumArgs(cctx) + } + api, closer, err := GetFullNodeAPI(cctx) if err != nil { return err @@ -653,6 +668,10 @@ var NetBlockRemovePeer = &cli.Command{ Usage: "Unblock a peer", ArgsUsage: " ...", Action: func(cctx *cli.Context) error { + if cctx.NArg() < 1 { + return IncorrectNumArgs(cctx) + } + api, closer, err := GetFullNodeAPI(cctx) if err != nil { return err @@ -679,6 +698,10 @@ var NetBlockRemoveIP = &cli.Command{ Usage: "Unblock an IP address", ArgsUsage: " ...", Action: func(cctx *cli.Context) error { + if cctx.NArg() < 1 { + return IncorrectNumArgs(cctx) + } + api, closer, err := GetFullNodeAPI(cctx) if err != nil { return err @@ -695,6 +718,10 @@ var NetBlockRemoveSubnet = &cli.Command{ Usage: "Unblock an IP subnet", ArgsUsage: " ...", Action: func(cctx *cli.Context) error { + if cctx.NArg() < 1 { + return IncorrectNumArgs(cctx) + } + api, closer, err := GetFullNodeAPI(cctx) if err != nil { return err diff --git a/cli/spcli/actor.go b/cli/spcli/actor.go index 41926fe83cf..525f991e0b2 100644 --- a/cli/spcli/actor.go +++ b/cli/spcli/actor.go @@ -734,8 +734,8 @@ func ActorProposeChangeWorkerCmd(getActor ActorAddressGetter) *cli.Command { }, }, Action: func(cctx *cli.Context) error { - if !cctx.Args().Present() { - return fmt.Errorf("must pass address of new worker address") + if cctx.NArg() != 1 { + return lcli.IncorrectNumArgsWithHint(cctx, "must pass address of the new worker address") } api, acloser, err := lcli.GetFullNodeAPI(cctx) @@ -980,8 +980,8 @@ func ActorConfirmChangeWorkerCmd(getActor ActorAddressGetter) *cli.Command { }, }, Action: func(cctx *cli.Context) error { - if !cctx.Args().Present() { - return fmt.Errorf("must pass address of new worker address") + if cctx.NArg() != 1 { + return lcli.IncorrectNumArgsWithHint(cctx, "must pass address of new worker address") } api, acloser, err := lcli.GetFullNodeAPI(cctx) diff --git a/cli/sync.go b/cli/sync.go index 8e4c3d889f7..2eb070c3d80 100644 --- a/cli/sync.go +++ b/cli/sync.go @@ -111,6 +111,10 @@ var SyncMarkBadCmd = &cli.Command{ Usage: "Mark the given block as bad, will prevent syncing to a chain that contains it", ArgsUsage: "[blockCid]", Action: func(cctx *cli.Context) error { + if cctx.NArg() != 1 { + return IncorrectNumArgsWithHint(cctx, "must specify block cid to mark") + } + napi, closer, err := GetFullNodeAPI(cctx) if err != nil { return err @@ -118,10 +122,6 @@ var SyncMarkBadCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if !cctx.Args().Present() { - return fmt.Errorf("must specify block cid to mark") - } - bcid, err := cid.Decode(cctx.Args().First()) if err != nil { return fmt.Errorf("failed to decode input as a cid: %s", err) @@ -142,6 +142,10 @@ var SyncUnmarkBadCmd = &cli.Command{ }, ArgsUsage: "[blockCid]", Action: func(cctx *cli.Context) error { + if cctx.NArg() != 1 { + return IncorrectNumArgsWithHint(cctx, "must specify block cid to unmark") + } + napi, closer, err := GetFullNodeAPI(cctx) if err != nil { return err @@ -153,10 +157,6 @@ var SyncUnmarkBadCmd = &cli.Command{ return napi.SyncUnmarkAllBad(ctx) } - if !cctx.Args().Present() { - return fmt.Errorf("must specify block cid to unmark") - } - bcid, err := cid.Decode(cctx.Args().First()) if err != nil { return fmt.Errorf("failed to decode input as a cid: %s", err) @@ -171,6 +171,10 @@ var SyncCheckBadCmd = &cli.Command{ Usage: "check if the given block was marked bad, and for what reason", ArgsUsage: "[blockCid]", Action: func(cctx *cli.Context) error { + if cctx.NArg() != 1 { + return IncorrectNumArgsWithHint(cctx, "must specify block cid to check") + } + afmt := NewAppFmt(cctx.App) napi, closer, err := GetFullNodeAPI(cctx) @@ -180,10 +184,6 @@ var SyncCheckBadCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if !cctx.Args().Present() { - return fmt.Errorf("must specify block cid to check") - } - bcid, err := cid.Decode(cctx.Args().First()) if err != nil { return fmt.Errorf("failed to decode input as a cid: %s", err) diff --git a/cli/wallet.go b/cli/wallet.go index 83349759a65..1310491a171 100644 --- a/cli/wallet.go +++ b/cli/wallet.go @@ -733,7 +733,7 @@ var walletMarketAdd = &cli.Command{ afmt := NewAppFmt(cctx.App) // Get amount param - if cctx.NArg() < 1 { + if cctx.NArg() != 1 { return IncorrectNumArgs(cctx) } f, err := types.ParseFIL(cctx.Args().First())