helius_rust_client/models/
raw_transaction.rs1use 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#[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}