simulateTransaction now returns the correct error code if accounts are provided as input (#21716)

(cherry picked from commit 824994db69f8f09fc2e051abe4f5a8c0f090a123)

Co-authored-by: Michael Vines <mvines@gmail.com>
This commit is contained in:
mergify[bot] 2021-12-09 01:12:42 +00:00 committed by GitHub
parent f2a6b94e5c
commit 8ee5fbc5c0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -3520,6 +3520,7 @@ pub mod rpc_full {
if config.sig_verify { if config.sig_verify {
verify_transaction(&transaction, &bank.feature_set)?; verify_transaction(&transaction, &bank.feature_set)?;
} }
let number_of_accounts = transaction.message().account_keys_len();
let TransactionSimulationResult { let TransactionSimulationResult {
result, result,
@ -3539,28 +3540,36 @@ pub mod rpc_full {
return Err(Error::invalid_params("base58 encoding not supported")); return Err(Error::invalid_params("base58 encoding not supported"));
} }
if config_accounts.addresses.len() > post_simulation_accounts.len() { if config_accounts.addresses.len() > number_of_accounts {
return Err(Error::invalid_params(format!( return Err(Error::invalid_params(format!(
"Too many accounts provided; max {}", "Too many accounts provided; max {}",
post_simulation_accounts.len() number_of_accounts
))); )));
} }
let mut accounts = vec![]; if result.is_err() {
for address_str in config_accounts.addresses { Some(vec![None; config_accounts.addresses.len()])
let address = verify_pubkey(&address_str)?; } else {
accounts.push(if result.is_err() { let mut accounts = vec![];
None for address_str in config_accounts.addresses {
} else { let address = verify_pubkey(&address_str)?;
post_simulation_accounts accounts.push(
.iter() post_simulation_accounts
.find(|(key, _account)| key == &address) .iter()
.map(|(pubkey, account)| { .find(|(key, _account)| key == &address)
UiAccount::encode(pubkey, account, accounts_encoding, None, None) .map(|(pubkey, account)| {
}) UiAccount::encode(
}); pubkey,
account,
accounts_encoding,
None,
None,
)
}),
);
}
Some(accounts)
} }
Some(accounts)
} else { } else {
None None
}; };