1use {
2 crate::rpc_filter::RpcFilterType,
3 gemachain_account_decoder::{UiAccountEncoding, UiDataSliceConfig},
4 gemachain_sdk::{
5 clock::{Epoch, Slot},
6 commitment_config::{CommitmentConfig, CommitmentLevel},
7 },
8 gemachain_transaction_status::{TransactionDetails, UiTransactionEncoding},
9};
10
11#[derive(Debug, Clone, PartialEq, 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, 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}
26
27#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
28#[serde(rename_all = "camelCase")]
29pub struct RpcSimulateTransactionAccountsConfig {
30 pub encoding: Option<UiAccountEncoding>,
31 pub addresses: Vec<String>,
32}
33
34#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
35#[serde(rename_all = "camelCase")]
36pub struct RpcSimulateTransactionConfig {
37 #[serde(default)]
38 pub sig_verify: bool,
39 #[serde(default)]
40 pub replace_recent_blockhash: bool,
41 #[serde(flatten)]
42 pub commitment: Option<CommitmentConfig>,
43 pub encoding: Option<UiTransactionEncoding>,
44 pub accounts: Option<RpcSimulateTransactionAccountsConfig>,
45}
46
47#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
48#[serde(rename_all = "camelCase")]
49pub struct RpcRequestAirdropConfig {
50 pub recent_blockhash: Option<String>, #[serde(flatten)]
52 pub commitment: Option<CommitmentConfig>,
53}
54
55#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
56#[serde(rename_all = "camelCase")]
57pub struct RpcLeaderScheduleConfig {
58 pub identity: Option<String>, #[serde(flatten)]
60 pub commitment: Option<CommitmentConfig>,
61}
62
63#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
64#[serde(rename_all = "camelCase")]
65pub struct RpcBlockProductionConfigRange {
66 pub first_slot: Slot,
67 pub last_slot: Option<Slot>,
68}
69
70#[derive(Debug, Default, Clone, Serialize, Deserialize)]
71#[serde(rename_all = "camelCase")]
72pub struct RpcBlockProductionConfig {
73 pub identity: Option<String>, pub range: Option<RpcBlockProductionConfigRange>, #[serde(flatten)]
76 pub commitment: Option<CommitmentConfig>,
77}
78
79#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
80#[serde(rename_all = "camelCase")]
81pub struct RpcGetVoteAccountsConfig {
82 pub vote_pubkey: Option<String>, #[serde(flatten)]
84 pub commitment: Option<CommitmentConfig>,
85 pub keep_unstaked_delinquents: Option<bool>,
86 pub delinquent_slot_distance: Option<u64>,
87}
88
89#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
90#[serde(untagged)]
91pub enum RpcLeaderScheduleConfigWrapper {
92 SlotOnly(Option<Slot>),
93 ConfigOnly(Option<RpcLeaderScheduleConfig>),
94}
95
96impl RpcLeaderScheduleConfigWrapper {
97 pub fn unzip(&self) -> (Option<Slot>, Option<RpcLeaderScheduleConfig>) {
98 match &self {
99 RpcLeaderScheduleConfigWrapper::SlotOnly(slot) => (*slot, None),
100 RpcLeaderScheduleConfigWrapper::ConfigOnly(config) => (None, config.clone()),
101 }
102 }
103}
104
105#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
106#[serde(rename_all = "camelCase")]
107pub enum RpcLargestAccountsFilter {
108 Circulating,
109 NonCirculating,
110}
111
112#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
113#[serde(rename_all = "camelCase")]
114pub struct RpcLargestAccountsConfig {
115 #[serde(flatten)]
116 pub commitment: Option<CommitmentConfig>,
117 pub filter: Option<RpcLargestAccountsFilter>,
118}
119
120#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
121#[serde(rename_all = "camelCase")]
122pub struct RpcSupplyConfig {
123 #[serde(flatten)]
124 pub commitment: Option<CommitmentConfig>,
125 #[serde(default)]
126 pub exclude_non_circulating_accounts_list: bool,
127}
128
129#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
130#[serde(rename_all = "camelCase")]
131pub struct RpcEpochConfig {
132 pub epoch: Option<Epoch>,
133 #[serde(flatten)]
134 pub commitment: Option<CommitmentConfig>,
135}
136
137#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
138#[serde(rename_all = "camelCase")]
139pub struct RpcAccountInfoConfig {
140 pub encoding: Option<UiAccountEncoding>,
141 pub data_slice: Option<UiDataSliceConfig>,
142 #[serde(flatten)]
143 pub commitment: Option<CommitmentConfig>,
144}
145
146#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
147#[serde(rename_all = "camelCase")]
148pub struct RpcProgramAccountsConfig {
149 pub filters: Option<Vec<RpcFilterType>>,
150 #[serde(flatten)]
151 pub account_config: RpcAccountInfoConfig,
152 pub with_context: Option<bool>,
153}
154
155#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
156#[serde(rename_all = "camelCase")]
157pub enum RpcTransactionLogsFilter {
158 All,
159 AllWithVotes,
160 Mentions(Vec<String>), }
162
163#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
164#[serde(rename_all = "camelCase")]
165pub struct RpcTransactionLogsConfig {
166 #[serde(flatten)]
167 pub commitment: Option<CommitmentConfig>,
168}
169
170#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
171#[serde(rename_all = "camelCase")]
172pub enum RpcTokenAccountsFilter {
173 Mint(String),
174 ProgramId(String),
175}
176
177#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
178#[serde(rename_all = "camelCase")]
179pub struct RpcSignatureSubscribeConfig {
180 #[serde(flatten)]
181 pub commitment: Option<CommitmentConfig>,
182 pub enable_received_notification: Option<bool>,
183}
184
185#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
186#[serde(rename_all = "camelCase")]
187pub struct RpcSignaturesForAddressConfig {
188 pub before: Option<String>, pub until: Option<String>, pub limit: Option<usize>,
191 #[serde(flatten)]
192 pub commitment: Option<CommitmentConfig>,
193}
194
195#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
196#[serde(untagged)]
197pub enum RpcEncodingConfigWrapper<T> {
198 Deprecated(Option<UiTransactionEncoding>),
199 Current(Option<T>),
200}
201
202impl<T: EncodingConfig + Default + Copy> RpcEncodingConfigWrapper<T> {
203 pub fn convert_to_current(&self) -> T {
204 match self {
205 RpcEncodingConfigWrapper::Deprecated(encoding) => T::new_with_encoding(encoding),
206 RpcEncodingConfigWrapper::Current(config) => config.unwrap_or_default(),
207 }
208 }
209
210 pub fn convert<U: EncodingConfig + From<T>>(&self) -> RpcEncodingConfigWrapper<U> {
211 match self {
212 RpcEncodingConfigWrapper::Deprecated(encoding) => {
213 RpcEncodingConfigWrapper::Deprecated(*encoding)
214 }
215 RpcEncodingConfigWrapper::Current(config) => {
216 RpcEncodingConfigWrapper::Current(config.map(|config| config.into()))
217 }
218 }
219 }
220}
221
222pub trait EncodingConfig {
223 fn new_with_encoding(encoding: &Option<UiTransactionEncoding>) -> Self;
224}
225
226#[derive(Debug, Clone, Copy, Default, PartialEq, Serialize, Deserialize)]
227#[serde(rename_all = "camelCase")]
228pub struct RpcBlockConfig {
229 pub encoding: Option<UiTransactionEncoding>,
230 pub transaction_details: Option<TransactionDetails>,
231 pub rewards: Option<bool>,
232 #[serde(flatten)]
233 pub commitment: Option<CommitmentConfig>,
234}
235
236impl EncodingConfig for RpcBlockConfig {
237 fn new_with_encoding(encoding: &Option<UiTransactionEncoding>) -> Self {
238 Self {
239 encoding: *encoding,
240 ..Self::default()
241 }
242 }
243}
244
245impl RpcBlockConfig {
246 pub fn rewards_only() -> Self {
247 Self {
248 transaction_details: Some(TransactionDetails::None),
249 ..Self::default()
250 }
251 }
252
253 pub fn rewards_with_commitment(commitment: Option<CommitmentConfig>) -> Self {
254 Self {
255 transaction_details: Some(TransactionDetails::None),
256 commitment,
257 ..Self::default()
258 }
259 }
260}
261
262impl From<RpcBlockConfig> for RpcEncodingConfigWrapper<RpcBlockConfig> {
263 fn from(config: RpcBlockConfig) -> Self {
264 RpcEncodingConfigWrapper::Current(Some(config))
265 }
266}
267
268#[derive(Debug, Clone, Copy, Default, PartialEq, Serialize, Deserialize)]
269#[serde(rename_all = "camelCase")]
270pub struct RpcTransactionConfig {
271 pub encoding: Option<UiTransactionEncoding>,
272 #[serde(flatten)]
273 pub commitment: Option<CommitmentConfig>,
274}
275
276impl EncodingConfig for RpcTransactionConfig {
277 fn new_with_encoding(encoding: &Option<UiTransactionEncoding>) -> Self {
278 Self {
279 encoding: *encoding,
280 ..Self::default()
281 }
282 }
283}
284
285#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
286#[serde(untagged)]
287pub enum RpcBlocksConfigWrapper {
288 EndSlotOnly(Option<Slot>),
289 CommitmentOnly(Option<CommitmentConfig>),
290}
291
292impl RpcBlocksConfigWrapper {
293 pub fn unzip(&self) -> (Option<Slot>, Option<CommitmentConfig>) {
294 match &self {
295 RpcBlocksConfigWrapper::EndSlotOnly(end_slot) => (*end_slot, None),
296 RpcBlocksConfigWrapper::CommitmentOnly(commitment) => (None, *commitment),
297 }
298 }
299}