@@ -10851,9 +10851,10 @@ where
10851
10851
})
10852
10852
}
10853
10853
10854
- /// Compute the channel balances (local & remote) by taking into account fees, anchor values, and dust limits.
10854
+ /// Compute the channel balances (local & remote, in msats) by taking into account fees,
10855
+ // anchor values, and dust limits.
10855
10856
/// Pending HTLCs are not taken into account, this method should be used when there is no such,
10856
- /// e.g. in quiscence state
10857
+ /// e.g. in quiescence state
10857
10858
#[cfg(splicing)]
10858
10859
fn compute_balances_less_fees(
10859
10860
&self, channel_value_sats: u64, value_to_self_msat: u64, is_local: bool,
@@ -10869,12 +10870,12 @@ where
10869
10870
((channel_value_sats * 1000) as i64).saturating_sub(value_to_self_msat as i64);
10870
10871
debug_assert!(value_to_remote_msat >= 0);
10871
10872
10872
- let total_fee_sat = SpecTxBuilder {}.commit_tx_fee_sat(
10873
+ let total_fee_sats = SpecTxBuilder {}.commit_tx_fee_sat(
10873
10874
feerate_per_kw,
10874
10875
0,
10875
10876
&self.funding.channel_transaction_parameters.channel_type_features,
10876
10877
);
10877
- let anchors_val = if self
10878
+ let anchors_val_sats = if self
10878
10879
.funding
10879
10880
.channel_transaction_parameters
10880
10881
.channel_type_features
@@ -10886,34 +10887,37 @@ where
10886
10887
} as i64;
10887
10888
10888
10889
// consider fees and anchor values
10889
- let (mut value_to_self, mut value_to_remote) = if self.funding.is_outbound() {
10890
+ let (mut new_value_to_self_msat, mut new_value_to_remote_msat) = if self
10891
+ .funding
10892
+ .is_outbound()
10893
+ {
10890
10894
(
10891
- ( value_to_self_msat as i64) / 1000 - anchors_val - total_fee_sat as i64,
10892
- value_to_remote_msat / 1000 ,
10895
+ value_to_self_msat as i64 - anchors_val_sats * 1000 - total_fee_sats as i64 * 1000 ,
10896
+ value_to_remote_msat,
10893
10897
)
10894
10898
} else {
10895
10899
(
10896
- ( value_to_self_msat as i64) / 1000 ,
10897
- value_to_remote_msat / 1000 - anchors_val - total_fee_sat as i64,
10900
+ value_to_self_msat as i64,
10901
+ value_to_remote_msat - anchors_val_sats * 1000 - total_fee_sats as i64 * 1000 ,
10898
10902
)
10899
10903
};
10900
10904
10901
10905
// consider dust limit
10902
- let broadcaster_dust_limit_satoshis = if is_local {
10906
+ let broadcaster_dust_limit_sats = if is_local {
10903
10907
self.context.holder_dust_limit_satoshis
10904
10908
} else {
10905
10909
self.context.counterparty_dust_limit_satoshis
10906
10910
} as i64;
10907
- if value_to_self < broadcaster_dust_limit_satoshis {
10908
- value_to_self = 0;
10911
+ if new_value_to_self_msat < (broadcaster_dust_limit_sats * 1000) {
10912
+ new_value_to_self_msat = 0;
10909
10913
}
10910
- debug_assert!(value_to_self >= 0);
10911
- if value_to_remote < broadcaster_dust_limit_satoshis {
10912
- value_to_remote = 0;
10914
+ debug_assert!(new_value_to_self_msat >= 0);
10915
+ if new_value_to_remote_msat < (broadcaster_dust_limit_sats * 1000) {
10916
+ new_value_to_remote_msat = 0;
10913
10917
}
10914
- debug_assert!(value_to_remote >= 0);
10918
+ debug_assert!(new_value_to_remote_msat >= 0);
10915
10919
10916
- (value_to_self as u64, value_to_remote as u64)
10920
+ (new_value_to_self_msat as u64, new_value_to_remote_msat as u64)
10917
10921
}
10918
10922
10919
10923
/// Handle splice_ack
@@ -10973,27 +10977,29 @@ where
10973
10977
10974
10978
// Pre-check for reserve requirement
10975
10979
// (Note: It should also be checked later at tx_complete)
10976
- let pre_channel_value = self.funding.get_value_satoshis();
10977
- let post_channel_value = self.funding.compute_post_splice_value(
10980
+ let pre_channel_value_sats = self.funding.get_value_satoshis();
10981
+ let post_channel_value_sats = self.funding.compute_post_splice_value(
10978
10982
our_funding_contribution_satoshis,
10979
10983
their_funding_contribution_satoshis,
10980
10984
);
10981
- let pre_balance_self = self.funding.value_to_self_msat;
10982
- let post_balance_self =
10983
- PendingSplice::add_checked(pre_balance_self, our_funding_contribution_satoshis);
10984
- let (pre_balance_self_less_fees, pre_balance_counterparty_less_fees) =
10985
- self.compute_balances_less_fees(pre_channel_value, pre_balance_self, true);
10986
- let (post_balance_self_less_fees, post_balance_counterparty_less_fees) =
10987
- self.compute_balances_less_fees(post_channel_value, post_balance_self, true);
10985
+ let pre_balance_self_msat = self.funding.value_to_self_msat;
10986
+ let post_balance_self_msat = PendingSplice::add_checked(
10987
+ pre_balance_self_msat,
10988
+ our_funding_contribution_satoshis * 1000,
10989
+ );
10990
+ let (pre_balance_self_less_fees_msat, pre_balance_counterparty_less_fees_msat) =
10991
+ self.compute_balances_less_fees(pre_channel_value_sats, pre_balance_self_msat, true);
10992
+ let (post_balance_self_less_fees_msat, post_balance_counterparty_less_fees_msat) =
10993
+ self.compute_balances_less_fees(post_channel_value_sats, post_balance_self_msat, true);
10988
10994
// Pre-check for reserve requirement
10989
10995
// This will also be checked later at tx_complete
10990
10996
let _res = self.check_splice_balances_meet_v2_reserve_requirements(
10991
- pre_balance_self_less_fees ,
10992
- post_balance_self_less_fees ,
10993
- pre_balance_counterparty_less_fees ,
10994
- post_balance_counterparty_less_fees ,
10995
- pre_channel_value ,
10996
- post_channel_value ,
10997
+ pre_balance_self_less_fees_msat ,
10998
+ post_balance_self_less_fees_msat ,
10999
+ pre_balance_counterparty_less_fees_msat ,
11000
+ post_balance_counterparty_less_fees_msat ,
11001
+ pre_channel_value_sats ,
11002
+ post_channel_value_sats ,
10997
11003
)?;
10998
11004
10999
11005
log_info!(
@@ -11086,59 +11092,58 @@ where
11086
11092
))
11087
11093
}
11088
11094
11089
- /// Check that post-splicing balance meets reserve requirements, but only if it met it pre-splice as well
11090
11095
/// Check that post-splicing balance meets reserve requirements, but only if it met it pre-splice as well.
11091
- /// Returns the minimum channel reserve ( sats)
11096
+ /// In case of error, it returns the minimum channel reserve that was violated (in sats)
11092
11097
#[cfg(splicing)]
11093
- pub fn check_splice_balance_meets_v2_reserve_requirement_noerr (
11094
- &self, pre_balance : u64, post_balance : u64, pre_channel_value : u64,
11095
- post_channel_value : u64, dust_limit : u64,
11098
+ pub fn check_splice_balance_meets_v2_reserve_requirement (
11099
+ &self, pre_balance_msat : u64, post_balance_msat : u64, pre_channel_value_sats : u64,
11100
+ post_channel_value_sats : u64, dust_limit_sats : u64,
11096
11101
) -> Result<(), u64> {
11097
11102
let post_channel_reserve_sats =
11098
- get_v2_channel_reserve_satoshis(post_channel_value, dust_limit );
11099
- if post_balance >= post_channel_reserve_sats * 1000 {
11103
+ get_v2_channel_reserve_satoshis(post_channel_value_sats, dust_limit_sats );
11104
+ if post_balance_msat >= ( post_channel_reserve_sats * 1000) {
11100
11105
return Ok(());
11101
11106
}
11102
11107
// We're not allowed to dip below the reserve once we've been above,
11103
11108
// check differently for originally v1 and v2 channels
11104
11109
if self.is_v2_established() {
11105
11110
let pre_channel_reserve_sats =
11106
- get_v2_channel_reserve_satoshis(pre_channel_value, dust_limit );
11107
- if pre_balance >= pre_channel_reserve_sats * 1000 {
11111
+ get_v2_channel_reserve_satoshis(pre_channel_value_sats, dust_limit_sats );
11112
+ if pre_balance_msat >= ( pre_channel_reserve_sats * 1000) {
11108
11113
return Err(post_channel_reserve_sats);
11109
11114
}
11110
11115
} else {
11111
- if pre_balance >= self.funding.holder_selected_channel_reserve_satoshis * 1000 {
11116
+ if pre_balance_msat >= ( self.funding.holder_selected_channel_reserve_satoshis * 1000) {
11112
11117
return Err(post_channel_reserve_sats);
11113
11118
}
11114
11119
if let Some(cp_reserve) = self.funding.counterparty_selected_channel_reserve_satoshis {
11115
- if pre_balance >= cp_reserve * 1000 {
11120
+ if pre_balance_msat >= ( cp_reserve * 1000) {
11116
11121
return Err(post_channel_reserve_sats);
11117
11122
}
11118
11123
}
11119
11124
}
11120
11125
// Make sure we either remain with the same balance or move towards the reserve.
11121
- if post_balance >= pre_balance {
11126
+ if post_balance_msat >= pre_balance_msat {
11122
11127
Ok(())
11123
11128
} else {
11124
11129
Err(post_channel_reserve_sats)
11125
11130
}
11126
11131
}
11127
11132
11128
- /// Check that balances meet the channel reserve requirements or violates them (below reserve).
11133
+ /// Check that balances (self and counterparty) meet the channel reserve requirements or violates them (below reserve).
11129
11134
/// The channel value is an input as opposed to using from the FundingScope, so that this can be used in case of splicing
11130
11135
/// to check with new channel value (before being committed to it).
11131
11136
#[cfg(splicing)]
11132
11137
pub fn check_splice_balances_meet_v2_reserve_requirements(
11133
11138
&self, self_balance_pre_msat: u64, self_balance_post_msat: u64,
11134
11139
counterparty_balance_pre_msat: u64, counterparty_balance_post_msat: u64,
11135
- channel_value_pre : u64, channel_value_post : u64,
11140
+ channel_value_pre_sats : u64, channel_value_post_sats : u64,
11136
11141
) -> Result<(), ChannelError> {
11137
- let is_ok_self = self.check_splice_balance_meets_v2_reserve_requirement_noerr (
11142
+ let is_ok_self = self.check_splice_balance_meets_v2_reserve_requirement (
11138
11143
self_balance_pre_msat,
11139
11144
self_balance_post_msat,
11140
- channel_value_pre ,
11141
- channel_value_post ,
11145
+ channel_value_pre_sats ,
11146
+ channel_value_post_sats ,
11142
11147
self.context.holder_dust_limit_satoshis,
11143
11148
);
11144
11149
if let Err(channel_reserve_self) = is_ok_self {
@@ -11147,11 +11152,11 @@ where
11147
11152
self_balance_post_msat, channel_reserve_self,
11148
11153
)));
11149
11154
}
11150
- let is_ok_cp = self.check_splice_balance_meets_v2_reserve_requirement_noerr (
11155
+ let is_ok_cp = self.check_splice_balance_meets_v2_reserve_requirement (
11151
11156
counterparty_balance_pre_msat,
11152
11157
counterparty_balance_post_msat,
11153
- channel_value_pre ,
11154
- channel_value_post ,
11158
+ channel_value_pre_sats ,
11159
+ channel_value_post_sats ,
11155
11160
self.context.counterparty_dust_limit_satoshis,
11156
11161
);
11157
11162
if let Err(channel_reserve_cp) = is_ok_cp {
0 commit comments