use { crate::rpc_filter::RpcFilterType, solana_account_decoder::{UiAccountEncoding, UiDataSliceConfig}, solana_sdk::{ clock::{Epoch, Slot}, commitment_config::{CommitmentConfig, CommitmentLevel}, }, solana_transaction_status::{TransactionDetails, UiTransactionEncoding}, }; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcSignatureStatusConfig { pub search_transaction_history: bool, } #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcSendTransactionConfig { #[serde(default)] pub skip_preflight: bool, pub preflight_commitment: Option, pub encoding: Option, pub max_retries: Option, pub min_context_slot: Option, } #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcSimulateTransactionAccountsConfig { pub encoding: Option, pub addresses: Vec, } #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcSimulateTransactionConfig { #[serde(default)] pub sig_verify: bool, #[serde(default)] pub replace_recent_blockhash: bool, #[serde(flatten)] pub commitment: Option, pub encoding: Option, pub accounts: Option, pub min_context_slot: Option, } #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcRequestAirdropConfig { pub recent_blockhash: Option, // base-58 encoded blockhash #[serde(flatten)] pub commitment: Option, } #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcLeaderScheduleConfig { pub identity: Option, // validator identity, as a base-58 encoded string #[serde(flatten)] pub commitment: Option, } #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcBlockProductionConfigRange { pub first_slot: Slot, pub last_slot: Option, } #[derive(Debug, Default, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcBlockProductionConfig { pub identity: Option, // validator identity, as a base-58 encoded string pub range: Option, // current epoch if `None` #[serde(flatten)] pub commitment: Option, } #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcGetVoteAccountsConfig { pub vote_pubkey: Option, // validator vote address, as a base-58 encoded string #[serde(flatten)] pub commitment: Option, pub keep_unstaked_delinquents: Option, pub delinquent_slot_distance: Option, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(untagged)] pub enum RpcLeaderScheduleConfigWrapper { SlotOnly(Option), ConfigOnly(Option), } impl RpcLeaderScheduleConfigWrapper { pub fn unzip(&self) -> (Option, Option) { match &self { RpcLeaderScheduleConfigWrapper::SlotOnly(slot) => (*slot, None), RpcLeaderScheduleConfigWrapper::ConfigOnly(config) => (None, config.clone()), } } } #[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum RpcLargestAccountsFilter { Circulating, NonCirculating, } #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcLargestAccountsConfig { #[serde(flatten)] pub commitment: Option, pub filter: Option, } #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcSupplyConfig { #[serde(flatten)] pub commitment: Option, #[serde(default)] pub exclude_non_circulating_accounts_list: bool, } #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcEpochConfig { pub epoch: Option, #[serde(flatten)] pub commitment: Option, pub min_context_slot: Option, } #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcAccountInfoConfig { pub encoding: Option, pub data_slice: Option, #[serde(flatten)] pub commitment: Option, pub min_context_slot: Option, } #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcProgramAccountsConfig { pub filters: Option>, #[serde(flatten)] pub account_config: RpcAccountInfoConfig, pub with_context: Option, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum RpcTransactionLogsFilter { All, AllWithVotes, Mentions(Vec), // base58-encoded list of addresses } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcTransactionLogsConfig { #[serde(flatten)] pub commitment: Option, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum RpcTokenAccountsFilter { Mint(String), ProgramId(String), } #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcSignatureSubscribeConfig { #[serde(flatten)] pub commitment: Option, pub enable_received_notification: Option, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum RpcBlockSubscribeFilter { All, MentionsAccountOrProgram(String), } #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcBlockSubscribeConfig { #[serde(flatten)] pub commitment: Option, pub encoding: Option, pub transaction_details: Option, pub show_rewards: Option, pub max_supported_transaction_version: Option, } #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcSignaturesForAddressConfig { pub before: Option, // Signature as base-58 string pub until: Option, // Signature as base-58 string pub limit: Option, #[serde(flatten)] pub commitment: Option, pub min_context_slot: Option, } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(untagged)] pub enum RpcEncodingConfigWrapper { Deprecated(Option), Current(Option), } impl RpcEncodingConfigWrapper { pub fn convert_to_current(&self) -> T { match self { RpcEncodingConfigWrapper::Deprecated(encoding) => T::new_with_encoding(encoding), RpcEncodingConfigWrapper::Current(config) => config.unwrap_or_default(), } } pub fn convert>(&self) -> RpcEncodingConfigWrapper { match self { RpcEncodingConfigWrapper::Deprecated(encoding) => { RpcEncodingConfigWrapper::Deprecated(*encoding) } RpcEncodingConfigWrapper::Current(config) => { RpcEncodingConfigWrapper::Current(config.map(|config| config.into())) } } } } pub trait EncodingConfig { fn new_with_encoding(encoding: &Option) -> Self; } #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcBlockConfig { pub encoding: Option, pub transaction_details: Option, pub rewards: Option, #[serde(flatten)] pub commitment: Option, pub max_supported_transaction_version: Option, } impl EncodingConfig for RpcBlockConfig { fn new_with_encoding(encoding: &Option) -> Self { Self { encoding: *encoding, ..Self::default() } } } impl RpcBlockConfig { pub fn rewards_only() -> Self { Self { transaction_details: Some(TransactionDetails::None), ..Self::default() } } pub fn rewards_with_commitment(commitment: Option) -> Self { Self { transaction_details: Some(TransactionDetails::None), commitment, ..Self::default() } } } impl From for RpcEncodingConfigWrapper { fn from(config: RpcBlockConfig) -> Self { RpcEncodingConfigWrapper::Current(Some(config)) } } #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcTransactionConfig { pub encoding: Option, #[serde(flatten)] pub commitment: Option, pub max_supported_transaction_version: Option, } impl EncodingConfig for RpcTransactionConfig { fn new_with_encoding(encoding: &Option) -> Self { Self { encoding: *encoding, ..Self::default() } } } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(untagged)] pub enum RpcBlocksConfigWrapper { EndSlotOnly(Option), CommitmentOnly(Option), } impl RpcBlocksConfigWrapper { pub fn unzip(&self) -> (Option, Option) { match &self { RpcBlocksConfigWrapper::EndSlotOnly(end_slot) => (*end_slot, None), RpcBlocksConfigWrapper::CommitmentOnly(commitment) => (None, *commitment), } } } #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RpcContextConfig { #[serde(flatten)] pub commitment: Option, pub min_context_slot: Option, }