From d8e933aac72cef84f231d531aee155a52c877be0 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 3 Feb 2020 10:59:28 +1030 Subject: [PATCH] common: add pico-BTC parsing test from proposed BOLT. See-also: https://github.com/lightningnetwork/lightning-rfc/pull/699 Signed-off-by: Rusty Russell --- common/test/run-bolt11.c | 95 ++++++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 29 deletions(-) diff --git a/common/test/run-bolt11.c b/common/test/run-bolt11.c index cc52410ed..74e951de5 100644 --- a/common/test/run-bolt11.c +++ b/common/test/run-bolt11.c @@ -5,6 +5,8 @@ #include "../features.c" #include "../node_id.c" #include "../hash_u5.c" +#include "../wire/fromwire.c" +#include "../wire/towire.c" #include #include #include @@ -12,35 +14,12 @@ #include /* AUTOGENERATED MOCKS START */ -/* Generated stub for fromwire_fail */ -const void *fromwire_fail(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) -{ fprintf(stderr, "fromwire_fail called!\n"); abort(); } -/* Generated stub for fromwire_node_id */ -void fromwire_node_id(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct node_id *id UNNEEDED) -{ fprintf(stderr, "fromwire_node_id called!\n"); abort(); } -/* Generated stub for fromwire_short_channel_id */ -void fromwire_short_channel_id(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, - struct short_channel_id *short_channel_id UNNEEDED) -{ fprintf(stderr, "fromwire_short_channel_id called!\n"); abort(); } -/* Generated stub for fromwire_u16 */ -u16 fromwire_u16(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) -{ fprintf(stderr, "fromwire_u16 called!\n"); abort(); } -/* Generated stub for fromwire_u32 */ -u32 fromwire_u32(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) -{ fprintf(stderr, "fromwire_u32 called!\n"); abort(); } -/* Generated stub for towire_node_id */ -void towire_node_id(u8 **pptr UNNEEDED, const struct node_id *id UNNEEDED) -{ fprintf(stderr, "towire_node_id called!\n"); abort(); } -/* Generated stub for towire_short_channel_id */ -void towire_short_channel_id(u8 **pptr UNNEEDED, - const struct short_channel_id *short_channel_id UNNEEDED) -{ fprintf(stderr, "towire_short_channel_id called!\n"); abort(); } -/* Generated stub for towire_u16 */ -void towire_u16(u8 **pptr UNNEEDED, u16 v UNNEEDED) -{ fprintf(stderr, "towire_u16 called!\n"); abort(); } -/* Generated stub for towire_u32 */ -void towire_u32(u8 **pptr UNNEEDED, u32 v UNNEEDED) -{ fprintf(stderr, "towire_u32 called!\n"); abort(); } +/* Generated stub for bigsize_get */ +size_t bigsize_get(const u8 *p UNNEEDED, size_t max UNNEEDED, bigsize_t *val UNNEEDED) +{ fprintf(stderr, "bigsize_get called!\n"); abort(); } +/* Generated stub for bigsize_put */ +size_t bigsize_put(u8 buf[BIGSIZE_MAX_LEN] UNNEEDED, bigsize_t v UNNEEDED) +{ fprintf(stderr, "bigsize_put called!\n"); abort(); } /* Generated stub for type_to_string_ */ const char *type_to_string_(const tal_t *ctx UNNEEDED, const char *typename UNNEEDED, union printable_types u UNNEEDED) @@ -386,6 +365,64 @@ int main(void) assert(!bolt11_decode(tmpctx, badstr, NULL, &fail)); assert(streq(fail, "9: unknown feature bit 100")); + /* BOLT-1fbccd30bb503203e4a255de67f9adb504563425 #11: + * + * > ### Please send 0.00967878534 BTC for a list of items within one week, amount in pico-BTC + * > lnbc9678785340p1pwmna7lpp5gc3xfm08u9qy06djf8dfflhugl6p7lgza6dsjxq454gxhj9t7a0sd8dgfkx7cmtwd68yetpd5s9xar0wfjn5gpc8qhrsdfq24f5ggrxdaezqsnvda3kkum5wfjkzmfqf3jkgem9wgsyuctwdus9xgrcyqcjcgpzgfskx6eqf9hzqnteypzxz7fzypfhg6trddjhygrcyqezcgpzfysywmm5ypxxjemgw3hxjmn8yptk7untd9hxwg3q2d6xjcmtv4ezq7pqxgsxzmnyyqcjqmt0wfjjq6t5v4khxxqyjw5qcqp2rzjq0gxwkzc8w6323m55m4jyxcjwmy7stt9hwkwe2qxmy8zpsgg7jcuwz87fcqqeuqqqyqqqqlgqqqqn3qq9qn07ytgrxxzad9hc4xt3mawjjt8znfv8xzscs7007v9gh9j569lencxa8xeujzkxs0uamak9aln6ez02uunw6rd2ht2sqe4hz8thcdagpleym0j + * + * Breakdown: + * + * * `lnbc`: prefix, Lightning on bitcoin mainnet + * * `9678785340p`: amount (9678785340 pico-bitcoin = 967878534 milli satoshi) + * * `1`: Bech32 separator + * * `pwmna7l`: timestamp (1572468703) + * * `p`: payment hash. + * * `p5`: `data_length` (`p` = 1, `5` = 20; 1 * 32 + 20 == 52) + * * `gc3xfm08u9qy06djf8dfflhugl6p7lgza6dsjxq454gxhj9t7a0s`: payment hash 462264ede7e14047e9b249da94fefc47f41f7d02ee9b091815a5506bc8abf75f + * * `d`: short description + * * `8d`: `data_length` (`8` = 7, `d` = 13; 7 * 32 + 13 == 237) + * * `gfkx7cmtwd68yetpd5s9xar0wfjn5gpc8qhrsdfq24f5ggrxdaezqsnvda3kkum5wfjkzmfqf3jkgem9wgsyuctwdus9xgrcyqcjcgpzgfskx6eqf9hzqnteypzxz7fzypfhg6trddjhygrcyqezcgpzfysywmm5ypxxjemgw3hxjmn8yptk7untd9hxwg3q2d6xjcmtv4ezq7pqxgsxzmnyyqcjqmt0wfjjq6t5v4khx`: 'Blockstream Store: 88.85 USD for Blockstream Ledger Nano S x 1, \"Back In My Day\" Sticker x 2, \"I Got Lightning Working\" Sticker x 2 and 1 more items' + * * `x`: expiry time + * * `qy`: `data_length` (`q` = 0, `y` = 2; 0 * 32 + 4 == 4) + * * `jw5q`: 604800 seconds (`j` = 18, `w` = 14, `5` = 20, `q` = 0; 18 * 32^3 + 14 * 32^2 + 20 * 32 + 0 == 604800) + * * `c`: `min_final_cltv_expiry` + * * `qp`: `data_length` (`q` = 0, `p` = 1; 0 * 32 + 1 == 1) + * * `2`: min_final_cltv_expiry = 10 + * * `r`: tagged field: route information + * * `zj`: `data_length` (`z` = 2, `j` = 18; 2 * 32 + 18 == 82) + * * `q0gxwkzc8w6323m55m4jyxcjwmy7stt9hwkwe2qxmy8zpsgg7jcuwz87fcqqeuqqqyqqqqlgqqqqn3qq9q`: + * * pubkey: 03d06758583bb5154774a6eb221b1276c9e82d65bbaceca806d90e20c108f4b1c7 + * * short_channel_id: 589390x3312x1 + * * fee_base_msat = 1000 + * * fee_proportional_millionths = 2500 + * * cltv_expiry_delta = 40 + * * `n07ytgrxxzad9hc4xt3mawjjt8znfv8xzscs7007v9gh9j569lencxa8xeujzkxs0uamak9aln6ez02uunw6rd2ht2sqe4hz8thcdagp`: signature + * * `leym0j`: Bech32 checksum + */ + msatoshi = AMOUNT_MSAT(967878534); + b11 = new_bolt11(tmpctx, &msatoshi); + b11->chain = chainparams_for_network("bitcoin"); + b11->timestamp = 1572468703; + b11->expiry = 604800; + b11->min_final_cltv_expiry = 10; + if (!hex_decode("462264ede7e14047e9b249da94fefc47f41f7d02ee9b091815a5506bc8abf75f", + strlen("462264ede7e14047e9b249da94fefc47f41f7d02ee9b091815a5506bc8abf75f"), + &b11->payment_hash, sizeof(b11->payment_hash))) + abort(); + b11->receiver_id = node; + b11->description = "Blockstream Store: 88.85 USD for Blockstream Ledger Nano S x 1, \"Back In My Day\" Sticker x 2, \"I Got Lightning Working\" Sticker x 2 and 1 more items"; + b11->routes = tal_arr(tmpctx, struct route_info *, 1); + b11->routes[0] = tal(b11->routes, struct route_info); + if (!node_id_from_hexstr("03d06758583bb5154774a6eb221b1276c9e82d65bbaceca806d90e20c108f4b1c7", strlen("03d06758583bb5154774a6eb221b1276c9e82d65bbaceca806d90e20c108f4b1c7"), &b11->routes[0]->pubkey)) + abort(); + if (!short_channel_id_from_str("589390x3312x1", strlen("589390x3312x1"), + &b11->routes[0]->short_channel_id)) + abort(); + b11->routes[0]->fee_base_msat = 1000; + b11->routes[0]->fee_proportional_millionths = 2500; + b11->routes[0]->cltv_expiry_delta = 40; + test_b11("lnbc9678785340p1pwmna7lpp5gc3xfm08u9qy06djf8dfflhugl6p7lgza6dsjxq454gxhj9t7a0sd8dgfkx7cmtwd68yetpd5s9xar0wfjn5gpc8qhrsdfq24f5ggrxdaezqsnvda3kkum5wfjkzmfqf3jkgem9wgsyuctwdus9xgrcyqcjcgpzgfskx6eqf9hzqnteypzxz7fzypfhg6trddjhygrcyqezcgpzfysywmm5ypxxjemgw3hxjmn8yptk7untd9hxwg3q2d6xjcmtv4ezq7pqxgsxzmnyyqcjqmt0wfjjq6t5v4khxxqyjw5qcqp2rzjq0gxwkzc8w6323m55m4jyxcjwmy7stt9hwkwe2qxmy8zpsgg7jcuwz87fcqqeuqqqyqqqqlgqqqqn3qq9qn07ytgrxxzad9hc4xt3mawjjt8znfv8xzscs7007v9gh9j569lencxa8xeujzkxs0uamak9aln6ez02uunw6rd2ht2sqe4hz8thcdagpleym0j", b11, NULL); + /* FIXME: Test the others! */ wally_cleanup(0); tal_free(tmpctx);