Skip to content

Commit 7827e21

Browse files
committed
Expose send_payment_for_bolt12_invoice
UserConfig::manually_handle_bolt12_invoices allows deferring payment of BOLT12 invoices by generating Event::InvoiceReceived. Expose ChannelManager::send_payment_for_bolt12_invoice to allow users to pay the Bolt12Invoice included in the event. While the event contains the PaymentId for reference, that parameter is now removed from the method in favor of extracting the PaymentId from the invoice's payer_metadata. WIP: send_payment_for_bolt12_invoice
1 parent 5a04feb commit 7827e21

File tree

4 files changed

+39
-7
lines changed

4 files changed

+39
-7
lines changed

lightning/src/events/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,8 +720,15 @@ pub enum Event {
720720
/// Indicates a [`Bolt12Invoice`] in response to an [`InvoiceRequest`] or a [`Refund`] was
721721
/// received.
722722
///
723+
/// This event will only be generated if [`UserConfig::manually_handle_bolt12_invoices`] is set.
724+
/// Use [`ChannelManager::send_payment_for_bolt12_invoice`] to pay the invoice or
725+
/// [`ChannelManager::abandon_payment`] to abandon the associated payment.
726+
///
723727
/// [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest
724728
/// [`Refund`]: crate::offers::refund::Refund
729+
/// [`UserConfig::manually_handle_bolt12_invoices`]: crate::util::config::UserConfig::manually_handle_bolt12_invoices
730+
/// [`ChannelManager::send_payment_for_bolt12_invoice`]: crate::ln::channelmanager::ChannelManager::send_payment_for_bolt12_invoice
731+
/// [`ChannelManager::abandon_payment`]: crate::ln::channelmanager::ChannelManager::abandon_payment
725732
InvoiceReceived {
726733
/// The `payment_id` associated with payment for the invoice.
727734
payment_id: PaymentId,

lightning/src/ln/channelmanager.rs

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ use crate::ln::onion_utils::{HTLCFailReason, INVALID_ONION_BLINDING};
5858
use crate::ln::msgs::{ChannelMessageHandler, DecodeError, LightningError};
5959
#[cfg(test)]
6060
use crate::ln::outbound_payment;
61-
use crate::ln::outbound_payment::{Bolt12PaymentError, OutboundPayments, PaymentAttempts, PendingOutboundPayment, SendAlongPathArgs, StaleExpiration};
61+
use crate::ln::outbound_payment::{OutboundPayments, PaymentAttempts, PendingOutboundPayment, SendAlongPathArgs, StaleExpiration};
6262
use crate::ln::wire::Encode;
6363
use crate::offers::invoice::{BlindedPayInfo, Bolt12Invoice, DEFAULT_RELATIVE_EXPIRY, DerivedSigningPubkey, ExplicitSigningPubkey, InvoiceBuilder, UnsignedBolt12Invoice};
6464
use crate::offers::invoice_error::InvoiceError;
@@ -105,7 +105,7 @@ use core::time::Duration;
105105
use core::ops::Deref;
106106

107107
// Re-export this for use in the public API.
108-
pub use crate::ln::outbound_payment::{PaymentSendFailure, ProbeSendFailure, Retry, RetryableSendFailure, RecipientOnionFields};
108+
pub use crate::ln::outbound_payment::{Bolt12PaymentError, PaymentSendFailure, ProbeSendFailure, Retry, RetryableSendFailure, RecipientOnionFields};
109109
use crate::ln::script::ShutdownScript;
110110

111111
// We hold various information about HTLC relay in the HTLC objects in Channel itself:
@@ -3996,7 +3996,28 @@ where
39963996
self.pending_outbound_payments.test_set_payment_metadata(payment_id, new_payment_metadata);
39973997
}
39983998

3999-
pub(super) fn send_payment_for_bolt12_invoice(&self, invoice: &Bolt12Invoice, payment_id: PaymentId) -> Result<(), Bolt12PaymentError> {
3999+
/// Pays the [`Bolt12Invoice`] associated with the `payment_id` encoded in its `payer_metadata`.
4000+
///
4001+
/// The invoice's `payer_metadata` is used to authenticate that the invoice was indeed requested
4002+
/// before attempting a payment. [`Bolt12PaymentError::UnexpectedInvoice`] is returned if this
4003+
/// fails or if the encoded `payment_id` is not recognized. The latter may happen once the
4004+
/// invoice is paid and the payment no longer tracked.
4005+
///
4006+
/// Attempting to pay the same invoice twice while the first payment is still pending will
4007+
/// result in a [`Bolt12PaymentError::DuplicateInvoice`].
4008+
///
4009+
/// Otherwise, either [`Event::PaymentSent`] or [`Event::PaymentFailed`] are used to indicate
4010+
/// whether or not the payment was successful.
4011+
pub fn send_payment_for_bolt12_invoice(&self, invoice: &Bolt12Invoice) -> Result<(), Bolt12PaymentError> {
4012+
let secp_ctx = &self.secp_ctx;
4013+
let expanded_key = &self.inbound_payment_key;
4014+
match invoice.verify(expanded_key, secp_ctx) {
4015+
Ok(payment_id) => self.send_payment_for_verified_bolt12_invoice(invoice, payment_id),
4016+
Err(()) => Err(Bolt12PaymentError::UnexpectedInvoice),
4017+
}
4018+
}
4019+
4020+
fn send_payment_for_verified_bolt12_invoice(&self, invoice: &Bolt12Invoice, payment_id: PaymentId) -> Result<(), Bolt12PaymentError> {
40004021
let best_block_height = self.best_block.read().unwrap().height;
40014022
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
40024023
self.pending_outbound_payments
@@ -10287,7 +10308,7 @@ where
1028710308
self.pending_events.lock().unwrap().push_back((event, None));
1028810309
return ResponseInstruction::NoResponse;
1028910310
} else {
10290-
self.send_payment_for_bolt12_invoice(&invoice, payment_id)
10311+
self.send_payment_for_verified_bolt12_invoice(&invoice, payment_id)
1029110312
.map_err(|e| {
1029210313
log_trace!(self.logger, "Failed paying invoice: {:?}", e);
1029310314
InvoiceError::from_string(format!("{:?}", e))

lightning/src/ln/outbound_payment.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -501,9 +501,9 @@ pub enum PaymentSendFailure {
501501
},
502502
}
503503

504-
/// An error when attempting to pay a BOLT 12 invoice.
504+
/// An error when attempting to pay a [`Bolt12Invoice`].
505505
#[derive(Clone, Debug, PartialEq, Eq)]
506-
pub(super) enum Bolt12PaymentError {
506+
pub enum Bolt12PaymentError {
507507
/// The invoice was not requested.
508508
UnexpectedInvoice,
509509
/// Payment for an invoice with the corresponding [`PaymentId`] was already initiated.

lightning/src/util/config.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -850,12 +850,16 @@ pub struct UserConfig {
850850
/// If this is set to true, the user needs to manually pay [`Bolt12Invoice`]s when received.
851851
///
852852
/// When set to true, [`Event::InvoiceReceived`] will be generated for each received
853-
/// [`Bolt12Invoice`] instead of being automatically paid after verification.
853+
/// [`Bolt12Invoice`] instead of being automatically paid after verification. Use
854+
/// [`ChannelManager::send_payment_for_bolt12_invoice`] to pay the invoice or
855+
/// [`ChannelManager::abandon_payment`] to abandon the associated payment.
854856
///
855857
/// Default value: false.
856858
///
857859
/// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
858860
/// [`Event::InvoiceReceived`]: crate::events::Event::InvoiceReceived
861+
/// [`ChannelManager::send_payment_for_bolt12_invoice`]: crate::ln::channelmanager::ChannelManager::send_payment_for_bolt12_invoice
862+
/// [`ChannelManager::abandon_payment`]: crate::ln::channelmanager::ChannelManager::abandon_payment
859863
pub manually_handle_bolt12_invoices: bool,
860864
}
861865

0 commit comments

Comments
 (0)