Skip to content

Commit df9a561

Browse files
committed
Remove i64 casts in ChannelContext::build_commitment_transaction
Instead of converting operands to `i64` and checking if the subtractions overflowed by checking if the `i64` is smaller than zero, we instead choose to do checked and saturating subtractions on the original unsigned integers.
1 parent d60cfda commit df9a561

File tree

1 file changed

+20
-19
lines changed

1 file changed

+20
-19
lines changed

lightning/src/ln/channel.rs

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3559,14 +3559,15 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
35593559
}
35603560
}
35613561

3562-
let value_to_self_msat: i64 = (funding.value_to_self_msat - local_htlc_total_msat) as i64 + value_to_self_msat_offset;
3563-
assert!(value_to_self_msat >= 0);
3562+
// TODO: When MSRV >= 1.66.0, use u64::checked_add_signed
3563+
let mut value_to_self_msat = u64::try_from(funding.value_to_self_msat as i64 + value_to_self_msat_offset).unwrap();
35643564
// Note that in case they have several just-awaiting-last-RAA fulfills in-progress (ie
35653565
// AwaitingRemoteRevokeToRemove or AwaitingRemovedRemoteRevoke) we may have allowed them to
3566-
// "violate" their reserve value by couting those against it. Thus, we have to convert
3567-
// everything to i64 before subtracting as otherwise we can overflow.
3568-
let value_to_remote_msat: i64 = (funding.channel_value_satoshis * 1000) as i64 - (funding.value_to_self_msat as i64) - (remote_htlc_total_msat as i64) - value_to_self_msat_offset;
3569-
assert!(value_to_remote_msat >= 0);
3566+
// "violate" their reserve value by couting those against it. Thus, we have to do checked subtraction
3567+
// as otherwise we can overflow.
3568+
let mut value_to_remote_msat = u64::checked_sub(funding.channel_value_satoshis * 1000, value_to_self_msat).unwrap();
3569+
value_to_self_msat = u64::checked_sub(value_to_self_msat, local_htlc_total_msat).unwrap();
3570+
value_to_remote_msat = u64::checked_sub(value_to_remote_msat, remote_htlc_total_msat).unwrap();
35703571

35713572
#[cfg(debug_assertions)]
35723573
{
@@ -3577,30 +3578,30 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
35773578
} else {
35783579
funding.counterparty_max_commitment_tx_output.lock().unwrap()
35793580
};
3580-
debug_assert!(broadcaster_max_commitment_tx_output.0 <= value_to_self_msat as u64 || value_to_self_msat / 1000 >= funding.counterparty_selected_channel_reserve_satoshis.unwrap() as i64);
3581-
broadcaster_max_commitment_tx_output.0 = cmp::max(broadcaster_max_commitment_tx_output.0, value_to_self_msat as u64);
3582-
debug_assert!(broadcaster_max_commitment_tx_output.1 <= value_to_remote_msat as u64 || value_to_remote_msat / 1000 >= funding.holder_selected_channel_reserve_satoshis as i64);
3583-
broadcaster_max_commitment_tx_output.1 = cmp::max(broadcaster_max_commitment_tx_output.1, value_to_remote_msat as u64);
3581+
debug_assert!(broadcaster_max_commitment_tx_output.0 <= value_to_self_msat || value_to_self_msat / 1000 >= funding.counterparty_selected_channel_reserve_satoshis.unwrap());
3582+
broadcaster_max_commitment_tx_output.0 = cmp::max(broadcaster_max_commitment_tx_output.0, value_to_self_msat);
3583+
debug_assert!(broadcaster_max_commitment_tx_output.1 <= value_to_remote_msat || value_to_remote_msat / 1000 >= funding.holder_selected_channel_reserve_satoshis);
3584+
broadcaster_max_commitment_tx_output.1 = cmp::max(broadcaster_max_commitment_tx_output.1, value_to_remote_msat);
35843585
}
35853586

35863587
let total_fee_sat = commit_tx_fee_sat(feerate_per_kw, included_non_dust_htlcs.len(), &self.channel_transaction_parameters.channel_type_features);
3587-
let anchors_val = if self.channel_transaction_parameters.channel_type_features.supports_anchors_zero_fee_htlc_tx() { ANCHOR_OUTPUT_VALUE_SATOSHI * 2 } else { 0 } as i64;
3588+
let anchors_val = if self.channel_transaction_parameters.channel_type_features.supports_anchors_zero_fee_htlc_tx() { ANCHOR_OUTPUT_VALUE_SATOSHI * 2 } else { 0 };
35883589
let (value_to_self, value_to_remote) = if self.is_outbound() {
3589-
(value_to_self_msat / 1000 - anchors_val - total_fee_sat as i64, value_to_remote_msat / 1000)
3590+
((value_to_self_msat / 1000).saturating_sub(anchors_val).saturating_sub(total_fee_sat), value_to_remote_msat / 1000)
35903591
} else {
3591-
(value_to_self_msat / 1000, value_to_remote_msat / 1000 - anchors_val - total_fee_sat as i64)
3592+
(value_to_self_msat / 1000, (value_to_remote_msat / 1000).saturating_sub(anchors_val).saturating_sub(total_fee_sat))
35923593
};
35933594

35943595
let mut value_to_a = if local { value_to_self } else { value_to_remote };
35953596
let mut value_to_b = if local { value_to_remote } else { value_to_self };
35963597

3597-
if value_to_a >= (broadcaster_dust_limit_satoshis as i64) {
3598+
if value_to_a >= broadcaster_dust_limit_satoshis {
35983599
log_trace!(logger, " ...including {} output with value {}", if local { "to_local" } else { "to_remote" }, value_to_a);
35993600
} else {
36003601
value_to_a = 0;
36013602
}
36023603

3603-
if value_to_b >= (broadcaster_dust_limit_satoshis as i64) {
3604+
if value_to_b >= broadcaster_dust_limit_satoshis {
36043605
log_trace!(logger, " ...including {} output with value {}", if local { "to_remote" } else { "to_local" }, value_to_b);
36053606
} else {
36063607
value_to_b = 0;
@@ -3613,8 +3614,8 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
36133614
else { self.channel_transaction_parameters.as_counterparty_broadcastable() };
36143615
let tx = CommitmentTransaction::new(commitment_number,
36153616
&per_commitment_point,
3616-
value_to_a as u64,
3617-
value_to_b as u64,
3617+
value_to_a,
3618+
value_to_b,
36183619
feerate_per_kw,
36193620
included_non_dust_htlcs.iter_mut().map(|(htlc, _)| htlc),
36203621
&channel_parameters,
@@ -3631,8 +3632,8 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
36313632
total_fee_sat,
36323633
num_nondust_htlcs,
36333634
htlcs_included,
3634-
local_balance_msat: value_to_self_msat as u64,
3635-
remote_balance_msat: value_to_remote_msat as u64,
3635+
local_balance_msat: value_to_self_msat,
3636+
remote_balance_msat: value_to_remote_msat,
36363637
inbound_htlc_preimages,
36373638
outbound_htlc_preimages,
36383639
}

0 commit comments

Comments
 (0)