Skip to content

Commit

Permalink
listpays: fixed bolt11 null with keysend and update doc command
Browse files Browse the repository at this point in the history
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`
  • Loading branch information
vincenzopalazzo authored and cdecker committed Aug 7, 2020
1 parent 01a82d3 commit 816843a
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 12 deletions.
14 changes: 9 additions & 5 deletions doc/lightning-listpays.7

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 8 additions & 5 deletions doc/lightning-listpays.7.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,33 @@ 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
------------

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.
Expand Down
12 changes: 10 additions & 2 deletions plugins/pay.c
Original file line number Diff line number Diff line change
Expand Up @@ -1733,7 +1733,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);
if (pm->label)
json_add_tok(ret, "label", pm->label, buf);
Expand Down Expand Up @@ -1844,11 +1847,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();

Expand All @@ -1857,6 +1862,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);
}

Expand Down Expand Up @@ -2044,7 +2052,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
},
Expand Down
24 changes: 24 additions & 0 deletions tests/test_pay.py
Original file line number Diff line number Diff line change
Expand Up @@ -3239,3 +3239,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]

0 comments on commit 816843a

Please sign in to comment.