invoice: add ctlv option.

This is required if we want to create a "bouncer" plugin (in my copious free time!)

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Added: JSON-RPC: `invoice` now takes an optional `cltv` parameter.
This commit is contained in:
Rusty Russell
2021-01-08 15:13:50 +10:30
committed by Christian Decker
parent 4b2efd69d7
commit 1a8978100e
5 changed files with 23 additions and 6 deletions

View File

@@ -872,7 +872,7 @@ class LightningRpc(UnixDomainSocketRpc):
} }
return self.call("help", payload) return self.call("help", payload)
def invoice(self, msatoshi, label, description, expiry=None, fallbacks=None, preimage=None, exposeprivatechannels=None): def invoice(self, msatoshi, label, description, expiry=None, fallbacks=None, preimage=None, exposeprivatechannels=None, cltv=None):
""" """
Create an invoice for {msatoshi} with {label} and {description} with Create an invoice for {msatoshi} with {label} and {description} with
optional {expiry} seconds (default 1 week). optional {expiry} seconds (default 1 week).
@@ -884,7 +884,8 @@ class LightningRpc(UnixDomainSocketRpc):
"expiry": expiry, "expiry": expiry,
"fallbacks": fallbacks, "fallbacks": fallbacks,
"preimage": preimage, "preimage": preimage,
"exposeprivatechannels": exposeprivatechannels "exposeprivatechannels": exposeprivatechannels,
"cltv": cltv,
} }
return self.call("invoice", payload) return self.call("invoice", payload)

View File

@@ -4,7 +4,7 @@ lightning-invoice - Command for accepting payments
.SH SYNOPSIS .SH SYNOPSIS
\fBinvoice\fR \fImsatoshi\fR \fIlabel\fR \fIdescription\fR [\fIexpiry\fR] \fBinvoice\fR \fImsatoshi\fR \fIlabel\fR \fIdescription\fR [\fIexpiry\fR]
[\fIfallbacks\fR] [\fIpreimage\fR] [\fIexposeprivatechannels\fR] [\fIfallbacks\fR] [\fIpreimage\fR] [\fIexposeprivatechannels\fR] [\fIcltv\fR]
.SH DESCRIPTION .SH DESCRIPTION
@@ -71,6 +71,10 @@ other public channel)\. The selection uses some randomness to prevent
probing, but favors channels that become more balanced after the probing, but favors channels that become more balanced after the
payment\. payment\.
If specified, \fIcltv\fR sets the \fImin_final_cltv_expiry\fR for the invoice\.
Otherwise, it's set to the parameter \fBcltv-final\fR\.
.SH RETURN VALUE .SH RETURN VALUE
On success, a hash is returned as \fIpayment_hash\fR to be given to the On success, a hash is returned as \fIpayment_hash\fR to be given to the
@@ -124,4 +128,4 @@ Rusty Russell \fI<rusty@rustcorp.com.au\fR> is mainly responsible\.
Main web site: \fIhttps://github.com/ElementsProject/lightning\fR Main web site: \fIhttps://github.com/ElementsProject/lightning\fR
\" SHA256STAMP:9a361884baa1bdceffb9861839ce4728cf38eaf5d08b3437ad4b3f5b9b42d8db \" SHA256STAMP:5a7792cb739f34adf7db346f3bd615816915230fcb8343af1b742336a677dbc2

View File

@@ -5,7 +5,7 @@ SYNOPSIS
-------- --------
**invoice** *msatoshi* *label* *description* \[*expiry*\] **invoice** *msatoshi* *label* *description* \[*expiry*\]
\[*fallbacks*\] \[*preimage*\] \[*exposeprivatechannels*\] \[*fallbacks*\] \[*preimage*\] \[*exposeprivatechannels*\] \[*cltv*\]
DESCRIPTION DESCRIPTION
----------- -----------
@@ -65,6 +65,9 @@ other public channel). The selection uses some randomness to prevent
probing, but favors channels that become more balanced after the probing, but favors channels that become more balanced after the
payment. payment.
If specified, *cltv* sets the *min_final_cltv_expiry* for the invoice.
Otherwise, it's set to the parameter **cltv-final**.
RETURN VALUE RETURN VALUE
------------ ------------

View File

@@ -1006,6 +1006,7 @@ static struct command_result *json_invoice(struct command *cmd,
struct sha256 rhash; struct sha256 rhash;
struct secret payment_secret; struct secret payment_secret;
struct preimage *preimage; struct preimage *preimage;
u32 *cltv;
#if DEVELOPER #if DEVELOPER
const jsmntok_t *routes; const jsmntok_t *routes;
#endif #endif
@@ -1022,6 +1023,8 @@ static struct command_result *json_invoice(struct command *cmd,
p_opt("preimage", param_preimage, &preimage), p_opt("preimage", param_preimage, &preimage),
p_opt("exposeprivatechannels", param_chanhints, p_opt("exposeprivatechannels", param_chanhints,
&info->chanhints), &info->chanhints),
p_opt_def("cltv", param_number, &cltv,
cmd->ld->config.cltv_final),
#if DEVELOPER #if DEVELOPER
p_opt("dev-routes", param_array, &routes), p_opt("dev-routes", param_array, &routes),
#endif #endif
@@ -1081,7 +1084,7 @@ static struct command_result *json_invoice(struct command *cmd,
info->b11->timestamp = time_now().ts.tv_sec; info->b11->timestamp = time_now().ts.tv_sec;
info->b11->payment_hash = rhash; info->b11->payment_hash = rhash;
info->b11->receiver_id = cmd->ld->id; info->b11->receiver_id = cmd->ld->id;
info->b11->min_final_cltv_expiry = cmd->ld->config.cltv_final; info->b11->min_final_cltv_expiry = *cltv;
info->b11->expiry = *expiry; info->b11->expiry = *expiry;
info->b11->description = tal_steal(info->b11, desc_val); info->b11->description = tal_steal(info->b11, desc_val);
info->b11->description_hash = NULL; info->b11->description_hash = NULL;

View File

@@ -30,6 +30,7 @@ def test_invoice(node_factory, chainparams):
assert b11['fallbacks'][0]['type'] == 'P2WPKH' assert b11['fallbacks'][0]['type'] == 'P2WPKH'
assert b11['fallbacks'][1]['addr'] == addr2 assert b11['fallbacks'][1]['addr'] == addr2
assert b11['fallbacks'][1]['type'] == 'P2SH' assert b11['fallbacks'][1]['type'] == 'P2SH'
assert b11['min_final_cltv_expiry'] == 5
# There's no incoming channel, so no routeboost # There's no incoming channel, so no routeboost
assert 'routes' not in b11 assert 'routes' not in b11
assert 'warning_capacity' in inv assert 'warning_capacity' in inv
@@ -58,6 +59,11 @@ def test_invoice(node_factory, chainparams):
l2.rpc.invoice(4294967295 + 1, 'inv3', '?') l2.rpc.invoice(4294967295 + 1, 'inv3', '?')
l2.rpc.invoice(4294967295, 'inv3', '?') l2.rpc.invoice(4294967295, 'inv3', '?')
# Test cltv option.
inv = l1.rpc.invoice(123000, 'label3', 'description', '3700', cltv=99)
b11 = l1.rpc.decodepay(inv['bolt11'])
assert b11['min_final_cltv_expiry'] == 99
def test_invoice_zeroval(node_factory): def test_invoice_zeroval(node_factory):
"""A zero value invoice is unpayable, did you mean 'any'?""" """A zero value invoice is unpayable, did you mean 'any'?"""