Skip to content
This repository has been archived by the owner on Jan 22, 2025. It is now read-only.

Commit

Permalink
rpc: simulate tx: add jsonParsed support for inner instructions
Browse files Browse the repository at this point in the history
  • Loading branch information
buffalojoec authored and Joe C committed Dec 5, 2023
1 parent 1183105 commit a888af0
Show file tree
Hide file tree
Showing 6 changed files with 22 additions and 14 deletions.
2 changes: 1 addition & 1 deletion banks-server/src/banks_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion programs/sbf/tests/programs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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());

Expand Down
5 changes: 2 additions & 3 deletions rpc-client-api/src/response.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -424,7 +423,7 @@ pub struct RpcSimulateTransactionResult {
pub accounts: Option<Vec<Option<UiAccount>>>,
pub units_consumed: Option<u64>,
pub return_data: Option<UiTransactionReturnData>,
pub inner_instructions: Option<Vec<InnerInstructions>>,
pub inner_instructions: Option<Vec<UiInnerInstructions>>,
}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
Expand Down
19 changes: 14 additions & 5 deletions rpc/src/rpc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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 => {
Expand Down Expand Up @@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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()
}),
},
))
}
Expand Down
6 changes: 3 additions & 3 deletions runtime/src/bank.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion transaction-status/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit a888af0

Please sign in to comment.