@@ -674,6 +674,7 @@ struct ClaimablePayment {
674
674
purpose: events::PaymentPurpose,
675
675
onion_fields: Option<RecipientOnionFields>,
676
676
htlcs: Vec<ClaimableHTLC>,
677
+ amount_msat: Option<u64>,
677
678
}
678
679
679
680
/// Information about claimable or being-claimed payments
@@ -3504,7 +3505,10 @@ where
3504
3505
let best_block_height = self.best_block.read().unwrap().height();
3505
3506
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
3506
3507
let mut preimage: Option<PaymentPreimage> = None;
3507
- if let Some(payment_secret) = recipient_onion.payment_secret {
3508
+ let mut payment_secret = PaymentSecret([0; 32]);
3509
+ let mut is_self_pay = false;
3510
+ if let Some(secret) = recipient_onion.payment_secret {
3511
+ payment_secret = secret;
3508
3512
if let Payee::Clear{node_id, .. } = route_params.payment_params.payee {
3509
3513
let is_phantom_payee = match self.node_signer.get_node_id(Recipient::PhantomNode) {
3510
3514
Ok(phantom_node_id) => node_id == phantom_node_id,
@@ -3513,15 +3517,26 @@ where
3513
3517
if node_id == self.get_our_node_id() || is_phantom_payee {
3514
3518
let payment_data = msgs::FinalOnionHopData{ payment_secret, total_msat: route_params.final_value_msat};
3515
3519
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;
3516
- // create a pending inbound payment
3520
+ is_self_pay = true;
3517
3521
}
3518
3522
}
3519
3523
}
3524
+
3520
3525
self.pending_outbound_payments
3521
- .send_payment(payment_hash, recipient_onion, payment_id, retry_strategy, route_params, preimage,
3526
+ .send_payment(payment_hash, recipient_onion.clone() , payment_id, retry_strategy, route_params.clone() , preimage,
3522
3527
&self.router, self.list_usable_channels(), || self.compute_inflight_htlcs(),
3523
3528
&self.entropy_source, &self.node_signer, best_block_height, &self.logger,
3524
- &self.pending_events, |args| self.send_payment_along_path(args))
3529
+ &self.pending_events, |args| self.send_payment_along_path(args))?;
3530
+
3531
+ if is_self_pay {
3532
+ let mut claimable_payments = self.claimable_payments.lock().unwrap();
3533
+ let purpose = events::PaymentPurpose::InvoicePayment { payment_preimage: preimage, payment_secret };
3534
+ 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)});
3535
+ let mut pending_events = self.pending_events.lock().unwrap();
3536
+ 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));
3537
+ }
3538
+
3539
+ Ok(())
3525
3540
}
3526
3541
3527
3542
#[cfg(test)]
@@ -4561,7 +4576,7 @@ where
4561
4576
.or_insert_with(|| {
4562
4577
committed_to_claimable = true;
4563
4578
ClaimablePayment {
4564
- purpose: $purpose.clone(), htlcs: Vec::new(), onion_fields: None,
4579
+ purpose: $purpose.clone(), htlcs: Vec::new(), onion_fields: None, amount_msat: None,
4565
4580
}
4566
4581
});
4567
4582
if $purpose != claimable_payment.purpose {
@@ -5404,6 +5419,14 @@ where
5404
5419
let mut claimable_payments = self.claimable_payments.lock().unwrap();
5405
5420
if let Some(payment) = claimable_payments.claimable_payments.remove(&payment_hash) {
5406
5421
let mut receiver_node_id = self.our_network_pubkey;
5422
+ if let events::PaymentPurpose::InvoicePayment { payment_secret, .. } = payment.purpose {
5423
+ if let Ok(_) = self.get_payment_preimage(payment_hash, payment_secret) {
5424
+ let mut pending_events_lock = self.pending_events.lock().unwrap();
5425
+ pending_events_lock.push_back((Event::PaymentClaimed { receiver_node_id: Some(receiver_node_id), payment_hash,
5426
+ amount_msat: payment.amount_msat.unwrap(), purpose: payment.purpose, htlcs: vec![], sender_intended_total_msat: None }, None));
5427
+ return;
5428
+ }
5429
+ }
5407
5430
for htlc in payment.htlcs.iter() {
5408
5431
if htlc.prev_hop.phantom_shared_secret.is_some() {
5409
5432
let phantom_pubkey = self.node_signer.get_node_id(Recipient::PhantomNode)
@@ -10879,14 +10902,14 @@ where
10879
10902
purposes.into_iter().zip(onion_fields.into_iter().zip(claimable_htlcs_list.into_iter()))
10880
10903
{
10881
10904
let existing_payment = claimable_payments.insert(payment_hash, ClaimablePayment {
10882
- purpose, htlcs, onion_fields: onion,
10905
+ purpose, htlcs, onion_fields: onion, amount_msat: None,
10883
10906
});
10884
10907
if existing_payment.is_some() { return Err(DecodeError::InvalidValue); }
10885
10908
}
10886
10909
} else {
10887
10910
for (purpose, (payment_hash, htlcs)) in purposes.into_iter().zip(claimable_htlcs_list.into_iter()) {
10888
10911
let existing_payment = claimable_payments.insert(payment_hash, ClaimablePayment {
10889
- purpose, htlcs, onion_fields: None,
10912
+ purpose, htlcs, onion_fields: None, amount_msat: None,
10890
10913
});
10891
10914
if existing_payment.is_some() { return Err(DecodeError::InvalidValue); }
10892
10915
}
@@ -10920,7 +10943,7 @@ where
10920
10943
events::PaymentPurpose::SpontaneousPayment(*payment_preimage),
10921
10944
};
10922
10945
claimable_payments.insert(payment_hash, ClaimablePayment {
10923
- purpose, htlcs, onion_fields: None,
10946
+ purpose, htlcs, onion_fields: None, amount_msat: None,
10924
10947
});
10925
10948
}
10926
10949
}
0 commit comments