1
1
mod common;
2
2
3
3
use common:: {
4
- do_channel_full_cycle, expect_event, expect_payment_received_event,
4
+ do_channel_full_cycle, expect_channel_ready_event , expect_event, expect_payment_received_event,
5
5
expect_payment_successful_event, generate_blocks_and_wait, open_channel,
6
6
premine_and_distribute_funds, random_config, setup_bitcoind_and_electrsd, setup_builder,
7
7
setup_node, setup_two_nodes, wait_for_tx, TestSyncStore ,
8
8
} ;
9
9
10
- use ldk_node:: payment:: PaymentKind ;
10
+ use ldk_node:: payment:: { PaymentKind , PaymentResult } ;
11
11
use ldk_node:: { Builder , Event , NodeError } ;
12
12
13
13
use lightning:: ln:: channelmanager:: PaymentId ;
@@ -17,8 +17,6 @@ use bitcoin::{Amount, Network};
17
17
18
18
use std:: sync:: Arc ;
19
19
20
- use crate :: common:: expect_channel_ready_event;
21
-
22
20
#[ test]
23
21
fn channel_full_cycle ( ) {
24
22
let ( bitcoind, electrsd) = setup_bitcoind_and_electrsd ( ) ;
@@ -552,3 +550,121 @@ fn simple_bolt12_send_receive() {
552
550
}
553
551
assert_eq ! ( node_a_payments. first( ) . unwrap( ) . amount_msat, Some ( overpaid_amount) ) ;
554
552
}
553
+
554
+ #[ test]
555
+ fn unified_qr_send_receive ( ) {
556
+ let ( bitcoind, electrsd) = setup_bitcoind_and_electrsd ( ) ;
557
+ let ( node_a, node_b) = setup_two_nodes ( & electrsd, false , true , false ) ;
558
+
559
+ let address_a = node_a. onchain_payment ( ) . new_address ( ) . unwrap ( ) ;
560
+ let premined_sats = 5_000_000 ;
561
+
562
+ premine_and_distribute_funds (
563
+ & bitcoind. client ,
564
+ & electrsd. client ,
565
+ vec ! [ address_a] ,
566
+ Amount :: from_sat ( premined_sats) ,
567
+ ) ;
568
+
569
+ node_a. sync_wallets ( ) . unwrap ( ) ;
570
+ open_channel ( & node_a, & node_b, 4_000_000 , true , & electrsd) ;
571
+ generate_blocks_and_wait ( & bitcoind. client , & electrsd. client , 6 ) ;
572
+
573
+ node_a. sync_wallets ( ) . unwrap ( ) ;
574
+ node_b. sync_wallets ( ) . unwrap ( ) ;
575
+
576
+ expect_channel_ready_event ! ( node_a, node_b. node_id( ) ) ;
577
+ expect_channel_ready_event ! ( node_b, node_a. node_id( ) ) ;
578
+
579
+ // Sleep until we broadcast a node announcement.
580
+ while node_b. status ( ) . latest_node_announcement_broadcast_timestamp . is_none ( ) {
581
+ std:: thread:: sleep ( std:: time:: Duration :: from_millis ( 10 ) ) ;
582
+ }
583
+
584
+ // Sleep one more sec to make sure the node announcement propagates.
585
+ std:: thread:: sleep ( std:: time:: Duration :: from_secs ( 1 ) ) ;
586
+
587
+ let expected_amount_msats = 100_000_000 ;
588
+ let offer = node_b. bolt12_payment ( ) . receive ( expected_amount_msats, "hi" ) ;
589
+
590
+ let offer_str = offer. clone ( ) . unwrap ( ) . to_string ( ) ;
591
+ let bolt12_offer_param = format ! ( "&lightning={}" , offer_str) ;
592
+
593
+ let expected_amount_sats = 100_000 ;
594
+ let message = "TestMessage" . to_string ( ) ;
595
+ let expiry_sec = 4_000 ;
596
+
597
+ let uqr_payment =
598
+ node_b. unified_qr_payment ( ) . receive ( expected_amount_sats, Some ( message) , expiry_sec) ;
599
+
600
+ let uri_str = uqr_payment. clone ( ) . unwrap ( ) ;
601
+ let uri_with_offer = format ! ( "{}{}" , uri_str, bolt12_offer_param) ;
602
+
603
+ let offer_payment_id: PaymentId = match node_a. unified_qr_payment ( ) . send ( & uri_with_offer) {
604
+ Ok ( PaymentResult :: Bolt12 { payment_id } ) => {
605
+ println ! ( "\n Bolt12 payment sent successfully with PaymentID: {:?}" , payment_id) ;
606
+ payment_id
607
+ } ,
608
+ Ok ( PaymentResult :: Bolt11 { payment_id : _ } ) => {
609
+ panic ! ( "Expected Bolt12 payment but got Bolt11" ) ;
610
+ } ,
611
+ Ok ( PaymentResult :: Onchain { txid : _ } ) => {
612
+ panic ! ( "Expected Bolt12 payment but get On-chain transaction" ) ;
613
+ } ,
614
+ Err ( e) => {
615
+ panic ! ( "Expected Bolt12 payment but got error: {:?}" , e) ;
616
+ } ,
617
+ } ;
618
+
619
+ expect_payment_successful_event ! ( node_a, Some ( offer_payment_id) , None ) ;
620
+
621
+ let uri_with_invalid_offer = format ! ( "{}{}" , uri_str, "&lightning=some_invalid_offer" ) ;
622
+ let invoice_payment_id: PaymentId =
623
+ match node_a. unified_qr_payment ( ) . send ( & uri_with_invalid_offer) {
624
+ Ok ( PaymentResult :: Bolt12 { payment_id : _ } ) => {
625
+ panic ! ( "Expected Bolt11 payment but got Bolt12" ) ;
626
+ } ,
627
+ Ok ( PaymentResult :: Bolt11 { payment_id } ) => {
628
+ println ! ( "\n Bolt11 payment sent successfully with PaymentID: {:?}" , payment_id) ;
629
+ payment_id
630
+ } ,
631
+ Ok ( PaymentResult :: Onchain { txid : _ } ) => {
632
+ panic ! ( "Expected Bolt11 payment but got on-chain transaction" ) ;
633
+ } ,
634
+ Err ( e) => {
635
+ panic ! ( "Expected Bolt11 payment but got error: {:?}" , e) ;
636
+ } ,
637
+ } ;
638
+ expect_payment_successful_event ! ( node_a, Some ( invoice_payment_id) , None ) ;
639
+
640
+ let expect_onchain_amount_sats = 800_000 ;
641
+ let onchain_uqr_payment = node_b
642
+ . unified_qr_payment ( )
643
+ . receive ( expect_onchain_amount_sats, Some ( "Different Message" . to_string ( ) ) , 4_000 )
644
+ . unwrap ( ) ;
645
+
646
+ let txid = match node_a. unified_qr_payment ( ) . send ( onchain_uqr_payment. as_str ( ) ) {
647
+ Ok ( PaymentResult :: Bolt12 { payment_id : _ } ) => {
648
+ panic ! ( "Expected on-chain payment but got Bolt12" )
649
+ } ,
650
+ Ok ( PaymentResult :: Bolt11 { payment_id : _ } ) => {
651
+ panic ! ( "Expected on-chain payment but got Bolt11" ) ;
652
+ } ,
653
+ Ok ( PaymentResult :: Onchain { txid } ) => {
654
+ println ! ( "\n On-chain transaction successful with Txid: {}" , txid) ;
655
+ txid
656
+ } ,
657
+ Err ( e) => {
658
+ panic ! ( "Expected on-chain payment but got error: {:?}" , e) ;
659
+ } ,
660
+ } ;
661
+
662
+ generate_blocks_and_wait ( & bitcoind. client , & electrsd. client , 6 ) ;
663
+ wait_for_tx ( & electrsd. client , txid) ;
664
+
665
+ node_a. sync_wallets ( ) . unwrap ( ) ;
666
+ node_b. sync_wallets ( ) . unwrap ( ) ;
667
+
668
+ assert_eq ! ( node_b. list_balances( ) . total_onchain_balance_sats, 800_000 ) ;
669
+ assert_eq ! ( node_b. list_balances( ) . total_lightning_balance_sats, 200_000 ) ;
670
+ }
0 commit comments