helius_rust_client/models/
raw_transaction.rs

1use serde::{Deserialize};
2use serde_json::{Value};
3use solana_client::client_error::{Result as ClientResult};
4use solana_program::{clock::UnixTimestamp, pubkey::Pubkey, slot_history::Slot};
5use solana_sdk::{
6    commitment_config::CommitmentLevel, signature::Signature, transaction::TransactionError,
7};
8use solana_transaction_status::{
9    option_serializer::OptionSerializer, Rewards, UiInnerInstructions, UiLoadedAddresses,
10    UiTransactionReturnData, UiTransactionTokenBalance,
11};
12
13use super::enriched_transaction::RequestConfig;
14
15#[derive(Clone, Debug, PartialEq, Deserialize)]
16#[serde(rename_all = "camelCase")]
17pub struct RawTransaction {
18    pub slot: Slot,
19    pub block_time: Option<UnixTimestamp>,
20    pub transaction: InnerTransaction,
21    pub meta: UiTransactionStatusMeta,
22    pub version: Option<String>,
23    pub index_within_block: Option<u64>,
24}
25
26#[derive(Clone, Debug, PartialEq, Deserialize)]
27#[serde(rename_all = "camelCase")]
28pub struct InnerTransaction {
29    pub signatures: Vec<String>,
30    pub message: InnerTransactionMessage,
31}
32
33#[derive(Clone, Debug, PartialEq, Deserialize)]
34#[serde(rename_all = "camelCase")]
35pub struct InnerTransactionMessage {
36    pub account_keys: Vec<String>,
37    pub header: Value,
38    pub recent_blockhash: String,
39    pub instructions: Vec<InnerInstruction>,
40}
41
42#[derive(Clone, Debug, PartialEq, Deserialize)]
43#[serde(rename_all = "camelCase")]
44pub struct InnerInstruction {
45    pub program_id_index: usize,
46    pub accounts: Vec<usize>,
47    pub data: String,
48}
49
50#[derive(Debug, Default)]
51pub struct GetRawTransactionsRequestConfig {
52    pub address: Pubkey,
53    pub before: Option<Signature>,
54    pub until: Option<Signature>,
55    pub limit: Option<usize>,
56    pub commitment: Option<CommitmentLevel>,
57}
58impl GetRawTransactionsRequestConfig {
59    pub fn generate_query_parameters(
60        &self,
61        api_key: String,
62    ) -> ClientResult<Vec<(String, String)>> {
63        let config = RequestConfig {
64            address: self.address,
65            before: self.before,
66            until: self.until,
67            limit: self.limit,
68            source: None,
69            transaction_type: None,
70            commitment: self.commitment,
71        };
72        config.generate_query_parameters(api_key)
73    }
74}
75
76/// A duplicate representation of TransactionStatusMeta with `err` field. Copied from solana-transactions-status crate, but without the status field.
77#[derive(Clone, Debug, PartialEq, Deserialize)]
78#[serde(rename_all = "camelCase")]
79pub struct UiTransactionStatusMeta {
80    pub err: Option<TransactionError>,
81    pub fee: u64,
82    pub pre_balances: Vec<u64>,
83    pub post_balances: Vec<u64>,
84    #[serde(
85        default = "OptionSerializer::none",
86        skip_serializing_if = "OptionSerializer::should_skip"
87    )]
88    pub inner_instructions: OptionSerializer<Vec<UiInnerInstructions>>,
89    #[serde(
90        default = "OptionSerializer::none",
91        skip_serializing_if = "OptionSerializer::should_skip"
92    )]
93    pub log_messages: OptionSerializer<Vec<String>>,
94    #[serde(
95        default = "OptionSerializer::none",
96        skip_serializing_if = "OptionSerializer::should_skip"
97    )]
98    pub pre_token_balances: OptionSerializer<Vec<UiTransactionTokenBalance>>,
99    #[serde(
100        default = "OptionSerializer::none",
101        skip_serializing_if = "OptionSerializer::should_skip"
102    )]
103    pub post_token_balances: OptionSerializer<Vec<UiTransactionTokenBalance>>,
104    #[serde(
105        default = "OptionSerializer::none",
106        skip_serializing_if = "OptionSerializer::should_skip"
107    )]
108    pub rewards: OptionSerializer<Rewards>,
109    #[serde(
110        default = "OptionSerializer::skip",
111        skip_serializing_if = "OptionSerializer::should_skip"
112    )]
113    pub loaded_addresses: OptionSerializer<UiLoadedAddresses>,
114    #[serde(
115        default = "OptionSerializer::skip",
116        skip_serializing_if = "OptionSerializer::should_skip"
117    )]
118    pub return_data: OptionSerializer<UiTransactionReturnData>,
119    #[serde(
120        default = "OptionSerializer::skip",
121        skip_serializing_if = "OptionSerializer::should_skip"
122    )]
123    pub compute_units_consumed: OptionSerializer<u64>,
124}