Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 17 additions & 2 deletions crates/litesvm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,7 @@ use {
solana_sysvar::{Sysvar, SysvarSerialize},
solana_sysvar_id::SysvarId,
solana_transaction::{
sanitized::{MessageHash, SanitizedTransaction},
sanitized::{MessageHash, SanitizedTransaction, MAX_TX_ACCOUNT_LOCKS},
versioned::VersionedTransaction,
},
solana_transaction_context::{ExecutionRecord, IndexOfAccount, TransactionContext},
Expand Down Expand Up @@ -1046,7 +1046,10 @@ impl LiteSVM {
let tx = self.sanitize_transaction_no_verify_inner(tx)?;

tx.verify()?;
SanitizedTransaction::validate_account_locks(tx.message(), 64)?;
SanitizedTransaction::validate_account_locks(
tx.message(),
get_transaction_account_lock_limit(self),
)?;

Ok(tx)
}
Expand Down Expand Up @@ -1750,6 +1753,18 @@ fn get_compute_budget_limits(
})
}

/// Get the max number of accounts that a transaction may lock in this block
fn get_transaction_account_lock_limit(svm: &LiteSVM) -> usize {
if svm
.feature_set
.is_active(&agave_feature_set::increase_tx_account_lock_limit::id())
{
MAX_TX_ACCOUNT_LOCKS
} else {
64
}
}

/// Lighter version of the one in the solana-svm crate.
///
/// Check whether the payer_account is capable of paying the fee. The
Expand Down
4 changes: 2 additions & 2 deletions crates/litesvm/tests/account_locks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use {
solana_message::{Message, MessageHeader},
solana_sdk_ids::system_program,
solana_signer::Signer,
solana_transaction::{CompiledInstruction, Transaction},
solana_transaction::{sanitized::MAX_TX_ACCOUNT_LOCKS, CompiledInstruction, Transaction},
solana_transaction_error::TransactionError,
};

Expand Down Expand Up @@ -84,7 +84,7 @@ fn test_too_many_account_locks() {
1_000_000,
);
let mut instructions: Vec<Instruction> = vec![compute_budget_ix];
for _ in 0..64 {
for _ in 0..MAX_TX_ACCOUNT_LOCKS {
let recipient = Address::new_unique();
let ix = transfer(&payer_pk, &recipient, 1_000_000);
instructions.push(ix);
Expand Down
Loading