@ -5,6 +5,8 @@
# include "../features.c"
# include "../node_id.c"
# include "../hash_u5.c"
# include "../wire/fromwire.c"
# include "../wire/towire.c"
# include <ccan/err/err.h>
# include <ccan/mem/mem.h>
# include <ccan/str/hex/hex.h>
@ -12,35 +14,12 @@
# include <wally_core.h>
/* 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
* * ` 9678785340 p ` : 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 462264 ede7e14047e9b249da94fefc47f41f7d02ee9b091815a5506bc8abf75f
* * ` d ` : short description
* * ` 8 d ` : ` 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 : 03 d06758583bb5154774a6eb221b1276c9e82d65bbaceca806d90e20c108f4b1c7
* * short_channel_id : 589390 x3312x1
* * 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 ) ;