diff --git a/programs/bpf_loader/src/lib.rs b/programs/bpf_loader/src/lib.rs index 815cd103fb..3eed89919e 100644 --- a/programs/bpf_loader/src/lib.rs +++ b/programs/bpf_loader/src/lib.rs @@ -421,7 +421,9 @@ fn process_loader_upgradeable_instruction( program.try_account_ref_mut()?.executable = true; // Drain the Buffer account back to the payer - payer.try_account_ref_mut()?.lamports += buffer.lamports()?; + payer + .try_account_ref_mut()? + .checked_add_lamports(buffer.lamports()?)?; buffer.try_account_ref_mut()?.lamports = 0; ic_logger_msg!(logger, "Deployed program {:?}", program.unsigned_key()); @@ -547,9 +549,10 @@ fn process_loader_upgradeable_instruction( // Fund ProgramData to rent-exemption, spill the rest - spill.try_account_ref_mut()?.lamports += (programdata.lamports()? - + buffer.lamports()?) - .saturating_sub(programdata_balance_required); + spill.try_account_ref_mut()?.checked_add_lamports( + (programdata.lamports()? + buffer.lamports()?) + .saturating_sub(programdata_balance_required), + )?; buffer.try_account_ref_mut()?.lamports = 0; programdata.try_account_ref_mut()?.lamports = programdata_balance_required; @@ -640,7 +643,9 @@ fn process_loader_upgradeable_instruction( return Err(InstructionError::MissingRequiredSignature); } - recipient_account.try_account_ref_mut()?.lamports += close_account.lamports()?; + recipient_account + .try_account_ref_mut()? + .checked_add_lamports(close_account.lamports()?)?; close_account.try_account_ref_mut()?.lamports = 0; for elt in close_account.try_account_ref_mut()?.data_as_mut_slice() { *elt = 0; diff --git a/programs/budget/src/budget_processor.rs b/programs/budget/src/budget_processor.rs index 85d5ba9332..730469858a 100644 --- a/programs/budget/src/budget_processor.rs +++ b/programs/budget/src/budget_processor.rs @@ -49,7 +49,9 @@ fn apply_signature( } budget_state.pending_budget = None; contract_keyed_account.try_account_ref_mut()?.lamports -= payment.lamports; - to_keyed_account.try_account_ref_mut()?.lamports += payment.lamports; + to_keyed_account + .try_account_ref_mut()? + .checked_add_lamports(payment.lamports)?; } Ok(()) } @@ -80,7 +82,9 @@ fn apply_timestamp( } budget_state.pending_budget = None; contract_keyed_account.try_account_ref_mut()?.lamports -= payment.lamports; - to_keyed_account.try_account_ref_mut()?.lamports += payment.lamports; + to_keyed_account + .try_account_ref_mut()? + .checked_add_lamports(payment.lamports)?; } Ok(()) } @@ -111,7 +115,9 @@ fn apply_account_data( } budget_state.pending_budget = None; contract_keyed_account.try_account_ref_mut()?.lamports -= payment.lamports; - to_keyed_account.try_account_ref_mut()?.lamports += payment.lamports; + to_keyed_account + .try_account_ref_mut()? + .checked_add_lamports(payment.lamports)?; } Ok(()) } @@ -135,7 +141,9 @@ pub fn process_instruction( let to_keyed_account = contract_keyed_account; let contract_keyed_account = keyed_account_at_index(keyed_accounts, 1)?; contract_keyed_account.try_account_ref_mut()?.lamports = 0; - to_keyed_account.try_account_ref_mut()?.lamports += payment.lamports; + to_keyed_account + .try_account_ref_mut()? + .checked_add_lamports(payment.lamports)?; return Ok(()); } let existing = diff --git a/programs/stake/src/stake_state.rs b/programs/stake/src/stake_state.rs index 25c632a36a..021ac1b20f 100644 --- a/programs/stake/src/stake_state.rs +++ b/programs/stake/src/stake_state.rs @@ -10,7 +10,7 @@ use crate::{ }; use serde_derive::{Deserialize, Serialize}; use solana_sdk::{ - account::{AccountSharedData, ReadableAccount}, + account::{AccountSharedData, ReadableAccount, WritableAccount}, account_utils::{State, StateMut}, clock::{Clock, Epoch, UnixTimestamp}, ic_msg, @@ -1155,7 +1155,9 @@ impl<'a> StakeAccount for KeyedAccount<'a> { self.set_state(&StakeState::Uninitialized)?; } - split.try_account_ref_mut()?.lamports += lamports; + split + .try_account_ref_mut()? + .checked_add_lamports(lamports)?; self.try_account_ref_mut()?.lamports -= lamports; Ok(()) } else { @@ -1203,7 +1205,7 @@ impl<'a> StakeAccount for KeyedAccount<'a> { // Drain the source stake account let lamports = source_account.lamports()?; source_account.try_account_ref_mut()?.lamports -= lamports; - self.try_account_ref_mut()?.lamports += lamports; + self.try_account_ref_mut()?.checked_add_lamports(lamports)?; Ok(()) } @@ -1284,7 +1286,7 @@ impl<'a> StakeAccount for KeyedAccount<'a> { } self.try_account_ref_mut()?.lamports -= lamports; - to.try_account_ref_mut()?.lamports += lamports; + to.try_account_ref_mut()?.checked_add_lamports(lamports)?; Ok(()) } } @@ -1486,8 +1488,8 @@ pub fn redeem_rewards( inflation_point_calc_tracer, fix_stake_deactivate, ) { - stake_account.lamports += stakers_reward; - vote_account.lamports += voters_reward; + stake_account.checked_add_lamports(stakers_reward)?; + vote_account.checked_add_lamports(voters_reward)?; stake_account.set_state(&StakeState::Stake(meta, stake))?; @@ -3171,7 +3173,7 @@ mod tests { ); // simulate rewards - stake_account.borrow_mut().lamports += 10; + stake_account.borrow_mut().checked_add_lamports(10).unwrap(); // withdrawal before deactivate works for rewards amount let stake_keyed_account = KeyedAccount::new(&stake_pubkey, true, &stake_account); let to_keyed_account = KeyedAccount::new(&to, false, &to_account); @@ -3188,7 +3190,7 @@ mod tests { ); // simulate rewards - stake_account.borrow_mut().lamports += 10; + stake_account.borrow_mut().checked_add_lamports(10).unwrap(); // withdrawal of rewards fails if not in excess of stake let stake_keyed_account = KeyedAccount::new(&stake_pubkey, true, &stake_account); let to_keyed_account = KeyedAccount::new(&to, false, &to_account); @@ -5964,7 +5966,11 @@ mod tests { stake_keyed_account.deactivate(&clock, &signers).unwrap(); // Out of band deposit - stake_keyed_account.try_account_ref_mut().unwrap().lamports += withdraw_lamports; + stake_keyed_account + .try_account_ref_mut() + .unwrap() + .checked_add_lamports(withdraw_lamports) + .unwrap(); clock.epoch += 1; stake_keyed_account