Skip to content

Commit dc571c7

Browse files
Store our skimmed fee in PendingHTLCRouting
Receivers need to use this value to verify incoming payments if ChannelConfig::accept_underpaying_htlcs is set.
1 parent e916e4b commit dc571c7

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ pub(super) enum PendingHTLCRouting {
104104
/// The SCID from the onion that we should forward to. This could be a real SCID or a fake one
105105
/// generated using `get_fake_scid` from the scid_utils::fake_scid module.
106106
short_channel_id: u64, // This should be NonZero<u64> eventually when we bump MSRV
107+
/// The fee we're skimming off the top of this HTLC. See
108+
/// [`ChannelConfig::accept_underpaying_htlcs`].
109+
skimmed_fee_msat: Option<u64>,
107110
},
108111
Receive {
109112
payment_data: msgs::FinalOnionHopData,
@@ -2774,6 +2777,7 @@ where
27742777
routing: PendingHTLCRouting::Forward {
27752778
onion_packet: outgoing_packet,
27762779
short_channel_id,
2780+
skimmed_fee_msat: None,
27772781
},
27782782
payment_hash: msg.payment_hash.clone(),
27792783
incoming_shared_secret: shared_secret,
@@ -3410,8 +3414,16 @@ where
34103414
})?;
34113415

34123416
let routing = match payment.forward_info.routing {
3413-
PendingHTLCRouting::Forward { onion_packet, .. } => {
3414-
PendingHTLCRouting::Forward { onion_packet, short_channel_id: next_hop_scid }
3417+
PendingHTLCRouting::Forward { onion_packet, skimmed_fee_msat, .. } => {
3418+
debug_assert!(skimmed_fee_msat.is_none());
3419+
PendingHTLCRouting::Forward {
3420+
onion_packet,
3421+
short_channel_id: next_hop_scid,
3422+
skimmed_fee_msat:
3423+
// The minuend here must match the expected forward amount generated for the
3424+
// HTLCIntercepted event.
3425+
Some(payment.forward_info.outgoing_amt_msat.saturating_sub(amt_to_forward_msat)),
3426+
}
34153427
},
34163428
_ => unreachable!() // Only `PendingHTLCRouting::Forward`s are intercepted
34173429
};
@@ -7282,6 +7294,7 @@ impl_writeable_tlv_based!(PhantomRouteHints, {
72827294
impl_writeable_tlv_based_enum!(PendingHTLCRouting,
72837295
(0, Forward) => {
72847296
(0, onion_packet, required),
7297+
(1, skimmed_fee_msat, option),
72857298
(2, short_channel_id, required),
72867299
},
72877300
(1, Receive) => {

pending_changelog/forward-underpaying-htlc.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@
22

33
* Setting `ChannelConfig::accept_underpaying_htlcs` may break compatibility with versions of LDK
44
prior to 0.0.116, and unsetting the feature between restarts may lead to payment failures.
5+
* Forwarding less than the expected amount in `ChannelManager::forward_intercepted_htlc` and
6+
subsequently downgrading to an LDK version prior to 0.0.116 may result in forwarding failures.

0 commit comments

Comments
 (0)