1use {
2 crate::rpc_filter::RpcFilterType,
3 safecoin_account_decoder::{UiAccountEncoding, UiDataSliceConfig},
4 solana_sdk::{
5 clock::{Epoch, Slot},
6 commitment_config::{CommitmentConfig, CommitmentLevel},
7 },
8 safecoin_transaction_status::{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}
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}
121
122#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
123#[serde(rename_all = "camelCase")]
124pub struct RpcSupplyConfig {
125 #[serde(flatten)]
126 pub commitment: Option<CommitmentConfig>,
127 #[serde(default)]
128 pub exclude_non_circulating_accounts_list: bool,
129}
130
131#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
132#[serde(rename_all = "camelCase")]
133pub struct RpcEpochConfig {
134 pub epoch: Option<Epoch>,
135 #[serde(flatten)]
136 pub commitment: Option<CommitmentConfig>,
137 pub min_context_slot: Option<Slot>,
138}
139
140#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
141#[serde(rename_all = "camelCase")]
142pub struct RpcAccountInfoConfig {
143 pub encoding: Option<UiAccountEncoding>,
144 pub data_slice: Option<UiDataSliceConfig>,
145 #[serde(flatten)]
146 pub commitment: Option<CommitmentConfig>,
147 pub min_context_slot: Option<Slot>,
148}
149
150#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
151#[serde(rename_all = "camelCase")]
152pub struct RpcProgramAccountsConfig {
153 pub filters: Option<Vec<RpcFilterType>>,
154 #[serde(flatten)]
155 pub account_config: RpcAccountInfoConfig,
156 pub with_context: Option<bool>,
157}
158
159#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
160#[serde(rename_all = "camelCase")]
161pub enum RpcTransactionLogsFilter {
162 All,
163 AllWithVotes,
164 Mentions(Vec<String>), }
166
167#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
168#[serde(rename_all = "camelCase")]
169pub struct RpcTransactionLogsConfig {
170 #[serde(flatten)]
171 pub commitment: Option<CommitmentConfig>,
172}
173
174#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
175#[serde(rename_all = "camelCase")]
176pub enum RpcTokenAccountsFilter {
177 Mint(String),
178 ProgramId(String),
179}
180
181#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
182#[serde(rename_all = "camelCase")]
183pub struct RpcSignatureSubscribeConfig {
184 #[serde(flatten)]
185 pub commitment: Option<CommitmentConfig>,
186 pub enable_received_notification: Option<bool>,
187}
188
189#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
190#[serde(rename_all = "camelCase")]
191pub enum RpcBlockSubscribeFilter {
192 All,
193 MentionsAccountOrProgram(String),
194}
195
196#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
197#[serde(rename_all = "camelCase")]
198pub struct RpcBlockSubscribeConfig {
199 #[serde(flatten)]
200 pub commitment: Option<CommitmentConfig>,
201 pub encoding: Option<UiTransactionEncoding>,
202 pub transaction_details: Option<TransactionDetails>,
203 pub show_rewards: Option<bool>,
204 pub max_supported_transaction_version: Option<u8>,
205}
206
207#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
208#[serde(rename_all = "camelCase")]
209pub struct RpcSignaturesForAddressConfig {
210 pub before: Option<String>, pub until: Option<String>, pub limit: Option<usize>,
213 #[serde(flatten)]
214 pub commitment: Option<CommitmentConfig>,
215 pub min_context_slot: Option<Slot>,
216}
217
218#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
219#[serde(untagged)]
220pub enum RpcEncodingConfigWrapper<T> {
221 Deprecated(Option<UiTransactionEncoding>),
222 Current(Option<T>),
223}
224
225impl<T: EncodingConfig + Default + Copy> RpcEncodingConfigWrapper<T> {
226 pub fn convert_to_current(&self) -> T {
227 match self {
228 RpcEncodingConfigWrapper::Deprecated(encoding) => T::new_with_encoding(encoding),
229 RpcEncodingConfigWrapper::Current(config) => config.unwrap_or_default(),
230 }
231 }
232
233 pub fn convert<U: EncodingConfig + From<T>>(&self) -> RpcEncodingConfigWrapper<U> {
234 match self {
235 RpcEncodingConfigWrapper::Deprecated(encoding) => {
236 RpcEncodingConfigWrapper::Deprecated(*encoding)
237 }
238 RpcEncodingConfigWrapper::Current(config) => {
239 RpcEncodingConfigWrapper::Current(config.map(|config| config.into()))
240 }
241 }
242 }
243}
244
245pub trait EncodingConfig {
246 fn new_with_encoding(encoding: &Option<UiTransactionEncoding>) -> Self;
247}
248
249#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
250#[serde(rename_all = "camelCase")]
251pub struct RpcBlockConfig {
252 pub encoding: Option<UiTransactionEncoding>,
253 pub transaction_details: Option<TransactionDetails>,
254 pub rewards: Option<bool>,
255 #[serde(flatten)]
256 pub commitment: Option<CommitmentConfig>,
257 pub max_supported_transaction_version: Option<u8>,
258}
259
260impl EncodingConfig for RpcBlockConfig {
261 fn new_with_encoding(encoding: &Option<UiTransactionEncoding>) -> Self {
262 Self {
263 encoding: *encoding,
264 ..Self::default()
265 }
266 }
267}
268
269impl RpcBlockConfig {
270 pub fn rewards_only() -> Self {
271 Self {
272 transaction_details: Some(TransactionDetails::None),
273 ..Self::default()
274 }
275 }
276
277 pub fn rewards_with_commitment(commitment: Option<CommitmentConfig>) -> Self {
278 Self {
279 transaction_details: Some(TransactionDetails::None),
280 commitment,
281 ..Self::default()
282 }
283 }
284}
285
286impl From<RpcBlockConfig> for RpcEncodingConfigWrapper<RpcBlockConfig> {
287 fn from(config: RpcBlockConfig) -> Self {
288 RpcEncodingConfigWrapper::Current(Some(config))
289 }
290}
291
292#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
293#[serde(rename_all = "camelCase")]
294pub struct RpcTransactionConfig {
295 pub encoding: Option<UiTransactionEncoding>,
296 #[serde(flatten)]
297 pub commitment: Option<CommitmentConfig>,
298 pub max_supported_transaction_version: Option<u8>,
299}
300
301impl EncodingConfig for RpcTransactionConfig {
302 fn new_with_encoding(encoding: &Option<UiTransactionEncoding>) -> Self {
303 Self {
304 encoding: *encoding,
305 ..Self::default()
306 }
307 }
308}
309
310#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
311#[serde(untagged)]
312pub enum RpcBlocksConfigWrapper {
313 EndSlotOnly(Option<Slot>),
314 CommitmentOnly(Option<CommitmentConfig>),
315}
316
317impl RpcBlocksConfigWrapper {
318 pub fn unzip(&self) -> (Option<Slot>, Option<CommitmentConfig>) {
319 match &self {
320 RpcBlocksConfigWrapper::EndSlotOnly(end_slot) => (*end_slot, None),
321 RpcBlocksConfigWrapper::CommitmentOnly(commitment) => (None, *commitment),
322 }
323 }
324}
325
326#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
327#[serde(rename_all = "camelCase")]
328pub struct RpcContextConfig {
329 #[serde(flatten)]
330 pub commitment: Option<CommitmentConfig>,
331 pub min_context_slot: Option<Slot>,
332}