Skip to content

Commit 6ae133a

Browse files
committed
Abort if insufficient liquidity in pay_for_offer
This commit introduces a check to abort early if there's insufficient liquidity when fulfilling the payment in `pay_for_offer`
1 parent 951174a commit 6ae133a

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ use crate::offers::invoice::{BlindedPayInfo, Bolt12Invoice, DEFAULT_RELATIVE_EXP
6565
use crate::offers::invoice_error::InvoiceError;
6666
use crate::offers::invoice_request::{DerivedPayerId, InvoiceRequestBuilder};
6767
use crate::offers::nonce::Nonce;
68-
use crate::offers::offer::{Offer, OfferBuilder};
68+
use crate::offers::offer::{Amount, Offer, OfferBuilder};
6969
use crate::offers::parse::Bolt12SemanticError;
7070
use crate::offers::refund::{Refund, RefundBuilder};
7171
use crate::onion_message::async_payments::{AsyncPaymentsMessage, HeldHtlcAvailable, ReleaseHeldHtlc, AsyncPaymentsMessageHandler};
@@ -9020,6 +9020,22 @@ where
90209020
let reply_paths = self.create_blinded_paths(context)
90219021
.map_err(|_| Bolt12SemanticError::MissingPaths)?;
90229022

9023+
let total_liquidity: u64 = self.list_usable_channels().iter().map(|channel| channel.next_outbound_htlc_limit_msat).sum();
9024+
let total_amount_msats = match invoice_request.amount_msats() {
9025+
Some(amount_msats) => Some(amount_msats),
9026+
None => match offer.amount() {
9027+
Some(Amount::Bitcoin { amount_msats }) => Some(amount_msats),
9028+
_ => None,
9029+
},
9030+
};
9031+
9032+
if let Some(amount) = total_amount_msats {
9033+
if amount > total_liquidity {
9034+
log_error!(self.logger, "Insufficient liquidity for payment with payment id: {}", payment_id);
9035+
return Err(Bolt12SemanticError::InsufficientLiquidity);
9036+
}
9037+
}
9038+
90239039
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
90249040

90259041
let expiration = StaleExpiration::TimerTicks(1);

lightning/src/offers/parse.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ pub enum Bolt12SemanticError {
193193
UnexpectedPaymentHash,
194194
/// A signature was expected but was missing.
195195
MissingSignature,
196+
/// There is insufficient liquidity to complete the payment.
197+
InsufficientLiquidity,
196198
}
197199

198200
impl From<bech32::Error> for Bolt12ParseError {

0 commit comments

Comments
 (0)