diff --git a/svm/src/transaction_processor.rs b/svm/src/transaction_processor.rs index 3fca871513c1b1..82411b1440ae95 100644 --- a/svm/src/transaction_processor.rs +++ b/svm/src/transaction_processor.rs @@ -925,16 +925,17 @@ impl TransactionBatchProcessor { ) -> ExecutedTransaction { let transaction_accounts = std::mem::take(&mut loaded_transaction.accounts); + // Ensure the length of accounts matches the expected length from tx.account_keys(). + // This is a sanity check in case that someone starts adding some additional accounts + // since this has been done before. See discussion in PR #4497 for details + debug_assert!(transaction_accounts.len() == tx.account_keys().len()); + fn transaction_accounts_lamports_sum( accounts: &[(Pubkey, AccountSharedData)], - message: &impl SVMMessage, ) -> Option { - let mut lamports_sum = 0u128; - for i in 0..message.account_keys().len() { - let (_, account) = accounts.get(i)?; - lamports_sum = lamports_sum.checked_add(u128::from(account.lamports()))?; - } - Some(lamports_sum) + accounts.iter().try_fold(0u128, |sum, (_, account)| { + sum.checked_add(u128::from(account.lamports())) + }) } let default_rent_collector = RentCollector::default(); @@ -943,7 +944,7 @@ impl TransactionBatchProcessor { .unwrap_or(&default_rent_collector); let lamports_before_tx = - transaction_accounts_lamports_sum(&transaction_accounts, tx).unwrap_or(0); + transaction_accounts_lamports_sum(&transaction_accounts).unwrap_or(0); let compute_budget = config .compute_budget @@ -1062,7 +1063,7 @@ impl TransactionBatchProcessor { } = transaction_context.into(); if status.is_ok() - && transaction_accounts_lamports_sum(&accounts, tx) + && transaction_accounts_lamports_sum(&accounts) .filter(|lamports_after_tx| lamports_before_tx == *lamports_after_tx) .is_none() {