@@ -20,7 +20,7 @@ use lightning::events::bump_transaction::{BumpTransactionEventHandler, Wallet};
2020use lightning:: events:: { Event , PaymentFailureReason , PaymentPurpose } ;
2121use lightning:: ln:: channelmanager:: { self , RecentPaymentDetails } ;
2222use lightning:: ln:: channelmanager:: {
23- ChainParameters , ChannelManagerReadArgs , SimpleArcChannelManager ,
23+ ChainParameters , ChannelManagerReadArgs , PaymentId , SimpleArcChannelManager ,
2424} ;
2525use lightning:: ln:: msgs:: DecodeError ;
2626use lightning:: ln:: peer_handler:: { IgnoringMessageHandler , MessageHandler , SimpleArcPeerManager } ;
@@ -109,11 +109,19 @@ impl_writeable_tlv_based!(PaymentInfo, {
109109 ( 6 , amt_msat, required) ,
110110} ) ;
111111
112- pub ( crate ) struct PaymentInfoStorage {
112+ pub ( crate ) struct InboundPaymentInfoStorage {
113113 payments : HashMap < PaymentHash , PaymentInfo > ,
114114}
115115
116- impl_writeable_tlv_based ! ( PaymentInfoStorage , {
116+ impl_writeable_tlv_based ! ( InboundPaymentInfoStorage , {
117+ ( 0 , payments, required) ,
118+ } ) ;
119+
120+ pub ( crate ) struct OutboundPaymentInfoStorage {
121+ payments : HashMap < PaymentId , PaymentInfo > ,
122+ }
123+
124+ impl_writeable_tlv_based ! ( OutboundPaymentInfoStorage , {
117125 ( 0 , payments, required) ,
118126} ) ;
119127
@@ -171,8 +179,9 @@ pub(crate) type BumpTxEventHandler = BumpTransactionEventHandler<
171179async fn handle_ldk_events (
172180 channel_manager : & Arc < ChannelManager > , bitcoind_client : & BitcoindClient ,
173181 network_graph : & NetworkGraph , keys_manager : & KeysManager ,
174- bump_tx_event_handler : & BumpTxEventHandler , inbound_payments : Arc < Mutex < PaymentInfoStorage > > ,
175- outbound_payments : Arc < Mutex < PaymentInfoStorage > > , fs_store : & Arc < FilesystemStore > ,
182+ bump_tx_event_handler : & BumpTxEventHandler ,
183+ inbound_payments : Arc < Mutex < InboundPaymentInfoStorage > > ,
184+ outbound_payments : Arc < Mutex < OutboundPaymentInfoStorage > > , fs_store : & Arc < FilesystemStore > ,
176185 network : Network , event : Event ,
177186) {
178187 match event {
@@ -286,10 +295,12 @@ async fn handle_ldk_events(
286295 }
287296 fs_store. write ( "" , "" , INBOUND_PAYMENTS_FNAME , & inbound. encode ( ) ) . unwrap ( ) ;
288297 }
289- Event :: PaymentSent { payment_preimage, payment_hash, fee_paid_msat, .. } => {
298+ Event :: PaymentSent {
299+ payment_preimage, payment_hash, fee_paid_msat, payment_id, ..
300+ } => {
290301 let mut outbound = outbound_payments. lock ( ) . unwrap ( ) ;
291- for ( hash , payment) in outbound. payments . iter_mut ( ) {
292- if * hash == payment_hash {
302+ for ( id , payment) in outbound. payments . iter_mut ( ) {
303+ if * id == payment_id . unwrap ( ) {
293304 payment. preimage = Some ( payment_preimage) ;
294305 payment. status = HTLCStatus :: Succeeded ;
295306 println ! (
@@ -343,7 +354,7 @@ async fn handle_ldk_events(
343354 Event :: PaymentPathFailed { .. } => { }
344355 Event :: ProbeSuccessful { .. } => { }
345356 Event :: ProbeFailed { .. } => { }
346- Event :: PaymentFailed { payment_hash, reason, .. } => {
357+ Event :: PaymentFailed { payment_hash, reason, payment_id , .. } => {
347358 print ! (
348359 "\n EVENT: Failed to send payment to payment hash {}: {:?}" ,
349360 payment_hash,
@@ -353,8 +364,8 @@ async fn handle_ldk_events(
353364 io:: stdout ( ) . flush ( ) . unwrap ( ) ;
354365
355366 let mut outbound = outbound_payments. lock ( ) . unwrap ( ) ;
356- if outbound. payments . contains_key ( & payment_hash ) {
357- let payment = outbound. payments . get_mut ( & payment_hash ) . unwrap ( ) ;
367+ if outbound. payments . contains_key ( & payment_id ) {
368+ let payment = outbound. payments . get_mut ( & payment_id ) . unwrap ( ) ;
358369 payment. status = HTLCStatus :: Failed ;
359370 }
360371 fs_store. write ( "" , "" , OUTBOUND_PAYMENTS_FNAME , & outbound. encode ( ) ) . unwrap ( ) ;
@@ -364,7 +375,12 @@ async fn handle_ldk_events(
364375 print ! ( "> " ) ;
365376 io:: stdout ( ) . flush ( ) . unwrap ( ) ;
366377
367- // TODO: mark the payment as failed
378+ let mut outbound = outbound_payments. lock ( ) . unwrap ( ) ;
379+ if outbound. payments . contains_key ( & payment_id) {
380+ let payment = outbound. payments . get_mut ( & payment_id) . unwrap ( ) ;
381+ payment. status = HTLCStatus :: Failed ;
382+ }
383+ fs_store. write ( "" , "" , OUTBOUND_PAYMENTS_FNAME , & outbound. encode ( ) ) . unwrap ( ) ;
368384 }
369385 Event :: PaymentForwarded {
370386 prev_channel_id,
@@ -833,32 +849,30 @@ async fn start_ldk() {
833849 }
834850 } ) ;
835851
836- let inbound_payments = Arc :: new ( Mutex :: new ( disk:: read_payment_info ( Path :: new ( & format ! (
837- "{}/{}" ,
838- ldk_data_dir, INBOUND_PAYMENTS_FNAME
839- ) ) ) ) ) ;
840- let outbound_payments = Arc :: new ( Mutex :: new ( disk:: read_payment_info ( Path :: new ( & format ! (
841- "{}/{}" ,
842- ldk_data_dir, OUTBOUND_PAYMENTS_FNAME
843- ) ) ) ) ) ;
844- let recent_payments_payment_hashes = channel_manager
852+ let inbound_payments = Arc :: new ( Mutex :: new ( disk:: read_inbound_payment_info ( Path :: new (
853+ & format ! ( "{}/{}" , ldk_data_dir, INBOUND_PAYMENTS_FNAME ) ,
854+ ) ) ) ) ;
855+ let outbound_payments = Arc :: new ( Mutex :: new ( disk:: read_outbound_payment_info ( Path :: new (
856+ & format ! ( "{}/{}" , ldk_data_dir, OUTBOUND_PAYMENTS_FNAME ) ,
857+ ) ) ) ) ;
858+ let recent_payments_payment_ids = channel_manager
845859 . list_recent_payments ( )
846860 . into_iter ( )
847861 . filter_map ( |p| match p {
848- RecentPaymentDetails :: Pending { payment_hash , .. } => Some ( payment_hash ) ,
849- RecentPaymentDetails :: Fulfilled { payment_hash , .. } => payment_hash ,
850- RecentPaymentDetails :: Abandoned { payment_hash , .. } => Some ( payment_hash ) ,
851- RecentPaymentDetails :: AwaitingInvoice { payment_id : _ } => todo ! ( ) ,
862+ RecentPaymentDetails :: Pending { payment_id , .. } => Some ( payment_id ) ,
863+ RecentPaymentDetails :: Fulfilled { payment_id , .. } => Some ( payment_id ) ,
864+ RecentPaymentDetails :: Abandoned { payment_id , .. } => Some ( payment_id ) ,
865+ RecentPaymentDetails :: AwaitingInvoice { payment_id } => Some ( payment_id ) ,
852866 } )
853- . collect :: < Vec < PaymentHash > > ( ) ;
854- for ( payment_hash , payment_info) in outbound_payments
867+ . collect :: < Vec < PaymentId > > ( ) ;
868+ for ( payment_id , payment_info) in outbound_payments
855869 . lock ( )
856870 . unwrap ( )
857871 . payments
858872 . iter_mut ( )
859873 . filter ( |( _, i) | matches ! ( i. status, HTLCStatus :: Pending ) )
860874 {
861- if !recent_payments_payment_hashes . contains ( payment_hash ) {
875+ if !recent_payments_payment_ids . contains ( payment_id ) {
862876 payment_info. status = HTLCStatus :: Failed ;
863877 }
864878 }
0 commit comments