use serde::{Deserialize, Serialize};
pub use hypersync_solana_net_types::{
Address, Hash, LogKind, RollbackGuard, Signature, TokenState,
};
mod opt_u64_as_string {
use serde::{Deserialize, Deserializer, Serializer};
pub fn serialize<S: Serializer>(v: &Option<u64>, s: S) -> Result<S::Ok, S::Error> {
match v {
Some(n) => s.serialize_some(&n.to_string()),
None => s.serialize_none(),
}
}
pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<Option<u64>, D::Error> {
let s: Option<String> = Option::deserialize(d)?;
s.map(|s| s.parse().map_err(serde::de::Error::custom))
.transpose()
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct Block {
pub slot: Option<u64>,
pub blockhash: Option<Hash>,
pub parent_slot: Option<u64>,
pub parent_blockhash: Option<Hash>,
pub block_time: Option<i64>,
pub block_height: Option<u64>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct Transaction {
pub slot: Option<u64>,
pub transaction_index: Option<u32>,
pub transaction_id: Option<Signature>,
pub signatures: Option<Vec<Signature>>,
pub fee_payer: Option<Address>,
pub success: Option<bool>,
pub err: Option<String>,
pub fee: Option<u64>,
pub compute_units_consumed: Option<u64>,
pub account_keys: Option<Vec<Address>>,
pub recent_blockhash: Option<Hash>,
pub version: Option<String>,
pub loaded_addresses_writable: Option<Vec<Address>>,
pub loaded_addresses_readonly: Option<Vec<Address>>,
pub has_dropped_log_messages: Option<bool>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct InstructionCall {
pub slot: Option<u64>,
pub transaction_index: Option<u32>,
pub instruction_address: Option<Vec<u32>>,
pub executing_account: Option<Address>,
pub executing_account_index: Option<u32>,
pub account_arguments: Option<Vec<Address>>,
pub account_index_arguments: Option<Vec<u32>>,
pub data: Option<Vec<u8>>,
pub d1: Option<Vec<u8>>,
pub d2: Option<Vec<u8>>,
pub d4: Option<Vec<u8>>,
pub d8: Option<Vec<u8>>,
pub a0: Option<Address>,
pub a1: Option<Address>,
pub a2: Option<Address>,
pub a3: Option<Address>,
pub a4: Option<Address>,
pub a5: Option<Address>,
pub a6: Option<Address>,
pub a7: Option<Address>,
pub a8: Option<Address>,
pub a9: Option<Address>,
pub is_inner: Option<bool>,
pub tx_success: Option<bool>,
pub error: Option<String>,
pub compute_units_consumed: Option<u64>,
}
impl InstructionCall {
pub fn stack_height(&self) -> Option<u32> {
self.instruction_address.as_ref().map(|a| a.len() as u32)
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct Log {
pub slot: Option<u64>,
pub transaction_index: Option<u32>,
pub instruction_address: Option<Vec<u32>>,
pub program_id: Option<Address>,
pub kind: Option<LogKind>,
pub message: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct AccountActivity {
pub slot: Option<u64>,
pub transaction_index: Option<u32>,
pub transaction_id: Option<Signature>,
pub account_index: Option<u32>,
pub account: Option<Address>,
pub pre_balance: Option<u64>,
pub post_balance: Option<u64>,
pub is_signer: Option<bool>,
pub is_writable: Option<bool>,
pub is_fee_payer: Option<bool>,
pub from_lookup_table: Option<bool>,
pub mint: Option<Address>,
pub pre_owner: Option<Address>,
pub post_owner: Option<Address>,
pub token_decimals: Option<u8>,
#[serde(default, with = "opt_u64_as_string")]
pub pre_token_balance: Option<u64>,
#[serde(default, with = "opt_u64_as_string")]
pub post_token_balance: Option<u64>,
pub pre_program_id: Option<Address>,
pub post_program_id: Option<Address>,
pub token_state: Option<TokenState>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct Reward {
pub slot: Option<u64>,
pub pubkey: Option<Address>,
pub lamports: Option<i64>,
pub post_balance: Option<u64>,
pub reward_type: Option<String>,
pub commission: Option<u8>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SolanaResponse {
pub next_slot: u64,
pub blocks: Vec<Block>,
pub transactions: Vec<Transaction>,
pub instruction_calls: Vec<InstructionCall>,
pub logs: Vec<Log>,
pub account_activity: Vec<AccountActivity>,
pub rewards: Vec<Reward>,
pub rollback_guard: Option<RollbackGuard>,
pub response_bytes: usize,
}