|
5 | 5 | "context"
|
6 | 6 | "crypto/rand"
|
7 | 7 | "encoding/hex"
|
| 8 | + "encoding/json" |
8 | 9 | "errors"
|
9 | 10 | "fmt"
|
10 | 11 | "io"
|
@@ -254,6 +255,15 @@ var SendPaymentCommand = cli.Command{
|
254 | 255 | Name: "keysend",
|
255 | 256 | Usage: "will generate a pre-image and encode it in the sphinx packet, a dest must be set [experimental]",
|
256 | 257 | },
|
| 258 | + cli.StringFlag{ |
| 259 | + Name: "route_hints", |
| 260 | + Usage: `route hints for sending through private ` + |
| 261 | + `channels. eg: ` + |
| 262 | + `'[{"hop_hints":[{"node_id":"A","chan_id":1,` + |
| 263 | + `"fee_base_msat":2,` + |
| 264 | + `"fee_proportional_millionths":3,` + |
| 265 | + `"cltv_expiry_delta":4}]}]'`, |
| 266 | + }, |
257 | 267 | ),
|
258 | 268 | Action: SendPayment,
|
259 | 269 | }
|
@@ -473,6 +483,20 @@ func SendPayment(ctx *cli.Context) error {
|
473 | 483 |
|
474 | 484 | req.PaymentAddr = payAddr
|
475 | 485 |
|
| 486 | + if ctx.IsSet("route_hints") { |
| 487 | + // Parse the route hints JSON. |
| 488 | + routeHintsJSON := ctx.String("route_hints") |
| 489 | + var routeHints []*lnrpc.RouteHint |
| 490 | + |
| 491 | + err := json.Unmarshal([]byte(routeHintsJSON), &routeHints) |
| 492 | + if err != nil { |
| 493 | + return fmt.Errorf("error unmarshaling route_hints "+ |
| 494 | + "json: %w", err) |
| 495 | + } |
| 496 | + |
| 497 | + req.RouteHints = routeHints |
| 498 | + } |
| 499 | + |
476 | 500 | return SendPaymentRequest(ctx, req, conn, conn, routerRPCSendPayment)
|
477 | 501 | }
|
478 | 502 |
|
@@ -1154,6 +1178,15 @@ var queryRoutesCommand = cli.Command{
|
1154 | 1178 | blindedBaseFlag,
|
1155 | 1179 | blindedPPMFlag,
|
1156 | 1180 | blindedCLTVFlag,
|
| 1181 | + cli.StringFlag{ |
| 1182 | + Name: "route_hints", |
| 1183 | + Usage: `route hints for searching through private ` + |
| 1184 | + `channels (and no blinded paths set). eg: ` + |
| 1185 | + `'[{"hop_hints":[{"node_id":"A","chan_id":1,` + |
| 1186 | + `"fee_base_msat":2,` + |
| 1187 | + `"fee_proportional_millionths":3,` + |
| 1188 | + `"cltv_expiry_delta":4}]}]'`, |
| 1189 | + }, |
1157 | 1190 | },
|
1158 | 1191 | Action: actionDecorator(queryRoutes),
|
1159 | 1192 | }
|
@@ -1248,6 +1281,23 @@ func queryRoutes(ctx *cli.Context) error {
|
1248 | 1281 | BlindedPaymentPaths: blindedRoutes,
|
1249 | 1282 | }
|
1250 | 1283 |
|
| 1284 | + if ctx.IsSet("route_hints") { |
| 1285 | + if len(blindedRoutes) > 0 { |
| 1286 | + return fmt.Errorf("--route_hints should not be used " + |
| 1287 | + "if blinded paths are set") |
| 1288 | + } |
| 1289 | + routeHintsJSON := ctx.String("route_hints") |
| 1290 | + var routeHints []*lnrpc.RouteHint |
| 1291 | + |
| 1292 | + err := json.Unmarshal([]byte(routeHintsJSON), &routeHints) |
| 1293 | + if err != nil { |
| 1294 | + return fmt.Errorf("error unmarshaling route_hints "+ |
| 1295 | + "json: %w", err) |
| 1296 | + } |
| 1297 | + |
| 1298 | + req.RouteHints = routeHints |
| 1299 | + } |
| 1300 | + |
1251 | 1301 | route, err := client.QueryRoutes(ctxc, req)
|
1252 | 1302 | if err != nil {
|
1253 | 1303 | return err
|
|
0 commit comments