Skip to content

Commit 0a2a46a

Browse files
committed
f - WIP: respond with invoice
1 parent a8d5e39 commit 0a2a46a

File tree

3 files changed

+47
-18
lines changed

3 files changed

+47
-18
lines changed

lightning/src/ln/channelmanager.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -793,7 +793,7 @@ where
793793
persistence_notifier: Notifier,
794794

795795
entropy_source: ES,
796-
node_signer: NS,
796+
pub(crate) node_signer: NS,
797797
signer_provider: SP,
798798

799799
logger: L,

lightning/src/offers/invoice.rs

+16-13
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ use crate::prelude::*;
122122
#[cfg(feature = "std")]
123123
use std::time::SystemTime;
124124

125-
const DEFAULT_RELATIVE_EXPIRY: Duration = Duration::from_secs(7200);
125+
pub(crate) const DEFAULT_RELATIVE_EXPIRY: Duration = Duration::from_secs(7200);
126126

127127
pub(super) const SIGNATURE_TAG: &'static str = concat!("lightning", "invoice", "signature");
128128

@@ -145,18 +145,7 @@ impl<'a> InvoiceBuilder<'a> {
145145
invoice_request: &'a InvoiceRequest, payment_paths: Vec<(BlindedPath, BlindedPayInfo)>,
146146
created_at: Duration, payment_hash: PaymentHash
147147
) -> Result<Self, SemanticError> {
148-
let amount_msats = match invoice_request.amount_msats() {
149-
Some(amount_msats) => amount_msats,
150-
None => match invoice_request.contents.offer.amount() {
151-
Some(Amount::Bitcoin { amount_msats }) => {
152-
amount_msats.checked_mul(invoice_request.quantity().unwrap_or(1))
153-
.ok_or(SemanticError::InvalidAmount)?
154-
},
155-
Some(Amount::Currency { .. }) => return Err(SemanticError::UnsupportedCurrency),
156-
None => return Err(SemanticError::MissingAmount),
157-
},
158-
};
159-
148+
let amount_msats = Self::amount_msats(invoice_request)?;
160149
let contents = InvoiceContents::ForOffer {
161150
invoice_request: invoice_request.contents.clone(),
162151
fields: InvoiceFields {
@@ -185,6 +174,20 @@ impl<'a> InvoiceBuilder<'a> {
185174
Self::new(&refund.bytes, contents)
186175
}
187176

177+
pub(crate) fn amount_msats(invoice_request: &InvoiceRequest) -> Result<u64, SemanticError> {
178+
match invoice_request.amount_msats() {
179+
Some(amount_msats) => Ok(amount_msats),
180+
None => match invoice_request.contents.offer.amount() {
181+
Some(Amount::Bitcoin { amount_msats }) => {
182+
amount_msats.checked_mul(invoice_request.quantity().unwrap_or(1))
183+
.ok_or(SemanticError::InvalidAmount)
184+
},
185+
Some(Amount::Currency { .. }) => Err(SemanticError::UnsupportedCurrency),
186+
None => Err(SemanticError::MissingAmount),
187+
},
188+
}
189+
}
190+
188191
fn new(invreq_bytes: &'a Vec<u8>, contents: InvoiceContents) -> Result<Self, SemanticError> {
189192
if contents.fields().payment_paths.is_empty() {
190193
return Err(SemanticError::MissingPaths);

lightning/src/onion_message/offers.rs

+30-4
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use crate::io::{self, Read};
1818
use crate::ln::channelmanager::ChannelManager;
1919
use crate::ln::msgs::DecodeError;
2020
use crate::offers::invoice_request::InvoiceRequest;
21-
use crate::offers::invoice::Invoice;
21+
use crate::offers::invoice::{DEFAULT_RELATIVE_EXPIRY, Invoice, InvoiceBuilder};
2222
use crate::offers::parse::ParseError;
2323
use crate::onion_message::messenger::{ResponseError, ResponseErrorHandler};
2424
use crate::routing::router::Router;
@@ -126,14 +126,40 @@ where
126126
fn handle_message(&self, message: OffersMessage) -> Option<OffersMessage> {
127127
match message {
128128
OffersMessage::InvoiceRequest(invoice_request) => {
129-
if invoice_request.verify(&self.inbound_payment_key) {}
129+
if !invoice_request.verify(&self.inbound_payment_key) {
130+
return Some(OffersMessage::InvoiceError);
131+
}
132+
133+
let amount_msats = match InvoiceBuilder::amount_msats(&invoice_request) {
134+
Ok(amount_msats) => Some(amount_msats),
135+
Err(_) => return Some(OffersMessage::InvoiceError),
136+
};
137+
let relative_expiry = DEFAULT_RELATIVE_EXPIRY.as_secs() as u32;
138+
139+
match self.create_inbound_payment(amount_msats, relative_expiry, None) {
140+
Ok((payment_hash, payment_secret)) => {
141+
let invoice = invoice_request
142+
.respond_with(vec![], payment_hash).unwrap()
143+
.allow_mpp()
144+
.build().unwrap()
145+
.sign(|digest, tag, bytes, metadata|
146+
self.node_signer.sign_bolt12_message(digest, tag, bytes, metadata)
147+
).unwrap();
148+
149+
Some(OffersMessage::Invoice(invoice))
150+
},
151+
Err(e) => Some(OffersMessage::InvoiceError),
152+
}
130153
},
131154
OffersMessage::Invoice(invoice) => {
132155
if invoice.verify(&self.inbound_payment_key) {}
156+
None
157+
},
158+
OffersMessage::InvoiceError => {
159+
// TODO: Log
160+
None
133161
},
134-
OffersMessage::InvoiceError => {},
135162
}
136-
todo!()
137163
}
138164
}
139165

0 commit comments

Comments
 (0)