solana_rpc_client_api/
config.rs

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