@@ -10602,6 +10602,65 @@ where
10602
10602
Ok(splice_ack_msg)
10603
10603
}
10604
10604
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
+
10605
10664
/// Handle splice_ack
10606
10665
#[cfg(splicing)]
10607
10666
pub fn splice_ack(&mut self, msg: &msgs::SpliceAck) -> Result<(), ChannelError> {
@@ -10618,14 +10677,28 @@ where
10618
10677
let their_funding_contribution_satoshis = msg.funding_contribution_satoshis;
10619
10678
10620
10679
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
+ );
10622
10685
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);
10626
10692
// Pre-check for reserve requirement
10627
10693
// 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
+ )?;
10629
10702
Ok(())
10630
10703
}
10631
10704
0 commit comments