@@ -75,6 +75,7 @@ pub(crate) enum PendingOutboundPayment {
7575 retry_strategy : Retry ,
7676 payment_release_secret : [ u8 ; 32 ] ,
7777 route_params : RouteParameters ,
78+ invoice_request : InvoiceRequest ,
7879 } ,
7980 Retryable {
8081 retry_strategy : Option < Retry > ,
@@ -946,7 +947,7 @@ impl OutboundPayments {
946947 }
947948
948949 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 ( ) {
950951 PendingOutboundPayment :: AwaitingInvoice { retry_strategy, invoice_request, .. } => {
951952 let invreq = invoice_request. as_ref ( ) . ok_or ( Bolt12PaymentError :: UnexpectedInvoice ) ?;
952953 if !invoice. from_same_offer ( invreq) {
@@ -984,6 +985,7 @@ impl OutboundPayments {
984985 retry_strategy : * retry_strategy,
985986 payment_release_secret,
986987 route_params,
988+ invoice_request : invoice_request. take ( ) . ok_or ( Bolt12PaymentError :: UnexpectedInvoice ) ?,
987989 } ;
988990 return Ok ( payment_release_secret)
989991 } ,
@@ -2115,31 +2117,36 @@ impl_writeable_tlv_based_enum_upgradable!(PendingOutboundPayment,
21152117 ( 4 , retry_strategy, required) ,
21162118 ( 6 , payment_release_secret, required) ,
21172119 ( 8 , route_params, required) ,
2120+ ( 10 , invoice_request, required) ,
21182121 } ,
21192122) ;
21202123
21212124#[ cfg( test) ]
21222125mod tests {
2126+ use bitcoin:: hex:: FromHex ;
21232127 use bitcoin:: network:: Network ;
21242128 use bitcoin:: secp256k1:: { PublicKey , Secp256k1 , SecretKey } ;
21252129
21262130 use core:: time:: Duration ;
21272131
21282132 use crate :: blinded_path:: EmptyNodeIdLookUp ;
21292133 use crate :: events:: { Event , PathFailure , PaymentFailureReason } ;
2134+ use crate :: io:: Cursor ;
21302135 use crate :: ln:: types:: { PaymentHash , PaymentPreimage } ;
21312136 use crate :: ln:: channelmanager:: { PaymentId , RecipientOnionFields } ;
21322137 use crate :: ln:: features:: { Bolt12InvoiceFeatures , ChannelFeatures , NodeFeatures } ;
21332138 use crate :: ln:: msgs:: { ErrorAction , LightningError } ;
21342139 use crate :: ln:: outbound_payment:: { Bolt12PaymentError , OutboundPayments , PendingOutboundPayment , Retry , RetryableSendFailure , StaleExpiration } ;
21352140 #[ cfg( feature = "std" ) ]
21362141 use crate :: offers:: invoice:: DEFAULT_RELATIVE_EXPIRY ;
2142+ use crate :: offers:: invoice_request:: InvoiceRequest ;
21372143 use crate :: offers:: offer:: OfferBuilder ;
21382144 use crate :: offers:: test_utils:: * ;
21392145 use crate :: routing:: gossip:: NetworkGraph ;
21402146 use crate :: routing:: router:: { InFlightHtlcs , Path , PaymentParameters , Route , RouteHop , RouteParameters } ;
21412147 use crate :: sync:: { Arc , Mutex , RwLock } ;
21422148 use crate :: util:: errors:: APIError ;
2149+ use crate :: util:: ser:: Readable ;
21432150 use crate :: util:: test_utils;
21442151
21452152 use alloc:: collections:: VecDeque ;
@@ -2681,6 +2688,11 @@ mod tests {
26812688 assert ! ( pending_events. lock( ) . unwrap( ) . is_empty( ) ) ;
26822689 }
26832690
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+
26842696 #[ test]
26852697 fn time_out_unreleased_async_payments ( ) {
26862698 let pending_events = Mutex :: new ( VecDeque :: new ( ) ) ;
@@ -2703,6 +2715,7 @@ mod tests {
27032715 retry_strategy : Retry :: Attempts ( 0 ) ,
27042716 payment_release_secret : [ 0 ; 32 ] ,
27052717 route_params,
2718+ invoice_request : invoice_request ( ) ,
27062719 } ;
27072720 outbounds. insert ( payment_id, outbound) ;
27082721 core:: mem:: drop ( outbounds) ;
@@ -2750,6 +2763,7 @@ mod tests {
27502763 retry_strategy : Retry :: Attempts ( 0 ) ,
27512764 payment_release_secret : [ 0 ; 32 ] ,
27522765 route_params,
2766+ invoice_request : invoice_request ( ) ,
27532767 } ;
27542768 outbounds. insert ( payment_id, outbound) ;
27552769 core:: mem:: drop ( outbounds) ;
0 commit comments