@@ -1757,6 +1757,22 @@ impl OutboundPayments {
1757
1757
true
1758
1758
}
1759
1759
} ,
1760
+ PendingOutboundPayment :: StaticInvoiceReceived { route_params, payment_hash, .. } => {
1761
+ let is_stale =
1762
+ route_params. payment_params . expiry_time . unwrap_or_else ( u64:: max_value) <
1763
+ duration_since_epoch. as_secs ( ) ;
1764
+ if is_stale {
1765
+ let fail_ev = events:: Event :: PaymentFailed {
1766
+ payment_id : * payment_id,
1767
+ payment_hash : * payment_hash,
1768
+ reason : Some ( PaymentFailureReason :: PaymentExpired )
1769
+ } ;
1770
+ pending_events. push_back ( ( fail_ev, None ) ) ;
1771
+ false
1772
+ } else {
1773
+ true
1774
+ }
1775
+ } ,
1760
1776
_ => true ,
1761
1777
} ) ;
1762
1778
}
@@ -2022,11 +2038,11 @@ mod tests {
2022
2038
2023
2039
use crate :: blinded_path:: EmptyNodeIdLookUp ;
2024
2040
use crate :: events:: { Event , PathFailure , PaymentFailureReason } ;
2025
- use crate :: ln:: types:: PaymentHash ;
2041
+ use crate :: ln:: types:: { PaymentHash , PaymentPreimage } ;
2026
2042
use crate :: ln:: channelmanager:: { PaymentId , RecipientOnionFields } ;
2027
2043
use crate :: ln:: features:: { ChannelFeatures , NodeFeatures } ;
2028
2044
use crate :: ln:: msgs:: { ErrorAction , LightningError } ;
2029
- use crate :: ln:: outbound_payment:: { Bolt12PaymentError , OutboundPayments , Retry , RetryableSendFailure , StaleExpiration } ;
2045
+ use crate :: ln:: outbound_payment:: { Bolt12PaymentError , OutboundPayments , PendingOutboundPayment , Retry , RetryableSendFailure , StaleExpiration } ;
2030
2046
#[ cfg( feature = "std" ) ]
2031
2047
use crate :: offers:: invoice:: DEFAULT_RELATIVE_EXPIRY ;
2032
2048
use crate :: offers:: offer:: OfferBuilder ;
@@ -2565,4 +2581,51 @@ mod tests {
2565
2581
assert ! ( outbound_payments. has_pending_payments( ) ) ;
2566
2582
assert ! ( pending_events. lock( ) . unwrap( ) . is_empty( ) ) ;
2567
2583
}
2584
+
2585
+ #[ test]
2586
+ fn time_out_unreleased_async_payments ( ) {
2587
+ let pending_events = Mutex :: new ( VecDeque :: new ( ) ) ;
2588
+ let outbound_payments = OutboundPayments :: new ( ) ;
2589
+ let payment_id = PaymentId ( [ 0 ; 32 ] ) ;
2590
+ let absolute_expiry = 60 ;
2591
+
2592
+ let mut outbounds = outbound_payments. pending_outbound_payments . lock ( ) . unwrap ( ) ;
2593
+ let payment_params = PaymentParameters :: from_node_id ( test_utils:: pubkey ( 42 ) , 0 )
2594
+ . with_expiry_time ( absolute_expiry) ;
2595
+ let route_params = RouteParameters {
2596
+ payment_params,
2597
+ final_value_msat : 0 ,
2598
+ max_total_routing_fee_msat : None ,
2599
+ } ;
2600
+ let payment_hash = PaymentHash ( [ 0 ; 32 ] ) ;
2601
+ let outbound = PendingOutboundPayment :: StaticInvoiceReceived {
2602
+ payment_hash,
2603
+ keysend_preimage : PaymentPreimage ( [ 0 ; 32 ] ) ,
2604
+ retry_strategy : Retry :: Attempts ( 0 ) ,
2605
+ payment_release_secret : [ 0 ; 32 ] ,
2606
+ route_params,
2607
+ } ;
2608
+ outbounds. insert ( payment_id, outbound) ;
2609
+ core:: mem:: drop ( outbounds) ;
2610
+
2611
+ // The payment will not be removed if it isn't expired yet.
2612
+ outbound_payments. remove_stale_payments ( Duration :: from_secs ( absolute_expiry) , & pending_events) ;
2613
+ let outbounds = outbound_payments. pending_outbound_payments . lock ( ) . unwrap ( ) ;
2614
+ assert_eq ! ( outbounds. len( ) , 1 ) ;
2615
+ let events = pending_events. lock ( ) . unwrap ( ) ;
2616
+ assert_eq ! ( events. len( ) , 0 ) ;
2617
+ core:: mem:: drop ( outbounds) ;
2618
+ core:: mem:: drop ( events) ;
2619
+
2620
+ outbound_payments. remove_stale_payments ( Duration :: from_secs ( absolute_expiry + 1 ) , & pending_events) ;
2621
+ let outbounds = outbound_payments. pending_outbound_payments . lock ( ) . unwrap ( ) ;
2622
+ assert_eq ! ( outbounds. len( ) , 0 ) ;
2623
+ let events = pending_events. lock ( ) . unwrap ( ) ;
2624
+ assert_eq ! ( events. len( ) , 1 ) ;
2625
+ assert_eq ! ( events[ 0 ] , ( Event :: PaymentFailed {
2626
+ payment_hash,
2627
+ payment_id,
2628
+ reason: Some ( PaymentFailureReason :: PaymentExpired ) ,
2629
+ } , None ) ) ;
2630
+ }
2568
2631
}
0 commit comments