@@ -20,7 +20,7 @@ use lightning::events::bump_transaction::{BumpTransactionEventHandler, Wallet};
20
20
use lightning:: events:: { Event , PaymentFailureReason , PaymentPurpose } ;
21
21
use lightning:: ln:: channelmanager:: { self , RecentPaymentDetails } ;
22
22
use lightning:: ln:: channelmanager:: {
23
- ChainParameters , ChannelManagerReadArgs , SimpleArcChannelManager ,
23
+ ChainParameters , ChannelManagerReadArgs , PaymentId , SimpleArcChannelManager ,
24
24
} ;
25
25
use lightning:: ln:: msgs:: DecodeError ;
26
26
use lightning:: ln:: peer_handler:: { IgnoringMessageHandler , MessageHandler , SimpleArcPeerManager } ;
@@ -109,11 +109,19 @@ impl_writeable_tlv_based!(PaymentInfo, {
109
109
( 6 , amt_msat, required) ,
110
110
} ) ;
111
111
112
- pub ( crate ) struct PaymentInfoStorage {
112
+ pub ( crate ) struct InboundPaymentInfoStorage {
113
113
payments : HashMap < PaymentHash , PaymentInfo > ,
114
114
}
115
115
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 , {
117
125
( 0 , payments, required) ,
118
126
} ) ;
119
127
@@ -171,8 +179,9 @@ pub(crate) type BumpTxEventHandler = BumpTransactionEventHandler<
171
179
async fn handle_ldk_events (
172
180
channel_manager : & Arc < ChannelManager > , bitcoind_client : & BitcoindClient ,
173
181
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 > ,
176
185
network : Network , event : Event ,
177
186
) {
178
187
match event {
@@ -286,10 +295,12 @@ async fn handle_ldk_events(
286
295
}
287
296
fs_store. write ( "" , "" , INBOUND_PAYMENTS_FNAME , & inbound. encode ( ) ) . unwrap ( ) ;
288
297
}
289
- Event :: PaymentSent { payment_preimage, payment_hash, fee_paid_msat, .. } => {
298
+ Event :: PaymentSent {
299
+ payment_preimage, payment_hash, fee_paid_msat, payment_id, ..
300
+ } => {
290
301
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 ( ) {
293
304
payment. preimage = Some ( payment_preimage) ;
294
305
payment. status = HTLCStatus :: Succeeded ;
295
306
println ! (
@@ -343,7 +354,7 @@ async fn handle_ldk_events(
343
354
Event :: PaymentPathFailed { .. } => { }
344
355
Event :: ProbeSuccessful { .. } => { }
345
356
Event :: ProbeFailed { .. } => { }
346
- Event :: PaymentFailed { payment_hash, reason, .. } => {
357
+ Event :: PaymentFailed { payment_hash, reason, payment_id , .. } => {
347
358
print ! (
348
359
"\n EVENT: Failed to send payment to payment hash {}: {:?}" ,
349
360
payment_hash,
@@ -353,8 +364,8 @@ async fn handle_ldk_events(
353
364
io:: stdout ( ) . flush ( ) . unwrap ( ) ;
354
365
355
366
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 ( ) ;
358
369
payment. status = HTLCStatus :: Failed ;
359
370
}
360
371
fs_store. write ( "" , "" , OUTBOUND_PAYMENTS_FNAME , & outbound. encode ( ) ) . unwrap ( ) ;
@@ -364,7 +375,12 @@ async fn handle_ldk_events(
364
375
print ! ( "> " ) ;
365
376
io:: stdout ( ) . flush ( ) . unwrap ( ) ;
366
377
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 ( ) ;
368
384
}
369
385
Event :: PaymentForwarded {
370
386
prev_channel_id,
@@ -833,32 +849,30 @@ async fn start_ldk() {
833
849
}
834
850
} ) ;
835
851
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
845
859
. list_recent_payments ( )
846
860
. into_iter ( )
847
861
. 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 ) ,
852
866
} )
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
855
869
. lock ( )
856
870
. unwrap ( )
857
871
. payments
858
872
. iter_mut ( )
859
873
. filter ( |( _, i) | matches ! ( i. status, HTLCStatus :: Pending ) )
860
874
{
861
- if !recent_payments_payment_hashes . contains ( payment_hash ) {
875
+ if !recent_payments_payment_ids . contains ( payment_id ) {
862
876
payment_info. status = HTLCStatus :: Failed ;
863
877
}
864
878
}
0 commit comments