1- use crate :: disk;
1+ use crate :: disk:: { self , INBOUND_PAYMENTS_FNAME , OUTBOUND_PAYMENTS_FNAME } ;
22use crate :: hex_utils;
33use crate :: {
44 ChannelManager , HTLCStatus , MillisatAmount , NetworkGraph , OnionMessenger , PaymentInfo ,
@@ -16,9 +16,11 @@ use lightning::onion_message::{CustomOnionMessageContents, Destination, OnionMes
1616use lightning:: routing:: gossip:: NodeId ;
1717use lightning:: routing:: router:: { PaymentParameters , RouteParameters } ;
1818use lightning:: util:: config:: { ChannelHandshakeConfig , ChannelHandshakeLimits , UserConfig } ;
19+ use lightning:: util:: persist:: KVStorePersister ;
1920use lightning:: util:: ser:: { Writeable , Writer } ;
2021use lightning_invoice:: payment:: pay_invoice;
2122use lightning_invoice:: { utils, Currency , Invoice } ;
23+ use lightning_persister:: FilesystemPersister ;
2224use std:: env;
2325use std:: io;
2426use std:: io:: Write ;
@@ -62,7 +64,7 @@ pub(crate) async fn poll_for_user_input(
6264 keys_manager : Arc < KeysManager > , network_graph : Arc < NetworkGraph > ,
6365 onion_messenger : Arc < OnionMessenger > , inbound_payments : Arc < Mutex < PaymentInfoStorage > > ,
6466 outbound_payments : Arc < Mutex < PaymentInfoStorage > > , ldk_data_dir : String , network : Network ,
65- logger : Arc < disk:: FilesystemLogger > ,
67+ logger : Arc < disk:: FilesystemLogger > , persister : Arc < FilesystemPersister > ,
6668) {
6769 println ! (
6870 "LDK startup successful. Enter \" help\" to view available commands. Press Ctrl-D to quit."
@@ -156,10 +158,12 @@ pub(crate) async fn poll_for_user_input(
156158 }
157159 } ;
158160
159- let mut outbound_payments = outbound_payments. lock ( ) . unwrap ( ) ;
160- send_payment ( & * channel_manager, & invoice, & mut outbound_payments) ;
161- disk:: persist_outbound_payments ( ldk_data_dir. clone ( ) , & outbound_payments)
162- . unwrap ( ) ;
161+ send_payment (
162+ & channel_manager,
163+ & invoice,
164+ & mut outbound_payments. lock ( ) . unwrap ( ) ,
165+ persister. clone ( ) ,
166+ ) ;
163167 }
164168 "keysend" => {
165169 let dest_pubkey = match words. next ( ) {
@@ -189,16 +193,14 @@ pub(crate) async fn poll_for_user_input(
189193 continue ;
190194 }
191195 } ;
192- let mut outbound_payments = outbound_payments. lock ( ) . unwrap ( ) ;
193196 keysend (
194- & * channel_manager,
197+ & channel_manager,
195198 dest_pubkey,
196199 amt_msat,
197200 & * keys_manager,
198- & mut outbound_payments,
201+ & mut outbound_payments. lock ( ) . unwrap ( ) ,
202+ persister. clone ( ) ,
199203 ) ;
200- disk:: persist_outbound_payments ( ldk_data_dir. clone ( ) , & outbound_payments)
201- . unwrap ( ) ;
202204 }
203205 "getinvoice" => {
204206 let amt_str = words. next ( ) ;
@@ -229,14 +231,13 @@ pub(crate) async fn poll_for_user_input(
229231 get_invoice (
230232 amt_msat. unwrap ( ) ,
231233 & mut inbound_payments,
232- & * channel_manager,
234+ & channel_manager,
233235 Arc :: clone ( & keys_manager) ,
234236 network,
235237 expiry_secs. unwrap ( ) ,
236238 Arc :: clone ( & logger) ,
237239 ) ;
238- disk:: persist_inbound_payments ( ldk_data_dir. clone ( ) , & inbound_payments)
239- . unwrap ( ) ;
240+ persister. persist ( INBOUND_PAYMENTS_FNAME , & * inbound_payments) . unwrap ( ) ;
240241 }
241242 "connectpeer" => {
242243 let peer_pubkey_and_ip_addr = words. next ( ) ;
@@ -665,40 +666,40 @@ fn open_channel(
665666}
666667
667668fn send_payment (
668- channel_manager : & ChannelManager , invoice : & Invoice , outbound_payments : & mut PaymentInfoStorage ,
669+ channel_manager : & ChannelManager , invoice : & Invoice ,
670+ outbound_payments : & mut PaymentInfoStorage , persister : Arc < FilesystemPersister > ,
669671) {
670- let status =
671- match pay_invoice ( invoice, Retry :: Timeout ( Duration :: from_secs ( 10 ) ) , channel_manager) {
672- Ok ( _payment_id) => {
673- let payee_pubkey = invoice. recover_payee_pub_key ( ) ;
674- let amt_msat = invoice. amount_milli_satoshis ( ) . unwrap ( ) ;
675- println ! ( "EVENT: initiated sending {} msats to {}" , amt_msat, payee_pubkey) ;
676- print ! ( "> " ) ;
677- HTLCStatus :: Pending
678- }
679- Err ( e) => {
680- println ! ( "ERROR: failed to send payment: {:?}" , e) ;
681- print ! ( "> " ) ;
682- HTLCStatus :: Failed
683- }
684- } ;
685- let payment_hash = PaymentHash ( invoice. payment_hash ( ) . clone ( ) . into_inner ( ) ) ;
686- let payment_secret = Some ( invoice. payment_secret ( ) . clone ( ) ) ;
687-
672+ let payment_hash = PaymentHash ( ( * invoice. payment_hash ( ) ) . into_inner ( ) ) ;
673+ let payment_secret = Some ( * invoice. payment_secret ( ) ) ;
688674 outbound_payments. payments . insert (
689675 payment_hash,
690676 PaymentInfo {
691677 preimage : None ,
692678 secret : payment_secret,
693- status,
679+ status : HTLCStatus :: Pending ,
694680 amt_msat : MillisatAmount ( invoice. amount_milli_satoshis ( ) ) ,
695681 } ,
696682 ) ;
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+ } ;
697698}
698699
699700fn keysend < E : EntropySource > (
700701 channel_manager : & ChannelManager , payee_pubkey : PublicKey , amt_msat : u64 , entropy_source : & E ,
701- outbound_payments : & mut PaymentInfoStorage ,
702+ outbound_payments : & mut PaymentInfoStorage , persister : Arc < FilesystemPersister > ,
702703) {
703704 let payment_preimage = PaymentPreimage ( entropy_source. get_secure_random_bytes ( ) ) ;
704705 let payment_hash = PaymentHash ( Sha256 :: hash ( & payment_preimage. 0 [ ..] ) . into_inner ( ) ) ;
@@ -707,7 +708,17 @@ fn keysend<E: EntropySource>(
707708 payment_params : PaymentParameters :: for_keysend ( payee_pubkey, 40 ) ,
708709 final_value_msat : amt_msat,
709710 } ;
710- 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 (
711722 Some ( payment_preimage) ,
712723 RecipientOnionFields :: spontaneous_empty ( ) ,
713724 PaymentId ( payment_hash. 0 ) ,
@@ -717,24 +728,14 @@ fn keysend<E: EntropySource>(
717728 Ok ( _payment_hash) => {
718729 println ! ( "EVENT: initiated sending {} msats to {}" , amt_msat, payee_pubkey) ;
719730 print ! ( "> " ) ;
720- HTLCStatus :: Pending
721731 }
722732 Err ( e) => {
723733 println ! ( "ERROR: failed to send payment: {:?}" , e) ;
724734 print ! ( "> " ) ;
725- HTLCStatus :: Failed
735+ outbound_payments. payments . get_mut ( & payment_hash) . unwrap ( ) . status = HTLCStatus :: Failed ;
736+ persister. persist ( OUTBOUND_PAYMENTS_FNAME , & * outbound_payments) . unwrap ( ) ;
726737 }
727738 } ;
728-
729- outbound_payments. payments . insert (
730- payment_hash,
731- PaymentInfo {
732- preimage : None ,
733- secret : None ,
734- status,
735- amt_msat : MillisatAmount ( Some ( amt_msat) ) ,
736- } ,
737- ) ;
738739}
739740
740741fn get_invoice (
0 commit comments