diff --git a/banks-server/src/banks_server.rs b/banks-server/src/banks_server.rs index 5f57bb39b2198c..3879a74a604056 100644 --- a/banks-server/src/banks_server.rs +++ b/banks-server/src/banks_server.rs @@ -196,7 +196,7 @@ fn simulate_transaction( units_consumed, return_data, inner_instructions, - } = bank.simulate_transaction_unchecked(sanitized_transaction, false); + } = bank.simulate_transaction_unchecked(&sanitized_transaction, false); let simulation_details = TransactionSimulationDetails { logs, diff --git a/programs/sbf/tests/programs.rs b/programs/sbf/tests/programs.rs index 50def794412fba..1c342f42ae1254 100644 --- a/programs/sbf/tests/programs.rs +++ b/programs/sbf/tests/programs.rs @@ -737,7 +737,7 @@ fn test_return_data_and_log_data_syscall() { let transaction = Transaction::new(&[&mint_keypair], message, blockhash); let sanitized_tx = SanitizedTransaction::from_transaction_for_tests(transaction); - let result = bank.simulate_transaction(sanitized_tx, false); + let result = bank.simulate_transaction(&sanitized_tx, false); assert!(result.result.is_ok()); diff --git a/rpc-client-api/src/response.rs b/rpc-client-api/src/response.rs index 96f021750462fb..fa70e89b6b88ee 100644 --- a/rpc-client-api/src/response.rs +++ b/rpc-client-api/src/response.rs @@ -10,8 +10,8 @@ use { transaction::{Result, TransactionError}, }, solana_transaction_status::{ - ConfirmedTransactionStatusWithSignature, InnerInstructions, TransactionConfirmationStatus, - UiConfirmedBlock, UiTransactionReturnData, + ConfirmedTransactionStatusWithSignature, TransactionConfirmationStatus, UiConfirmedBlock, + UiInnerInstructions, UiTransactionReturnData, }, std::{collections::HashMap, fmt, net::SocketAddr, str::FromStr}, thiserror::Error, @@ -423,7 +423,7 @@ pub struct RpcSimulateTransactionResult { pub accounts: Option>>, pub units_consumed: Option, pub return_data: Option, - pub inner_instructions: Option>, + pub inner_instructions: Option>, } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] diff --git a/rpc/src/rpc.rs b/rpc/src/rpc.rs index 022a53920e0156..5367ada66801a0 100644 --- a/rpc/src/rpc.rs +++ b/rpc/src/rpc.rs @@ -3265,6 +3265,7 @@ pub mod rpc_full { use { super::*, solana_sdk::message::{SanitizedVersionedMessage, VersionedMessage}, + solana_transaction_status::UiInnerInstructions, }; #[rpc] pub trait Full { @@ -3676,7 +3677,7 @@ pub mod rpc_full { units_consumed, return_data, inner_instructions: _, // Always `None` due to `enable_cpi_recording = false` - } = preflight_bank.simulate_transaction(transaction, false) + } = preflight_bank.simulate_transaction(&transaction, false) { match err { TransactionError::BlockhashNotFound => { @@ -3755,7 +3756,6 @@ pub mod rpc_full { if sig_verify { verify_transaction(&transaction, &bank.feature_set)?; } - let number_of_accounts = transaction.message().account_keys().len(); let TransactionSimulationResult { result, @@ -3764,7 +3764,10 @@ pub mod rpc_full { units_consumed, return_data, inner_instructions, - } = bank.simulate_transaction(transaction, enable_cpi_recording); + } = bank.simulate_transaction(&transaction, enable_cpi_recording); + + let account_keys = transaction.message().account_keys(); + let number_of_accounts = account_keys.len(); let accounts = if let Some(config_accounts) = config_accounts { let accounts_encoding = config_accounts @@ -3821,6 +3824,7 @@ pub mod rpc_full { .collect(), }) .filter(|i| !i.instructions.is_empty()) + .map(|converted| UiInnerInstructions::parse(converted, &account_keys)) .collect() }); diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index a0edec393d5978..3df33f8e90d9ea 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -4318,7 +4318,7 @@ impl Bank { /// Run transactions against a frozen bank without committing the results pub fn simulate_transaction( &self, - transaction: SanitizedTransaction, + transaction: &SanitizedTransaction, enable_cpi_recording: bool, ) -> TransactionSimulationResult { assert!(self.is_frozen(), "simulation bank must be frozen"); @@ -4330,13 +4330,13 @@ impl Bank { /// is frozen, enabling use in single-Bank test frameworks pub fn simulate_transaction_unchecked( &self, - transaction: SanitizedTransaction, + transaction: &SanitizedTransaction, enable_cpi_recording: bool, ) -> TransactionSimulationResult { let account_keys = transaction.message().account_keys(); let number_of_accounts = account_keys.len(); let account_overrides = self.get_account_overrides_for_simulation(&account_keys); - let batch = self.prepare_unlocked_batch_from_single_tx(&transaction); + let batch = self.prepare_unlocked_batch_from_single_tx(transaction); let mut timings = ExecuteTimings::default(); let LoadAndExecuteTransactionsOutput { diff --git a/transaction-status/src/lib.rs b/transaction-status/src/lib.rs index fac20d9859cdbd..7231f95678e479 100644 --- a/transaction-status/src/lib.rs +++ b/transaction-status/src/lib.rs @@ -240,7 +240,7 @@ pub struct UiInnerInstructions { } impl UiInnerInstructions { - fn parse(inner_instructions: InnerInstructions, account_keys: &AccountKeys) -> Self { + pub fn parse(inner_instructions: InnerInstructions, account_keys: &AccountKeys) -> Self { Self { index: inner_instructions.index, instructions: inner_instructions