solana_rpc_client_api/
config.rs

1use {
2    crate::filter::RpcFilterType,
3    solana_account_decoder_client_types::{UiAccountEncoding, UiDataSliceConfig},
4    solana_clock::{Epoch, Slot},
5    solana_commitment_config::{CommitmentConfig, CommitmentLevel},
6    solana_transaction_status_client_types::{TransactionDetails, UiTransactionEncoding},
7};
8
9#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
10#[serde(rename_all = "camelCase")]
11pub struct RpcSignatureStatusConfig {
12    pub search_transaction_history: bool,
13}
14
15#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
16#[serde(rename_all = "camelCase")]
17pub struct RpcSendTransactionConfig {
18    #[serde(default)]
19    pub skip_preflight: bool,
20    pub preflight_commitment: Option<CommitmentLevel>,
21    pub encoding: Option<UiTransactionEncoding>,
22    pub max_retries: Option<usize>,
23    pub min_context_slot: Option<Slot>,
24}
25
26#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
27#[serde(rename_all = "camelCase")]
28pub struct RpcSimulateTransactionAccountsConfig {
29    pub encoding: Option<UiAccountEncoding>,
30    pub addresses: Vec<String>,
31}
32
33#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
34#[serde(rename_all = "camelCase")]
35pub struct RpcSimulateTransactionConfig {
36    #[serde(default)]
37    pub sig_verify: bool,
38    #[serde(default)]
39    pub replace_recent_blockhash: bool,
40    #[serde(flatten)]
41    pub commitment: Option<CommitmentConfig>,
42    pub encoding: Option<UiTransactionEncoding>,
43    pub accounts: Option<RpcSimulateTransactionAccountsConfig>,
44    pub min_context_slot: Option<Slot>,
45    #[serde(default)]
46    pub inner_instructions: bool,
47}
48
49#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
50#[serde(rename_all = "camelCase")]
51pub struct RpcRequestAirdropConfig {
52    pub recent_blockhash: Option<String>, // base-58 encoded blockhash
53    #[serde(flatten)]
54    pub commitment: Option<CommitmentConfig>,
55}
56
57#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
58#[serde(rename_all = "camelCase")]
59pub struct RpcLeaderScheduleConfig {
60    pub identity: Option<String>, // validator identity, as a base-58 encoded string
61    #[serde(flatten)]
62    pub commitment: Option<CommitmentConfig>,
63}
64
65#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
66#[serde(rename_all = "camelCase")]
67pub struct RpcBlockProductionConfigRange {
68    pub first_slot: Slot,
69    pub last_slot: Option<Slot>,
70}
71
72#[derive(Debug, Default, Clone, Serialize, Deserialize)]
73#[serde(rename_all = "camelCase")]
74pub struct RpcBlockProductionConfig {
75    pub identity: Option<String>, // validator identity, as a base-58 encoded string
76    pub range: Option<RpcBlockProductionConfigRange>, // current epoch if `None`
77    #[serde(flatten)]
78    pub commitment: Option<CommitmentConfig>,
79}
80
81#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
82#[serde(rename_all = "camelCase")]
83pub struct RpcGetVoteAccountsConfig {
84    pub vote_pubkey: Option<String>, // validator vote address, as a base-58 encoded string
85    #[serde(flatten)]
86    pub commitment: Option<CommitmentConfig>,
87    pub keep_unstaked_delinquents: Option<bool>,
88    pub delinquent_slot_distance: Option<u64>,
89}
90
91#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
92#[serde(untagged)]
93pub enum RpcLeaderScheduleConfigWrapper {
94    SlotOnly(Option<Slot>),
95    ConfigOnly(Option<RpcLeaderScheduleConfig>),
96}
97
98impl RpcLeaderScheduleConfigWrapper {
99    pub fn unzip(&self) -> (Option<Slot>, Option<RpcLeaderScheduleConfig>) {
100        match &self {
101            RpcLeaderScheduleConfigWrapper::SlotOnly(slot) => (*slot, None),
102            RpcLeaderScheduleConfigWrapper::ConfigOnly(config) => (None, config.clone()),
103        }
104    }
105}
106
107#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
108#[serde(rename_all = "camelCase")]
109pub enum RpcLargestAccountsFilter {
110    Circulating,
111    NonCirculating,
112}
113
114#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
115#[serde(rename_all = "camelCase")]
116pub struct RpcLargestAccountsConfig {
117    #[serde(flatten)]
118    pub commitment: Option<CommitmentConfig>,
119    pub filter: Option<RpcLargestAccountsFilter>,
120    pub sort_results: Option<bool>,
121}
122
123#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
124#[serde(rename_all = "camelCase")]
125pub struct RpcSupplyConfig {
126    #[serde(flatten)]
127    pub commitment: Option<CommitmentConfig>,
128    #[serde(default)]
129    pub exclude_non_circulating_accounts_list: bool,
130}
131
132#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
133#[serde(rename_all = "camelCase")]
134pub struct RpcEpochConfig {
135    pub epoch: Option<Epoch>,
136    #[serde(flatten)]
137    pub commitment: Option<CommitmentConfig>,
138    pub min_context_slot: Option<Slot>,
139}
140
141#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Hash)]
142#[serde(rename_all = "camelCase")]
143pub enum RpcAccountIndex {
144    ProgramId,
145    SplTokenMint,
146    SplTokenOwner,
147}
148
149#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
150#[serde(rename_all = "camelCase")]
151pub struct RpcAccountInfoConfig {
152    pub encoding: Option<UiAccountEncoding>,
153    pub data_slice: Option<UiDataSliceConfig>,
154    #[serde(flatten)]
155    pub commitment: Option<CommitmentConfig>,
156    pub min_context_slot: Option<Slot>,
157}
158
159#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
160#[serde(rename_all = "camelCase")]
161pub struct RpcProgramAccountsConfig {
162    pub filters: Option<Vec<RpcFilterType>>,
163    #[serde(flatten)]
164    pub account_config: RpcAccountInfoConfig,
165    pub with_context: Option<bool>,
166    pub sort_results: Option<bool>,
167}
168
169#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
170#[serde(rename_all = "camelCase")]
171pub enum RpcTransactionLogsFilter {
172    All,
173    AllWithVotes,
174    Mentions(Vec<String>), // base58-encoded list of addresses
175}
176
177#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
178#[serde(rename_all = "camelCase")]
179pub struct RpcTransactionLogsConfig {
180    #[serde(flatten)]
181    pub commitment: Option<CommitmentConfig>,
182}
183
184#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
185#[serde(rename_all = "camelCase")]
186pub enum RpcTokenAccountsFilter {
187    Mint(String),
188    ProgramId(String),
189}
190
191#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
192#[serde(rename_all = "camelCase")]
193pub struct RpcSignatureSubscribeConfig {
194    #[serde(flatten)]
195    pub commitment: Option<CommitmentConfig>,
196    pub enable_received_notification: Option<bool>,
197}
198
199#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
200#[serde(rename_all = "camelCase")]
201pub enum RpcBlockSubscribeFilter {
202    All,
203    MentionsAccountOrProgram(String),
204}
205
206#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
207#[serde(rename_all = "camelCase")]
208pub struct RpcBlockSubscribeConfig {
209    #[serde(flatten)]
210    pub commitment: Option<CommitmentConfig>,
211    pub encoding: Option<UiTransactionEncoding>,
212    pub transaction_details: Option<TransactionDetails>,
213    pub show_rewards: Option<bool>,
214    pub max_supported_transaction_version: Option<u8>,
215}
216
217#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
218#[serde(rename_all = "camelCase")]
219pub struct RpcSignaturesForAddressConfig {
220    pub before: Option<String>, // Signature as base-58 string
221    pub until: Option<String>,  // Signature as base-58 string
222    pub limit: Option<usize>,
223    #[serde(flatten)]
224    pub commitment: Option<CommitmentConfig>,
225    pub min_context_slot: Option<Slot>,
226}
227
228#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
229#[serde(untagged)]
230pub enum RpcEncodingConfigWrapper<T> {
231    Deprecated(Option<UiTransactionEncoding>),
232    Current(Option<T>),
233}
234
235impl<T: EncodingConfig + Default + Copy> RpcEncodingConfigWrapper<T> {
236    pub fn convert_to_current(&self) -> T {
237        match self {
238            RpcEncodingConfigWrapper::Deprecated(encoding) => T::new_with_encoding(encoding),
239            RpcEncodingConfigWrapper::Current(config) => config.unwrap_or_default(),
240        }
241    }
242
243    pub fn convert<U: EncodingConfig + From<T>>(&self) -> RpcEncodingConfigWrapper<U> {
244        match self {
245            RpcEncodingConfigWrapper::Deprecated(encoding) => {
246                RpcEncodingConfigWrapper::Deprecated(*encoding)
247            }
248            RpcEncodingConfigWrapper::Current(config) => {
249                RpcEncodingConfigWrapper::Current(config.map(|config| config.into()))
250            }
251        }
252    }
253}
254
255pub trait EncodingConfig {
256    fn new_with_encoding(encoding: &Option<UiTransactionEncoding>) -> Self;
257}
258
259#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
260#[serde(rename_all = "camelCase")]
261pub struct RpcBlockConfig {
262    pub encoding: Option<UiTransactionEncoding>,
263    pub transaction_details: Option<TransactionDetails>,
264    pub rewards: Option<bool>,
265    #[serde(flatten)]
266    pub commitment: Option<CommitmentConfig>,
267    pub max_supported_transaction_version: Option<u8>,
268}
269
270impl EncodingConfig for RpcBlockConfig {
271    fn new_with_encoding(encoding: &Option<UiTransactionEncoding>) -> Self {
272        Self {
273            encoding: *encoding,
274            ..Self::default()
275        }
276    }
277}
278
279impl RpcBlockConfig {
280    pub fn rewards_only() -> Self {
281        Self {
282            transaction_details: Some(TransactionDetails::None),
283            ..Self::default()
284        }
285    }
286
287    pub fn rewards_with_commitment(commitment: Option<CommitmentConfig>) -> Self {
288        Self {
289            transaction_details: Some(TransactionDetails::None),
290            commitment,
291            ..Self::default()
292        }
293    }
294}
295
296impl From<RpcBlockConfig> for RpcEncodingConfigWrapper<RpcBlockConfig> {
297    fn from(config: RpcBlockConfig) -> Self {
298        RpcEncodingConfigWrapper::Current(Some(config))
299    }
300}
301
302#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
303#[serde(rename_all = "camelCase")]
304pub struct RpcTransactionConfig {
305    pub encoding: Option<UiTransactionEncoding>,
306    #[serde(flatten)]
307    pub commitment: Option<CommitmentConfig>,
308    pub max_supported_transaction_version: Option<u8>,
309}
310
311impl EncodingConfig for RpcTransactionConfig {
312    fn new_with_encoding(encoding: &Option<UiTransactionEncoding>) -> Self {
313        Self {
314            encoding: *encoding,
315            ..Self::default()
316        }
317    }
318}
319
320#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
321#[serde(untagged)]
322pub enum RpcBlocksConfigWrapper {
323    EndSlotOnly(Option<Slot>),
324    ConfigOnly(Option<RpcContextConfig>),
325}
326
327impl RpcBlocksConfigWrapper {
328    pub fn unzip(&self) -> (Option<Slot>, Option<RpcContextConfig>) {
329        match &self {
330            RpcBlocksConfigWrapper::EndSlotOnly(end_slot) => (*end_slot, None),
331            RpcBlocksConfigWrapper::ConfigOnly(config) => (None, *config),
332        }
333    }
334}
335
336#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
337#[serde(rename_all = "camelCase")]
338pub struct RpcContextConfig {
339    #[serde(flatten)]
340    pub commitment: Option<CommitmentConfig>,
341    pub min_context_slot: Option<Slot>,
342}