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