Skip to content

Commit f7ff833

Browse files
committed
Add InvoiceRequest field to AwaitingInvoice
- Introduce InvoiceRequest as a field in AwaitingInvoice. - This field will be used to recreate InvoiceRequest messages for retrying payments that are still awaiting an invoice.
1 parent 67b0770 commit f7ff833

File tree

3 files changed

+40
-13
lines changed

3 files changed

+40
-13
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8371,7 +8371,7 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => {
83718371
let expiration = StaleExpiration::AbsoluteTimeout(absolute_expiry);
83728372
$self.pending_outbound_payments
83738373
.add_new_awaiting_invoice(
8374-
payment_id, expiration, retry_strategy, max_total_routing_fee_msat,
8374+
payment_id, expiration, retry_strategy, max_total_routing_fee_msat, None
83758375
)
83768376
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)?;
83778377

@@ -8487,7 +8487,7 @@ where
84878487
let expiration = StaleExpiration::TimerTicks(1);
84888488
self.pending_outbound_payments
84898489
.add_new_awaiting_invoice(
8490-
payment_id, expiration, retry_strategy, max_total_routing_fee_msat
8490+
payment_id, expiration, retry_strategy, max_total_routing_fee_msat, Some(invoice_request.clone())
84918491
)
84928492
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)?;
84938493

lightning/src/ln/outbound_payment.rs

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use bitcoin::hashes::Hash;
1313
use bitcoin::hashes::sha256::Hash as Sha256;
1414
use bitcoin::secp256k1::{self, Secp256k1, SecretKey};
1515

16+
use crate::offers::invoice_request::InvoiceRequest;
1617
use crate::sign::{EntropySource, NodeSigner, Recipient};
1718
use crate::events::{self, PaymentFailureReason};
1819
use crate::ln::types::{PaymentHash, PaymentPreimage, PaymentSecret};
@@ -53,6 +54,7 @@ pub(crate) enum PendingOutboundPayment {
5354
expiration: StaleExpiration,
5455
retry_strategy: Retry,
5556
max_total_routing_fee_msat: Option<u64>,
57+
invoice_request: Option<InvoiceRequest>,
5658
},
5759
InvoiceReceived {
5860
payment_hash: PaymentHash,
@@ -1313,7 +1315,7 @@ impl OutboundPayments {
13131315

13141316
pub(super) fn add_new_awaiting_invoice(
13151317
&self, payment_id: PaymentId, expiration: StaleExpiration, retry_strategy: Retry,
1316-
max_total_routing_fee_msat: Option<u64>
1318+
max_total_routing_fee_msat: Option<u64>, invoice_request: Option<InvoiceRequest>
13171319
) -> Result<(), ()> {
13181320
let mut pending_outbounds = self.pending_outbound_payments.lock().unwrap();
13191321
match pending_outbounds.entry(payment_id) {
@@ -1323,6 +1325,7 @@ impl OutboundPayments {
13231325
expiration,
13241326
retry_strategy,
13251327
max_total_routing_fee_msat,
1328+
invoice_request,
13261329
});
13271330

13281331
Ok(())
@@ -1789,6 +1792,22 @@ impl OutboundPayments {
17891792
pub fn clear_pending_payments(&self) {
17901793
self.pending_outbound_payments.lock().unwrap().clear()
17911794
}
1795+
1796+
pub fn get_invoice_request_awaiting_invoice(&self) -> Vec<InvoiceRequest> {
1797+
if !self.awaiting_invoice_flag.load(Ordering::SeqCst) {
1798+
return vec![];
1799+
}
1800+
let mut pending_outbound_payments = self.pending_outbound_payments.lock().unwrap();
1801+
let invoice_requests = pending_outbound_payments.values_mut()
1802+
.filter_map(|payment| match payment {
1803+
PendingOutboundPayment::AwaitingInvoice { invoice_request, .. } => invoice_request.take(),
1804+
_ => None,
1805+
})
1806+
.collect();
1807+
1808+
self.awaiting_invoice_flag.store(false, Ordering::SeqCst);
1809+
invoice_requests
1810+
}
17921811
}
17931812

17941813
/// Returns whether a payment with the given [`PaymentHash`] and [`PaymentId`] is, in fact, a
@@ -1844,6 +1863,7 @@ impl_writeable_tlv_based_enum_upgradable!(PendingOutboundPayment,
18441863
(0, expiration, required),
18451864
(2, retry_strategy, required),
18461865
(4, max_total_routing_fee_msat, option),
1866+
(6, invoice_request, option),
18471867
},
18481868
(7, InvoiceReceived) => {
18491869
(0, payment_hash, required),
@@ -2081,7 +2101,7 @@ mod tests {
20812101
assert!(!outbound_payments.has_pending_payments());
20822102
assert!(
20832103
outbound_payments.add_new_awaiting_invoice(
2084-
payment_id, expiration, Retry::Attempts(0), None
2104+
payment_id, expiration, Retry::Attempts(0), None, None
20852105
).is_ok()
20862106
);
20872107
assert!(outbound_payments.has_pending_payments());
@@ -2107,14 +2127,14 @@ mod tests {
21072127

21082128
assert!(
21092129
outbound_payments.add_new_awaiting_invoice(
2110-
payment_id, expiration, Retry::Attempts(0), None
2130+
payment_id, expiration, Retry::Attempts(0), None, None
21112131
).is_ok()
21122132
);
21132133
assert!(outbound_payments.has_pending_payments());
21142134

21152135
assert!(
21162136
outbound_payments.add_new_awaiting_invoice(
2117-
payment_id, expiration, Retry::Attempts(0), None
2137+
payment_id, expiration, Retry::Attempts(0), None, None
21182138
).is_err()
21192139
);
21202140
}
@@ -2130,7 +2150,7 @@ mod tests {
21302150
assert!(!outbound_payments.has_pending_payments());
21312151
assert!(
21322152
outbound_payments.add_new_awaiting_invoice(
2133-
payment_id, expiration, Retry::Attempts(0), None
2153+
payment_id, expiration, Retry::Attempts(0), None, None
21342154
).is_ok()
21352155
);
21362156
assert!(outbound_payments.has_pending_payments());
@@ -2156,14 +2176,14 @@ mod tests {
21562176

21572177
assert!(
21582178
outbound_payments.add_new_awaiting_invoice(
2159-
payment_id, expiration, Retry::Attempts(0), None
2179+
payment_id, expiration, Retry::Attempts(0), None, None
21602180
).is_ok()
21612181
);
21622182
assert!(outbound_payments.has_pending_payments());
21632183

21642184
assert!(
21652185
outbound_payments.add_new_awaiting_invoice(
2166-
payment_id, expiration, Retry::Attempts(0), None
2186+
payment_id, expiration, Retry::Attempts(0), None, None
21672187
).is_err()
21682188
);
21692189
}
@@ -2178,7 +2198,7 @@ mod tests {
21782198
assert!(!outbound_payments.has_pending_payments());
21792199
assert!(
21802200
outbound_payments.add_new_awaiting_invoice(
2181-
payment_id, expiration, Retry::Attempts(0), None
2201+
payment_id, expiration, Retry::Attempts(0), None, None
21822202
).is_ok()
21832203
);
21842204
assert!(outbound_payments.has_pending_payments());
@@ -2211,7 +2231,7 @@ mod tests {
22112231

22122232
assert!(
22132233
outbound_payments.add_new_awaiting_invoice(
2214-
payment_id, expiration, Retry::Attempts(0), None
2234+
payment_id, expiration, Retry::Attempts(0), None, None
22152235
).is_ok()
22162236
);
22172237
assert!(outbound_payments.has_pending_payments());
@@ -2273,7 +2293,7 @@ mod tests {
22732293
assert!(
22742294
outbound_payments.add_new_awaiting_invoice(
22752295
payment_id, expiration, Retry::Attempts(0),
2276-
Some(invoice.amount_msats() / 100 + 50_000)
2296+
Some(invoice.amount_msats() / 100 + 50_000), None
22772297
).is_ok()
22782298
);
22792299
assert!(outbound_payments.has_pending_payments());
@@ -2370,7 +2390,7 @@ mod tests {
23702390

23712391
assert!(
23722392
outbound_payments.add_new_awaiting_invoice(
2373-
payment_id, expiration, Retry::Attempts(0), Some(1234)
2393+
payment_id, expiration, Retry::Attempts(0), Some(1234), None
23742394
).is_ok()
23752395
);
23762396
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)