Skip to content

Commit 5e36ba6

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 443a262 commit 5e36ba6

File tree

3 files changed

+64
-5
lines changed

3 files changed

+64
-5
lines changed

lightning/src/ln/outbound_payment.rs

+14-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;
@@ -3157,6 +3164,7 @@ mod tests {
31573164
retry_strategy: Retry::Attempts(0),
31583165
route_params,
31593166
invoice_request: dummy_invoice_request(),
3167+
static_invoice: dummy_static_invoice(),
31603168
};
31613169
outbounds.insert(payment_id, outbound);
31623170
core::mem::drop(outbounds);
@@ -3204,6 +3212,7 @@ mod tests {
32043212
retry_strategy: Retry::Attempts(0),
32053213
route_params,
32063214
invoice_request: dummy_invoice_request(),
3215+
static_invoice: dummy_static_invoice(),
32073216
};
32083217
outbounds.insert(payment_id, outbound);
32093218
core::mem::drop(outbounds);

lightning/src/offers/invoice_request.rs

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

879884
impl InvoiceRequest {

lightning/src/offers/test_utils.rs

+45
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)