Skip to content

Commit 9a5e774

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 305ddb4 commit 9a5e774

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
@@ -3607,14 +3607,15 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
36073607
}
36083608
}
36093609

3610-
let value_to_self_msat: i64 = (funding.value_to_self_msat - local_htlc_total_msat) as i64 + value_to_self_msat_offset;
3611-
assert!(value_to_self_msat >= 0);
3610+
// TODO: When MSRV >= 1.66.0, use u64::checked_add_signed
3611+
let mut value_to_self_msat = u64::try_from(funding.value_to_self_msat as i64 + value_to_self_msat_offset).unwrap();
36123612
// Note that in case they have several just-awaiting-last-RAA fulfills in-progress (ie
36133613
// AwaitingRemoteRevokeToRemove or AwaitingRemovedRemoteRevoke) we may have allowed them to
3614-
// "violate" their reserve value by couting those against it. Thus, we have to convert
3615-
// everything to i64 before subtracting as otherwise we can overflow.
3616-
let value_to_remote_msat: i64 = (funding.get_value_satoshis() * 1000) as i64 - (funding.value_to_self_msat as i64) - (remote_htlc_total_msat as i64) - value_to_self_msat_offset;
3617-
assert!(value_to_remote_msat >= 0);
3614+
// "violate" their reserve value by couting those against it. Thus, we have to do checked subtraction
3615+
// as otherwise we can overflow.
3616+
let mut value_to_remote_msat = u64::checked_sub(funding.get_value_satoshis() * 1000, value_to_self_msat).unwrap();
3617+
value_to_self_msat = u64::checked_sub(value_to_self_msat, local_htlc_total_msat).unwrap();
3618+
value_to_remote_msat = u64::checked_sub(value_to_remote_msat, remote_htlc_total_msat).unwrap();
36183619

36193620
#[cfg(debug_assertions)]
36203621
{
@@ -3625,30 +3626,30 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
36253626
} else {
36263627
funding.counterparty_max_commitment_tx_output.lock().unwrap()
36273628
};
3628-
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);
3629-
broadcaster_max_commitment_tx_output.0 = cmp::max(broadcaster_max_commitment_tx_output.0, value_to_self_msat as u64);
3630-
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);
3631-
broadcaster_max_commitment_tx_output.1 = cmp::max(broadcaster_max_commitment_tx_output.1, value_to_remote_msat as u64);
3629+
debug_assert!(broadcaster_max_commitment_tx_output.0 <= value_to_self_msat || value_to_self_msat / 1000 >= funding.counterparty_selected_channel_reserve_satoshis.unwrap());
3630+
broadcaster_max_commitment_tx_output.0 = cmp::max(broadcaster_max_commitment_tx_output.0, value_to_self_msat);
3631+
debug_assert!(broadcaster_max_commitment_tx_output.1 <= value_to_remote_msat || value_to_remote_msat / 1000 >= funding.holder_selected_channel_reserve_satoshis);
3632+
broadcaster_max_commitment_tx_output.1 = cmp::max(broadcaster_max_commitment_tx_output.1, value_to_remote_msat);
36323633
}
36333634

36343635
let total_fee_sat = commit_tx_fee_sat(feerate_per_kw, included_non_dust_htlcs.len(), &funding.channel_transaction_parameters.channel_type_features);
3635-
let anchors_val = if funding.channel_transaction_parameters.channel_type_features.supports_anchors_zero_fee_htlc_tx() { ANCHOR_OUTPUT_VALUE_SATOSHI * 2 } else { 0 } as i64;
3636+
let anchors_val = if funding.channel_transaction_parameters.channel_type_features.supports_anchors_zero_fee_htlc_tx() { ANCHOR_OUTPUT_VALUE_SATOSHI * 2 } else { 0 };
36363637
let (value_to_self, value_to_remote) = if funding.is_outbound() {
3637-
(value_to_self_msat / 1000 - anchors_val - total_fee_sat as i64, value_to_remote_msat / 1000)
3638+
((value_to_self_msat / 1000).saturating_sub(anchors_val).saturating_sub(total_fee_sat), value_to_remote_msat / 1000)
36383639
} else {
3639-
(value_to_self_msat / 1000, value_to_remote_msat / 1000 - anchors_val - total_fee_sat as i64)
3640+
(value_to_self_msat / 1000, (value_to_remote_msat / 1000).saturating_sub(anchors_val).saturating_sub(total_fee_sat))
36403641
};
36413642

36423643
let mut value_to_a = if local { value_to_self } else { value_to_remote };
36433644
let mut value_to_b = if local { value_to_remote } else { value_to_self };
36443645

3645-
if value_to_a >= (broadcaster_dust_limit_satoshis as i64) {
3646+
if value_to_a >= broadcaster_dust_limit_satoshis {
36463647
log_trace!(logger, " ...including {} output with value {}", if local { "to_local" } else { "to_remote" }, value_to_a);
36473648
} else {
36483649
value_to_a = 0;
36493650
}
36503651

3651-
if value_to_b >= (broadcaster_dust_limit_satoshis as i64) {
3652+
if value_to_b >= broadcaster_dust_limit_satoshis {
36523653
log_trace!(logger, " ...including {} output with value {}", if local { "to_remote" } else { "to_local" }, value_to_b);
36533654
} else {
36543655
value_to_b = 0;
@@ -3661,8 +3662,8 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
36613662
else { funding.channel_transaction_parameters.as_counterparty_broadcastable() };
36623663
let tx = CommitmentTransaction::new(commitment_number,
36633664
&per_commitment_point,
3664-
value_to_a as u64,
3665-
value_to_b as u64,
3665+
value_to_a,
3666+
value_to_b,
36663667
feerate_per_kw,
36673668
included_non_dust_htlcs.iter_mut().map(|(htlc, _)| htlc).collect(),
36683669
&channel_parameters,
@@ -3679,8 +3680,8 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
36793680
total_fee_sat,
36803681
num_nondust_htlcs,
36813682
htlcs_included,
3682-
local_balance_msat: value_to_self_msat as u64,
3683-
remote_balance_msat: value_to_remote_msat as u64,
3683+
local_balance_msat: value_to_self_msat,
3684+
remote_balance_msat: value_to_remote_msat,
36843685
inbound_htlc_preimages,
36853686
outbound_htlc_preimages,
36863687
}

0 commit comments

Comments
 (0)