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>, #[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>, #[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>, pub range: Option<RpcBlockProductionConfigRange>, #[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>, #[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>), }
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>, pub until: Option<String>, 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}