listpays mod 1: add destination inside the response when bolt11 is null

Changelog-Added: JSON-RPC: `listpays` now lists the `destination` if it was provided (e.g., via the `pay` plugin or `keysend` plugin)
This commit is contained in:
Vincenzo Palazzo 2020-07-31 17:19:22 +02:00 committed by Christian Decker
parent 700897f06e
commit 1521c29fcf
6 changed files with 32 additions and 5 deletions

View File

@ -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\.

View File

@ -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*.

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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]