From b726d7395b9b5c2808bcd08e100a03d4d0da9458 Mon Sep 17 00:00:00 2001 From: Joe Date: Tue, 5 Dec 2023 08:52:29 -0600 Subject: [PATCH] rpc: simulate tx: add `jsonParsed` support for inner instructions --- banks-server/src/banks_server.rs | 2 +- programs/sbf/tests/programs.rs | 2 +- rpc-client-api/src/response.rs | 5 ++--- rpc/src/rpc.rs | 19 ++++++++++++++----- runtime/src/bank.rs | 6 +++--- transaction-status/src/lib.rs | 2 +- 6 files changed, 22 insertions(+), 14 deletions(-) diff --git a/banks-server/src/banks_server.rs b/banks-server/src/banks_server.rs index 91b43559617b73..5d44b7ca94847a 100644 --- a/banks-server/src/banks_server.rs +++ b/banks-server/src/banks_server.rs @@ -195,7 +195,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 09fe981f8dbf9a..6f7aa9e03fd164 100644 --- a/programs/sbf/tests/programs.rs +++ b/programs/sbf/tests/programs.rs @@ -738,7 +738,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 7d01952f4179d8..fa70e89b6b88ee 100644 --- a/rpc-client-api/src/response.rs +++ b/rpc-client-api/src/response.rs @@ -7,12 +7,11 @@ use { fee_calculator::{FeeCalculator, FeeRateGovernor}, hash::Hash, inflation::Inflation, - instruction::InnerInstructions, transaction::{Result, TransactionError}, }, solana_transaction_status::{ ConfirmedTransactionStatusWithSignature, TransactionConfirmationStatus, UiConfirmedBlock, - UiTransactionReturnData, + UiInnerInstructions, UiTransactionReturnData, }, std::{collections::HashMap, fmt, net::SocketAddr, str::FromStr}, thiserror::Error, @@ -424,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 27f19c4f30749c..d70fc1448130f8 100644 --- a/rpc/src/rpc.rs +++ b/rpc/src/rpc.rs @@ -18,7 +18,6 @@ use { accounts_index::{AccountIndex, AccountSecondaryIndexes, IndexKey, ScanConfig}, inline_spl_token::{SPL_TOKEN_ACCOUNT_MINT_OFFSET, SPL_TOKEN_ACCOUNT_OWNER_OFFSET}, inline_spl_token_2022::{self, ACCOUNTTYPE_ACCOUNT}, - transaction_results::map_inner_instructions, }, solana_client::connection_cache::{ConnectionCache, Protocol}, solana_entry::entry::Entry, @@ -3265,7 +3264,9 @@ pub mod rpc_accounts_scan { pub mod rpc_full { use { super::*, + solana_accounts_db::transaction_results::map_inner_instructions, solana_sdk::message::{SanitizedVersionedMessage, VersionedMessage}, + solana_transaction_status::UiInnerInstructions, }; #[rpc] pub trait Full { @@ -3677,7 +3678,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 => { @@ -3756,7 +3757,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, @@ -3765,7 +3765,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 @@ -3816,7 +3819,13 @@ pub mod rpc_full { accounts, units_consumed: Some(units_consumed), return_data: return_data.map(|return_data| return_data.into()), - inner_instructions: inner_instructions.map(map_inner_instructions), + inner_instructions: inner_instructions.map(|inner_instructions| { + let converted = map_inner_instructions(inner_instructions); + converted + .into_iter() + .map(|inner| UiInnerInstructions::parse(inner, &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 b2826f2ea4c4b5..e6e4116dec54b2 100644 --- a/transaction-status/src/lib.rs +++ b/transaction-status/src/lib.rs @@ -224,7 +224,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