@@ -198,6 +198,11 @@ impl<'a> Iterator for TlvStream<'a> {
198
198
#[ cfg( test) ]
199
199
mod tests {
200
200
use bitcoin:: hashes:: { Hash , sha256} ;
201
+ use bitcoin:: secp256k1:: { KeyPair , Secp256k1 , SecretKey } ;
202
+ use core:: convert:: Infallible ;
203
+ use crate :: offers:: offer:: { Amount , OfferBuilder } ;
204
+ use crate :: offers:: invoice_request:: InvoiceRequest ;
205
+ use crate :: offers:: parse:: Bech32Encode ;
201
206
202
207
#[ test]
203
208
fn calculates_merkle_root_hash ( ) {
@@ -218,4 +223,50 @@ mod tests {
218
223
sha256:: Hash :: from_slice( & hex:: decode( "ab2e79b1283b0b31e0b035258de23782df6b89a38cfa7237bde69aed1a658c5d" ) . unwrap( ) ) . unwrap( ) ,
219
224
) ;
220
225
}
226
+
227
+ #[ test]
228
+ fn calculates_merkle_root_hash_from_invoice_request ( ) {
229
+ let secp_ctx = Secp256k1 :: new ( ) ;
230
+ let recipient_pubkey = {
231
+ let secret_key = SecretKey :: from_slice ( & hex:: decode ( "4141414141414141414141414141414141414141414141414141414141414141" ) . unwrap ( ) ) . unwrap ( ) ;
232
+ KeyPair :: from_secret_key ( & secp_ctx, & secret_key) . public_key ( )
233
+ } ;
234
+ let payer_keys = {
235
+ let secret_key = SecretKey :: from_slice ( & hex:: decode ( "4242424242424242424242424242424242424242424242424242424242424242" ) . unwrap ( ) ) . unwrap ( ) ;
236
+ KeyPair :: from_secret_key ( & secp_ctx, & secret_key)
237
+ } ;
238
+
239
+ // BOLT 12 test vectors
240
+ let invoice_request = OfferBuilder :: new ( "A Mathematical Treatise" . into ( ) , recipient_pubkey)
241
+ . amount ( Amount :: Currency { iso4217_code : * b"USD" , amount : 100 } )
242
+ . build_unchecked ( )
243
+ . request_invoice ( vec ! [ 0 ; 8 ] , payer_keys. public_key ( ) ) . unwrap ( )
244
+ . build_unchecked ( )
245
+ . sign :: < _ , Infallible > ( |digest| Ok ( secp_ctx. sign_schnorr_no_aux_rand ( digest, & payer_keys) ) )
246
+ . unwrap ( ) ;
247
+ assert_eq ! (
248
+ invoice_request. to_string( ) ,
249
+ "lnr1qqyqqqqqqqqqqqqqqcp4256ypqqkgzshgysy6ct5dpjk6ct5d93kzmpq23ex2ct5d9ek293pqthvwfzadd7jejes8q9lhc4rvjxd022zv5l44g6qah82ru5rdpnpjkppqvjx204vgdzgsqpvcp4mldl3plscny0rt707gvpdh6ndydfacz43euzqhrurageg3n7kafgsek6gz3e9w52parv8gs2hlxzk95tzeswywffxlkeyhml0hh46kndmwf4m6xma3tkq2lu04qz3slje2rfthc89vss" ,
250
+ ) ;
251
+ assert_eq ! (
252
+ super :: root_hash( & invoice_request. bytes[ ..] ) ,
253
+ sha256:: Hash :: from_slice( & hex:: decode( "608407c18ad9a94d9ea2bcdbe170b6c20c462a7833a197621c916f78cf18e624" ) . unwrap( ) ) . unwrap( ) ,
254
+ ) ;
255
+ }
256
+
257
+ impl AsRef < [ u8 ] > for InvoiceRequest {
258
+ fn as_ref ( & self ) -> & [ u8 ] {
259
+ & self . bytes
260
+ }
261
+ }
262
+
263
+ impl Bech32Encode for InvoiceRequest {
264
+ const BECH32_HRP : & ' static str = "lnr" ;
265
+ }
266
+
267
+ impl core:: fmt:: Display for InvoiceRequest {
268
+ fn fmt ( & self , f : & mut core:: fmt:: Formatter ) -> Result < ( ) , core:: fmt:: Error > {
269
+ self . fmt_bech32_str ( f)
270
+ }
271
+ }
221
272
}
0 commit comments