From 3c68a24275ad1f6adf5e9ab07faa87f18043fd11 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Thu, 17 Jun 2021 15:10:19 +0930 Subject: [PATCH] invoice: allow creation of giant invoices. https://github.com/lightningnetwork/lightning-rfc/pull/877 talks about removing this restriction (only Electrum actually enforced it on receive), so start by allowing creation of giant invoices, though we mark them as requiring mpp. Changelog-Changed: JSON-RPC: `invoice` now allows creation of giant invoices (>= 2^32 msat) Signed-off-by: Rusty Russell --- lightningd/invoice.c | 21 +++++++++++++-------- tests/test_invoices.py | 6 +++--- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lightningd/invoice.c b/lightningd/invoice.c index bf7c2ec4ca13..ba9962473d44 100644 --- a/lightningd/invoice.c +++ b/lightningd/invoice.c @@ -834,6 +834,19 @@ invoice_complete(struct invoice_info *info, info->label->s); } + /* If this requires a giant HTLC, most implementations cannot + * send that much; will need to split. */ + /* BOLT #2: + * ### Adding an HTLC: `update_add_htlc` + *... + * - for channels with `chain_hash` identifying the Bitcoin blockchain: + * - MUST set the four most significant bytes of `amount_msat` to 0. + */ + if (info->b11->msat + && amount_msat_greater(*info->b11->msat, chainparams->max_payment)) { + warning_mpp = true; + } + /* Get details */ details = wallet_invoice_details(info, wallet, invoice); @@ -1135,14 +1148,6 @@ static struct command_result *json_invoice(struct command *cmd, strlen(desc_val)); } - if (msatoshi_val - && amount_msat_greater(*msatoshi_val, chainparams->max_payment)) { - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "msatoshi cannot exceed %s", - type_to_string(tmpctx, struct amount_msat, - &chainparams->max_payment)); - } - if (fallbacks) { size_t i; const jsmntok_t *t; diff --git a/tests/test_invoices.py b/tests/test_invoices.py index 33e91ae9bc76..340b2f10f7f6 100644 --- a/tests/test_invoices.py +++ b/tests/test_invoices.py @@ -54,9 +54,9 @@ def test_invoice(node_factory, chainparams): assert 'routes' not in b11 assert 'warning_capacity' in inv - # Make sure no wumbo invoices - with pytest.raises(RpcError, match=r'msatoshi cannot exceed 4294967295msat'): - l2.rpc.invoice(4294967295 + 1, 'inv3', '?') + # Make sure wumbo invoices warn about mpp being needed. + inv = l2.rpc.invoice(4294967295 + 1, 'inv3', '?') + assert 'warning_mpp' in inv l2.rpc.invoice(4294967295, 'inv3', '?') # Test cltv option.