Skip to main content

solana_rpc_client_types/
config.rs

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