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