@@ -8610,6 +8610,43 @@ impl<SP: Deref> FundedChannel<SP> where
8610
8610
Ok(splice_ack_msg)
8611
8611
}
8612
8612
8613
+ /// Compute the channel balances (local & remote) by taking into account fees, anchor values, and dust limits.
8614
+ #[cfg(splicing)]
8615
+ fn compute_balances_less_fees(&self, channel_value_sats: u64, value_to_self_msat: u64, is_local: bool) -> (u64, u64) {
8616
+ let feerate_per_kw = self.context.feerate_per_kw;
8617
+
8618
+ // compute 'raw' counterparty balance
8619
+ let value_to_remote_msat: i64 = ((channel_value_sats * 1000) as i64).saturating_sub(value_to_self_msat as i64);
8620
+ debug_assert!(value_to_remote_msat >= 0);
8621
+
8622
+ let total_fee_sat = commit_tx_fee_sat(feerate_per_kw, 0, &self.funding.channel_transaction_parameters.channel_type_features);
8623
+ let anchors_val = if self.funding.channel_transaction_parameters.channel_type_features.supports_anchors_zero_fee_htlc_tx() { ANCHOR_OUTPUT_VALUE_SATOSHI * 2 } else { 0 } as i64;
8624
+
8625
+ // consider fees and anchor values
8626
+ let (mut value_to_self, mut value_to_remote) = if self.funding.is_outbound() {
8627
+ ((value_to_self_msat as i64) / 1000 - anchors_val - total_fee_sat as i64, value_to_remote_msat / 1000)
8628
+ } else {
8629
+ ((value_to_self_msat as i64) / 1000, value_to_remote_msat / 1000 - anchors_val - total_fee_sat as i64)
8630
+ };
8631
+
8632
+ // consider dust limit
8633
+ let broadcaster_dust_limit_satoshis = if is_local {
8634
+ self.context.holder_dust_limit_satoshis
8635
+ } else {
8636
+ self.context.counterparty_dust_limit_satoshis
8637
+ } as i64;
8638
+ if value_to_self < broadcaster_dust_limit_satoshis {
8639
+ value_to_self = 0;
8640
+ }
8641
+ debug_assert!(value_to_self >= 0);
8642
+ if value_to_remote < broadcaster_dust_limit_satoshis {
8643
+ value_to_remote = 0;
8644
+ }
8645
+ debug_assert!(value_to_remote >= 0);
8646
+
8647
+ (value_to_self as u64, value_to_remote as u64)
8648
+ }
8649
+
8613
8650
/// Handle splice_ack
8614
8651
#[cfg(splicing)]
8615
8652
pub fn splice_ack(&mut self, msg: &msgs::SpliceAck) -> Result<(), ChannelError> {
@@ -8629,11 +8666,15 @@ impl<SP: Deref> FundedChannel<SP> where
8629
8666
let post_channel_value = PendingSplice::compute_post_value(pre_channel_value, our_funding_contribution, their_funding_contribution_satoshis);
8630
8667
let pre_balance_self = self.funding.value_to_self_msat;
8631
8668
let post_balance_self = PendingSplice::add_checked(pre_balance_self, our_funding_contribution);
8632
- let pre_balance_counterparty = pre_channel_value.saturating_sub( pre_balance_self);
8633
- let post_balance_counterparty = post_channel_value.saturating_sub( post_balance_self);
8669
+ let (pre_balance_self_less_fees, pre_balance_counterparty_less_fees) = self.compute_balances_less_fees(pre_channel_value, pre_balance_self, true );
8670
+ let (post_balance_self_less_fees, post_balance_counterparty_less_fees) = self.compute_balances_less_fees(post_channel_value, post_balance_self, true );
8634
8671
// Pre-check for reserve requirement
8635
8672
// This will also be checked later at tx_complete
8636
- let _res = self.context.check_splice_balances_meet_v2_reserve_requirements(pre_balance_self, post_balance_self, pre_balance_counterparty, post_balance_counterparty, pre_channel_value, post_channel_value)?;
8673
+ let _res = self.context.check_splice_balances_meet_v2_reserve_requirements(
8674
+ pre_balance_self_less_fees, post_balance_self_less_fees,
8675
+ pre_balance_counterparty_less_fees, post_balance_counterparty_less_fees,
8676
+ pre_channel_value, post_channel_value
8677
+ )?;
8637
8678
Ok(())
8638
8679
}
8639
8680
0 commit comments