surfpool_types/
jito_bundles.rs1use serde::{Deserialize, Serialize};
15use solana_account_decoder_client_types::{UiAccount, UiAccountEncoding};
16use solana_clock::Slot;
17use solana_commitment_config::{CommitmentConfig, CommitmentLevel};
18use solana_rpc_client_api::response::RpcBlockhash;
19use solana_signature::Signature;
20use solana_transaction_error::TransactionError;
21use solana_transaction_status::{
22 UiLoadedAddresses, UiTransactionEncoding, UiTransactionReturnData, UiTransactionTokenBalance,
23};
24use thiserror::Error;
25
26#[derive(Debug, Default, Clone, Serialize, Deserialize)]
29#[serde(rename_all = "camelCase")]
30pub struct RpcBundleRequest {
31 pub encoded_transactions: Vec<String>,
32}
33
34#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq)]
38#[serde(rename_all = "camelCase")]
39pub struct RpcSimulateTransactionAccountsConfig {
40 pub encoding: Option<UiAccountEncoding>,
43 pub addresses: Vec<String>,
45}
46
47#[derive(Debug, Default, Clone, Serialize, Deserialize)]
48#[serde(rename_all = "camelCase")]
49pub struct RpcSimulateBundleConfig {
50 #[serde(default)]
57 pub pre_execution_accounts_configs: Vec<Option<RpcSimulateTransactionAccountsConfig>>,
58 #[serde(default)]
61 pub post_execution_accounts_configs: Vec<Option<RpcSimulateTransactionAccountsConfig>>,
62 pub transaction_encoding: Option<UiTransactionEncoding>,
66 pub simulation_bank: Option<SimulationSlotConfig>,
69 #[serde(default)]
72 pub skip_sig_verify: bool,
73 #[serde(default)]
76 pub replace_recent_blockhash: bool,
77}
78
79#[derive(Serialize, Deserialize, Clone, Copy, Debug)]
80#[serde(rename_all = "camelCase")]
81pub enum SimulationSlotConfig {
82 Commitment(CommitmentConfig),
83 Slot(Slot),
84 Tip,
85}
86
87impl Default for SimulationSlotConfig {
88 fn default() -> Self {
89 Self::Commitment(CommitmentConfig {
90 commitment: CommitmentLevel::Confirmed,
91 })
92 }
93}
94
95#[derive(Serialize, Deserialize, Clone, Debug)]
96#[serde(rename_all = "camelCase")]
97pub struct RpcSimulateBundleResult {
98 pub summary: RpcBundleSimulationSummary,
99 pub transaction_results: Vec<RpcSimulateBundleTransactionResult>,
100}
101
102#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
103#[serde(rename_all = "camelCase")]
104pub enum RpcBundleSimulationSummary {
105 Failed {
109 error: RpcBundleExecutionError,
110 tx_signature: Option<String>,
111 },
112 Succeeded,
114}
115
116#[derive(Error, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
117pub enum RpcBundleExecutionError {
118 #[error("The bank has hit the max allotted time for processing transactions")]
119 BankProcessingTimeLimitReached,
120 #[error("Error locking bundle because a transaction is malformed")]
121 BundleLockError,
122 #[error("Bundle execution timed out")]
123 BundleExecutionTimeout,
124 #[error("The bundle exceeds the cost model")]
125 ExceedsCostModel,
126 #[error("Invalid pre or post accounts")]
127 InvalidPreOrPostAccounts,
128 #[error("PoH record error: {0}")]
129 PohRecordError(String),
130 #[error("Tip payment error: {0}")]
131 TipError(String),
132 #[error("A transaction in the bundle failed to execute: [signature={0}, error={1}]")]
133 TransactionFailure(Signature, String),
134}
135
136#[derive(Serialize, Deserialize, Clone, Debug)]
149#[serde(rename_all = "camelCase")]
150pub struct RpcSimulateBundleTransactionResult {
151 pub err: Option<TransactionError>,
152 pub logs: Option<Vec<String>>,
153 pub pre_execution_accounts: Option<Vec<UiAccount>>,
154 pub post_execution_accounts: Option<Vec<UiAccount>>,
155 pub units_consumed: Option<u64>,
156 pub loaded_accounts_data_size: Option<u32>,
157 pub return_data: Option<UiTransactionReturnData>,
158 pub replacement_blockhash: Option<RpcBlockhash>,
159 pub fee: Option<u64>,
160 pub pre_balances: Option<Vec<u64>>,
161 pub post_balances: Option<Vec<u64>>,
162 pub pre_token_balances: Option<Vec<UiTransactionTokenBalance>>,
163 pub post_token_balances: Option<Vec<UiTransactionTokenBalance>>,
164 pub loaded_addresses: Option<UiLoadedAddresses>,
165}