safecoin_client/
rpc_config.rs

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>, // base-58 encoded blockhash
53    #[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>, // validator identity, as a base-58 encoded string
61    #[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>, // validator identity, as a base-58 encoded string
76    pub range: Option<RpcBlockProductionConfigRange>, // current epoch if `None`
77    #[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>, // validator vote address, as a base-58 encoded string
85    #[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>), // base58-encoded list of addresses
165}
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>, // Signature as base-58 string
211    pub until: Option<String>,  // Signature as base-58 string
212    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}