Skip to content

Commit 2d37358

Browse files
Introduce InvoiceRequest as a field in AwaitingInvoice.
This will be used to recreate InvoiceRequest messages for retries for the payments that are still awaiting receiving an invoice. Co-authored-by: Valentine Wallace <[email protected]>
1 parent 78c0eaa commit 2d37358

File tree

3 files changed

+24
-13
lines changed

3 files changed

+24
-13
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8708,7 +8708,7 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => {
87088708
let expiration = StaleExpiration::AbsoluteTimeout(absolute_expiry);
87098709
$self.pending_outbound_payments
87108710
.add_new_awaiting_invoice(
8711-
payment_id, expiration, retry_strategy, max_total_routing_fee_msat,
8711+
payment_id, expiration, retry_strategy, max_total_routing_fee_msat, None
87128712
)
87138713
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)?;
87148714

@@ -8826,7 +8826,7 @@ where
88268826
let expiration = StaleExpiration::TimerTicks(1);
88278827
self.pending_outbound_payments
88288828
.add_new_awaiting_invoice(
8829-
payment_id, expiration, retry_strategy, max_total_routing_fee_msat
8829+
payment_id, expiration, retry_strategy, max_total_routing_fee_msat, Some(invoice_request.clone())
88308830
)
88318831
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)?;
88328832

lightning/src/ln/outbound_payment.rs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use crate::ln::channelmanager::{EventCompletionAction, HTLCSource, PaymentId};
2222
use crate::ln::onion_utils;
2323
use crate::ln::onion_utils::{DecodedOnionFailure, HTLCFailReason};
2424
use crate::offers::invoice::Bolt12Invoice;
25+
use crate::offers::invoice_request::InvoiceRequest;
2526
use crate::routing::router::{BlindedTail, InFlightHtlcs, Path, PaymentParameters, Route, RouteParameters, Router};
2627
use crate::sign::{EntropySource, NodeSigner, Recipient};
2728
use crate::util::errors::APIError;
@@ -54,6 +55,7 @@ pub(crate) enum PendingOutboundPayment {
5455
expiration: StaleExpiration,
5556
retry_strategy: Retry,
5657
max_total_routing_fee_msat: Option<u64>,
58+
invoice_request: Option<InvoiceRequest>,
5759
},
5860
InvoiceReceived {
5961
payment_hash: PaymentHash,
@@ -1351,7 +1353,7 @@ impl OutboundPayments {
13511353

13521354
pub(super) fn add_new_awaiting_invoice(
13531355
&self, payment_id: PaymentId, expiration: StaleExpiration, retry_strategy: Retry,
1354-
max_total_routing_fee_msat: Option<u64>
1356+
max_total_routing_fee_msat: Option<u64>, invoice_request: Option<InvoiceRequest>
13551357
) -> Result<(), ()> {
13561358
let mut pending_outbounds = self.pending_outbound_payments.lock().unwrap();
13571359
match pending_outbounds.entry(payment_id) {
@@ -1361,6 +1363,7 @@ impl OutboundPayments {
13611363
expiration,
13621364
retry_strategy,
13631365
max_total_routing_fee_msat,
1366+
invoice_request,
13641367
});
13651368

13661369
Ok(())
@@ -1882,6 +1885,7 @@ impl_writeable_tlv_based_enum_upgradable!(PendingOutboundPayment,
18821885
(0, expiration, required),
18831886
(2, retry_strategy, required),
18841887
(4, max_total_routing_fee_msat, option),
1888+
(6, invoice_request, option),
18851889
},
18861890
(7, InvoiceReceived) => {
18871891
(0, payment_hash, required),
@@ -2120,7 +2124,7 @@ mod tests {
21202124
assert!(!outbound_payments.has_pending_payments());
21212125
assert!(
21222126
outbound_payments.add_new_awaiting_invoice(
2123-
payment_id, expiration, Retry::Attempts(0), None
2127+
payment_id, expiration, Retry::Attempts(0), None, None
21242128
).is_ok()
21252129
);
21262130
assert!(outbound_payments.has_pending_payments());
@@ -2146,14 +2150,14 @@ mod tests {
21462150

21472151
assert!(
21482152
outbound_payments.add_new_awaiting_invoice(
2149-
payment_id, expiration, Retry::Attempts(0), None
2153+
payment_id, expiration, Retry::Attempts(0), None, None
21502154
).is_ok()
21512155
);
21522156
assert!(outbound_payments.has_pending_payments());
21532157

21542158
assert!(
21552159
outbound_payments.add_new_awaiting_invoice(
2156-
payment_id, expiration, Retry::Attempts(0), None
2160+
payment_id, expiration, Retry::Attempts(0), None, None
21572161
).is_err()
21582162
);
21592163
}
@@ -2169,7 +2173,7 @@ mod tests {
21692173
assert!(!outbound_payments.has_pending_payments());
21702174
assert!(
21712175
outbound_payments.add_new_awaiting_invoice(
2172-
payment_id, expiration, Retry::Attempts(0), None
2176+
payment_id, expiration, Retry::Attempts(0), None, None
21732177
).is_ok()
21742178
);
21752179
assert!(outbound_payments.has_pending_payments());
@@ -2195,14 +2199,14 @@ mod tests {
21952199

21962200
assert!(
21972201
outbound_payments.add_new_awaiting_invoice(
2198-
payment_id, expiration, Retry::Attempts(0), None
2202+
payment_id, expiration, Retry::Attempts(0), None, None
21992203
).is_ok()
22002204
);
22012205
assert!(outbound_payments.has_pending_payments());
22022206

22032207
assert!(
22042208
outbound_payments.add_new_awaiting_invoice(
2205-
payment_id, expiration, Retry::Attempts(0), None
2209+
payment_id, expiration, Retry::Attempts(0), None, None
22062210
).is_err()
22072211
);
22082212
}
@@ -2217,7 +2221,7 @@ mod tests {
22172221
assert!(!outbound_payments.has_pending_payments());
22182222
assert!(
22192223
outbound_payments.add_new_awaiting_invoice(
2220-
payment_id, expiration, Retry::Attempts(0), None
2224+
payment_id, expiration, Retry::Attempts(0), None, None
22212225
).is_ok()
22222226
);
22232227
assert!(outbound_payments.has_pending_payments());
@@ -2251,7 +2255,7 @@ mod tests {
22512255

22522256
assert!(
22532257
outbound_payments.add_new_awaiting_invoice(
2254-
payment_id, expiration, Retry::Attempts(0), None
2258+
payment_id, expiration, Retry::Attempts(0), None, None
22552259
).is_ok()
22562260
);
22572261
assert!(outbound_payments.has_pending_payments());
@@ -2315,7 +2319,7 @@ mod tests {
23152319
assert!(
23162320
outbound_payments.add_new_awaiting_invoice(
23172321
payment_id, expiration, Retry::Attempts(0),
2318-
Some(invoice.amount_msats() / 100 + 50_000)
2322+
Some(invoice.amount_msats() / 100 + 50_000), None
23192323
).is_ok()
23202324
);
23212325
assert!(outbound_payments.has_pending_payments());
@@ -2415,7 +2419,7 @@ mod tests {
24152419

24162420
assert!(
24172421
outbound_payments.add_new_awaiting_invoice(
2418-
payment_id, expiration, Retry::Attempts(0), Some(1234)
2422+
payment_id, expiration, Retry::Attempts(0), Some(1234), None
24192423
).is_ok()
24202424
);
24212425
assert!(outbound_payments.has_pending_payments());

lightning/src/offers/invoice_request.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1010,6 +1010,13 @@ impl Writeable for InvoiceRequestContents {
10101010
}
10111011
}
10121012

1013+
impl Readable for InvoiceRequest {
1014+
fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
1015+
let bytes: WithoutLength<Vec<u8>> = Readable::read(reader)?;
1016+
Self::try_from(bytes.0).map_err(|_| DecodeError::InvalidValue)
1017+
}
1018+
}
1019+
10131020
/// Valid type range for invoice_request TLV records.
10141021
pub(super) const INVOICE_REQUEST_TYPES: core::ops::Range<u64> = 80..160;
10151022

0 commit comments

Comments
 (0)