diff --git a/crates/litesvm/src/lib.rs b/crates/litesvm/src/lib.rs index df9fcffb..c199d450 100644 --- a/crates/litesvm/src/lib.rs +++ b/crates/litesvm/src/lib.rs @@ -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}, @@ -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) } @@ -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 diff --git a/crates/litesvm/tests/account_locks.rs b/crates/litesvm/tests/account_locks.rs index 8c9e0c45..1e2fa10b 100644 --- a/crates/litesvm/tests/account_locks.rs +++ b/crates/litesvm/tests/account_locks.rs @@ -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, }; @@ -84,7 +84,7 @@ fn test_too_many_account_locks() { 1_000_000, ); let mut instructions: Vec = 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);