Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
904 changes: 583 additions & 321 deletions Cargo.lock

Large diffs are not rendered by default.

63 changes: 32 additions & 31 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,20 @@ repository = "https://github.com/LiteSVM/litesvm"
rust-version = "1.86.0"

[workspace.dependencies]
agave-feature-set = "3.1.0"
agave-precompiles = "3.1.0"
agave-reserved-account-keys = "3.1.0"
agave-syscalls = "3.1.0"
agave-feature-set = "=4.0.0-beta.6"
agave-precompiles = "=4.0.0-beta.6"
agave-reserved-account-keys = "=4.0.0-beta.6"
agave-syscalls = "=4.0.0-beta.6"
ansi_term = "0.12"
bincode = "1.3.3"
bv = "0.11.1"
criterion = "0.8"
ed25519-dalek = "=1.0.1"
ed25519-dalek = "=2.1.1"
hashbrown = "0.16.0"
hex = "0.4.3"
indexmap = "2.12"
itertools = "0.14"
libsecp256k1 = "0.6.0"
libsecp256k1 = "0.7.2"
litesvm = { path = "crates/litesvm", version = "0.11" }
log = "0.4"
napi = { version = "3.8.3", default-features = false }
Expand All @@ -34,57 +34,58 @@ qualifier_attr = "0.2.2"
serde = "1.0.203"
sha2 = "0.10.9"
smallvec = "1.13"
solana-account = "3.2.0"
solana-account = "3.4.0"
solana-address = "2.0"
solana-address-lookup-table-interface = "3.0"
solana-bpf-loader-program = "3.1.0"
solana-builtins = "3.1.0"
solana-clock = "3.0"
solana-compute-budget = "3.1.0"
solana-compute-budget-instruction = "3.1.0"
solana-bpf-loader-program = "=4.0.0-beta.6"
solana-builtins = "=4.0.0-beta.6"
solana-clock = "3.0.1"
solana-compute-budget = "=4.0.0-beta.6"
solana-compute-budget-instruction = "=4.0.0-beta.6"
solana-compute-budget-interface = "3.0"
solana-config-interface = "2.0.0"
solana-ed25519-program = "3.0"
solana-epoch-rewards = "3.0"
solana-epoch-schedule = "3.0"
solana-fee = "3.1"
solana-fee = "=4.0.0-beta.6"
solana-feature-gate-interface = "3.1.0"
solana-fee-structure = "3.0"
solana-hash = "3.1.0"
solana-instruction = "3.0"
solana-hash = "4.2.0"
solana-instruction = "3.2.0"
solana-instructions-sysvar = "3.0"
solana-keypair = "3.1"
solana-last-restart-slot = "3.0"
solana-loader-v3-interface = "6.1.0"
solana-loader-v4-interface = "3.1.0"
solana-message = "3.0.1"
solana-loader-v4-program = "=4.0.0-beta.6"
solana-message = "3.1.0"
solana-native-token = "3.0"
solana-nonce = "3.0"
solana-nonce-account = "3.0"
solana-precompile-error = "3.0"
solana-program-error = "3.0"
solana-program-option = "3.0"
solana-program-pack = "3.0"
solana-program-runtime = "3.0"
solana-program-pack = "3.1.0"
solana-program-runtime = "=4.0.0-beta.6"
solana-rent = "3.0"
solana-sdk-ids = "3.0"
solana-secp256k1-program = "3.0"
solana-sdk-ids = "3.1.0"
solana-secp256k1-program = "3.0.1"
solana-sha256-hasher = "3.1.0"
solana-signature = "3.1.0"
solana-signer = "3.0"
solana-slot-hashes = "3.0"
solana-slot-hashes = "3.0.1"
solana-slot-history = "3.0"
solana-stake-interface = "2.0.1"
solana-svm-callback = "3.1.0"
solana-svm-log-collector = "3.1.0"
solana-svm-timings = "3.1.0"
solana-svm-transaction = "3.0.0"
solana-system-interface = "2.0"
solana-system-program = "3.1.0"
solana-sysvar = "3.0"
solana-sysvar-id = "3.0"
solana-stake-interface = "2.0.2"
solana-svm-callback = "=4.0.0-beta.6"
solana-svm-log-collector = "=4.0.0-beta.6"
solana-svm-timings = "=4.0.0-beta.6"
solana-svm-transaction = "=4.0.0-beta.6"
solana-system-interface = "3.0"
solana-system-program = "=4.0.0-beta.6"
solana-sysvar = "3.1.1"
solana-sysvar-id = "3.1.0"
solana-transaction = "3.0"
solana-transaction-context = "3.1.0"
solana-transaction-context = "=4.0.0-beta.6"
solana-transaction-error = "3.0.0"
solana-vote-interface = "5.0.0"
spl-associated-token-account-interface = "2.0.0"
Expand Down
1 change: 1 addition & 0 deletions crates/litesvm/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ solana-keypair.workspace = true
solana-last-restart-slot.workspace = true
solana-loader-v3-interface.workspace = true
solana-loader-v4-interface.workspace = true
solana-loader-v4-program.workspace = true
solana-message.workspace = true
solana-native-token.workspace = true
solana-nonce.workspace = true
Expand Down
2 changes: 2 additions & 0 deletions crates/litesvm/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,6 @@ pub enum LiteSVMError {
InvalidPath(#[from] std::io::Error),
#[error("{0}")]
InvalidLoader(String),
#[error("{0}")]
ProgramLoad(String),
}
68 changes: 45 additions & 23 deletions crates/litesvm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -358,15 +358,18 @@ use {
solana_stake_interface::stake_history::StakeHistory,
solana_svm_log_collector::LogCollector,
solana_svm_timings::ExecuteTimings,
solana_svm_transaction::svm_message::SVMMessage,
solana_svm_transaction::svm_message::SVMStaticMessage,
solana_system_program::{get_system_account_kind, SystemAccountKind},
solana_sysvar::{Sysvar, SysvarSerialize},
solana_sysvar_id::SysvarId,
solana_transaction::{
sanitized::{MessageHash, SanitizedTransaction, MAX_TX_ACCOUNT_LOCKS},
versioned::VersionedTransaction,
},
solana_transaction_context::{ExecutionRecord, IndexOfAccount, TransactionContext},
solana_transaction_context::{
transaction::{ExecutionRecord, TransactionContext},
IndexOfAccount,
},
solana_transaction_error::TransactionError,
std::{cell::RefCell, path::Path, rc::Rc, sync::Arc},
types::SimulatedTransactionInfo,
Expand Down Expand Up @@ -936,17 +939,33 @@ impl LiteSVM {
)));
};

let mut loaded_program = solana_bpf_loader_program::load_program_from_bytes(
None,
&mut LoadProgramMetrics::default(),
program_bytes,
loader_id,
program_size,
current_slot,
self.accounts.environments.program_runtime_v1.clone(),
PREVERIFIED,
)
.map_err(LiteSVMError::from)?;
let effective_slot = current_slot
.saturating_add(solana_program_runtime::loaded_programs::DELAY_VISIBILITY_SLOT_OFFSET);
let mut loaded_program = if PREVERIFIED {
// Safety: PREVERIFIED means the program was previously verified.
unsafe {
ProgramCacheEntry::reload(
loader_id,
self.accounts.environments.program_runtime_v1.clone(),
current_slot,
effective_slot,
program_bytes,
program_size,
&mut LoadProgramMetrics::default(),
)
}
} else {
ProgramCacheEntry::new(
loader_id,
self.accounts.environments.program_runtime_v1.clone(),
current_slot,
effective_slot,
program_bytes,
program_size,
&mut LoadProgramMetrics::default(),
)
}
.map_err(|e| LiteSVMError::ProgramLoad(e.to_string()))?;
loaded_program.effective_slot = current_slot;

self.accounts
Expand Down Expand Up @@ -994,12 +1013,14 @@ impl LiteSVM {
&self,
compute_budget: ComputeBudget,
accounts: Vec<(Address, AccountSharedData)>,
number_of_top_level_instructions: usize,
) -> TransactionContext<'_> {
TransactionContext::new(
accounts,
self.get_sysvar(),
compute_budget.max_instruction_stack_depth,
compute_budget.max_instruction_trace_length,
number_of_top_level_instructions,
)
}

Expand Down Expand Up @@ -1195,7 +1216,11 @@ impl LiteSVM {

match maybe_program_indices {
Ok(program_indices) => {
let mut context = self.create_transaction_context(compute_budget, accounts);
let mut context = self.create_transaction_context(
compute_budget,
accounts,
message.num_instructions(),
);
let feature_set = self.feature_set.runtime_features();
let mut invoke_context = InvokeContext::new(
&mut context,
Expand Down Expand Up @@ -1720,7 +1745,7 @@ fn execute_tx_helper(
ctx: TransactionContext,
) -> (
Signature,
solana_transaction_context::TransactionReturnData,
solana_transaction_context::transaction::TransactionReturnData,
InnerInstructionsList,
Vec<(Address, AccountSharedData)>,
) {
Expand All @@ -1745,14 +1770,11 @@ fn get_compute_budget_limits(
sanitized_tx: &SanitizedTransaction,
feature_set: &FeatureSet,
) -> Result<ComputeBudgetLimits, ExecutionResult> {
process_compute_budget_instructions(
SVMMessage::program_instructions_iter(sanitized_tx),
feature_set,
)
.map_err(|e| ExecutionResult {
tx_result: Err(e),
..Default::default()
})
process_compute_budget_instructions(sanitized_tx.program_instructions_iter(), feature_set)
.map_err(|e| ExecutionResult {
tx_result: Err(e),
..Default::default()
})
}

/// Get the max number of accounts that a transaction may lock in this block
Expand Down
2 changes: 1 addition & 1 deletion crates/litesvm/src/register_tracing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use {
solana_address::Address,
solana_program_runtime::invoke_context::{Executable, InvokeContext, RegisterTrace},
solana_transaction::sanitized::SanitizedTransaction,
solana_transaction_context::{IndexOfAccount, InstructionContext},
solana_transaction_context::{instruction::InstructionContext, IndexOfAccount},
std::{fs::File, io::Write},
};

Expand Down
2 changes: 1 addition & 1 deletion crates/litesvm/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use {
solana_message::inner_instruction::InnerInstructionsList,
solana_program_error::ProgramError,
solana_signature::Signature,
solana_transaction_context::TransactionReturnData,
solana_transaction_context::transaction::TransactionReturnData,
solana_transaction_error::{TransactionError, TransactionResult as Result},
};

Expand Down
2 changes: 1 addition & 1 deletion crates/litesvm/src/utils/inner_instructions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use {
compiled_instruction::CompiledInstruction,
inner_instruction::{InnerInstruction, InnerInstructionsList},
},
solana_transaction_context::TransactionContext,
solana_transaction_context::transaction::TransactionContext,
};

/// Pulled verbatim from `solana-svm` crate, `transaction_processor.rs`
Expand Down
6 changes: 3 additions & 3 deletions crates/litesvm/tests/counter_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ fn test_register_tracing_handler() {
litesvm::InvocationInspectCallback,
solana_program_runtime::invoke_context::{Executable, InvokeContext, RegisterTrace},
solana_transaction::{sanitized::SanitizedTransaction, Address},
solana_transaction_context::{IndexOfAccount, InstructionContext},
solana_transaction_context::{instruction::InstructionContext, IndexOfAccount},
std::{
collections::HashMap,
sync::{Arc, Mutex},
Expand Down Expand Up @@ -218,8 +218,8 @@ fn test_register_tracing_handler() {
)
})
.filter(|(_registers, insn)| {
insn.opc & 7 == solana_program_runtime::solana_sbpf::ebpf::BPF_JMP
&& insn.opc != solana_program_runtime::solana_sbpf::ebpf::BPF_JA
insn.opc & 7 == solana_program_runtime::solana_sbpf::ebpf::BPF_JMP64
&& insn.opc != solana_program_runtime::solana_sbpf::ebpf::JA
})
.count();
let entry = tracing_data.entry(*program_id).or_insert(TracingData {
Expand Down
6 changes: 3 additions & 3 deletions crates/litesvm/tests/precompiles.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use {
ed25519_dalek::ed25519::signature::Signer,
ed25519_dalek::Signer as DalekSigner,
litesvm::LiteSVM,
solana_ed25519_program::{self as ed25519_instruction, new_ed25519_instruction_with_signature},
solana_instruction::error::InstructionError,
Expand All @@ -17,7 +17,7 @@ use {
#[test_log::test]
fn ed25519_precompile_ok() {
let kp = Keypair::new();
let kp_dalek = ed25519_dalek::Keypair::from_bytes(&kp.to_bytes()).unwrap();
let kp_dalek = ed25519_dalek::SigningKey::from_bytes(&kp.to_bytes()[..32].try_into().unwrap());

let mut svm = LiteSVM::new();
svm.airdrop(&kp.pubkey(), 10u64.pow(9)).unwrap();
Expand All @@ -44,7 +44,7 @@ fn ed25519_precompile_ok() {
#[test_log::test]
fn ed25519_precompile_err() {
let kp = Keypair::new();
let kp_dalek = ed25519_dalek::Keypair::from_bytes(&kp.to_bytes()).unwrap();
let kp_dalek = ed25519_dalek::SigningKey::from_bytes(&kp.to_bytes()[..32].try_into().unwrap());

let mut svm = LiteSVM::new();
svm.airdrop(&kp.pubkey(), 10u64.pow(9)).unwrap();
Expand Down
8 changes: 4 additions & 4 deletions crates/node-litesvm/src/compute_budget.rs
Original file line number Diff line number Diff line change
Expand Up @@ -266,19 +266,19 @@ impl ComputeBudget {
}
#[napi(setter)]
pub fn set_alt_bn128_addition_cost(&mut self, val: BigInt) -> Result<()> {
Ok(self.0.alt_bn128_addition_cost = bigint_to_u64(&val)?)
Ok(self.0.alt_bn128_g1_addition_cost = bigint_to_u64(&val)?)
}
#[napi(getter)]
pub fn alt_bn128_addition_cost(&self) -> u64 {
self.0.alt_bn128_addition_cost
self.0.alt_bn128_g1_addition_cost
}
#[napi(setter)]
pub fn set_alt_bn128_multiplication_cost(&mut self, val: BigInt) -> Result<()> {
Ok(self.0.alt_bn128_multiplication_cost = bigint_to_u64(&val)?)
Ok(self.0.alt_bn128_g1_multiplication_cost = bigint_to_u64(&val)?)
}
#[napi(getter)]
pub fn alt_bn128_multiplication_cost(&self) -> u64 {
self.0.alt_bn128_multiplication_cost
self.0.alt_bn128_g1_multiplication_cost
}
#[napi(setter)]
pub fn set_alt_bn128_pairing_one_pair_cost_first(&mut self, val: BigInt) -> Result<()> {
Expand Down
2 changes: 1 addition & 1 deletion crates/node-litesvm/src/transaction_metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ use {
compiled_instruction::CompiledInstruction as CompiledInstructionOriginal,
inner_instruction::InnerInstruction as InnerInstructionOriginal,
},
solana_transaction_context::TransactionReturnData as TransactionReturnDataOriginal,
solana_transaction_context::transaction::TransactionReturnData as TransactionReturnDataOriginal,
};

#[derive(Debug, Clone)]
Expand Down
Loading