@@ -1819,6 +1819,22 @@ impl OutboundPayments {
1819
1819
true
1820
1820
}
1821
1821
} ,
1822
+ PendingOutboundPayment :: StaticInvoiceReceived { route_params, payment_hash, .. } => {
1823
+ let is_stale =
1824
+ route_params. payment_params . expiry_time . unwrap_or_else ( u64:: max_value) <
1825
+ duration_since_epoch. as_secs ( ) ;
1826
+ if is_stale {
1827
+ let fail_ev = events:: Event :: PaymentFailed {
1828
+ payment_id : * payment_id,
1829
+ payment_hash : * payment_hash,
1830
+ reason : Some ( PaymentFailureReason :: PaymentExpired )
1831
+ } ;
1832
+ pending_events. push_back ( ( fail_ev, None ) ) ;
1833
+ false
1834
+ } else {
1835
+ true
1836
+ }
1837
+ } ,
1822
1838
_ => true ,
1823
1839
} ) ;
1824
1840
}
@@ -2070,11 +2086,11 @@ mod tests {
2070
2086
2071
2087
use crate :: blinded_path:: EmptyNodeIdLookUp ;
2072
2088
use crate :: events:: { Event , PathFailure , PaymentFailureReason } ;
2073
- use crate :: ln:: types:: PaymentHash ;
2089
+ use crate :: ln:: types:: { PaymentHash , PaymentPreimage } ;
2074
2090
use crate :: ln:: channelmanager:: { PaymentId , RecipientOnionFields } ;
2075
2091
use crate :: ln:: features:: { ChannelFeatures , NodeFeatures } ;
2076
2092
use crate :: ln:: msgs:: { ErrorAction , LightningError } ;
2077
- use crate :: ln:: outbound_payment:: { Bolt12PaymentError , OutboundPayments , Retry , RetryableSendFailure , StaleExpiration } ;
2093
+ use crate :: ln:: outbound_payment:: { Bolt12PaymentError , OutboundPayments , PendingOutboundPayment , Retry , RetryableSendFailure , StaleExpiration } ;
2078
2094
#[ cfg( feature = "std" ) ]
2079
2095
use crate :: offers:: invoice:: DEFAULT_RELATIVE_EXPIRY ;
2080
2096
use crate :: offers:: offer:: OfferBuilder ;
@@ -2613,4 +2629,51 @@ mod tests {
2613
2629
assert ! ( outbound_payments. has_pending_payments( ) ) ;
2614
2630
assert ! ( pending_events. lock( ) . unwrap( ) . is_empty( ) ) ;
2615
2631
}
2632
+
2633
+ #[ test]
2634
+ fn time_out_unreleased_async_payments ( ) {
2635
+ let pending_events = Mutex :: new ( VecDeque :: new ( ) ) ;
2636
+ let outbound_payments = OutboundPayments :: new ( ) ;
2637
+ let payment_id = PaymentId ( [ 0 ; 32 ] ) ;
2638
+ let absolute_expiry = 60 ;
2639
+
2640
+ let mut outbounds = outbound_payments. pending_outbound_payments . lock ( ) . unwrap ( ) ;
2641
+ let payment_params = PaymentParameters :: from_node_id ( test_utils:: pubkey ( 42 ) , 0 )
2642
+ . with_expiry_time ( absolute_expiry) ;
2643
+ let route_params = RouteParameters {
2644
+ payment_params,
2645
+ final_value_msat : 0 ,
2646
+ max_total_routing_fee_msat : None ,
2647
+ } ;
2648
+ let payment_hash = PaymentHash ( [ 0 ; 32 ] ) ;
2649
+ let outbound = PendingOutboundPayment :: StaticInvoiceReceived {
2650
+ payment_hash,
2651
+ keysend_preimage : PaymentPreimage ( [ 0 ; 32 ] ) ,
2652
+ retry_strategy : Retry :: Attempts ( 0 ) ,
2653
+ payment_release_secret : [ 0 ; 32 ] ,
2654
+ route_params,
2655
+ } ;
2656
+ outbounds. insert ( payment_id, outbound) ;
2657
+ core:: mem:: drop ( outbounds) ;
2658
+
2659
+ // The payment will not be removed if it isn't expired yet.
2660
+ outbound_payments. remove_stale_payments ( Duration :: from_secs ( absolute_expiry) , & pending_events) ;
2661
+ let outbounds = outbound_payments. pending_outbound_payments . lock ( ) . unwrap ( ) ;
2662
+ assert_eq ! ( outbounds. len( ) , 1 ) ;
2663
+ let events = pending_events. lock ( ) . unwrap ( ) ;
2664
+ assert_eq ! ( events. len( ) , 0 ) ;
2665
+ core:: mem:: drop ( outbounds) ;
2666
+ core:: mem:: drop ( events) ;
2667
+
2668
+ outbound_payments. remove_stale_payments ( Duration :: from_secs ( absolute_expiry + 1 ) , & pending_events) ;
2669
+ let outbounds = outbound_payments. pending_outbound_payments . lock ( ) . unwrap ( ) ;
2670
+ assert_eq ! ( outbounds. len( ) , 0 ) ;
2671
+ let events = pending_events. lock ( ) . unwrap ( ) ;
2672
+ assert_eq ! ( events. len( ) , 1 ) ;
2673
+ assert_eq ! ( events[ 0 ] , ( Event :: PaymentFailed {
2674
+ payment_hash,
2675
+ payment_id,
2676
+ reason: Some ( PaymentFailureReason :: PaymentExpired ) ,
2677
+ } , None ) ) ;
2678
+ }
2616
2679
}
0 commit comments