Skip to content

Commit 0731bc9

Browse files
shaavanvalentinewallace
authored andcommitted
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.
1 parent d43218a commit 0731bc9

File tree

3 files changed

+38
-13
lines changed

3 files changed

+38
-13
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8461,7 +8461,7 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => {
84618461
let expiration = StaleExpiration::AbsoluteTimeout(absolute_expiry);
84628462
$self.pending_outbound_payments
84638463
.add_new_awaiting_invoice(
8464-
payment_id, expiration, retry_strategy, max_total_routing_fee_msat,
8464+
payment_id, expiration, retry_strategy, max_total_routing_fee_msat, None
84658465
)
84668466
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)?;
84678467

@@ -8577,7 +8577,7 @@ where
85778577
let expiration = StaleExpiration::TimerTicks(1);
85788578
self.pending_outbound_payments
85798579
.add_new_awaiting_invoice(
8580-
payment_id, expiration, retry_strategy, max_total_routing_fee_msat
8580+
payment_id, expiration, retry_strategy, max_total_routing_fee_msat, Some(invoice_request.clone())
85818581
)
85828582
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)?;
85838583

lightning/src/ln/outbound_payment.rs

Lines changed: 29 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,
@@ -1337,7 +1339,7 @@ impl OutboundPayments {
13371339

13381340
pub(super) fn add_new_awaiting_invoice(
13391341
&self, payment_id: PaymentId, expiration: StaleExpiration, retry_strategy: Retry,
1340-
max_total_routing_fee_msat: Option<u64>
1342+
max_total_routing_fee_msat: Option<u64>, invoice_request: Option<InvoiceRequest>
13411343
) -> Result<(), ()> {
13421344
let mut pending_outbounds = self.pending_outbound_payments.lock().unwrap();
13431345
match pending_outbounds.entry(payment_id) {
@@ -1347,6 +1349,7 @@ impl OutboundPayments {
13471349
expiration,
13481350
retry_strategy,
13491351
max_total_routing_fee_msat,
1352+
invoice_request,
13501353
});
13511354

13521355
Ok(())
@@ -1813,6 +1816,20 @@ impl OutboundPayments {
18131816
pub fn clear_pending_payments(&self) {
18141817
self.pending_outbound_payments.lock().unwrap().clear()
18151818
}
1819+
1820+
pub fn get_invoice_request_awaiting_invoice(&self) -> Vec<InvoiceRequest> {
1821+
let pending_outbound_payments = self.pending_outbound_payments.lock().unwrap();
1822+
1823+
pending_outbound_payments.iter().filter_map(
1824+
|(_, payment)| {
1825+
if let PendingOutboundPayment::AwaitingInvoice { invoice_request, .. } = payment {
1826+
invoice_request.clone()
1827+
} else {
1828+
None
1829+
}
1830+
}
1831+
).collect()
1832+
}
18161833
}
18171834

18181835
/// Returns whether a payment with the given [`PaymentHash`] and [`PaymentId`] is, in fact, a
@@ -1868,6 +1885,7 @@ impl_writeable_tlv_based_enum_upgradable!(PendingOutboundPayment,
18681885
(0, expiration, required),
18691886
(2, retry_strategy, required),
18701887
(4, max_total_routing_fee_msat, option),
1888+
(6, invoice_request, option),
18711889
},
18721890
(7, InvoiceReceived) => {
18731891
(0, payment_hash, required),
@@ -2106,7 +2124,7 @@ mod tests {
21062124
assert!(!outbound_payments.has_pending_payments());
21072125
assert!(
21082126
outbound_payments.add_new_awaiting_invoice(
2109-
payment_id, expiration, Retry::Attempts(0), None
2127+
payment_id, expiration, Retry::Attempts(0), None, None
21102128
).is_ok()
21112129
);
21122130
assert!(outbound_payments.has_pending_payments());
@@ -2132,14 +2150,14 @@ mod tests {
21322150

21332151
assert!(
21342152
outbound_payments.add_new_awaiting_invoice(
2135-
payment_id, expiration, Retry::Attempts(0), None
2153+
payment_id, expiration, Retry::Attempts(0), None, None
21362154
).is_ok()
21372155
);
21382156
assert!(outbound_payments.has_pending_payments());
21392157

21402158
assert!(
21412159
outbound_payments.add_new_awaiting_invoice(
2142-
payment_id, expiration, Retry::Attempts(0), None
2160+
payment_id, expiration, Retry::Attempts(0), None, None
21432161
).is_err()
21442162
);
21452163
}
@@ -2155,7 +2173,7 @@ mod tests {
21552173
assert!(!outbound_payments.has_pending_payments());
21562174
assert!(
21572175
outbound_payments.add_new_awaiting_invoice(
2158-
payment_id, expiration, Retry::Attempts(0), None
2176+
payment_id, expiration, Retry::Attempts(0), None, None
21592177
).is_ok()
21602178
);
21612179
assert!(outbound_payments.has_pending_payments());
@@ -2181,14 +2199,14 @@ mod tests {
21812199

21822200
assert!(
21832201
outbound_payments.add_new_awaiting_invoice(
2184-
payment_id, expiration, Retry::Attempts(0), None
2202+
payment_id, expiration, Retry::Attempts(0), None, None
21852203
).is_ok()
21862204
);
21872205
assert!(outbound_payments.has_pending_payments());
21882206

21892207
assert!(
21902208
outbound_payments.add_new_awaiting_invoice(
2191-
payment_id, expiration, Retry::Attempts(0), None
2209+
payment_id, expiration, Retry::Attempts(0), None, None
21922210
).is_err()
21932211
);
21942212
}
@@ -2203,7 +2221,7 @@ mod tests {
22032221
assert!(!outbound_payments.has_pending_payments());
22042222
assert!(
22052223
outbound_payments.add_new_awaiting_invoice(
2206-
payment_id, expiration, Retry::Attempts(0), None
2224+
payment_id, expiration, Retry::Attempts(0), None, None
22072225
).is_ok()
22082226
);
22092227
assert!(outbound_payments.has_pending_payments());
@@ -2237,7 +2255,7 @@ mod tests {
22372255

22382256
assert!(
22392257
outbound_payments.add_new_awaiting_invoice(
2240-
payment_id, expiration, Retry::Attempts(0), None
2258+
payment_id, expiration, Retry::Attempts(0), None, None
22412259
).is_ok()
22422260
);
22432261
assert!(outbound_payments.has_pending_payments());
@@ -2301,7 +2319,7 @@ mod tests {
23012319
assert!(
23022320
outbound_payments.add_new_awaiting_invoice(
23032321
payment_id, expiration, Retry::Attempts(0),
2304-
Some(invoice.amount_msats() / 100 + 50_000)
2322+
Some(invoice.amount_msats() / 100 + 50_000), None
23052323
).is_ok()
23062324
);
23072325
assert!(outbound_payments.has_pending_payments());
@@ -2401,7 +2419,7 @@ mod tests {
24012419

24022420
assert!(
24032421
outbound_payments.add_new_awaiting_invoice(
2404-
payment_id, expiration, Retry::Attempts(0), Some(1234)
2422+
payment_id, expiration, Retry::Attempts(0), Some(1234), None
24052423
).is_ok()
24062424
);
24072425
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)