1
- use crate :: disk;
1
+ use crate :: disk:: { self , INBOUND_PAYMENTS_FNAME , OUTBOUND_PAYMENTS_FNAME } ;
2
2
use crate :: hex_utils;
3
3
use crate :: {
4
4
ChannelManager , HTLCStatus , MillisatAmount , NetworkGraph , OnionMessenger , PaymentInfo ,
@@ -16,17 +16,18 @@ use lightning::onion_message::{CustomOnionMessageContents, Destination, OnionMes
16
16
use lightning:: routing:: gossip:: NodeId ;
17
17
use lightning:: routing:: router:: { PaymentParameters , RouteParameters } ;
18
18
use lightning:: util:: config:: { ChannelHandshakeConfig , ChannelHandshakeLimits , UserConfig } ;
19
+ use lightning:: util:: persist:: KVStorePersister ;
19
20
use lightning:: util:: ser:: { Writeable , Writer } ;
20
21
use lightning_invoice:: payment:: pay_invoice;
21
22
use lightning_invoice:: { utils, Currency , Invoice } ;
23
+ use lightning_persister:: FilesystemPersister ;
22
24
use std:: env;
23
25
use std:: io;
24
26
use std:: io:: Write ;
25
27
use std:: net:: { SocketAddr , ToSocketAddrs } ;
26
- use std:: ops:: Deref ;
27
28
use std:: path:: Path ;
28
29
use std:: str:: FromStr ;
29
- use std:: sync:: Arc ;
30
+ use std:: sync:: { Arc , Mutex } ;
30
31
use std:: time:: Duration ;
31
32
32
33
pub ( crate ) struct LdkUserInfo {
@@ -61,9 +62,9 @@ impl Writeable for UserOnionMessageContents {
61
62
pub ( crate ) async fn poll_for_user_input (
62
63
peer_manager : Arc < PeerManager > , channel_manager : Arc < ChannelManager > ,
63
64
keys_manager : Arc < KeysManager > , network_graph : Arc < NetworkGraph > ,
64
- onion_messenger : Arc < OnionMessenger > , inbound_payments : PaymentInfoStorage ,
65
- outbound_payments : PaymentInfoStorage , ldk_data_dir : String , network : Network ,
66
- logger : Arc < disk:: FilesystemLogger > ,
65
+ onion_messenger : Arc < OnionMessenger > , inbound_payments : Arc < Mutex < PaymentInfoStorage > > ,
66
+ outbound_payments : Arc < Mutex < PaymentInfoStorage > > , ldk_data_dir : String , network : Network ,
67
+ logger : Arc < disk:: FilesystemLogger > , persister : Arc < FilesystemPersister > ,
67
68
) {
68
69
println ! (
69
70
"LDK startup successful. Enter \" help\" to view available commands. Press Ctrl-D to quit."
@@ -157,7 +158,12 @@ pub(crate) async fn poll_for_user_input(
157
158
}
158
159
} ;
159
160
160
- send_payment ( & * channel_manager, & invoice, outbound_payments. clone ( ) ) ;
161
+ send_payment (
162
+ & channel_manager,
163
+ & invoice,
164
+ & mut outbound_payments. lock ( ) . unwrap ( ) ,
165
+ persister. clone ( ) ,
166
+ ) ;
161
167
}
162
168
"keysend" => {
163
169
let dest_pubkey = match words. next ( ) {
@@ -188,11 +194,12 @@ pub(crate) async fn poll_for_user_input(
188
194
}
189
195
} ;
190
196
keysend (
191
- & * channel_manager,
197
+ & channel_manager,
192
198
dest_pubkey,
193
199
amt_msat,
194
200
& * keys_manager,
195
- outbound_payments. clone ( ) ,
201
+ & mut outbound_payments. lock ( ) . unwrap ( ) ,
202
+ persister. clone ( ) ,
196
203
) ;
197
204
}
198
205
"getinvoice" => {
@@ -220,15 +227,17 @@ pub(crate) async fn poll_for_user_input(
220
227
continue ;
221
228
}
222
229
230
+ let mut inbound_payments = inbound_payments. lock ( ) . unwrap ( ) ;
223
231
get_invoice (
224
232
amt_msat. unwrap ( ) ,
225
- Arc :: clone ( & inbound_payments) ,
226
- & * channel_manager,
233
+ & mut inbound_payments,
234
+ & channel_manager,
227
235
Arc :: clone ( & keys_manager) ,
228
236
network,
229
237
expiry_secs. unwrap ( ) ,
230
238
Arc :: clone ( & logger) ,
231
239
) ;
240
+ persister. persist ( INBOUND_PAYMENTS_FNAME , & * inbound_payments) . unwrap ( ) ;
232
241
}
233
242
"connectpeer" => {
234
243
let peer_pubkey_and_ip_addr = words. next ( ) ;
@@ -278,9 +287,10 @@ pub(crate) async fn poll_for_user_input(
278
287
}
279
288
}
280
289
"listchannels" => list_channels ( & channel_manager, & network_graph) ,
281
- "listpayments" => {
282
- list_payments ( inbound_payments. clone ( ) , outbound_payments. clone ( ) )
283
- }
290
+ "listpayments" => list_payments (
291
+ & inbound_payments. lock ( ) . unwrap ( ) ,
292
+ & outbound_payments. lock ( ) . unwrap ( ) ,
293
+ ) ,
284
294
"closechannel" => {
285
295
let channel_id_str = words. next ( ) ;
286
296
if channel_id_str. is_none ( ) {
@@ -527,11 +537,9 @@ fn list_channels(channel_manager: &Arc<ChannelManager>, network_graph: &Arc<Netw
527
537
println ! ( "]" ) ;
528
538
}
529
539
530
- fn list_payments ( inbound_payments : PaymentInfoStorage , outbound_payments : PaymentInfoStorage ) {
531
- let inbound = inbound_payments. lock ( ) . unwrap ( ) ;
532
- let outbound = outbound_payments. lock ( ) . unwrap ( ) ;
540
+ fn list_payments ( inbound_payments : & PaymentInfoStorage , outbound_payments : & PaymentInfoStorage ) {
533
541
print ! ( "[" ) ;
534
- for ( payment_hash, payment_info) in inbound . deref ( ) {
542
+ for ( payment_hash, payment_info) in & inbound_payments . payments {
535
543
println ! ( "" ) ;
536
544
println ! ( "\t {{" ) ;
537
545
println ! ( "\t \t amount_millisatoshis: {}," , payment_info. amt_msat) ;
@@ -549,7 +557,7 @@ fn list_payments(inbound_payments: PaymentInfoStorage, outbound_payments: Paymen
549
557
println ! ( "\t }}," ) ;
550
558
}
551
559
552
- for ( payment_hash, payment_info) in outbound . deref ( ) {
560
+ for ( payment_hash, payment_info) in & outbound_payments . payments {
553
561
println ! ( "" ) ;
554
562
println ! ( "\t {{" ) ;
555
563
println ! ( "\t \t amount_millisatoshis: {}," , payment_info. amt_msat) ;
@@ -658,41 +666,40 @@ fn open_channel(
658
666
}
659
667
660
668
fn send_payment (
661
- channel_manager : & ChannelManager , invoice : & Invoice , payment_storage : PaymentInfoStorage ,
669
+ channel_manager : & ChannelManager , invoice : & Invoice ,
670
+ outbound_payments : & mut PaymentInfoStorage , persister : Arc < FilesystemPersister > ,
662
671
) {
663
- let status =
664
- match pay_invoice ( invoice, Retry :: Timeout ( Duration :: from_secs ( 10 ) ) , channel_manager) {
665
- Ok ( _payment_id) => {
666
- let payee_pubkey = invoice. recover_payee_pub_key ( ) ;
667
- let amt_msat = invoice. amount_milli_satoshis ( ) . unwrap ( ) ;
668
- println ! ( "EVENT: initiated sending {} msats to {}" , amt_msat, payee_pubkey) ;
669
- print ! ( "> " ) ;
670
- HTLCStatus :: Pending
671
- }
672
- Err ( e) => {
673
- println ! ( "ERROR: failed to send payment: {:?}" , e) ;
674
- print ! ( "> " ) ;
675
- HTLCStatus :: Failed
676
- }
677
- } ;
678
- let payment_hash = PaymentHash ( invoice. payment_hash ( ) . clone ( ) . into_inner ( ) ) ;
679
- let payment_secret = Some ( invoice. payment_secret ( ) . clone ( ) ) ;
680
-
681
- let mut payments = payment_storage. lock ( ) . unwrap ( ) ;
682
- payments. insert (
672
+ let payment_hash = PaymentHash ( ( * invoice. payment_hash ( ) ) . into_inner ( ) ) ;
673
+ let payment_secret = Some ( * invoice. payment_secret ( ) ) ;
674
+ outbound_payments. payments . insert (
683
675
payment_hash,
684
676
PaymentInfo {
685
677
preimage : None ,
686
678
secret : payment_secret,
687
- status,
679
+ status : HTLCStatus :: Pending ,
688
680
amt_msat : MillisatAmount ( invoice. amount_milli_satoshis ( ) ) ,
689
681
} ,
690
682
) ;
683
+ persister. persist ( OUTBOUND_PAYMENTS_FNAME , & * outbound_payments) . unwrap ( ) ;
684
+ match pay_invoice ( invoice, Retry :: Timeout ( Duration :: from_secs ( 10 ) ) , channel_manager) {
685
+ Ok ( _payment_id) => {
686
+ let payee_pubkey = invoice. recover_payee_pub_key ( ) ;
687
+ let amt_msat = invoice. amount_milli_satoshis ( ) . unwrap ( ) ;
688
+ println ! ( "EVENT: initiated sending {} msats to {}" , amt_msat, payee_pubkey) ;
689
+ print ! ( "> " ) ;
690
+ }
691
+ Err ( e) => {
692
+ println ! ( "ERROR: failed to send payment: {:?}" , e) ;
693
+ print ! ( "> " ) ;
694
+ outbound_payments. payments . get_mut ( & payment_hash) . unwrap ( ) . status = HTLCStatus :: Failed ;
695
+ persister. persist ( OUTBOUND_PAYMENTS_FNAME , & * outbound_payments) . unwrap ( ) ;
696
+ }
697
+ } ;
691
698
}
692
699
693
700
fn keysend < E : EntropySource > (
694
701
channel_manager : & ChannelManager , payee_pubkey : PublicKey , amt_msat : u64 , entropy_source : & E ,
695
- payment_storage : PaymentInfoStorage ,
702
+ outbound_payments : & mut PaymentInfoStorage , persister : Arc < FilesystemPersister > ,
696
703
) {
697
704
let payment_preimage = PaymentPreimage ( entropy_source. get_secure_random_bytes ( ) ) ;
698
705
let payment_hash = PaymentHash ( Sha256 :: hash ( & payment_preimage. 0 [ ..] ) . into_inner ( ) ) ;
@@ -701,7 +708,17 @@ fn keysend<E: EntropySource>(
701
708
payment_params : PaymentParameters :: for_keysend ( payee_pubkey, 40 ) ,
702
709
final_value_msat : amt_msat,
703
710
} ;
704
- let status = match channel_manager. send_spontaneous_payment_with_retry (
711
+ outbound_payments. payments . insert (
712
+ payment_hash,
713
+ PaymentInfo {
714
+ preimage : None ,
715
+ secret : None ,
716
+ status : HTLCStatus :: Pending ,
717
+ amt_msat : MillisatAmount ( Some ( amt_msat) ) ,
718
+ } ,
719
+ ) ;
720
+ persister. persist ( OUTBOUND_PAYMENTS_FNAME , & * outbound_payments) . unwrap ( ) ;
721
+ match channel_manager. send_spontaneous_payment_with_retry (
705
722
Some ( payment_preimage) ,
706
723
RecipientOnionFields :: spontaneous_empty ( ) ,
707
724
PaymentId ( payment_hash. 0 ) ,
@@ -711,33 +728,21 @@ fn keysend<E: EntropySource>(
711
728
Ok ( _payment_hash) => {
712
729
println ! ( "EVENT: initiated sending {} msats to {}" , amt_msat, payee_pubkey) ;
713
730
print ! ( "> " ) ;
714
- HTLCStatus :: Pending
715
731
}
716
732
Err ( e) => {
717
733
println ! ( "ERROR: failed to send payment: {:?}" , e) ;
718
734
print ! ( "> " ) ;
719
- HTLCStatus :: Failed
735
+ outbound_payments. payments . get_mut ( & payment_hash) . unwrap ( ) . status = HTLCStatus :: Failed ;
736
+ persister. persist ( OUTBOUND_PAYMENTS_FNAME , & * outbound_payments) . unwrap ( ) ;
720
737
}
721
738
} ;
722
-
723
- let mut payments = payment_storage. lock ( ) . unwrap ( ) ;
724
- payments. insert (
725
- payment_hash,
726
- PaymentInfo {
727
- preimage : None ,
728
- secret : None ,
729
- status,
730
- amt_msat : MillisatAmount ( Some ( amt_msat) ) ,
731
- } ,
732
- ) ;
733
739
}
734
740
735
741
fn get_invoice (
736
- amt_msat : u64 , payment_storage : PaymentInfoStorage , channel_manager : & ChannelManager ,
742
+ amt_msat : u64 , inbound_payments : & mut PaymentInfoStorage , channel_manager : & ChannelManager ,
737
743
keys_manager : Arc < KeysManager > , network : Network , expiry_secs : u32 ,
738
744
logger : Arc < disk:: FilesystemLogger > ,
739
745
) {
740
- let mut payments = payment_storage. lock ( ) . unwrap ( ) ;
741
746
let currency = match network {
742
747
Network :: Bitcoin => Currency :: Bitcoin ,
743
748
Network :: Testnet => Currency :: BitcoinTestnet ,
@@ -765,7 +770,7 @@ fn get_invoice(
765
770
} ;
766
771
767
772
let payment_hash = PaymentHash ( invoice. payment_hash ( ) . clone ( ) . into_inner ( ) ) ;
768
- payments. insert (
773
+ inbound_payments . payments . insert (
769
774
payment_hash,
770
775
PaymentInfo {
771
776
preimage : None ,
0 commit comments