lncli: Add --route_hints flag support

Adds --route_hints flag to sendpayment.
Hints should be JSON encoded (see usage for example).

Adds --route_hints flag to queryroutes.
Errors if blinded paths are set.
This commit is contained in:
Alex Pilon
2025-05-06 13:39:23 -04:00
parent dc946ae7e8
commit baf2e445f4

View File

@@ -5,6 +5,7 @@ import (
"context"
"crypto/rand"
"encoding/hex"
"encoding/json"
"errors"
"fmt"
"io"
@@ -254,6 +255,15 @@ var SendPaymentCommand = cli.Command{
Name: "keysend",
Usage: "will generate a pre-image and encode it in the sphinx packet, a dest must be set [experimental]",
},
cli.StringFlag{
Name: "route_hints",
Usage: `route hints for sending through private ` +
`channels. eg: ` +
`'[{"hop_hints":[{"node_id":"A","chan_id":1,` +
`"fee_base_msat":2,` +
`"fee_proportional_millionths":3,` +
`"cltv_expiry_delta":4}]}]'`,
},
),
Action: SendPayment,
}
@@ -473,6 +483,20 @@ func SendPayment(ctx *cli.Context) error {
req.PaymentAddr = payAddr
if ctx.IsSet("route_hints") {
// Parse the route hints JSON.
routeHintsJSON := ctx.String("route_hints")
var routeHints []*lnrpc.RouteHint
err := json.Unmarshal([]byte(routeHintsJSON), &routeHints)
if err != nil {
return fmt.Errorf("error unmarshaling route_hints "+
"json: %w", err)
}
req.RouteHints = routeHints
}
return SendPaymentRequest(ctx, req, conn, conn, routerRPCSendPayment)
}
@@ -1154,6 +1178,15 @@ var queryRoutesCommand = cli.Command{
blindedBaseFlag,
blindedPPMFlag,
blindedCLTVFlag,
cli.StringFlag{
Name: "route_hints",
Usage: `route hints for searching through private ` +
`channels (and no blinded paths set). eg: ` +
`'[{"hop_hints":[{"node_id":"A","chan_id":1,` +
`"fee_base_msat":2,` +
`"fee_proportional_millionths":3,` +
`"cltv_expiry_delta":4}]}]'`,
},
},
Action: actionDecorator(queryRoutes),
}
@@ -1248,6 +1281,23 @@ func queryRoutes(ctx *cli.Context) error {
BlindedPaymentPaths: blindedRoutes,
}
if ctx.IsSet("route_hints") {
if len(blindedRoutes) > 0 {
return fmt.Errorf("--route_hints should not be used " +
"if blinded paths are set")
}
routeHintsJSON := ctx.String("route_hints")
var routeHints []*lnrpc.RouteHint
err := json.Unmarshal([]byte(routeHintsJSON), &routeHints)
if err != nil {
return fmt.Errorf("error unmarshaling route_hints "+
"json: %w", err)
}
req.RouteHints = routeHints
}
route, err := client.QueryRoutes(ctxc, req)
if err != nil {
return err