Skip to content

Commit 94d71cf

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 <[email protected]>
1 parent ffe3d6d commit 94d71cf

File tree

2 files changed

+55
-5
lines changed

2 files changed

+55
-5
lines changed

lightning/src/ln/outbound_payment.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ pub(crate) enum PendingOutboundPayment {
9292
retry_strategy: Retry,
9393
route_params: RouteParameters,
9494
invoice_request: InvoiceRequest,
95+
static_invoice: StaticInvoice,
9596
},
9697
Retryable {
9798
retry_strategy: Option<Retry>,
@@ -1159,6 +1160,7 @@ impl OutboundPayments {
11591160
.take()
11601161
.ok_or(Bolt12PaymentError::UnexpectedInvoice)?
11611162
.invoice_request,
1163+
static_invoice: invoice.clone(),
11621164
};
11631165
return Ok(())
11641166
},
@@ -1187,22 +1189,22 @@ impl OutboundPayments {
11871189
IH: Fn() -> InFlightHtlcs,
11881190
SP: Fn(SendAlongPathArgs) -> Result<(), APIError>,
11891191
{
1190-
let (payment_hash, keysend_preimage, route_params, retry_strategy, invoice_request) =
1192+
let (payment_hash, keysend_preimage, route_params, retry_strategy, invoice_request, invoice) =
11911193
match self.pending_outbound_payments.lock().unwrap().entry(payment_id) {
11921194
hash_map::Entry::Occupied(entry) => match entry.get() {
11931195
PendingOutboundPayment::StaticInvoiceReceived {
1194-
payment_hash, route_params, retry_strategy, keysend_preimage, invoice_request, ..
1196+
payment_hash, route_params, retry_strategy, keysend_preimage, invoice_request, static_invoice, ..
11951197
} => {
11961198
(*payment_hash, *keysend_preimage, route_params.clone(), *retry_strategy,
1197-
invoice_request.clone())
1199+
invoice_request.clone(), static_invoice.clone())
11981200
},
11991201
_ => return Err(Bolt12PaymentError::DuplicateInvoice),
12001202
},
12011203
hash_map::Entry::Vacant(_) => return Err(Bolt12PaymentError::UnexpectedInvoice),
12021204
};
1203-
1205+
let invoice = PaidInvoice::StaticInvoice(invoice);
12041206
self.send_payment_for_bolt12_invoice_internal(
1205-
payment_id, payment_hash, Some(keysend_preimage), Some(&invoice_request), None, route_params,
1207+
payment_id, payment_hash, Some(keysend_preimage), Some(&invoice_request), Some(invoice), route_params,
12061208
retry_strategy, router, first_hops, inflight_htlcs, entropy_source, node_signer,
12071209
node_id_lookup, secp_ctx, best_block_height, logger, pending_events, send_payment_along_path
12081210
)
@@ -2526,6 +2528,7 @@ impl_writeable_tlv_based_enum_upgradable!(PendingOutboundPayment,
25262528
(4, retry_strategy, required),
25272529
(6, route_params, required),
25282530
(8, invoice_request, required),
2531+
(10, static_invoice, required),
25292532
},
25302533
// Added in 0.1. Prior versions will drop these outbounds on downgrade, which is safe because
25312534
// no HTLCs are in-flight.
@@ -3156,6 +3159,7 @@ mod tests {
31563159
retry_strategy: Retry::Attempts(0),
31573160
route_params,
31583161
invoice_request: dummy_invoice_request(),
3162+
static_invoice: dummy_static_invoice(),
31593163
};
31603164
outbounds.insert(payment_id, outbound);
31613165
core::mem::drop(outbounds);
@@ -3203,6 +3207,7 @@ mod tests {
32033207
retry_strategy: Retry::Attempts(0),
32043208
route_params,
32053209
invoice_request: dummy_invoice_request(),
3210+
static_invoice: dummy_static_invoice(),
32063211
};
32073212
outbounds.insert(payment_id, outbound);
32083213
core::mem::drop(outbounds);

lightning/src/offers/test_utils.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@
1212
use bitcoin::secp256k1::schnorr::Signature;
1313
use bitcoin::secp256k1::{Keypair, PublicKey, Secp256k1, SecretKey};
1414

15+
use crate::blinded_path::message::BlindedMessagePath;
1516
use crate::blinded_path::payment::{BlindedPayInfo, BlindedPaymentPath};
1617
use crate::blinded_path::BlindedHop;
18+
use crate::ln::inbound_payment::ExpandedKey;
1719
use crate::offers::merkle::TaggedHash;
1820
use crate::sign::EntropySource;
1921
use crate::types::features::BlindedHopFeatures;
@@ -23,6 +25,10 @@ use core::time::Duration;
2325
#[allow(unused_imports)]
2426
use crate::prelude::*;
2527

28+
use super::nonce::Nonce;
29+
use super::offer::OfferBuilder;
30+
use super::static_invoice::{StaticInvoice, StaticInvoiceBuilder};
31+
2632
pub(crate) fn fail_sign<T: AsRef<TaggedHash>>(_message: &T) -> Result<Signature, ()> {
2733
Err(())
2834
}
@@ -120,3 +126,42 @@ impl EntropySource for FixedEntropy {
120126
[42; 32]
121127
}
122128
}
129+
130+
pub fn blinded_path() -> BlindedMessagePath {
131+
BlindedMessagePath::from_raw(
132+
pubkey(40),
133+
pubkey(41),
134+
vec![
135+
BlindedHop { blinded_node_id: pubkey(42), encrypted_payload: vec![0; 43] },
136+
BlindedHop { blinded_node_id: pubkey(43), encrypted_payload: vec![0; 44] },
137+
],
138+
)
139+
}
140+
141+
pub fn dummy_static_invoice() -> StaticInvoice {
142+
let node_id = recipient_pubkey();
143+
let payment_paths = payment_paths();
144+
let now = now();
145+
let expanded_key = ExpandedKey::new([42; 32]);
146+
let entropy = FixedEntropy {};
147+
let nonce = Nonce::from_entropy_source(&entropy);
148+
let secp_ctx = Secp256k1::new();
149+
150+
let offer = OfferBuilder::deriving_signing_pubkey(node_id, &expanded_key, nonce, &secp_ctx)
151+
.path(blinded_path())
152+
.build()
153+
.unwrap();
154+
155+
StaticInvoiceBuilder::for_offer_using_derived_keys(
156+
&offer,
157+
payment_paths.clone(),
158+
vec![blinded_path()],
159+
now,
160+
&expanded_key,
161+
nonce,
162+
&secp_ctx,
163+
)
164+
.unwrap()
165+
.build_and_sign(&secp_ctx)
166+
.unwrap()
167+
}

0 commit comments

Comments
 (0)