Skip to content

Commit 1dfd1f1

Browse files
Add payment claimable path
1 parent 4b31747 commit 1dfd1f1

File tree

2 files changed

+33
-9
lines changed

2 files changed

+33
-9
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,7 @@ struct ClaimablePayment {
549549
purpose: events::PaymentPurpose,
550550
onion_fields: Option<RecipientOnionFields>,
551551
htlcs: Vec<ClaimableHTLC>,
552+
amount_msat: Option<u64>,
552553
}
553554

554555
/// Information about claimable or being-claimed payments
@@ -3555,7 +3556,10 @@ where
35553556
let best_block_height = self.best_block.read().unwrap().height();
35563557
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
35573558
let mut preimage: Option<PaymentPreimage> = None;
3558-
if let Some(payment_secret) = recipient_onion.payment_secret {
3559+
let mut payment_secret = PaymentSecret([0; 32]);
3560+
let mut is_self_pay = false;
3561+
if let Some(secret) = recipient_onion.payment_secret {
3562+
payment_secret = secret;
35593563
if let Payee::Clear{node_id, .. } = route_params.payment_params.payee {
35603564
let is_phantom_payee = match self.node_signer.get_node_id(Recipient::PhantomNode) {
35613565
Ok(phantom_node_id) => node_id == phantom_node_id,
@@ -3564,15 +3568,26 @@ where
35643568
if node_id == self.get_our_node_id() || is_phantom_payee {
35653569
let payment_data = msgs::FinalOnionHopData{ payment_secret, total_msat: route_params.final_value_msat};
35663570
preimage = inbound_payment::verify(payment_hash, &payment_data, self.highest_seen_timestamp.load(Ordering::Acquire) as u64, &self.inbound_payment_key, &self.logger).map_err(|_| RetryableSendFailure::RecipientRejected)?.0;
3567-
// create a pending inbound payment
3571+
is_self_pay = true;
35683572
}
35693573
}
35703574
}
3575+
35713576
self.pending_outbound_payments
3572-
.send_payment(payment_hash, recipient_onion, payment_id, retry_strategy, route_params, preimage,
3577+
.send_payment(payment_hash, recipient_onion.clone(), payment_id, retry_strategy, route_params.clone(), preimage,
35733578
&self.router, self.list_usable_channels(), || self.compute_inflight_htlcs(),
35743579
&self.entropy_source, &self.node_signer, best_block_height, &self.logger,
3575-
&self.pending_events, |args| self.send_payment_along_path(args))
3580+
&self.pending_events, |args| self.send_payment_along_path(args))?;
3581+
3582+
if is_self_pay {
3583+
let mut claimable_payments = self.claimable_payments.lock().unwrap();
3584+
let purpose = events::PaymentPurpose::InvoicePayment { payment_preimage: preimage, payment_secret };
3585+
claimable_payments.claimable_payments.insert(payment_hash, ClaimablePayment{ purpose: purpose.clone(), onion_fields: Some(recipient_onion.clone()), htlcs: vec![], amount_msat: Some(route_params.final_value_msat)});
3586+
let mut pending_events = self.pending_events.lock().unwrap();
3587+
pending_events.push_back((events::Event::PaymentClaimable { receiver_node_id: Some(self.get_our_node_id()), payment_hash, onion_fields: Some(recipient_onion), amount_msat: route_params.final_value_msat, counterparty_skimmed_fee_msat: 0, purpose, via_channel_id: None, via_user_channel_id: None, claim_deadline: None }, None));
3588+
}
3589+
3590+
Ok(())
35763591
}
35773592

35783593
#[cfg(test)]
@@ -4555,7 +4570,7 @@ where
45554570
.or_insert_with(|| {
45564571
committed_to_claimable = true;
45574572
ClaimablePayment {
4558-
purpose: $purpose.clone(), htlcs: Vec::new(), onion_fields: None,
4573+
purpose: $purpose.clone(), htlcs: Vec::new(), onion_fields: None, amount_msat: None,
45594574
}
45604575
});
45614576
if $purpose != claimable_payment.purpose {
@@ -5358,13 +5373,22 @@ where
53585373

53595374
fn claim_payment_internal(&self, payment_preimage: PaymentPreimage, custom_tlvs_known: bool) {
53605375
let payment_hash = PaymentHash(Sha256::hash(&payment_preimage.0).into_inner());
5376+
53615377

53625378
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
53635379

53645380
let mut sources = {
53655381
let mut claimable_payments = self.claimable_payments.lock().unwrap();
53665382
if let Some(payment) = claimable_payments.claimable_payments.remove(&payment_hash) {
53675383
let mut receiver_node_id = self.our_network_pubkey;
5384+
if let events::PaymentPurpose::InvoicePayment { payment_secret, .. } = payment.purpose {
5385+
if let Ok(_) = self.get_payment_preimage(payment_hash, payment_secret) {
5386+
let mut pending_events_lock = self.pending_events.lock().unwrap();
5387+
pending_events_lock.push_back((Event::PaymentClaimed { receiver_node_id: Some(receiver_node_id), payment_hash,
5388+
amount_msat: 0, purpose: payment.purpose, htlcs: vec![], sender_intended_total_msat: None }, None));
5389+
return;
5390+
}
5391+
}
53685392
for htlc in payment.htlcs.iter() {
53695393
if htlc.prev_hop.phantom_shared_secret.is_some() {
53705394
let phantom_pubkey = self.node_signer.get_node_id(Recipient::PhantomNode)
@@ -10584,14 +10608,14 @@ where
1058410608
purposes.into_iter().zip(onion_fields.into_iter().zip(claimable_htlcs_list.into_iter()))
1058510609
{
1058610610
let existing_payment = claimable_payments.insert(payment_hash, ClaimablePayment {
10587-
purpose, htlcs, onion_fields: onion,
10611+
purpose, htlcs, onion_fields: onion, amount_msat: None,
1058810612
});
1058910613
if existing_payment.is_some() { return Err(DecodeError::InvalidValue); }
1059010614
}
1059110615
} else {
1059210616
for (purpose, (payment_hash, htlcs)) in purposes.into_iter().zip(claimable_htlcs_list.into_iter()) {
1059310617
let existing_payment = claimable_payments.insert(payment_hash, ClaimablePayment {
10594-
purpose, htlcs, onion_fields: None,
10618+
purpose, htlcs, onion_fields: None, amount_msat: None,
1059510619
});
1059610620
if existing_payment.is_some() { return Err(DecodeError::InvalidValue); }
1059710621
}
@@ -10625,7 +10649,7 @@ where
1062510649
events::PaymentPurpose::SpontaneousPayment(*payment_preimage),
1062610650
};
1062710651
claimable_payments.insert(payment_hash, ClaimablePayment {
10628-
purpose, htlcs, onion_fields: None,
10652+
purpose, htlcs, onion_fields: None, amount_msat: None,
1062910653
});
1063010654
}
1063110655
}

lightning/src/ln/outbound_payment.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use bitcoin::hashes::sha256::Hash as Sha256;
1414
use bitcoin::secp256k1::{self, Secp256k1, SecretKey};
1515

1616
use crate::sign::{EntropySource, NodeSigner, Recipient};
17-
use crate::events::{self, PaymentFailureReason, Event, PaymentPurpose};
17+
use crate::events::{self, PaymentFailureReason, Event};
1818
use crate::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
1919
use crate::ln::channelmanager::{ChannelDetails, EventCompletionAction, HTLCSource, PaymentId};
2020
use crate::ln::onion_utils::{DecodedOnionFailure, HTLCFailReason};

0 commit comments

Comments
 (0)