diff --git a/cli/src/cli.rs b/cli/src/cli.rs index 422f6d8000..a475b71956 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -567,6 +567,7 @@ impl CliConfig<'_> { config.commitment = CommitmentConfig::recent(); config.send_transaction_config = RpcSendTransactionConfig { skip_preflight: true, + ..RpcSendTransactionConfig::default() }; config } @@ -1183,6 +1184,7 @@ fn send_and_confirm_transactions_with_spinner( &transaction, RpcSendTransactionConfig { skip_preflight: true, + ..RpcSendTransactionConfig::default() }, ) .ok(); @@ -1360,6 +1362,7 @@ fn process_deploy( config.commitment, RpcSendTransactionConfig { skip_preflight: true, + ..RpcSendTransactionConfig::default() }, ) .map_err(|e| { diff --git a/client/src/rpc_config.rs b/client/src/rpc_config.rs index 1c51169640..ed24156569 100644 --- a/client/src/rpc_config.rs +++ b/client/src/rpc_config.rs @@ -12,12 +12,14 @@ pub struct RpcSignatureStatusConfig { #[serde(rename_all = "camelCase")] pub struct RpcSendTransactionConfig { pub skip_preflight: bool, + pub preflight_commitment: Option, } #[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcSimulateTransactionConfig { pub sig_verify: bool, + pub commitment: Option, } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] diff --git a/core/src/rpc.rs b/core/src/rpc.rs index 722e6ec48b..3083e0750e 100644 --- a/core/src/rpc.rs +++ b/core/src/rpc.rs @@ -2132,7 +2132,10 @@ impl RpcSol for RpcSolImpl { .into()); } - if let (Err(err), _log_output) = bank.simulate_transaction(transaction.clone()) { + let preflight_bank = &*meta.bank(config.preflight_commitment); + if let (Err(err), _log_output) = + preflight_bank.simulate_transaction(transaction.clone()) + { // Note: it's possible that the transaction simulation failed but the actual // transaction would succeed, such as when a transaction depends on an earlier // transaction that has yet to reach max confirmations. In these cases the user @@ -2164,7 +2167,7 @@ impl RpcSol for RpcSolImpl { Ok(()) }; - let bank = &*meta.bank(None); + let bank = &*meta.bank(config.commitment); let logs = if result.is_ok() { let (transaction_result, log_messages) = bank.simulate_transaction(transaction); result = transaction_result; diff --git a/docs/src/apps/jsonrpc-api.md b/docs/src/apps/jsonrpc-api.md index 882b105b46..4772931fdd 100644 --- a/docs/src/apps/jsonrpc-api.md +++ b/docs/src/apps/jsonrpc-api.md @@ -1353,6 +1353,7 @@ Before submitting, the following preflight checks are performed: - `` - fully-signed Transaction, as base-58 encoded string - `` - (optional) Configuration object containing the following field: - `skipPreflight: ` - if true, skip the preflight transaction checks (default: false) + - `preflightCommitment: ` - (optional) [Commitment](jsonrpc-api.md#configuring-state-commitment) level to use for preflight (default: max). #### Results: @@ -1377,6 +1378,7 @@ Simulate sending a transaction - `` - Transaction, as base-58 encoded string. The transaction must have a valid blockhash, but is not required to be signed. - `` - (optional) Configuration object containing the following field: - `sigVerify: ` - if true the transaction signatures will be verified (default: false) + - `commitment: ` - (optional) [Commitment](jsonrpc-api.md#configuring-state-commitment) level to simulate the transaction at (default: max). #### Results: diff --git a/stake-monitor/src/lib.rs b/stake-monitor/src/lib.rs index e3b954e2d5..15fe3138f4 100644 --- a/stake-monitor/src/lib.rs +++ b/stake-monitor/src/lib.rs @@ -494,6 +494,7 @@ mod test { ), RpcSendTransactionConfig { skip_preflight: true, + ..RpcSendTransactionConfig::default() }, ) .unwrap(); @@ -549,6 +550,7 @@ mod test { ), RpcSendTransactionConfig { skip_preflight: true, + ..RpcSendTransactionConfig::default() }, ) .unwrap(); @@ -594,6 +596,7 @@ mod test { ), RpcSendTransactionConfig { skip_preflight: true, + ..RpcSendTransactionConfig::default() }, ) .unwrap(); @@ -632,6 +635,7 @@ mod test { ), RpcSendTransactionConfig { skip_preflight: true, + ..RpcSendTransactionConfig::default() }, ) .unwrap();