helius_sdk/api/
enhanced_transactions.rs1use crate::common::*;
2use crate::{Helius, ProgramName, Source, TokenStandard, TransactionContext, TransactionType};
3use serde::{Deserialize, Serialize};
4use serde_json::Number;
5
6impl Helius {
7 pub fn parse_transaction(
8 &self,
9 transactions: &ParseTransactionsRequest
10 ) -> reqwest::Result<Vec<EnrichedTransaction>> {
11 return self.handler.post(self.get_url_v0("transactions"), transactions);
12 }
13}
14
15serializable_camel_case! {
16 pub struct EnrichedTransaction {
17 pub description: String,
18 #[serde(rename="type")] pub transaction_type: TransactionType,
20 pub source: Source,
21 pub fee: Number,
22 pub fee_payer: String,
23 pub signature: String,
24 pub slot: Number,
25 pub native_transfers: Option<Vec<NativeTransfer>>,
26 pub token_transfers: Option<Vec<TokenTransfer>>,
27 pub account_data: Vec<AccountData>,
28 pub transaction_error: Option<TransactionError>,
29 pub instructions: Vec<Instruction>,
30 pub events: TransactionEvent
31 }
32}
33
34serializable! {
35 pub struct ParseTransactionsRequest {
36 pub transactions: Vec<String>
37 }
38}
39
40serializable! {
41 pub struct TransactionEvent {
42 pub nft: Option<NFTEvent>,
43 pub swap: Option<SwapEvent>,
44 pub compressed: Option<CompressedNftEvent>
45 }
46}
47
48serializable_camel_case! {
49 pub struct CompressedNftEvent {
50 #[serde(rename="type")]
51 pub transaction_type: TransactionType,
52 pub tree_id: String,
53 pub leaf_index: Option<Number>,
54 pub seq: Option<Number>,
55 pub asset_id: Option<String>,
56 pub instruction_index: Option<Number>,
57 pub inner_instruction_index: Option<Number>,
58 pub new_leaf_owner: Option<String>,
59 pub old_leaf_owner: Option<String>
60 }
61}
62
63serializable_camel_case! {
64 pub struct SwapEvent {
65 pub native_input: NativeBalanceChange,
66 pub native_output: NativeBalanceChange,
67 pub token_inputs: Vec<TokenBalanceChange>,
68 pub token_outputs: Vec<TokenBalanceChange>,
69 pub token_fees: Vec<TokenBalanceChange>,
70 pub native_fees: Vec<NativeBalanceChange>,
71 pub inner_swaps: Vec<TokenSwap>
72 }
73}
74
75serializable_camel_case! {
76 pub struct TokenSwap {
77 pub native_input: Option<NativeTransfer>,
78 pub native_output: Option<NativeTransfer>,
79 pub token_inputs: Vec<TokenTransfer>,
80 pub token_outputs: Vec<TokenTransfer>,
81 pub token_fees: Vec<TokenTransfer>,
82 pub native_fees: Vec<NativeTransfer>,
83 pub program_info: ProgramInfo
84 }
85}
86
87serializable_camel_case! {
88 pub struct ProgramInfo {
89 pub source: Source,
90 pub account: String,
91 pub program_name: ProgramName,
92 pub instruction_name: String
93 }
94}
95
96serializable_camel_case! {
97 pub struct NFTEvent {
98 pub seller: String,
99 pub buyer: String,
100 pub timestamp: Number,
101 pub amount: Number,
102 pub fee: Number,
103 pub signature: String,
104 pub source: Source,
105 #[serde(rename="type")]
106 pub transaction_type: TransactionType,
107 pub sale_type: TransactionContext,
108 pub nfts: Vec<Token>
109 }
110}
111
112serializable_camel_case! {
113 pub struct Token {
114 pub mint: String,
115 pub token_standard: TokenStandard
116 }
117}
118
119serializable! {
120 pub struct TransactionError {
121 pub error: String
122 }
123}
124
125serializable! {
126 pub struct NativeBalanceChange {
127 pub account: String,
128 pub amount: Number
129 }
130}
131
132serializable_camel_case! {
133 pub struct AccountData {
134 pub account: String,
135 pub native_balance_change: Number,
136 pub token_balance_changes: Option<Vec<TokenBalanceChange>>
137 }
138}
139
140serializable_camel_case! {
141 pub struct TokenBalanceChange {
142 pub user_account: String,
143 pub token_account: String,
144 pub raw_token_amount: RawTokenAmount,
145 pub mint: String
146 }
147}
148
149serializable_camel_case! {
150 pub struct RawTokenAmount {
151 pub token_amount: String,
152 pub decimals: Number
153 }
154}
155
156serializable_camel_case! {
157 pub struct TokenTransfer {
158 #[serde(flatten)]
159 pub user_accounts: TransferUserAccounts,
160 pub from_token_account: Option<String>,
161 pub to_token_account: Option<String>,
162 pub token_amount: Number,
163 pub token_standard: TokenStandard,
164 pub mint: String
165 }
166}
167
168serializable_camel_case! {
169 pub struct TransferUserAccounts {
170 pub from_user_account: Option<String>,
171 pub to_user_account: Option<String>,
172 }
173}
174
175serializable_camel_case! {
176 pub struct NativeTransfer {
177 #[serde(flatten)]
178 pub user_accounts: TransferUserAccounts,
179 pub amount: Number
180 }
181}
182
183serializable_camel_case! {
184 pub struct Instruction {
185 pub accounts: Vec<String>,
186 pub data: String,
187 pub program_id: String,
188 pub inner_instructions: Vec<InnerInstruction>
189 }
190}
191
192serializable_camel_case! {
193 pub struct InnerInstruction {
194 pub accounts: Vec<String>,
195 pub data: String,
196 pub program_id: String
197 }
198}