@@ -181,6 +181,7 @@ pub(super) enum HTLCForwardInfo {
181181pub(crate) struct HTLCPreviousHopData {
182182 // Note that this may be an outbound SCID alias for the associated channel.
183183 short_channel_id: u64,
184+ user_channel_id: Option<u128>,
184185 htlc_id: u64,
185186 incoming_packet_shared_secret: [u8; 32],
186187 phantom_shared_secret: Option<[u8; 32]>,
@@ -221,6 +222,17 @@ struct ClaimableHTLC {
221222 counterparty_skimmed_fee_msat: Option<u64>,
222223}
223224
225+ impl From<&ClaimableHTLC> for events::ClaimedHTLC {
226+ fn from(val: &ClaimableHTLC) -> Self {
227+ events::ClaimedHTLC {
228+ channel_id: val.prev_hop.outpoint.to_channel_id(),
229+ user_channel_id: val.prev_hop.user_channel_id.unwrap_or(0),
230+ cltv_expiry: val.cltv_expiry,
231+ value_msat: val.value,
232+ }
233+ }
234+ }
235+
224236/// A payment identifier used to uniquely identify a payment to LDK.
225237///
226238/// This is not exported to bindings users as we just use [u8; 32] directly
@@ -496,11 +508,15 @@ struct ClaimingPayment {
496508 amount_msat: u64,
497509 payment_purpose: events::PaymentPurpose,
498510 receiver_node_id: PublicKey,
511+ htlcs: Vec<events::ClaimedHTLC>,
512+ sender_intended_value: Option<u64>,
499513}
500514impl_writeable_tlv_based!(ClaimingPayment, {
501515 (0, amount_msat, required),
502516 (2, payment_purpose, required),
503517 (4, receiver_node_id, required),
518+ (5, htlcs, optional_vec),
519+ (7, sender_intended_value, option),
504520});
505521
506522struct ClaimablePayment {
@@ -3785,6 +3801,7 @@ where
37853801 if let PendingHTLCRouting::Forward { short_channel_id, .. } = payment.forward_info.routing {
37863802 let htlc_source = HTLCSource::PreviousHopData(HTLCPreviousHopData {
37873803 short_channel_id: payment.prev_short_channel_id,
3804+ user_channel_id: Some(payment.prev_user_channel_id),
37883805 outpoint: payment.prev_funding_outpoint,
37893806 htlc_id: payment.prev_htlc_id,
37903807 incoming_packet_shared_secret: payment.forward_info.incoming_shared_secret,
@@ -3832,6 +3849,7 @@ where
38323849
38333850 let htlc_source = HTLCSource::PreviousHopData(HTLCPreviousHopData {
38343851 short_channel_id: prev_short_channel_id,
3852+ user_channel_id: Some(prev_user_channel_id),
38353853 outpoint: prev_funding_outpoint,
38363854 htlc_id: prev_htlc_id,
38373855 incoming_packet_shared_secret: incoming_shared_secret,
@@ -3936,7 +3954,7 @@ where
39363954 for forward_info in pending_forwards.drain(..) {
39373955 match forward_info {
39383956 HTLCForwardInfo::AddHTLC(PendingAddHTLCInfo {
3939- prev_short_channel_id, prev_htlc_id, prev_funding_outpoint, prev_user_channel_id: _ ,
3957+ prev_short_channel_id, prev_htlc_id, prev_funding_outpoint, prev_user_channel_id,
39403958 forward_info: PendingHTLCInfo {
39413959 incoming_shared_secret, payment_hash, outgoing_amt_msat, outgoing_cltv_value,
39423960 routing: PendingHTLCRouting::Forward { onion_packet, .. }, skimmed_fee_msat, ..
@@ -3945,6 +3963,7 @@ where
39453963 log_trace!(self.logger, "Adding HTLC from short id {} with payment_hash {} to channel with short id {} after delay", prev_short_channel_id, log_bytes!(payment_hash.0), short_chan_id);
39463964 let htlc_source = HTLCSource::PreviousHopData(HTLCPreviousHopData {
39473965 short_channel_id: prev_short_channel_id,
3966+ user_channel_id: Some(prev_user_channel_id),
39483967 outpoint: prev_funding_outpoint,
39493968 htlc_id: prev_htlc_id,
39503969 incoming_packet_shared_secret: incoming_shared_secret,
@@ -4026,6 +4045,7 @@ where
40264045 let claimable_htlc = ClaimableHTLC {
40274046 prev_hop: HTLCPreviousHopData {
40284047 short_channel_id: prev_short_channel_id,
4048+ user_channel_id: Some(prev_user_channel_id),
40294049 outpoint: prev_funding_outpoint,
40304050 htlc_id: prev_htlc_id,
40314051 incoming_packet_shared_secret: incoming_shared_secret,
@@ -4055,6 +4075,7 @@ where
40554075 );
40564076 failed_forwards.push((HTLCSource::PreviousHopData(HTLCPreviousHopData {
40574077 short_channel_id: $htlc.prev_hop.short_channel_id,
4078+ user_channel_id: $htlc.prev_hop.user_channel_id,
40584079 outpoint: prev_funding_outpoint,
40594080 htlc_id: $htlc.prev_hop.htlc_id,
40604081 incoming_packet_shared_secret: $htlc.prev_hop.incoming_packet_shared_secret,
@@ -4786,7 +4807,7 @@ where
47864807 &self.pending_events, &self.logger)
47874808 { self.push_pending_forwards_ev(); }
47884809 },
4789- HTLCSource::PreviousHopData(HTLCPreviousHopData { ref short_channel_id, ref htlc_id, ref incoming_packet_shared_secret, ref phantom_shared_secret, ref outpoint }) => {
4810+ HTLCSource::PreviousHopData(HTLCPreviousHopData { ref short_channel_id, ref htlc_id, ref incoming_packet_shared_secret, ref phantom_shared_secret, ref outpoint, .. }) => {
47904811 log_trace!(self.logger, "Failing HTLC with payment_hash {} backwards from us with {:?}", log_bytes!(payment_hash.0), onion_error);
47914812 let err_packet = onion_error.get_encrypted_failure_packet(incoming_packet_shared_secret, phantom_shared_secret);
47924813
@@ -4873,9 +4894,11 @@ where
48734894 }
48744895 }
48754896
4897+ let htlcs = payment.htlcs.iter().map(events::ClaimedHTLC::from).collect();
4898+ let sender_intended_value = payment.htlcs.first().map(|htlc| htlc.total_msat);
48764899 let dup_purpose = claimable_payments.pending_claiming_payments.insert(payment_hash,
48774900 ClaimingPayment { amount_msat: payment.htlcs.iter().map(|source| source.value).sum(),
4878- payment_purpose: payment.purpose, receiver_node_id,
4901+ payment_purpose: payment.purpose, receiver_node_id, htlcs, sender_intended_value
48794902 });
48804903 if dup_purpose.is_some() {
48814904 debug_assert!(false, "Shouldn't get a duplicate pending claim event ever");
@@ -5139,9 +5162,20 @@ where
51395162 match action {
51405163 MonitorUpdateCompletionAction::PaymentClaimed { payment_hash } => {
51415164 let payment = self.claimable_payments.lock().unwrap().pending_claiming_payments.remove(&payment_hash);
5142- if let Some(ClaimingPayment { amount_msat, payment_purpose: purpose, receiver_node_id }) = payment {
5165+ if let Some(ClaimingPayment {
5166+ amount_msat,
5167+ payment_purpose: purpose,
5168+ receiver_node_id,
5169+ htlcs,
5170+ sender_intended_value: sender_intended_total_msat,
5171+ }) = payment {
51435172 self.pending_events.lock().unwrap().push_back((events::Event::PaymentClaimed {
5144- payment_hash, purpose, amount_msat, receiver_node_id: Some(receiver_node_id),
5173+ payment_hash,
5174+ purpose,
5175+ amount_msat,
5176+ receiver_node_id: Some(receiver_node_id),
5177+ htlcs,
5178+ sender_intended_total_msat,
51455179 }, None));
51465180 }
51475181 },
@@ -6019,6 +6053,7 @@ where
60196053 log_info!(self.logger, "Failed to forward incoming HTLC: detected duplicate intercepted payment over short channel id {}", scid);
60206054 let htlc_source = HTLCSource::PreviousHopData(HTLCPreviousHopData {
60216055 short_channel_id: prev_short_channel_id,
6056+ user_channel_id: Some(prev_user_channel_id),
60226057 outpoint: prev_funding_outpoint,
60236058 htlc_id: prev_htlc_id,
60246059 incoming_packet_shared_secret: forward_info.incoming_shared_secret,
@@ -7145,6 +7180,7 @@ where
71457180 if height >= htlc.forward_info.outgoing_cltv_value - HTLC_FAIL_BACK_BUFFER {
71467181 let prev_hop_data = HTLCSource::PreviousHopData(HTLCPreviousHopData {
71477182 short_channel_id: htlc.prev_short_channel_id,
7183+ user_channel_id: Some(htlc.prev_user_channel_id),
71487184 htlc_id: htlc.prev_htlc_id,
71497185 incoming_packet_shared_secret: htlc.forward_info.incoming_shared_secret,
71507186 phantom_shared_secret: None,
@@ -7920,7 +7956,8 @@ impl_writeable_tlv_based!(HTLCPreviousHopData, {
79207956 (1, phantom_shared_secret, option),
79217957 (2, outpoint, required),
79227958 (4, htlc_id, required),
7923- (6, incoming_packet_shared_secret, required)
7959+ (6, incoming_packet_shared_secret, required),
7960+ (7, user_channel_id, option),
79247961});
79257962
79267963impl Writeable for ClaimableHTLC {
@@ -9174,7 +9211,7 @@ where
91749211 .expect("Failed to get node_id for phantom node recipient");
91759212 receiver_node_id = Some(phantom_pubkey)
91769213 }
9177- for claimable_htlc in payment.htlcs {
9214+ for claimable_htlc in & payment.htlcs {
91789215 claimable_amt_msat += claimable_htlc.value;
91799216
91809217 // Add a holding-cell claim of the payment to the Channel, which should be
@@ -9210,6 +9247,8 @@ where
92109247 payment_hash,
92119248 purpose: payment.purpose,
92129249 amount_msat: claimable_amt_msat,
9250+ htlcs: payment.htlcs.iter().map(events::ClaimedHTLC::from).collect(),
9251+ sender_intended_total_msat: payment.htlcs.first().map(|htlc| htlc.total_msat),
92139252 }, None));
92149253 }
92159254 }
0 commit comments