@@ -7,6 +7,7 @@ use common::{
77 setup_node, setup_two_nodes, wait_for_tx, TestSyncStore ,
88} ;
99
10+ use ldk_node:: payment:: PaymentKind ;
1011use ldk_node:: { Builder , Event , NodeError } ;
1112
1213use lightning:: util:: persist:: KVStore ;
@@ -15,6 +16,8 @@ use bitcoin::{Amount, Network};
1516
1617use std:: sync:: Arc ;
1718
19+ use crate :: common:: expect_channel_ready_event;
20+
1821#[ test]
1922fn channel_full_cycle ( ) {
2023 let ( bitcoind, electrsd) = setup_bitcoind_and_electrsd ( ) ;
@@ -138,7 +141,7 @@ fn multi_hop_sending() {
138141
139142 let payment_id = expect_payment_received_event ! ( & nodes[ 4 ] , 2_500_000 ) ;
140143 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) ) ;
142145}
143146
144147#[ test]
@@ -366,3 +369,70 @@ fn concurrent_connections_succeed() {
366369 h. join ( ) . unwrap ( ) ;
367370 }
368371}
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