Skip to content

Commit 3b81c9c

Browse files
committed
Consider fees and anchor in balances when checking reserve requirements
1 parent 52cecb4 commit 3b81c9c

File tree

1 file changed

+78
-5
lines changed

1 file changed

+78
-5
lines changed

lightning/src/ln/channel.rs

Lines changed: 78 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)