@@ -677,6 +677,7 @@ struct ClaimablePayment {
677
677
purpose: events::PaymentPurpose,
678
678
onion_fields: Option<RecipientOnionFields>,
679
679
htlcs: Vec<ClaimableHTLC>,
680
+ amount_msat: Option<u64>,
680
681
}
681
682
682
683
/// Information about claimable or being-claimed payments
@@ -697,6 +698,17 @@ struct ClaimablePayments {
697
698
pending_claiming_payments: HashMap<PaymentHash, ClaimingPayment>,
698
699
}
699
700
701
+ /// Information about self claimable payments.
702
+ struct ClaimableSelfPayments {
703
+ claimable_payments: HashMap<PaymentHash, ClaimableSelfPayment>
704
+ }
705
+
706
+ struct ClaimableSelfPayment {
707
+ purpose: events::PaymentPurpose,
708
+ amount_msat: u64,
709
+ payment_id: PaymentId,
710
+ }
711
+
700
712
/// Events which we process internally but cannot be processed immediately at the generation site
701
713
/// usually because we're running pre-full-init. They are handled immediately once we detect we are
702
714
/// running normally, and specifically must be processed before any other non-background
@@ -1267,6 +1279,12 @@ where
1267
1279
/// See `ChannelManager` struct-level documentation for lock order requirements.
1268
1280
claimable_payments: Mutex<ClaimablePayments>,
1269
1281
1282
+ /// The set of self payments which are claimable. See [`ClaimableSelfPayments`]
1283
+ /// individual field docs for more info.
1284
+ ///
1285
+ /// See `ChannelManager` struct-level documentation for lock order requirements.
1286
+ claimable_self_payments: Mutex<ClaimableSelfPayments>,
1287
+
1270
1288
/// The set of outbound SCID aliases across all our channels, including unconfirmed channels
1271
1289
/// and some closed channels which reached a usable state prior to being closed. This is used
1272
1290
/// only to avoid duplicates, and is not persisted explicitly to disk, but rebuilt from the
@@ -2468,6 +2486,7 @@ where
2468
2486
pending_outbound_payments: OutboundPayments::new(),
2469
2487
forward_htlcs: Mutex::new(new_hash_map()),
2470
2488
claimable_payments: Mutex::new(ClaimablePayments { claimable_payments: new_hash_map(), pending_claiming_payments: new_hash_map() }),
2489
+ claimable_self_payments: Mutex::new(ClaimableSelfPayments { claimable_payments: new_hash_map() }),
2471
2490
pending_intercepted_htlcs: Mutex::new(new_hash_map()),
2472
2491
outpoint_to_peer: Mutex::new(new_hash_map()),
2473
2492
short_to_chan_info: FairRwLock::new(new_hash_map()),
@@ -3549,11 +3568,38 @@ where
3549
3568
pub fn send_payment(&self, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields, payment_id: PaymentId, route_params: RouteParameters, retry_strategy: Retry) -> Result<(), RetryableSendFailure> {
3550
3569
let best_block_height = self.best_block.read().unwrap().height;
3551
3570
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
3571
+ let mut preimage: Option<PaymentPreimage> = None;
3572
+ let mut payment_secret = PaymentSecret([0; 32]);
3573
+ let mut is_self_pay = false;
3574
+ if let Some(secret) = recipient_onion.payment_secret {
3575
+ payment_secret = secret;
3576
+ if let Payee::Clear{ node_id, .. } = route_params.payment_params.payee {
3577
+ let is_phantom_payee = match self.node_signer.get_node_id(Recipient::PhantomNode) {
3578
+ Ok(phantom_node_id) => node_id == phantom_node_id,
3579
+ Err(_) => false,
3580
+ };
3581
+ if node_id == self.get_our_node_id() || is_phantom_payee {
3582
+ let payment_data = msgs::FinalOnionHopData{ payment_secret, total_msat: route_params.final_value_msat };
3583
+ 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;
3584
+ is_self_pay = true;
3585
+ }
3586
+ }
3587
+ }
3552
3588
self.pending_outbound_payments
3553
- .send_payment(payment_hash, recipient_onion, payment_id, retry_strategy, route_params,
3589
+ .send_payment(payment_hash, recipient_onion.clone() , payment_id, retry_strategy, route_params.clone() ,
3554
3590
&self.router, self.list_usable_channels(), || self.compute_inflight_htlcs(),
3555
3591
&self.entropy_source, &self.node_signer, best_block_height, &self.logger,
3556
- &self.pending_events, |args| self.send_payment_along_path(args))
3592
+ &self.pending_events, |args| self.send_payment_along_path(args))?;
3593
+
3594
+ if is_self_pay {
3595
+ let mut claimable_self_payments = self.claimable_self_payments.lock().unwrap();
3596
+ let purpose = events::PaymentPurpose::InvoicePayment { payment_preimage: preimage, payment_secret };
3597
+ claimable_self_payments.claimable_payments.insert(payment_hash, ClaimableSelfPayment{ purpose: purpose.clone(), amount_msat: route_params.final_value_msat, payment_id });
3598
+ let mut pending_events = self.pending_events.lock().unwrap();
3599
+ 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));
3600
+ }
3601
+
3602
+ Ok(())
3557
3603
}
3558
3604
3559
3605
#[cfg(test)]
@@ -4602,7 +4648,7 @@ where
4602
4648
.or_insert_with(|| {
4603
4649
committed_to_claimable = true;
4604
4650
ClaimablePayment {
4605
- purpose: $purpose.clone(), htlcs: Vec::new(), onion_fields: None,
4651
+ purpose: $purpose.clone(), htlcs: Vec::new(), onion_fields: None, amount_msat: None,
4606
4652
}
4607
4653
});
4608
4654
if $purpose != claimable_payment.purpose {
@@ -5446,10 +5492,32 @@ where
5446
5492
5447
5493
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
5448
5494
5495
+ // This handles fulfilling and claiming of Self payment.
5496
+ {
5497
+ let mut claimable_self_payments = self.claimable_self_payments.lock().unwrap();
5498
+ if let Some(payment) = claimable_self_payments.claimable_payments.remove(&payment_hash) {
5499
+ let mut pending_outbounds_lock = self.pending_outbound_payments.pending_outbound_payments.lock().unwrap();
5500
+ let out_payment = pending_outbounds_lock.get_mut(&payment.payment_id).unwrap();
5501
+ out_payment.mark_fulfilled();
5502
+ let mut pending_events_lock = self.pending_events.lock().unwrap();
5503
+ pending_events_lock.push_back((Event::PaymentSent { payment_id: Some(payment.payment_id), payment_preimage,
5504
+ payment_hash, fee_paid_msat: None }, None));
5505
+ pending_events_lock.push_back((Event::PaymentClaimed { receiver_node_id: None, payment_hash,
5506
+ amount_msat: payment.amount_msat, purpose: payment.purpose, htlcs: vec![], sender_intended_total_msat: None }, None));
5507
+ return;
5508
+ }
5509
+ }
5510
+
5449
5511
let mut sources = {
5450
5512
let mut claimable_payments = self.claimable_payments.lock().unwrap();
5451
5513
if let Some(payment) = claimable_payments.claimable_payments.remove(&payment_hash) {
5452
5514
let mut receiver_node_id = self.our_network_pubkey;
5515
+ if payment.htlcs.is_empty() {
5516
+ let mut pending_events_lock = self.pending_events.lock().unwrap();
5517
+ pending_events_lock.push_back((Event::PaymentClaimed { receiver_node_id: Some(receiver_node_id), payment_hash,
5518
+ amount_msat: payment.amount_msat.unwrap(), purpose: payment.purpose, htlcs: vec![], sender_intended_total_msat: None }, None));
5519
+ return;
5520
+ }
5453
5521
for htlc in payment.htlcs.iter() {
5454
5522
if htlc.prev_hop.phantom_shared_secret.is_some() {
5455
5523
let phantom_pubkey = self.node_signer.get_node_id(Recipient::PhantomNode)
@@ -10111,6 +10179,7 @@ where
10111
10179
10112
10180
let pending_inbound_payments = self.pending_inbound_payments.lock().unwrap();
10113
10181
let claimable_payments = self.claimable_payments.lock().unwrap();
10182
+ let claimable_self_payments = self.claimable_self_payments.lock().unwrap();
10114
10183
let pending_outbound_payments = self.pending_outbound_payments.pending_outbound_payments.lock().unwrap();
10115
10184
10116
10185
let mut htlc_purposes: Vec<&events::PaymentPurpose> = Vec::new();
@@ -10126,6 +10195,14 @@ where
10126
10195
htlc_onion_fields.push(&payment.onion_fields);
10127
10196
}
10128
10197
10198
+ (claimable_self_payments.claimable_payments.len() as u64).write(writer)?;
10199
+ for (payment_hash, payment) in claimable_self_payments.claimable_payments.iter() {
10200
+ payment_hash.write(writer)?;
10201
+ payment.purpose.write(writer)?;
10202
+ payment.amount_msat.write(writer)?;
10203
+ payment.payment_id.write(writer)?;
10204
+ }
10205
+
10129
10206
let mut monitor_update_blocked_actions_per_peer = None;
10130
10207
let mut peer_states = Vec::new();
10131
10208
for (_, peer_state_mutex) in per_peer_state.iter() {
@@ -10639,6 +10716,21 @@ where
10639
10716
claimable_htlcs_list.push((payment_hash, previous_hops));
10640
10717
}
10641
10718
10719
+ let claimable_self_payment_count: u64 = Readable::read(reader)?;
10720
+ let mut claimable_self_payments = HashMap::with_capacity(claimable_self_payment_count as usize);
10721
+ for _ in 0..claimable_self_payment_count {
10722
+ //read each payment details and add an entry to the map of claimable payments.
10723
+ let payment_hash = Readable::read(reader)?;
10724
+ let purpose = Readable::read(reader)?;
10725
+ let amount_msat = Readable::read(reader)?;
10726
+ let payment_id = Readable::read(reader)?;
10727
+ claimable_self_payments.insert(payment_hash, ClaimableSelfPayment {
10728
+ purpose,
10729
+ amount_msat,
10730
+ payment_id,
10731
+ });
10732
+ }
10733
+
10642
10734
let peer_state_from_chans = |channel_by_id| {
10643
10735
PeerState {
10644
10736
channel_by_id,
@@ -11064,14 +11156,14 @@ where
11064
11156
purposes.into_iter().zip(onion_fields.into_iter().zip(claimable_htlcs_list.into_iter()))
11065
11157
{
11066
11158
let existing_payment = claimable_payments.insert(payment_hash, ClaimablePayment {
11067
- purpose, htlcs, onion_fields: onion,
11159
+ purpose, htlcs, onion_fields: onion, amount_msat: None,
11068
11160
});
11069
11161
if existing_payment.is_some() { return Err(DecodeError::InvalidValue); }
11070
11162
}
11071
11163
} else {
11072
11164
for (purpose, (payment_hash, htlcs)) in purposes.into_iter().zip(claimable_htlcs_list.into_iter()) {
11073
11165
let existing_payment = claimable_payments.insert(payment_hash, ClaimablePayment {
11074
- purpose, htlcs, onion_fields: None,
11166
+ purpose, htlcs, onion_fields: None, amount_msat: None,
11075
11167
});
11076
11168
if existing_payment.is_some() { return Err(DecodeError::InvalidValue); }
11077
11169
}
@@ -11105,7 +11197,7 @@ where
11105
11197
events::PaymentPurpose::SpontaneousPayment(*payment_preimage),
11106
11198
};
11107
11199
claimable_payments.insert(payment_hash, ClaimablePayment {
11108
- purpose, htlcs, onion_fields: None,
11200
+ purpose, htlcs, onion_fields: None, amount_msat: None,
11109
11201
});
11110
11202
}
11111
11203
}
@@ -11272,6 +11364,7 @@ where
11272
11364
11273
11365
forward_htlcs: Mutex::new(forward_htlcs),
11274
11366
claimable_payments: Mutex::new(ClaimablePayments { claimable_payments, pending_claiming_payments: pending_claiming_payments.unwrap() }),
11367
+ claimable_self_payments: Mutex::new(ClaimableSelfPayments { claimable_payments: claimable_self_payments }),
11275
11368
outbound_scid_aliases: Mutex::new(outbound_scid_aliases),
11276
11369
outpoint_to_peer: Mutex::new(outpoint_to_peer),
11277
11370
short_to_chan_info: FairRwLock::new(short_to_chan_info),
0 commit comments