@@ -10602,6 +10602,65 @@ where
1060210602 Ok(splice_ack_msg)
1060310603 }
1060410604
10605+ /// Compute the channel balances (local & remote) by taking into account fees, anchor values, and dust limits.
10606+ #[cfg(splicing)]
10607+ fn compute_balances_less_fees(
10608+ &self, channel_value_sats: u64, value_to_self_msat: u64, is_local: bool,
10609+ ) -> (u64, u64) {
10610+ let feerate_per_kw = self.context.feerate_per_kw;
10611+
10612+ // compute 'raw' counterparty balance
10613+ let value_to_remote_msat: i64 =
10614+ ((channel_value_sats * 1000) as i64).saturating_sub(value_to_self_msat as i64);
10615+ debug_assert!(value_to_remote_msat >= 0);
10616+
10617+ let total_fee_sat = SpecTxBuilder {}.commit_tx_fee_sat(
10618+ feerate_per_kw,
10619+ 0,
10620+ &self.funding.channel_transaction_parameters.channel_type_features,
10621+ );
10622+ let anchors_val = if self
10623+ .funding
10624+ .channel_transaction_parameters
10625+ .channel_type_features
10626+ .supports_anchors_zero_fee_htlc_tx()
10627+ {
10628+ ANCHOR_OUTPUT_VALUE_SATOSHI * 2
10629+ } else {
10630+ 0
10631+ } as i64;
10632+
10633+ // consider fees and anchor values
10634+ let (mut value_to_self, mut value_to_remote) = if self.funding.is_outbound() {
10635+ (
10636+ (value_to_self_msat as i64) / 1000 - anchors_val - total_fee_sat as i64,
10637+ value_to_remote_msat / 1000,
10638+ )
10639+ } else {
10640+ (
10641+ (value_to_self_msat as i64) / 1000,
10642+ value_to_remote_msat / 1000 - anchors_val - total_fee_sat as i64,
10643+ )
10644+ };
10645+
10646+ // consider dust limit
10647+ let broadcaster_dust_limit_satoshis = if is_local {
10648+ self.context.holder_dust_limit_satoshis
10649+ } else {
10650+ self.context.counterparty_dust_limit_satoshis
10651+ } as i64;
10652+ if value_to_self < broadcaster_dust_limit_satoshis {
10653+ value_to_self = 0;
10654+ }
10655+ debug_assert!(value_to_self >= 0);
10656+ if value_to_remote < broadcaster_dust_limit_satoshis {
10657+ value_to_remote = 0;
10658+ }
10659+ debug_assert!(value_to_remote >= 0);
10660+
10661+ (value_to_self as u64, value_to_remote as u64)
10662+ }
10663+
1060510664 /// Handle splice_ack
1060610665 #[cfg(splicing)]
1060710666 pub fn splice_ack(&mut self, msg: &msgs::SpliceAck) -> Result<(), ChannelError> {
@@ -10618,14 +10677,28 @@ where
1061810677 let their_funding_contribution_satoshis = msg.funding_contribution_satoshis;
1061910678
1062010679 let pre_channel_value = self.funding.get_value_satoshis();
10621- let post_channel_value = PendingSplice::compute_post_value(pre_channel_value, our_funding_contribution, their_funding_contribution_satoshis);
10680+ let post_channel_value = PendingSplice::compute_post_value(
10681+ pre_channel_value,
10682+ our_funding_contribution,
10683+ their_funding_contribution_satoshis,
10684+ );
1062210685 let pre_balance_self = self.funding.value_to_self_msat;
10623- let post_balance_self = PendingSplice::add_checked(pre_balance_self, our_funding_contribution);
10624- let pre_balance_counterparty = pre_channel_value.saturating_sub(pre_balance_self);
10625- let post_balance_counterparty = post_channel_value.saturating_sub(post_balance_self);
10686+ let post_balance_self =
10687+ PendingSplice::add_checked(pre_balance_self, our_funding_contribution);
10688+ let (pre_balance_self_less_fees, pre_balance_counterparty_less_fees) =
10689+ self.compute_balances_less_fees(pre_channel_value, pre_balance_self, true);
10690+ let (post_balance_self_less_fees, post_balance_counterparty_less_fees) =
10691+ self.compute_balances_less_fees(post_channel_value, post_balance_self, true);
1062610692 // Pre-check for reserve requirement
1062710693 // This will also be checked later at tx_complete
10628- 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)?;
10694+ let _res = self.context.check_splice_balances_meet_v2_reserve_requirements(
10695+ pre_balance_self_less_fees,
10696+ post_balance_self_less_fees,
10697+ pre_balance_counterparty_less_fees,
10698+ post_balance_counterparty_less_fees,
10699+ pre_channel_value,
10700+ post_channel_value,
10701+ )?;
1062910702 Ok(())
1063010703 }
1063110704
0 commit comments