From 26b5baf40b13ea48561530f683b3608c312e8dad Mon Sep 17 00:00:00 2001 From: Vincent Date: Wed, 29 Jul 2020 10:48:47 +0200 Subject: [PATCH] listpays: fixed bolt11 null with keysend and update doc command listpays: make doc-all missed Changelog-Added: JSON-RPC: `listpays` can be used to query payments using the `payment_hash` Changelog-Added: JSON-RPC: `listpays` now includes the `payment_hash` --- doc/lightning-listpays.7 | 14 +++++++++----- doc/lightning-listpays.7.md | 13 ++++++++----- plugins/pay.c | 12 ++++++++++-- tests/test_pay.py | 24 ++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 12 deletions(-) diff --git a/doc/lightning-listpays.7 b/doc/lightning-listpays.7 index adff03ec3..30573f34e 100644 --- a/doc/lightning-listpays.7 +++ b/doc/lightning-listpays.7 @@ -3,12 +3,12 @@ lightning-listpays - Command for querying payment status .SH SYNOPSIS -\fBlistpays\fR [bolt11] +\fBlistpays\fR [bolt11] [payment_hash] .SH DESCRIPTION The \fBlistpay\fR RPC command gets the status of all \fIpay\fR commands, or a -single one if \fIbolt11\fR is specified\. +single one if either \fIbolt11\fR or \fIpayment_hash\fR was specified\. .SH RETURN VALUE @@ -16,7 +16,11 @@ On success, an array of objects is returned\. Each object contains: \fIbolt11\fR -the \fIbolt11\fR argument given to \fIpay\fR (see below for exceptions)\. +the \fIbolt11\fR invoice if provided to \fBpay\fR\. + + + \fIpayment_hash\fR +the \fIpayment_hash\fR of the payment\. \fIstatus\fR @@ -24,11 +28,11 @@ one of \fIcomplete\fR, \fIfailed\fR or \fIpending\fR\. \fIpayment_preimage\fR -(if \fIstatus\fR is \fIcomplete\fR) proves payment was received\. +if \fIstatus\fR is \fIcomplete\fR\. \fIlabel\fR -optional \fIlabel\fR, if provided to \fIpay\fR\. +optional \fIlabel\fR, if provided to \fIpay\fR or \fIsendonion\fR\. \fIamount_sent_msat\fR diff --git a/doc/lightning-listpays.7.md b/doc/lightning-listpays.7.md index 1cb8d0e19..4620dfabf 100644 --- a/doc/lightning-listpays.7.md +++ b/doc/lightning-listpays.7.md @@ -4,13 +4,13 @@ lightning-listpays -- Command for querying payment status SYNOPSIS -------- -**listpays** \[bolt11\] +**listpays** \[bolt11\] \[payment_hash\] DESCRIPTION ----------- The **listpay** RPC command gets the status of all *pay* commands, or a -single one if *bolt11* is specified. +single one if either *bolt11* or *payment_hash* was specified. RETURN VALUE ------------ @@ -18,16 +18,19 @@ RETURN VALUE On success, an array of objects is returned. Each object contains: *bolt11* -the *bolt11* argument given to *pay* (see below for exceptions). +the *bolt11* invoice if provided to `pay`. + + *payment_hash* +the *payment_hash* of the payment. *status* one of *complete*, *failed* or *pending*. *payment\_preimage* -(if *status* is *complete*) proves payment was received. +if *status* is *complete*. *label* -optional *label*, if provided to *pay*. +optional *label*, if provided to *pay* or *sendonion*. *amount\_sent\_msat* total amount sent, in "NNNmsat" format. diff --git a/plugins/pay.c b/plugins/pay.c index 883ddd693..1d63d99a3 100644 --- a/plugins/pay.c +++ b/plugins/pay.c @@ -1736,7 +1736,10 @@ static void add_new_entry(struct json_stream *ret, const struct pay_mpp *pm) { json_object_start(ret, NULL); - json_add_string(ret, "bolt11", pm->b11); + if (pm->b11) + json_add_string(ret, "bolt11", pm->b11); + + json_add_sha256(ret, "payment_hash", pm->payment_hash); json_add_string(ret, "status", pm->status); json_add_u32(ret, "created_at", pm->timestamp); @@ -1854,11 +1857,13 @@ static struct command_result *json_listpays(struct command *cmd, const jsmntok_t *params) { const char *b11str; + struct sha256 *payment_hash; struct out_req *req; /* FIXME: would be nice to parse as a bolt11 so check worked in future */ if (!param(cmd, buf, params, p_opt("bolt11", param_string, &b11str), + p_opt("payment_hash", param_sha256, &payment_hash), NULL)) return command_param_failed(); @@ -1867,6 +1872,9 @@ static struct command_result *json_listpays(struct command *cmd, cast_const(char *, b11str)); if (b11str) json_add_string(req->js, "bolt11", b11str); + + if (payment_hash) + json_add_sha256(req->js, "payment_hash", payment_hash); return send_outreq(cmd->plugin, req); } @@ -2054,7 +2062,7 @@ static const struct plugin_command commands[] = { }, { "listpays", "payment", - "List result of payment {bolt11}, or all", + "List result of payment {bolt11} or {payment_hash}, or all", "Covers old payments (failed and succeeded) and current ones.", json_listpays }, diff --git a/tests/test_pay.py b/tests/test_pay.py index 7c59dd345..5872f2fe4 100644 --- a/tests/test_pay.py +++ b/tests/test_pay.py @@ -3250,3 +3250,27 @@ def test_mpp_presplit_routehint_conflict(node_factory, bitcoind): inv = l3.rpc.invoice(Millisatoshi(2 * 10000 * 1000), 'i', 'i', exposeprivatechannels=True)['bolt11'] l1.rpc.pay(inv) + + +def test_listpay_result_with_paymod(node_factory, bitcoind): + """ + The object of this test is to verify the correct behavior + of the RPC command listpay e with two different type of + payment, such as: keysend (without invoice) and pay (with invoice). + l1 -> keysend -> l2 + l2 -> pay invoice -> l3 + """ + + amount_sat = 10 ** 6 + + l1, l2, l3 = node_factory.line_graph(3) + + invl2 = l2.rpc.invoice(amount_sat * 2, "inv_l2", "inv_l2") + l1.rpc.pay(invl2['bolt11']) + + l2.rpc.keysend(l3.info['id'], amount_sat * 2, "keysend_l3") + + assert 'bolt11' in l1.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]