@@ -7,6 +7,7 @@ use common::{
7
7
setup_node, setup_two_nodes, wait_for_tx, TestSyncStore ,
8
8
} ;
9
9
10
+ use ldk_node:: payment:: PaymentKind ;
10
11
use ldk_node:: { Builder , Event , NodeError } ;
11
12
12
13
use lightning:: util:: persist:: KVStore ;
@@ -15,6 +16,8 @@ use bitcoin::{Amount, Network};
15
16
16
17
use std:: sync:: Arc ;
17
18
19
+ use crate :: common:: expect_channel_ready_event;
20
+
18
21
#[ test]
19
22
fn channel_full_cycle ( ) {
20
23
let ( bitcoind, electrsd) = setup_bitcoind_and_electrsd ( ) ;
@@ -138,7 +141,7 @@ fn multi_hop_sending() {
138
141
139
142
let payment_id = expect_payment_received_event ! ( & nodes[ 4 ] , 2_500_000 ) ;
140
143
let fee_paid_msat = Some ( 2000 ) ;
141
- expect_payment_successful_event ! ( nodes[ 0 ] , payment_id, fee_paid_msat) ;
144
+ expect_payment_successful_event ! ( nodes[ 0 ] , payment_id, Some ( fee_paid_msat) ) ;
142
145
}
143
146
144
147
#[ test]
@@ -366,3 +369,70 @@ fn concurrent_connections_succeed() {
366
369
h. join ( ) . unwrap ( ) ;
367
370
}
368
371
}
372
+
373
+ #[ test]
374
+ fn simple_bolt12_send_receive ( ) {
375
+ let ( bitcoind, electrsd) = setup_bitcoind_and_electrsd ( ) ;
376
+ let ( node_a, node_b) = setup_two_nodes ( & electrsd, false ) ;
377
+
378
+ let address_a = node_a. onchain_payment ( ) . new_address ( ) . unwrap ( ) ;
379
+ let premine_amount_sat = 5_000_000 ;
380
+ premine_and_distribute_funds (
381
+ & bitcoind. client ,
382
+ & electrsd. client ,
383
+ vec ! [ address_a] ,
384
+ Amount :: from_sat ( premine_amount_sat) ,
385
+ ) ;
386
+
387
+ node_a. sync_wallets ( ) . unwrap ( ) ;
388
+ open_channel ( & node_a, & node_b, 1_000_000 , true , & electrsd) ;
389
+
390
+ generate_blocks_and_wait ( & bitcoind. client , & electrsd. client , 6 ) ;
391
+
392
+ node_a. sync_wallets ( ) . unwrap ( ) ;
393
+ node_b. sync_wallets ( ) . unwrap ( ) ;
394
+
395
+ expect_channel_ready_event ! ( node_a, node_b. node_id( ) ) ;
396
+ expect_channel_ready_event ! ( node_b, node_a. node_id( ) ) ;
397
+
398
+ // Sleep until we broadcasted a node announcement.
399
+ while node_b. status ( ) . latest_node_announcement_broadcast_timestamp . is_none ( ) {
400
+ std:: thread:: sleep ( std:: time:: Duration :: from_millis ( 10 ) ) ;
401
+ }
402
+
403
+ // Sleep one more sec to make sure the node announcement propagates.
404
+ std:: thread:: sleep ( std:: time:: Duration :: from_secs ( 1 ) ) ;
405
+
406
+ let expected_amount_msat = 100_000_000 ;
407
+ let offer = node_b. bolt12_payment ( ) . receive ( expected_amount_msat, "asdf" ) . unwrap ( ) ;
408
+ let payment_id = node_a. bolt12_payment ( ) . send ( & offer, None ) . unwrap ( ) ;
409
+
410
+ expect_payment_successful_event ! ( node_a, Some ( payment_id) , None ) ;
411
+ let node_a_payments = node_a. list_payments ( ) ;
412
+ assert_eq ! ( node_a_payments. len( ) , 1 ) ;
413
+ match node_a_payments. first ( ) . unwrap ( ) . kind {
414
+ PaymentKind :: Bolt12 { hash, preimage, secret : _ } => {
415
+ assert ! ( hash. is_some( ) ) ;
416
+ assert ! ( preimage. is_some( ) ) ;
417
+ //TODO: We should eventually set and assert the secret sender-side, too, but the BOLT12
418
+ //API currently doesn't allow to do that.
419
+ } ,
420
+ _ => {
421
+ panic ! ( "Unexpected payment kind" ) ;
422
+ } ,
423
+ }
424
+
425
+ expect_payment_received_event ! ( node_b, expected_amount_msat) ;
426
+ let node_b_payments = node_b. list_payments ( ) ;
427
+ assert_eq ! ( node_b_payments. len( ) , 1 ) ;
428
+ match node_b_payments. first ( ) . unwrap ( ) . kind {
429
+ PaymentKind :: Bolt12 { hash, preimage, secret } => {
430
+ assert ! ( hash. is_some( ) ) ;
431
+ assert ! ( preimage. is_some( ) ) ;
432
+ assert ! ( secret. is_some( ) ) ;
433
+ } ,
434
+ _ => {
435
+ panic ! ( "Unexpected payment kind" ) ;
436
+ } ,
437
+ }
438
+ }
0 commit comments