diff --git a/doc/lightning-sendonion.7 b/doc/lightning-sendonion.7 index 260921fee..56d63b1e1 100644 --- a/doc/lightning-sendonion.7 +++ b/doc/lightning-sendonion.7 @@ -3,7 +3,8 @@ lightning-sendonion - Send a payment with a custom onion packet .SH SYNOPSIS -\fBsendonion\fR \fIonion\fR \fIfirst_hop\fR \fIpayment_hash\fR [\fIlabel\fR] [\fIshared_secrets\fR] [\fIpartid\fR] [\fIbolt11\fR] [\fImsatoshi\fR] +\fBsendonion\fR \fIonion\fR \fIfirst_hop\fR \fIpayment_hash\fR [\fIlabel\fR] [\fIshared_secrets\fR] [\fIpartid\fR] [\fIbolt11\fR] +[\fIdestination\fR] [\fImsatoshi\fR] .SH DESCRIPTION @@ -90,6 +91,9 @@ The \fIbolt11\fR parameter, if provided, will be returned in \fIwaitsendpay\fR and \fIlistsendpays\fR results\. +The \fIdestination\fR parameter, if provided, will be returned in \fBlistpays\fR result\. + + The \fImsatoshi\fR parameter is used to annotate the payment, and is returned by \fIwaitsendpay\fR and \fIlistsendpays\fR\. diff --git a/doc/lightning-sendonion.7.md b/doc/lightning-sendonion.7.md index cde69a1db..0b4e18f42 100644 --- a/doc/lightning-sendonion.7.md +++ b/doc/lightning-sendonion.7.md @@ -4,7 +4,8 @@ lightning-sendonion -- Send a payment with a custom onion packet SYNOPSIS -------- -**sendonion** *onion* *first_hop* *payment_hash* \[*label*\] \[*shared_secrets*\] \[*partid*\] \[*bolt11*\] \[*msatoshi*\] +**sendonion** *onion* *first_hop* *payment_hash* \[*label*\] \[*shared_secrets*\] \[*partid*\] \[*bolt11*\] +\[*msatoshi*\] \[*destination*\] DESCRIPTION ----------- @@ -78,6 +79,8 @@ partial payments with the same *payment_hash*. The *bolt11* parameter, if provided, will be returned in *waitsendpay* and *listsendpays* results. +The *destination* parameter, if provided, will be returned in **listpays** result. + The *msatoshi* parameter is used to annotate the payment, and is returned by *waitsendpay* and *listsendpays*. diff --git a/lightningd/pay.c b/lightningd/pay.c index f9dc40f57..d6a013d51 100644 --- a/lightningd/pay.c +++ b/lightningd/pay.c @@ -1178,6 +1178,7 @@ static struct command_result *json_sendonion(struct command *cmd, struct sha256 *payment_hash; struct lightningd *ld = cmd->ld; const char *label, *b11str; + struct node_id *destination; struct secret *path_secrets; struct amount_msat *msat; u64 *partid; @@ -1191,6 +1192,7 @@ static struct command_result *json_sendonion(struct command *cmd, p_opt_def("partid", param_u64, &partid, 0), p_opt("bolt11", param_string, &b11str), p_opt_def("msatoshi", param_msat, &msat, AMOUNT_MSAT(0)), + p_opt("destination", param_node_id, &destination), NULL)) return command_param_failed(); @@ -1204,7 +1206,7 @@ static struct command_result *json_sendonion(struct command *cmd, return send_payment_core(ld, cmd, payment_hash, *partid, first_hop, *msat, AMOUNT_MSAT(0), - label, b11str, &packet, NULL, NULL, NULL, + label, b11str, &packet, destination, NULL, NULL, path_secrets); } diff --git a/plugins/libplugin-pay.c b/plugins/libplugin-pay.c index 5b6fe84b0..4521b9afa 100644 --- a/plugins/libplugin-pay.c +++ b/plugins/libplugin-pay.c @@ -1041,6 +1041,9 @@ static struct command_result *payment_createonion_success(struct command *cmd, if (p->bolt11) json_add_string(req->js, "bolt11", p->bolt11); + if (p->destination) + json_add_node_id(req->js, "destination", p->destination); + send_outreq(p->plugin, req); return command_still_pending(cmd); } diff --git a/plugins/pay.c b/plugins/pay.c index 1d63d99a3..3832e8900 100644 --- a/plugins/pay.c +++ b/plugins/pay.c @@ -1669,6 +1669,9 @@ struct pay_mpp { /* Timestamp of the first part */ u32 timestamp; + + /* The destination of the payment, if specified. */ + struct node_id *destination; }; static const struct sha256 *pay_mpp_key(const struct pay_mpp *pm) @@ -1739,6 +1742,9 @@ static void add_new_entry(struct json_stream *ret, if (pm->b11) json_add_string(ret, "bolt11", pm->b11); + if (pm->destination) + json_add_node_id(ret, "destination", pm->destination); + json_add_sha256(ret, "payment_hash", pm->payment_hash); json_add_string(ret, "status", pm->status); json_add_u32(ret, "created_at", pm->timestamp); @@ -1785,13 +1791,15 @@ static struct command_result *listsendpays_done(struct command *cmd, ret = jsonrpc_stream_success(cmd); json_array_start(ret, "pays"); json_for_each_arr(i, t, arr) { - const jsmntok_t *status, *b11tok, *hashtok, *createdtok; + const jsmntok_t *status, *b11tok, *hashtok, *destinationtok, *createdtok; const char *b11 = b11str; struct sha256 payment_hash; + struct node_id destination; u32 created_at; b11tok = json_get_member(buf, t, "bolt11"); hashtok = json_get_member(buf, t, "payment_hash"); + destinationtok = json_get_member(buf, t, "destination"); createdtok = json_get_member(buf, t, "created_at"); assert(hashtok != NULL); assert(createdtok != NULL); @@ -1801,11 +1809,15 @@ static struct command_result *listsendpays_done(struct command *cmd, if (b11tok) b11 = json_strdup(cmd, buf, b11tok); + if (destinationtok) + json_to_node_id(buf, destinationtok, &destination); + pm = pay_map_get(&pay_map, &payment_hash); if (!pm) { pm = tal(cmd, struct pay_mpp); pm->payment_hash = tal_dup(pm, struct sha256, &payment_hash); pm->b11 = tal_steal(pm, b11); + pm->destination = tal_dup(pm,struct node_id, &destination); pm->label = json_get_member(buf, t, "label"); pm->preimage = NULL; pm->amount_sent = AMOUNT_MSAT(0); @@ -1875,6 +1887,7 @@ static struct command_result *json_listpays(struct command *cmd, if (payment_hash) json_add_sha256(req->js, "payment_hash", payment_hash); + return send_outreq(cmd->plugin, req); } diff --git a/tests/test_pay.py b/tests/test_pay.py index 08817fc93..0b2c1865b 100644 --- a/tests/test_pay.py +++ b/tests/test_pay.py @@ -3261,6 +3261,8 @@ def test_listpay_result_with_paymod(node_factory, bitcoind): l2.rpc.keysend(l3.info['id'], amount_sat * 2, "keysend_l3") assert 'bolt11' in l1.rpc.listpays()['pays'][0] + assert 'bolt11' not in l2.rpc.listpays()['pays'][0] assert 'payment_hash' in l2.rpc.listpays()['pays'][0] assert 'payment_hash' in l1.rpc.listpays()['pays'][0] - assert 'bolt11' not in l2.rpc.listpays()['pays'][0] + assert 'destination' in l1.rpc.listpays()['pays'][0] + assert 'destination' in l2.rpc.listpays()['pays'][0]