From 807bc0628c97823f31ce687d1368bd886d431a84 Mon Sep 17 00:00:00 2001 From: mads krogh Date: Tue, 11 Jan 2022 21:41:20 +0100 Subject: [PATCH] lncli: add chan_point flag to closechannel command --- cmd/lncli/commands.go | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/cmd/lncli/commands.go b/cmd/lncli/commands.go index e38479536..d1d0296b7 100644 --- a/cmd/lncli/commands.go +++ b/cmd/lncli/commands.go @@ -39,6 +39,9 @@ const ( defaultUtxoMinConf = 1 ) +var errBadChanPoint = errors.New("expecting chan_point to be in format of: " + + "txid:index") + func getContext() context.Context { shutdownInterceptor, err := signal.Intercept() if err != nil { @@ -719,6 +722,12 @@ var closeChannelCommand = cli.Command{ Usage: "the output index for the funding output of the funding " + "transaction", }, + cli.StringFlag{ + Name: "chan_point", + Usage: "(optional) the channel point. If set, " + + "funding_txid and output_index flags and " + + "positional arguments will be ignored", + }, cli.BoolFlag{ Name: "force", Usage: "attempt an uncooperative closure", @@ -1183,10 +1192,19 @@ func abandonChannel(ctx *cli.Context) error { // line. Both named options as well as unnamed parameters are supported. func parseChannelPoint(ctx *cli.Context) (*lnrpc.ChannelPoint, error) { channelPoint := &lnrpc.ChannelPoint{} + var err error args := ctx.Args() switch { + case ctx.IsSet("chan_point"): + channelPoint, err = parseChanPoint(ctx.String("chan_point")) + if err != nil { + return nil, fmt.Errorf("unable to parse chan_point: "+ + "%v", err) + } + return channelPoint, nil + case ctx.IsSet("funding_txid"): channelPoint.FundingTxid = &lnrpc.ChannelPoint_FundingTxidStr{ FundingTxidStr: ctx.String("funding_txid"), @@ -1984,9 +2002,8 @@ var updateChannelPolicyCommand = cli.Command{ func parseChanPoint(s string) (*lnrpc.ChannelPoint, error) { split := strings.Split(s, ":") - if len(split) != 2 { - return nil, fmt.Errorf("expecting chan_point to be in format of: " + - "txid:index") + if len(split) != 2 || len(split[0]) == 0 || len(split[1]) == 0 { + return nil, errBadChanPoint } index, err := strconv.ParseInt(split[1], 10, 32) @@ -2077,7 +2094,7 @@ func updateChannelPolicy(ctx *cli.Context) error { if chanPointStr != "" { chanPoint, err = parseChanPoint(chanPointStr) if err != nil { - return fmt.Errorf("unable to parse chan point: %v", err) + return fmt.Errorf("unable to parse chan_point: %v", err) } } @@ -2227,7 +2244,7 @@ func exportChanBackup(ctx *cli.Context) error { if chanPointStr != "" { chanPointRPC, err := parseChanPoint(chanPointStr) if err != nil { - return err + return fmt.Errorf("unable to parse chan_point: %v", err) } chanBackup, err := client.ExportChannelBackup(