Skip to content

Commit 52f2901

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 85a5b31 commit 52f2901

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

lightning/src/events/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,7 @@ pub enum Event {
623623
inbound_amount_msat: u64,
624624
/// How many msats the payer intended to route to the next node. Depending on the reason you are
625625
/// intercepting this payment, you might take a fee by forwarding less than this amount.
626+
/// Forwarding less than this amount may break compatibility with LDK versions prior to 0.0.116.
626627
///
627628
/// Note that LDK will NOT check that expected fees were factored into this value. You MUST
628629
/// check that whatever fee you want has been included here or subtract it as required. Further,

lightning/src/ln/channelmanager.rs

Lines changed: 15 additions & 3 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
@@ -2616,6 +2619,7 @@ where
26162619
incoming_amt_msat: Some(amt_msat),
26172620
outgoing_amt_msat: hop_data.amt_to_forward,
26182621
outgoing_cltv_value: hop_data.outgoing_cltv_value,
2622+
skimmed_fee_msat: None,
26192623
})
26202624
}
26212625

@@ -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
}
@@ -3485,13 +3490,16 @@ where
34853490
/// [`ChannelManager::fail_intercepted_htlc`] MUST be called in response to the event.
34863491
///
34873492
/// Note that LDK does not enforce fee requirements in `amt_to_forward_msat`, and will not stop
3488-
/// you from forwarding more than you received.
3493+
/// you from forwarding more than you received. See
3494+
/// [`HTLCIntercepted::expected_outbound_amount_msat`] for more on forwarding a different amount
3495+
/// than expected.
34893496
///
34903497
/// Errors if the event was not handled in time, in which case the HTLC was automatically failed
34913498
/// backwards.
34923499
///
34933500
/// [`UserConfig::accept_intercept_htlcs`]: crate::util::config::UserConfig::accept_intercept_htlcs
34943501
/// [`HTLCIntercepted`]: events::Event::HTLCIntercepted
3502+
/// [`HTLCIntercepted::expected_outbound_amount_msat`]: events::Event::HTLCIntercepted::expected_outbound_amount_msat
34953503
// TODO: when we move to deciding the best outbound channel at forward time, only take
34963504
// `next_node_id` and not `next_hop_channel_id`
34973505
pub fn forward_intercepted_htlc(&self, intercept_id: InterceptId, next_hop_channel_id: &[u8; 32], next_node_id: PublicKey, amt_to_forward_msat: u64) -> Result<(), APIError> {
@@ -3530,7 +3538,10 @@ where
35303538
},
35313539
_ => unreachable!() // Only `PendingHTLCRouting::Forward`s are intercepted
35323540
};
3541+
let skimmed_fee_msat =
3542+
payment.forward_info.outgoing_amt_msat.saturating_sub(amt_to_forward_msat);
35333543
let pending_htlc_info = PendingHTLCInfo {
3544+
skimmed_fee_msat: if skimmed_fee_msat == 0 { None } else { Some(skimmed_fee_msat) },
35343545
outgoing_amt_msat: amt_to_forward_msat, routing, ..payment.forward_info
35353546
};
35363547

@@ -3600,7 +3611,7 @@ where
36003611
prev_short_channel_id, prev_htlc_id, prev_funding_outpoint, prev_user_channel_id,
36013612
forward_info: PendingHTLCInfo {
36023613
routing, incoming_shared_secret, payment_hash, outgoing_amt_msat,
3603-
outgoing_cltv_value, incoming_amt_msat: _
3614+
outgoing_cltv_value, ..
36043615
}
36053616
}) => {
36063617
macro_rules! failure_handler {
@@ -3713,7 +3724,7 @@ where
37133724
prev_short_channel_id, prev_htlc_id, prev_funding_outpoint, prev_user_channel_id: _,
37143725
forward_info: PendingHTLCInfo {
37153726
incoming_shared_secret, payment_hash, outgoing_amt_msat, outgoing_cltv_value,
3716-
routing: PendingHTLCRouting::Forward { onion_packet, .. }, incoming_amt_msat: _,
3727+
routing: PendingHTLCRouting::Forward { onion_packet, .. }, ..
37173728
},
37183729
}) => {
37193730
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);
@@ -7448,6 +7459,7 @@ impl_writeable_tlv_based!(PendingHTLCInfo, {
74487459
(6, outgoing_amt_msat, required),
74497460
(8, outgoing_cltv_value, required),
74507461
(9, incoming_amt_msat, option),
7462+
(10, skimmed_fee_msat, option),
74517463
});
74527464

74537465

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)