gemachain_client/
rpc_config.rs

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>, // base-58 encoded blockhash
51    #[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>, // validator identity, as a base-58 encoded string
59    #[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>, // validator identity, as a base-58 encoded string
74    pub range: Option<RpcBlockProductionConfigRange>, // current epoch if `None`
75    #[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>, // validator vote address, as a base-58 encoded string
83    #[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>), // base58-encoded list of addresses
161}
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>, // Signature as base-58 string
189    pub until: Option<String>,  // Signature as base-58 string
190    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}