@@ -75,6 +75,7 @@ pub(crate) enum PendingOutboundPayment {
75
75
retry_strategy : Retry ,
76
76
payment_release_secret : [ u8 ; 32 ] ,
77
77
route_params : RouteParameters ,
78
+ invoice_request : InvoiceRequest ,
78
79
} ,
79
80
Retryable {
80
81
retry_strategy : Option < Retry > ,
@@ -946,7 +947,7 @@ impl OutboundPayments {
946
947
}
947
948
948
949
match self . pending_outbound_payments . lock ( ) . unwrap ( ) . entry ( payment_id) {
949
- hash_map:: Entry :: Occupied ( mut entry) => match entry. get ( ) {
950
+ hash_map:: Entry :: Occupied ( mut entry) => match entry. get_mut ( ) {
950
951
PendingOutboundPayment :: AwaitingInvoice { retry_strategy, invoice_request, .. } => {
951
952
let invreq = invoice_request. as_ref ( ) . ok_or ( Bolt12PaymentError :: UnexpectedInvoice ) ?;
952
953
if !invoice. from_same_offer ( invreq) {
@@ -984,6 +985,7 @@ impl OutboundPayments {
984
985
retry_strategy : * retry_strategy,
985
986
payment_release_secret,
986
987
route_params,
988
+ invoice_request : invoice_request. take ( ) . ok_or ( Bolt12PaymentError :: UnexpectedInvoice ) ?,
987
989
} ;
988
990
return Ok ( payment_release_secret)
989
991
} ,
@@ -2115,31 +2117,36 @@ impl_writeable_tlv_based_enum_upgradable!(PendingOutboundPayment,
2115
2117
( 4 , retry_strategy, required) ,
2116
2118
( 6 , payment_release_secret, required) ,
2117
2119
( 8 , route_params, required) ,
2120
+ ( 10 , invoice_request, required) ,
2118
2121
} ,
2119
2122
) ;
2120
2123
2121
2124
#[ cfg( test) ]
2122
2125
mod tests {
2126
+ use bitcoin:: hex:: FromHex ;
2123
2127
use bitcoin:: network:: Network ;
2124
2128
use bitcoin:: secp256k1:: { PublicKey , Secp256k1 , SecretKey } ;
2125
2129
2126
2130
use core:: time:: Duration ;
2127
2131
2128
2132
use crate :: blinded_path:: EmptyNodeIdLookUp ;
2129
2133
use crate :: events:: { Event , PathFailure , PaymentFailureReason } ;
2134
+ use crate :: io:: Cursor ;
2130
2135
use crate :: ln:: types:: { PaymentHash , PaymentPreimage } ;
2131
2136
use crate :: ln:: channelmanager:: { PaymentId , RecipientOnionFields } ;
2132
2137
use crate :: ln:: features:: { Bolt12InvoiceFeatures , ChannelFeatures , NodeFeatures } ;
2133
2138
use crate :: ln:: msgs:: { ErrorAction , LightningError } ;
2134
2139
use crate :: ln:: outbound_payment:: { Bolt12PaymentError , OutboundPayments , PendingOutboundPayment , Retry , RetryableSendFailure , StaleExpiration } ;
2135
2140
#[ cfg( feature = "std" ) ]
2136
2141
use crate :: offers:: invoice:: DEFAULT_RELATIVE_EXPIRY ;
2142
+ use crate :: offers:: invoice_request:: InvoiceRequest ;
2137
2143
use crate :: offers:: offer:: OfferBuilder ;
2138
2144
use crate :: offers:: test_utils:: * ;
2139
2145
use crate :: routing:: gossip:: NetworkGraph ;
2140
2146
use crate :: routing:: router:: { InFlightHtlcs , Path , PaymentParameters , Route , RouteHop , RouteParameters } ;
2141
2147
use crate :: sync:: { Arc , Mutex , RwLock } ;
2142
2148
use crate :: util:: errors:: APIError ;
2149
+ use crate :: util:: ser:: Readable ;
2143
2150
use crate :: util:: test_utils;
2144
2151
2145
2152
use alloc:: collections:: VecDeque ;
@@ -2681,6 +2688,11 @@ mod tests {
2681
2688
assert ! ( pending_events. lock( ) . unwrap( ) . is_empty( ) ) ;
2682
2689
}
2683
2690
2691
+ fn invoice_request ( ) -> InvoiceRequest {
2692
+ let invreq_bytes = <Vec < u8 > >:: from_hex ( "00200101010101010101010101010101010101010101010101010101010101010101080203e80a00162102bb58b5feca505c74edc000d8282fc556e51a1024fc8e7d7e56c6f887c5c8d5f25821035be5e9478209674a96e60f1f037f6176540fd001fa1d64694770c56a7709c42cf040a31d68198578a5aa1fe57de5f6d33f89c1556752cb333dbb56ac727f751893804d3a26b42909f1952fb1db8080238f9476b829160387692df35ff85dfe72e2ed" ) . unwrap ( ) ;
2693
+ Readable :: read ( & mut Cursor :: new ( & invreq_bytes[ ..] ) ) . unwrap ( )
2694
+ }
2695
+
2684
2696
#[ test]
2685
2697
fn time_out_unreleased_async_payments ( ) {
2686
2698
let pending_events = Mutex :: new ( VecDeque :: new ( ) ) ;
@@ -2703,6 +2715,7 @@ mod tests {
2703
2715
retry_strategy : Retry :: Attempts ( 0 ) ,
2704
2716
payment_release_secret : [ 0 ; 32 ] ,
2705
2717
route_params,
2718
+ invoice_request : invoice_request ( ) ,
2706
2719
} ;
2707
2720
outbounds. insert ( payment_id, outbound) ;
2708
2721
core:: mem:: drop ( outbounds) ;
@@ -2750,6 +2763,7 @@ mod tests {
2750
2763
retry_strategy : Retry :: Attempts ( 0 ) ,
2751
2764
payment_release_secret : [ 0 ; 32 ] ,
2752
2765
route_params,
2766
+ invoice_request : invoice_request ( ) ,
2753
2767
} ;
2754
2768
outbounds. insert ( payment_id, outbound) ;
2755
2769
core:: mem:: drop ( outbounds) ;
0 commit comments