Skip to content

Commit 734c955

Browse files
store static invoice inside the PendingOutboundPayment::StaticInvoiceReceived
Inject the static invoice inside the PendingOutboundPayment::StaticInvoiceReceived to allow to use the static invoice inside the PendingOutboundPayment::PaymentReceived. Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
1 parent c91a362 commit 734c955

File tree

3 files changed

+60
-6
lines changed

3 files changed

+60
-6
lines changed

lightning/src/ln/outbound_payment.rs

+54-5
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ pub(crate) enum PendingOutboundPayment {
9393
retry_strategy: Retry,
9494
route_params: RouteParameters,
9595
invoice_request: InvoiceRequest,
96+
static_invoice: StaticInvoice,
9697
},
9798
Retryable {
9899
retry_strategy: Option<Retry>,
@@ -1160,6 +1161,7 @@ impl OutboundPayments {
11601161
.take()
11611162
.ok_or(Bolt12PaymentError::UnexpectedInvoice)?
11621163
.invoice_request,
1164+
static_invoice: invoice.clone(),
11631165
};
11641166
return Ok(())
11651167
},
@@ -1188,22 +1190,22 @@ impl OutboundPayments {
11881190
IH: Fn() -> InFlightHtlcs,
11891191
SP: Fn(SendAlongPathArgs) -> Result<(), APIError>,
11901192
{
1191-
let (payment_hash, keysend_preimage, route_params, retry_strategy, invoice_request) =
1193+
let (payment_hash, keysend_preimage, route_params, retry_strategy, invoice_request, invoice) =
11921194
match self.pending_outbound_payments.lock().unwrap().entry(payment_id) {
11931195
hash_map::Entry::Occupied(entry) => match entry.get() {
11941196
PendingOutboundPayment::StaticInvoiceReceived {
1195-
payment_hash, route_params, retry_strategy, keysend_preimage, invoice_request, ..
1197+
payment_hash, route_params, retry_strategy, keysend_preimage, invoice_request, static_invoice, ..
11961198
} => {
11971199
(*payment_hash, *keysend_preimage, route_params.clone(), *retry_strategy,
1198-
invoice_request.clone())
1200+
invoice_request.clone(), static_invoice.clone())
11991201
},
12001202
_ => return Err(Bolt12PaymentError::DuplicateInvoice),
12011203
},
12021204
hash_map::Entry::Vacant(_) => return Err(Bolt12PaymentError::UnexpectedInvoice),
12031205
};
1204-
1206+
let invoice = PaidInvoice::StaticInvoice(invoice.clone());
12051207
self.send_payment_for_bolt12_invoice_internal(
1206-
payment_id, payment_hash, Some(keysend_preimage), Some(&invoice_request), None, route_params,
1208+
payment_id, payment_hash, Some(keysend_preimage), Some(&invoice_request), Some(&invoice), route_params,
12071209
retry_strategy, router, first_hops, inflight_htlcs, entropy_source, node_signer,
12081210
node_id_lookup, secp_ctx, best_block_height, logger, pending_events, send_payment_along_path
12091211
)
@@ -2527,6 +2529,7 @@ impl_writeable_tlv_based_enum_upgradable!(PendingOutboundPayment,
25272529
(4, retry_strategy, required),
25282530
(6, route_params, required),
25292531
(8, invoice_request, required),
2532+
(10, static_invoice, required),
25302533
},
25312534
// Added in 0.1. Prior versions will drop these outbounds on downgrade, which is safe because
25322535
// no HTLCs are in-flight.
@@ -2558,6 +2561,10 @@ mod tests {
25582561

25592562
use crate::blinded_path::EmptyNodeIdLookUp;
25602563
use crate::events::{Event, PathFailure, PaymentFailureReason};
2564+
use crate::offers::static_invoice::{StaticInvoiceBuilder, StaticInvoice};
2565+
use crate::blinded_path::message::BlindedMessagePath;
2566+
use crate::ln::outbound_payment::tests::test_utils::pubkey;
2567+
use crate::blinded_path::BlindedHop;
25612568
use crate::types::payment::{PaymentHash, PaymentPreimage};
25622569
use crate::ln::channelmanager::{PaymentId, RecipientOnionFields};
25632570
use crate::ln::inbound_payment::ExpandedKey;
@@ -3135,6 +3142,46 @@ mod tests {
31353142
.unwrap()
31363143
}
31373144

3145+
fn blinded_path() -> BlindedMessagePath {
3146+
BlindedMessagePath::from_raw(
3147+
pubkey(40),
3148+
pubkey(41),
3149+
vec![
3150+
BlindedHop { blinded_node_id: pubkey(42), encrypted_payload: vec![0; 43] },
3151+
BlindedHop { blinded_node_id: pubkey(43), encrypted_payload: vec![0; 44] },
3152+
],
3153+
)
3154+
}
3155+
3156+
// FIXME(vincenzopalazzo): This function is duplicated with the one in static_invoive.rs
3157+
fn dummy_static_invoice() -> StaticInvoice {
3158+
let node_id = recipient_pubkey();
3159+
let payment_paths = payment_paths();
3160+
let now = now();
3161+
let expanded_key = ExpandedKey::new([42; 32]);
3162+
let entropy = FixedEntropy {};
3163+
let nonce = Nonce::from_entropy_source(&entropy);
3164+
let secp_ctx = Secp256k1::new();
3165+
3166+
let offer = OfferBuilder::deriving_signing_pubkey(node_id, &expanded_key, nonce, &secp_ctx)
3167+
.path(blinded_path())
3168+
.build()
3169+
.unwrap();
3170+
3171+
StaticInvoiceBuilder::for_offer_using_derived_keys(
3172+
&offer,
3173+
payment_paths.clone(),
3174+
vec![blinded_path()],
3175+
now,
3176+
&expanded_key,
3177+
nonce,
3178+
&secp_ctx,
3179+
)
3180+
.unwrap()
3181+
.build_and_sign(&secp_ctx)
3182+
.unwrap()
3183+
}
3184+
31383185
#[test]
31393186
fn time_out_unreleased_async_payments() {
31403187
let pending_events = Mutex::new(VecDeque::new());
@@ -3157,6 +3204,7 @@ mod tests {
31573204
retry_strategy: Retry::Attempts(0),
31583205
route_params,
31593206
invoice_request: dummy_invoice_request(),
3207+
static_invoice: dummy_static_invoice(),
31603208
};
31613209
outbounds.insert(payment_id, outbound);
31623210
core::mem::drop(outbounds);
@@ -3204,6 +3252,7 @@ mod tests {
32043252
retry_strategy: Retry::Attempts(0),
32053253
route_params,
32063254
invoice_request: dummy_invoice_request(),
3255+
static_invoice: dummy_static_invoice(),
32073256
};
32083257
outbounds.insert(payment_id, outbound);
32093258
core::mem::drop(outbounds);

lightning/src/offers/invoice_request.rs

+5
Original file line numberDiff line numberDiff line change
@@ -873,6 +873,11 @@ impl InvoiceRequest {
873873
InvoiceWithExplicitSigningPubkeyBuilder
874874
);
875875
invoice_request_verify_method!(self, &Self);
876+
877+
#[allow(unused)] // TODO: remove this once we remove the `async_payments` cfg flag
878+
pub(super) fn bytes(&self) -> &Vec<u8> {
879+
&self.bytes
880+
}
876881
}
877882

878883
impl InvoiceRequest {

lightning/src/offers/static_invoice.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ impl StaticInvoice {
392392
let invoice_offer_tlv_stream =
393393
Offer::tlv_stream_iter(&self.bytes).map(|tlv_record| tlv_record.record_bytes);
394394
let invreq_offer_tlv_stream =
395-
Offer::tlv_stream_iter(invreq.bytes()).map(|tlv_record| tlv_record.record_bytes);
395+
Offer::tlv_stream_iter(&invreq.bytes()).map(|tlv_record| tlv_record.record_bytes);
396396
invoice_offer_tlv_stream.eq(invreq_offer_tlv_stream)
397397
}
398398
}

0 commit comments

Comments
 (0)