Skip to content

Commit 520ae0b

Browse files
Store invreqs in StaticInvoiceReceived outbound payments
When transitioning outbound payments from AwaitingInvoice to StaticInvoiceReceived, include the invreq in the new state's outbound payment storage for future inclusion in an async payment onion. Per BOLTs PR 1149, when paying a static invoice we need to include our original invoice request in the HTLC onion since the recipient wouldn't have received it previously.
1 parent fead88f commit 520ae0b

File tree

1 file changed

+30
-1
lines changed

1 file changed

+30
-1
lines changed

lightning/src/ln/outbound_payment.rs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ pub(crate) enum PendingOutboundPayment {
8383
keysend_preimage: PaymentPreimage,
8484
retry_strategy: Retry,
8585
route_params: RouteParameters,
86+
invoice_request: InvoiceRequest,
8687
},
8788
Retryable {
8889
retry_strategy: Option<Retry>,
@@ -1004,7 +1005,7 @@ impl OutboundPayments {
10041005
}
10051006

10061007
match self.pending_outbound_payments.lock().unwrap().entry(payment_id) {
1007-
hash_map::Entry::Occupied(mut entry) => match entry.get() {
1008+
hash_map::Entry::Occupied(mut entry) => match entry.get_mut() {
10081009
PendingOutboundPayment::AwaitingInvoice {
10091010
retry_strategy, retryable_invoice_request, max_total_routing_fee_msat, ..
10101011
} => {
@@ -1048,6 +1049,11 @@ impl OutboundPayments {
10481049
keysend_preimage,
10491050
retry_strategy: *retry_strategy,
10501051
route_params,
1052+
invoice_request:
1053+
retryable_invoice_request
1054+
.take()
1055+
.ok_or(Bolt12PaymentError::UnexpectedInvoice)?
1056+
.invoice_request,
10511057
};
10521058
return Ok(())
10531059
},
@@ -2256,6 +2262,7 @@ impl_writeable_tlv_based_enum_upgradable!(PendingOutboundPayment,
22562262
(2, keysend_preimage, required),
22572263
(4, retry_strategy, required),
22582264
(6, route_params, required),
2265+
(8, invoice_request, required),
22592266
},
22602267
);
22612268

@@ -2270,15 +2277,19 @@ mod tests {
22702277
use crate::events::{Event, PathFailure, PaymentFailureReason};
22712278
use crate::types::payment::{PaymentHash, PaymentPreimage};
22722279
use crate::ln::channelmanager::{PaymentId, RecipientOnionFields};
2280+
use crate::ln::inbound_payment::ExpandedKey;
22732281
use crate::types::features::{Bolt12InvoiceFeatures, ChannelFeatures, NodeFeatures};
22742282
use crate::ln::msgs::{ErrorAction, LightningError};
22752283
use crate::ln::outbound_payment::{Bolt12PaymentError, OutboundPayments, PendingOutboundPayment, Retry, RetryableSendFailure, StaleExpiration};
22762284
#[cfg(feature = "std")]
22772285
use crate::offers::invoice::DEFAULT_RELATIVE_EXPIRY;
2286+
use crate::offers::invoice_request::InvoiceRequest;
2287+
use crate::offers::nonce::Nonce;
22782288
use crate::offers::offer::OfferBuilder;
22792289
use crate::offers::test_utils::*;
22802290
use crate::routing::gossip::NetworkGraph;
22812291
use crate::routing::router::{InFlightHtlcs, Path, PaymentParameters, Route, RouteHop, RouteParameters};
2292+
use crate::sign::KeyMaterial;
22822293
use crate::sync::{Arc, Mutex, RwLock};
22832294
use crate::util::errors::APIError;
22842295
use crate::util::hash_tables::new_hash_map;
@@ -2823,6 +2834,22 @@ mod tests {
28232834
assert!(pending_events.lock().unwrap().is_empty());
28242835
}
28252836

2837+
fn dummy_invoice_request() -> InvoiceRequest {
2838+
let expanded_key = ExpandedKey::new(&KeyMaterial([42; 32]));
2839+
let entropy = FixedEntropy {};
2840+
let nonce = Nonce::from_entropy_source(&entropy);
2841+
let secp_ctx = Secp256k1::new();
2842+
let payment_id = PaymentId([1; 32]);
2843+
2844+
OfferBuilder::new(recipient_pubkey())
2845+
.amount_msats(1000)
2846+
.build().unwrap()
2847+
.request_invoice_deriving_signing_pubkey(&expanded_key, nonce, &secp_ctx, payment_id)
2848+
.unwrap()
2849+
.build_and_sign()
2850+
.unwrap()
2851+
}
2852+
28262853
#[test]
28272854
fn time_out_unreleased_async_payments() {
28282855
let pending_events = Mutex::new(VecDeque::new());
@@ -2844,6 +2871,7 @@ mod tests {
28442871
keysend_preimage: PaymentPreimage([0; 32]),
28452872
retry_strategy: Retry::Attempts(0),
28462873
route_params,
2874+
invoice_request: dummy_invoice_request(),
28472875
};
28482876
outbounds.insert(payment_id, outbound);
28492877
core::mem::drop(outbounds);
@@ -2890,6 +2918,7 @@ mod tests {
28902918
keysend_preimage: PaymentPreimage([0; 32]),
28912919
retry_strategy: Retry::Attempts(0),
28922920
route_params,
2921+
invoice_request: dummy_invoice_request(),
28932922
};
28942923
outbounds.insert(payment_id, outbound);
28952924
core::mem::drop(outbounds);

0 commit comments

Comments
 (0)