helius_sdk/api/
enhanced_transactions.rs

1use 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")] // so we don't shadow a keyword
19        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}