@@ -8138,7 +8138,21 @@ impl<SP: Deref> FundedChannel<SP> where
8138
8138
}
8139
8139
8140
8140
let dust_exposure_limiting_feerate = self.context.get_dust_exposure_limiting_feerate(&fee_estimator);
8141
- let htlc_stats = self.context.get_pending_htlc_stats(&self.funding, None, dust_exposure_limiting_feerate);
8141
+
8142
+ core::iter::once(&self.funding)
8143
+ .chain(self.pending_funding.iter())
8144
+ .map(|funding| self.can_accept_incoming_htlc_for_funding(funding, msg, dust_exposure_limiting_feerate, &logger))
8145
+ .collect::<Result<(), LocalHTLCFailureReason>>()
8146
+ }
8147
+
8148
+ fn can_accept_incoming_htlc_for_funding<L: Deref>(
8149
+ &self, funding: &FundingScope, msg: &msgs::UpdateAddHTLC,
8150
+ dust_exposure_limiting_feerate: u32, logger: &L,
8151
+ ) -> Result<(), LocalHTLCFailureReason>
8152
+ where
8153
+ L::Target: Logger,
8154
+ {
8155
+ let htlc_stats = self.context.get_pending_htlc_stats(funding, None, dust_exposure_limiting_feerate);
8142
8156
let max_dust_htlc_exposure_msat = self.context.get_max_dust_htlc_exposure_msat(dust_exposure_limiting_feerate);
8143
8157
let on_counterparty_tx_dust_htlc_exposure_msat = htlc_stats.on_counterparty_tx_dust_exposure_msat;
8144
8158
if on_counterparty_tx_dust_htlc_exposure_msat > max_dust_htlc_exposure_msat {
@@ -8147,11 +8161,11 @@ impl<SP: Deref> FundedChannel<SP> where
8147
8161
on_counterparty_tx_dust_htlc_exposure_msat, max_dust_htlc_exposure_msat);
8148
8162
return Err(LocalHTLCFailureReason::DustLimitCounterparty)
8149
8163
}
8150
- let htlc_success_dust_limit = if self. funding.get_channel_type().supports_anchors_zero_fee_htlc_tx() {
8164
+ let htlc_success_dust_limit = if funding.get_channel_type().supports_anchors_zero_fee_htlc_tx() {
8151
8165
0
8152
8166
} else {
8153
8167
let dust_buffer_feerate = self.context.get_dust_buffer_feerate(None) as u64;
8154
- dust_buffer_feerate * htlc_success_tx_weight(self. funding.get_channel_type()) / 1000
8168
+ dust_buffer_feerate * htlc_success_tx_weight(funding.get_channel_type()) / 1000
8155
8169
};
8156
8170
let exposure_dust_limit_success_sats = htlc_success_dust_limit + self.context.holder_dust_limit_satoshis;
8157
8171
if msg.amount_msat / 1000 < exposure_dust_limit_success_sats {
@@ -8163,7 +8177,7 @@ impl<SP: Deref> FundedChannel<SP> where
8163
8177
}
8164
8178
}
8165
8179
8166
- let anchor_outputs_value_msat = if self. funding.get_channel_type().supports_anchors_zero_fee_htlc_tx() {
8180
+ let anchor_outputs_value_msat = if funding.get_channel_type().supports_anchors_zero_fee_htlc_tx() {
8167
8181
ANCHOR_OUTPUT_VALUE_SATOSHI * 2 * 1000
8168
8182
} else {
8169
8183
0
@@ -8179,23 +8193,23 @@ impl<SP: Deref> FundedChannel<SP> where
8179
8193
}
8180
8194
8181
8195
let pending_value_to_self_msat =
8182
- self. funding.value_to_self_msat + htlc_stats.pending_inbound_htlcs_value_msat - removed_outbound_total_msat;
8196
+ funding.value_to_self_msat + htlc_stats.pending_inbound_htlcs_value_msat - removed_outbound_total_msat;
8183
8197
let pending_remote_value_msat =
8184
- self. funding.get_value_satoshis() * 1000 - pending_value_to_self_msat;
8198
+ funding.get_value_satoshis() * 1000 - pending_value_to_self_msat;
8185
8199
8186
- if !self. funding.is_outbound() {
8200
+ if !funding.is_outbound() {
8187
8201
// `Some(())` is for the fee spike buffer we keep for the remote. This deviates from
8188
8202
// the spec because the fee spike buffer requirement doesn't exist on the receiver's
8189
8203
// side, only on the sender's. Note that with anchor outputs we are no longer as
8190
8204
// sensitive to fee spikes, so we need to account for them.
8191
8205
//
8192
8206
// A `None` `HTLCCandidate` is used as in this case because we're already accounting for
8193
8207
// the incoming HTLC as it has been fully committed by both sides.
8194
- let mut remote_fee_cost_incl_stuck_buffer_msat = self.context.next_remote_commit_tx_fee_msat(&self. funding, None, Some(()));
8195
- if !self. funding.get_channel_type().supports_anchors_zero_fee_htlc_tx() {
8208
+ let mut remote_fee_cost_incl_stuck_buffer_msat = self.context.next_remote_commit_tx_fee_msat(funding, None, Some(()));
8209
+ if !funding.get_channel_type().supports_anchors_zero_fee_htlc_tx() {
8196
8210
remote_fee_cost_incl_stuck_buffer_msat *= FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE;
8197
8211
}
8198
- if pending_remote_value_msat.saturating_sub(self. funding.holder_selected_channel_reserve_satoshis * 1000).saturating_sub(anchor_outputs_value_msat) < remote_fee_cost_incl_stuck_buffer_msat {
8212
+ if pending_remote_value_msat.saturating_sub(funding.holder_selected_channel_reserve_satoshis * 1000).saturating_sub(anchor_outputs_value_msat) < remote_fee_cost_incl_stuck_buffer_msat {
8199
8213
log_info!(logger, "Attempting to fail HTLC due to fee spike buffer violation in channel {}. Rebalancing is required.", &self.context.channel_id());
8200
8214
return Err(LocalHTLCFailureReason::FeeSpikeBuffer);
8201
8215
}
0 commit comments