diff --git a/Makefile b/Makefile index c9cd544c8..4c3dd6475 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ CCANDIR := ccan # Where we keep the BOLT RFCs BOLTDIR := ../lightning-rfc/ -DEFAULT_BOLTVERSION := 381650c7bc3e7370df7b6f12b3c6bb63f970fd97 +DEFAULT_BOLTVERSION := 07c7caed516f3a39370d2467685b1a48a12e50ad # Can be overridden on cmdline. BOLTVERSION := $(DEFAULT_BOLTVERSION) diff --git a/channeld/full_channel.c b/channeld/full_channel.c index be6f0de87..d3650fbbd 100644 --- a/channeld/full_channel.c +++ b/channeld/full_channel.c @@ -578,7 +578,8 @@ static enum channel_add_err add_htlc(struct channel *channel, return CHANNEL_ERR_HTLC_BELOW_MINIMUM; } - /* BOLT #2: + /* FIXME: There used to be a requirement that we not send more than + * 2^32 msat, *but* only electrum enforced it. Remove in next version: * * A sending node: *... diff --git a/common/test/run-bolt11.c b/common/test/run-bolt11.c index 39747180f..8fb329e53 100644 --- a/common/test/run-bolt11.c +++ b/common/test/run-bolt11.c @@ -157,7 +157,7 @@ int main(int argc, char *argv[]) /* BOLT #11: * * > ### Please make a donation of any amount using payment_hash 0001020304050607080900010203040506070809000102030405060708090102 to me @03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad - * > lnbc1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq8rkx3yf5tcsyz3d73gafnh3cax9rn449d9p5uxz9ezhhypd0elx87sjle52x86fux2ypatgddc6k63n7erqz25le42c4u4ecky03ylcqca784w + * > lnbc1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq0py3tfrnxkt5xadpzangn5rry6r0kqt4f3g36lwln8wwpxtxqccn5agpyte3nx0v78uwn78zu6k30k5mgdgn50yvnd20namlmzp2ersq8065fg */ if (!node_id_from_hexstr("03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad", strlen("03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad"), &node)) abort(); @@ -169,14 +169,17 @@ int main(int argc, char *argv[]) * * `lnbc`: prefix, Lightning on Bitcoin mainnet * * `1`: Bech32 separator * * `pvjluez`: timestamp (1496314658) + * * `s`: payment secret + * * `p5`: `data_length` (`p` = 1, `5` = 20; 1 * 32 + 20 == 52) + * * `zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs`: payment secret 1111111111111111111111111111111111111111111111111111111111111111 * * `p`: payment hash * * `p5`: `data_length` (`p` = 1, `5` = 20; 1 * 32 + 20 == 52) * * `qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypq`: payment hash 0001020304050607080900010203040506070809000102030405060708090102 * * `d`: short description * * `pl`: `data_length` (`p` = 1, `l` = 31; 1 * 32 + 31 == 63) * * `2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq`: 'Please consider supporting this project' - * * `8rkx3yf5tcsyz3d73gafnh3cax9rn449d9p5uxz9ezhhypd0elx87sjle52x86fux2ypatgddc6k63n7erqz25le42c4u4ecky03ylcq`: signature - * * `ca784w`: Bech32 checksum + * * `0py3tfrnxkt5xadpzangn5rry6r0kqt4f3g36lwln8wwpxtxqccn5agpyte3nx0v78uwn78zu6k30k5mgdgn50yvnd20namlmzp2ersq`: signature + * * `8065fg`: Bech32 checksum */ b11 = new_bolt11(tmpctx, NULL); b11->chain = chainparams_for_network("bitcoin"); @@ -186,14 +189,16 @@ int main(int argc, char *argv[]) &b11->payment_hash, sizeof(b11->payment_hash))) abort(); b11->receiver_id = node; + b11->payment_secret = tal(b11, struct secret); + memset(b11->payment_secret, 0x11, sizeof(*b11->payment_secret)); b11->description = "Please consider supporting this project"; - test_b11("lnbc1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq8rkx3yf5tcsyz3d73gafnh3cax9rn449d9p5uxz9ezhhypd0elx87sjle52x86fux2ypatgddc6k63n7erqz25le42c4u4ecky03ylcqca784w", b11, NULL); + test_b11("lnbc1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq0py3tfrnxkt5xadpzangn5rry6r0kqt4f3g36lwln8wwpxtxqccn5agpyte3nx0v78uwn78zu6k30k5mgdgn50yvnd20namlmzp2ersq8065fg", b11, NULL); /* BOLT #11: * * > ### Please send $3 for a cup of coffee to the same peer, within one minute - * > lnbc2500u1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5xysxxatsyp3k7enxv4jsxqzpuaztrnwngzn3kdzw5hydlzf03qdgm2hdq27cqv3agm2awhz5se903vruatfhq77w3ls4evs3ch9zw97j25emudupq63nyw24cg27h2rspfj9srp + * > lnbc2500u1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5xysxxatsyp3k7enxv4jsxqzpuu4tgyw2zt3v3c7eljkv2cn8a3etgn8kh8ukctqdmuxdfa7xup0w5ruwpt6eugv73pgzqczz3nc8tcqt2pcljp8ldkrnu5klff35vyscq6lp6ja * * Breakdown: * @@ -201,6 +206,7 @@ int main(int argc, char *argv[]) * * `2500u`: amount (2500 micro-bitcoin) * * `1`: Bech32 separator * * `pvjluez`: timestamp (1496314658) + * * `s`: payment secret... * * `p`: payment hash... * * `d`: short description * * `q5`: `data_length` (`q` = 0, `5` = 20; 0 * 32 + 20 == 20) @@ -208,13 +214,15 @@ int main(int argc, char *argv[]) * * `x`: expiry time * * `qz`: `data_length` (`q` = 0, `z` = 2; 0 * 32 + 2 == 2) * * `pu`: 60 seconds (`p` = 1, `u` = 28; 1 * 32 + 28 == 60) - * * `aztrnwngzn3kdzw5hydlzf03qdgm2hdq27cqv3agm2awhz5se903vruatfhq77w3ls4evs3ch9zw97j25emudupq63nyw24cg27h2rsp`: signature - * * `fj9srp`: Bech32 checksum + * * `u4tgyw2zt3v3c7eljkv2cn8a3etgn8kh8ukctqdmuxdfa7xup0w5ruwpt6eugv73pgzqczz3nc8tcqt2pcljp8ldkrnu5klff35vyscq`: signature + * * `6lp6ja`: Bech32 checksum */ msatoshi = AMOUNT_MSAT(2500 * (1000ULL * 100000000) / 1000000); b11 = new_bolt11(tmpctx, &msatoshi); b11->chain = chainparams_for_network("bitcoin"); b11->timestamp = 1496314658; + b11->payment_secret = tal(b11, struct secret); + memset(b11->payment_secret, 0x11, sizeof(*b11->payment_secret)); if (!hex_decode("0001020304050607080900010203040506070809000102030405060708090102", strlen("0001020304050607080900010203040506070809000102030405060708090102"), &b11->payment_hash, sizeof(b11->payment_hash))) @@ -223,12 +231,12 @@ int main(int argc, char *argv[]) b11->description = "1 cup coffee"; b11->expiry = 60; - test_b11("lnbc2500u1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5xysxxatsyp3k7enxv4jsxqzpuaztrnwngzn3kdzw5hydlzf03qdgm2hdq27cqv3agm2awhz5se903vruatfhq77w3ls4evs3ch9zw97j25emudupq63nyw24cg27h2rspfj9srp", b11, NULL); + test_b11("lnbc2500u1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5xysxxatsyp3k7enxv4jsxqzpuu4tgyw2zt3v3c7eljkv2cn8a3etgn8kh8ukctqdmuxdfa7xup0w5ruwpt6eugv73pgzqczz3nc8tcqt2pcljp8ldkrnu5klff35vyscq6lp6ja", b11, NULL); /* BOLT #11: * * > ### Now send $24 for an entire list of things (hashed) - * > lnbc20m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqscc6gd6ql3jrc5yzme8v4ntcewwz5cnw92tz0pc8qcuufvq7khhr8wpald05e92xw006sq94mg8v2ndf4sefvf9sygkshp5zfem29trqq2yxxz7 + * > lnbc20m1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqs6e4fy93me7wjwdf9sxgrzr8xldm570z02ur92rv6pa7wkhzpfehnecuyhp4mdhsv5t7em4jz4tjtchs8zmx3tr555yl59lk848due0gqvkanpl * * Breakdown: * @@ -236,24 +244,27 @@ int main(int argc, char *argv[]) * * `20m`: amount (20 milli-bitcoin) * * `1`: Bech32 separator * * `pvjluez`: timestamp (1496314658) + * * `s`: payment secret... * * `p`: payment hash... * * `h`: tagged field: hash of description * * `p5`: `data_length` (`p` = 1, `5` = 20; 1 * 32 + 20 == 52) * * `8yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqs`: SHA256 of 'One piece of chocolate cake, one icecream cone, one pickle, one slice of swiss cheese, one slice of salami, one lollypop, one piece of cherry pie, one sausage, one cupcake, and one slice of watermelon' - * * `cc6gd6ql3jrc5yzme8v4ntcewwz5cnw92tz0pc8qcuufvq7khhr8wpald05e92xw006sq94mg8v2ndf4sefvf9sygkshp5zfem29trqq`: signature - * * `2yxxz7`: Bech32 checksum + * * `6e4fy93me7wjwdf9sxgrzr8xldm570z02ur92rv6pa7wkhzpfehnecuyhp4mdhsv5t7em4jz4tjtchs8zmx3tr555yl59lk848due0gq`: signature + * * `vkanpl`: Bech32 checksum */ msatoshi = AMOUNT_MSAT(20 * (1000ULL * 100000000) / 1000); b11 = new_bolt11(tmpctx, &msatoshi); b11->chain = chainparams_for_network("bitcoin"); b11->timestamp = 1496314658; + b11->payment_secret = tal(b11, struct secret); + memset(b11->payment_secret, 0x11, sizeof(*b11->payment_secret)); if (!hex_decode("0001020304050607080900010203040506070809000102030405060708090102", strlen("0001020304050607080900010203040506070809000102030405060708090102"), &b11->payment_hash, sizeof(b11->payment_hash))) abort(); b11->receiver_id = node; b11->description_hash = tal(b11, struct sha256); - test_b11("lnbc20m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqscc6gd6ql3jrc5yzme8v4ntcewwz5cnw92tz0pc8qcuufvq7khhr8wpald05e92xw006sq94mg8v2ndf4sefvf9sygkshp5zfem29trqq2yxxz7", b11, "One piece of chocolate cake, one icecream cone, one pickle, one slice of swiss cheese, one slice of salami, one lollypop, one piece of cherry pie, one sausage, one cupcake, and one slice of watermelon"); + test_b11("lnbc20m1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqs6e4fy93me7wjwdf9sxgrzr8xldm570z02ur92rv6pa7wkhzpfehnecuyhp4mdhsv5t7em4jz4tjtchs8zmx3tr555yl59lk848due0gqvkanpl", b11, "One piece of chocolate cake, one icecream cone, one pickle, one slice of swiss cheese, one slice of salami, one lollypop, one piece of cherry pie, one sausage, one cupcake, and one slice of watermelon"); /* Malformed bolt11 strings (no '1'). */ badstr = "lnbc20mpvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqscc6gd6ql3jrc5yzme8v4ntcewwz5cnw92tz0pc8qcuufvq7khhr8wpald05e92xw006sq94mg8v2ndf4sefvf9sygkshp5zfem29trqq2yxxz7"; @@ -326,7 +337,7 @@ int main(int argc, char *argv[]) * * `9`: features * * `q5`: `data_length` (`q` = 0, `5` = 20; 0 * 32 + 20 == 20) * * `sqqqqqqqqqqqqqqqpqsq`: b1000....00001000001000000000 - ** `67gye39hfg3zd8rgc8032tvy9xk2xunwm5lzexnvpx6fd77en8qaq424dxgt56cag2dpt359k3ssyhetktkpqh24jqnjyw6uqd08sgp`: signature + ** `67gye39hfg3zd8rgc80k32tvy9xk2xunwm5lzexnvpx6fd77en8qaq424dxgt56cag2dpt359k3ssyhetktkpqh24jqnjyw6uqd08sgp`: signature ** `tq44qu`: Bech32 checksum */ msatoshi = AMOUNT_MSAT(25 * (1000ULL * 100000000) / 1000); @@ -474,7 +485,7 @@ int main(int argc, char *argv[]) /* BOLT #11: * * > ### Please send 0.00967878534 BTC for a list of items within one week, amount in pico-BTC - * > lnbc9678785340p1pwmna7lpp5gc3xfm08u9qy06djf8dfflhugl6p7lgza6dsjxq454gxhj9t7a0sd8dgfkx7cmtwd68yetpd5s9xar0wfjn5gpc8qhrsdfq24f5ggrxdaezqsnvda3kkum5wfjkzmfqf3jkgem9wgsyuctwdus9xgrcyqcjcgpzgfskx6eqf9hzqnteypzxz7fzypfhg6trddjhygrcyqezcgpzfysywmm5ypxxjemgw3hxjmn8yptk7untd9hxwg3q2d6xjcmtv4ezq7pqxgsxzmnyyqcjqmt0wfjjq6t5v4khxxqyjw5qcqp2rzjq0gxwkzc8w6323m55m4jyxcjwmy7stt9hwkwe2qxmy8zpsgg7jcuwz87fcqqeuqqqyqqqqlgqqqqn3qq9qn07ytgrxxzad9hc4xt3mawjjt8znfv8xzscs7007v9gh9j569lencxa8xeujzkxs0uamak9aln6ez02uunw6rd2ht2sqe4hz8thcdagpleym0j + * > lnbc9678785340p1pwmna7lpp5gc3xfm08u9qy06djf8dfflhugl6p7lgza6dsjxq454gxhj9t7a0sd8dgfkx7cmtwd68yetpd5s9xar0wfjn5gpc8qhrsdfq24f5ggrxdaezqsnvda3kkum5wfjkzmfqf3jkgem9wgsyuctwdus9xgrcyqcjcgpzgfskx6eqf9hzqnteypzxz7fzypfhg6trddjhygrcyqezcgpzfysywmm5ypxxjemgw3hxjmn8yptk7untd9hxwg3q2d6xjcmtv4ezq7pqxgsxzmnyyqcjqmt0wfjjq6t5v4khxsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygsxqyjw5qcqp2rzjq0gxwkzc8w6323m55m4jyxcjwmy7stt9hwkwe2qxmy8zpsgg7jcuwz87fcqqeuqqqyqqqqlgqqqqn3qq9q0777th7sgnqqpykcmu4c2u65vtnefrnjzws78maaxy87euvpj0hr8t5ma58cyw5f3f9ej4aw9swcyvk4vp6vjlxtgpcfdy8u9m4c6wgpdqfxt2 * * Breakdown: * @@ -482,7 +493,8 @@ int main(int argc, char *argv[]) * * `9678785340p`: amount (9678785340 pico-bitcoin = 967878534 milli satoshi) * * `1`: Bech32 separator * * `pwmna7l`: timestamp (1572468703) - * * `p`: payment hash. + * * `s`: payment secret... + * * `p`: payment hash * * `p5`: `data_length` (`p` = 1, `5` = 20; 1 * 32 + 20 == 52) * * `gc3xfm08u9qy06djf8dfflhugl6p7lgza6dsjxq454gxhj9t7a0s`: payment hash 462264ede7e14047e9b249da94fefc47f41f7d02ee9b091815a5506bc8abf75f * * `d`: short description @@ -502,8 +514,8 @@ int main(int argc, char *argv[]) * * fee_base_msat = 1000 * * fee_proportional_millionths = 2500 * * cltv_expiry_delta = 40 - * * `n07ytgrxxzad9hc4xt3mawjjt8znfv8xzscs7007v9gh9j569lencxa8xeujzkxs0uamak9aln6ez02uunw6rd2ht2sqe4hz8thcdagp`: signature - * * `leym0j`: Bech32 checksum + * * `0777th7sgnqqpykcmu4c2u65vtnefrnjzws78maaxy87euvpj0hr8t5ma58cyw5f3f9ej4aw9swcyvk4vp6vjlxtgpcfdy8u9m4c6wgp`: signature + * * `dqfxt2`: Bech32 checksum */ msatoshi = AMOUNT_MSAT(967878534); b11 = new_bolt11(tmpctx, &msatoshi); diff --git a/devtools/mkcommit.c b/devtools/mkcommit.c index 3abf94cf6..b0f26b570 100644 --- a/devtools/mkcommit.c +++ b/devtools/mkcommit.c @@ -408,6 +408,7 @@ int main(int argc, char *argv[]) &funding_localkey, &funding_remotekey, option_static_remotekey, option_anchor_outputs, + false, fee_payer); if (!channel_force_htlcs(channel, diff --git a/lightningd/invoice.c b/lightningd/invoice.c index b4434fe89..542b6ac5b 100644 --- a/lightningd/invoice.c +++ b/lightningd/invoice.c @@ -885,19 +885,6 @@ 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); @@ -916,7 +903,7 @@ invoice_complete(struct invoice_info *info, "No listincoming command available, cannot add routehints to invoice"); if (warning_mpp) json_add_string(response, "warning_mpp", - "The invoice might only be payable by MPP-capable payers."); + "The invoice is only payable by MPP-capable payers."); if (warning_capacity) json_add_string(response, "warning_capacity", "Insufficient incoming channel capacity to pay invoice"); diff --git a/tests/test_invoices.py b/tests/test_invoices.py index 59b8dc794..386f5a99e 100644 --- a/tests/test_invoices.py +++ b/tests/test_invoices.py @@ -54,11 +54,6 @@ def test_invoice(node_factory, chainparams): assert 'routes' not in b11 assert 'warning_capacity' in inv - # Make sure wumbo invoices warn about mpp being needed. - inv = l2.rpc.invoice(4294967295 + 1, 'inv4', '?') - assert 'warning_mpp' in inv - l2.rpc.invoice(4294967295, 'inv3', '?') - # Test cltv option. inv = l1.rpc.invoice(123000, 'label3', 'description', '3700', cltv=99) b11 = l1.rpc.decodepay(inv['bolt11'])