Skip to content

Commit 05b69a0

Browse files
Set extra skimmed fee on intercepted forward
Receivers need to use this value to verify incoming payments if ChannelConfig::accept_underpaying_htlcs is set.
1 parent 53d9a60 commit 05b69a0

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ pub(super) struct PendingHTLCInfo {
131131
/// may overshoot this in either case)
132132
pub(super) outgoing_amt_msat: u64,
133133
pub(super) outgoing_cltv_value: u32,
134+
/// The fee being skimmed off the top of this HTLC. If this is a forward, it'll be the fee we are
135+
/// skimming. If we're receiving this HTLC, it's the fee that our counterparty skimmed.
136+
pub(super) skimmed_fee_msat: Option<u64>,
134137
}
135138

136139
#[derive(Clone)] // See Channel::revoke_and_ack for why, tl;dr: Rust bug
@@ -2623,6 +2626,7 @@ where
26232626
incoming_amt_msat: Some(amt_msat),
26242627
outgoing_amt_msat: hop_data.amt_to_forward,
26252628
outgoing_cltv_value: hop_data.outgoing_cltv_value,
2629+
skimmed_fee_msat: None,
26262630
})
26272631
}
26282632

@@ -2890,6 +2894,7 @@ where
28902894
incoming_amt_msat: Some(msg.amount_msat),
28912895
outgoing_amt_msat: next_hop_data.amt_to_forward,
28922896
outgoing_cltv_value: next_hop_data.outgoing_cltv_value,
2897+
skimmed_fee_msat: None,
28932898
})
28942899
}
28952900
}
@@ -3527,7 +3532,10 @@ where
35273532
},
35283533
_ => unreachable!() // Only `PendingHTLCRouting::Forward`s are intercepted
35293534
};
3535+
let skimmed_fee_msat =
3536+
payment.forward_info.outgoing_amt_msat.saturating_sub(amt_to_forward_msat);
35303537
let pending_htlc_info = PendingHTLCInfo {
3538+
skimmed_fee_msat: if skimmed_fee_msat == 0 { None } else { Some(skimmed_fee_msat) },
35313539
outgoing_amt_msat: amt_to_forward_msat, routing, ..payment.forward_info
35323540
};
35333541

@@ -3597,7 +3605,7 @@ where
35973605
prev_short_channel_id, prev_htlc_id, prev_funding_outpoint, prev_user_channel_id,
35983606
forward_info: PendingHTLCInfo {
35993607
routing, incoming_shared_secret, payment_hash, outgoing_amt_msat,
3600-
outgoing_cltv_value, incoming_amt_msat: _
3608+
outgoing_cltv_value, ..
36013609
}
36023610
}) => {
36033611
macro_rules! failure_handler {
@@ -3710,7 +3718,7 @@ where
37103718
prev_short_channel_id, prev_htlc_id, prev_funding_outpoint, prev_user_channel_id: _,
37113719
forward_info: PendingHTLCInfo {
37123720
incoming_shared_secret, payment_hash, outgoing_amt_msat, outgoing_cltv_value,
3713-
routing: PendingHTLCRouting::Forward { onion_packet, .. }, incoming_amt_msat: _,
3721+
routing: PendingHTLCRouting::Forward { onion_packet, .. }, ..
37143722
},
37153723
}) => {
37163724
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);
@@ -7508,6 +7516,7 @@ impl_writeable_tlv_based!(PendingHTLCInfo, {
75087516
(6, outgoing_amt_msat, required),
75097517
(8, outgoing_cltv_value, required),
75107518
(9, incoming_amt_msat, option),
7519+
(10, skimmed_fee_msat, option),
75117520
});
75127521

75137522

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
## Backwards Compat
2+
3+
* Forwarding less than the expected amount in `ChannelManager::forward_intercepted_htlc` may break
4+
compatibility with versions of LDK prior to 0.0.116

0 commit comments

Comments
 (0)