@@ -549,6 +549,7 @@ struct ClaimablePayment {
549
549
purpose: events::PaymentPurpose,
550
550
onion_fields: Option<RecipientOnionFields>,
551
551
htlcs: Vec<ClaimableHTLC>,
552
+ amount_msat: Option<u64>,
552
553
}
553
554
554
555
/// Information about claimable or being-claimed payments
@@ -3555,7 +3556,10 @@ where
3555
3556
let best_block_height = self.best_block.read().unwrap().height();
3556
3557
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
3557
3558
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;
3559
3563
if let Payee::Clear{node_id, .. } = route_params.payment_params.payee {
3560
3564
let is_phantom_payee = match self.node_signer.get_node_id(Recipient::PhantomNode) {
3561
3565
Ok(phantom_node_id) => node_id == phantom_node_id,
@@ -3564,15 +3568,26 @@ where
3564
3568
if node_id == self.get_our_node_id() || is_phantom_payee {
3565
3569
let payment_data = msgs::FinalOnionHopData{ payment_secret, total_msat: route_params.final_value_msat};
3566
3570
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;
3568
3572
}
3569
3573
}
3570
3574
}
3575
+
3571
3576
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,
3573
3578
&self.router, self.list_usable_channels(), || self.compute_inflight_htlcs(),
3574
3579
&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(())
3576
3591
}
3577
3592
3578
3593
#[cfg(test)]
@@ -4555,7 +4570,7 @@ where
4555
4570
.or_insert_with(|| {
4556
4571
committed_to_claimable = true;
4557
4572
ClaimablePayment {
4558
- purpose: $purpose.clone(), htlcs: Vec::new(), onion_fields: None,
4573
+ purpose: $purpose.clone(), htlcs: Vec::new(), onion_fields: None, amount_msat: None,
4559
4574
}
4560
4575
});
4561
4576
if $purpose != claimable_payment.purpose {
@@ -5358,13 +5373,22 @@ where
5358
5373
5359
5374
fn claim_payment_internal(&self, payment_preimage: PaymentPreimage, custom_tlvs_known: bool) {
5360
5375
let payment_hash = PaymentHash(Sha256::hash(&payment_preimage.0).into_inner());
5376
+
5361
5377
5362
5378
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
5363
5379
5364
5380
let mut sources = {
5365
5381
let mut claimable_payments = self.claimable_payments.lock().unwrap();
5366
5382
if let Some(payment) = claimable_payments.claimable_payments.remove(&payment_hash) {
5367
5383
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
+ }
5368
5392
for htlc in payment.htlcs.iter() {
5369
5393
if htlc.prev_hop.phantom_shared_secret.is_some() {
5370
5394
let phantom_pubkey = self.node_signer.get_node_id(Recipient::PhantomNode)
@@ -10584,14 +10608,14 @@ where
10584
10608
purposes.into_iter().zip(onion_fields.into_iter().zip(claimable_htlcs_list.into_iter()))
10585
10609
{
10586
10610
let existing_payment = claimable_payments.insert(payment_hash, ClaimablePayment {
10587
- purpose, htlcs, onion_fields: onion,
10611
+ purpose, htlcs, onion_fields: onion, amount_msat: None,
10588
10612
});
10589
10613
if existing_payment.is_some() { return Err(DecodeError::InvalidValue); }
10590
10614
}
10591
10615
} else {
10592
10616
for (purpose, (payment_hash, htlcs)) in purposes.into_iter().zip(claimable_htlcs_list.into_iter()) {
10593
10617
let existing_payment = claimable_payments.insert(payment_hash, ClaimablePayment {
10594
- purpose, htlcs, onion_fields: None,
10618
+ purpose, htlcs, onion_fields: None, amount_msat: None,
10595
10619
});
10596
10620
if existing_payment.is_some() { return Err(DecodeError::InvalidValue); }
10597
10621
}
@@ -10625,7 +10649,7 @@ where
10625
10649
events::PaymentPurpose::SpontaneousPayment(*payment_preimage),
10626
10650
};
10627
10651
claimable_payments.insert(payment_hash, ClaimablePayment {
10628
- purpose, htlcs, onion_fields: None,
10652
+ purpose, htlcs, onion_fields: None, amount_msat: None,
10629
10653
});
10630
10654
}
10631
10655
}
0 commit comments