1extern crate serde;
2extern crate serde_json;
3
4use serde::{Deserialize, Deserializer, Serialize};
5
6fn deserialize_optional_field<'de, T, D>(deserializer: D)
7 -> Result<Option<Option<T>>, D::Error>
8 where D: Deserializer<'de>,
9 T: Deserialize<'de>
10{
11 Ok(Some(Option::deserialize(deserializer)?))
12}
13
14#[derive(Debug, Serialize, Deserialize)]
15pub struct TransactionLast {
16 #[serde(skip_serializing_if = "Option::is_none")]
17 pub meta: Option<Meta>,
18 #[serde(skip_serializing_if = "Option::is_none")]
19 pub transaction: Option<Transaction>,
20}
21
22#[derive(Debug, Serialize, Deserialize)]
23pub struct Meta {
24 pub err: Option<Err>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 pub fee: Option<i64>,
27 #[serde(skip_serializing_if = "Option::is_none")]
28 #[serde(rename = "innerInstructions")]
29 pub inner_instructions: Option<Vec<Option<serde_json::Value>>>,
30 #[serde(skip_serializing_if = "Option::is_none")]
31 #[serde(rename = "loadedAddresses")]
32 pub loaded_addresses: Option<LoadedAddresses>,
33 #[serde(skip_serializing_if = "Option::is_none")]
34 #[serde(rename = "logMessages")]
35 pub log_messages: Option<Vec<String>>,
36 #[serde(skip_serializing_if = "Option::is_none")]
37 #[serde(rename = "postBalances")]
38 pub post_balances: Option<Vec<i64>>,
39 #[serde(skip_serializing_if = "Option::is_none")]
40 #[serde(rename = "postTokenBalances")]
41 pub post_token_balances: Option<Vec<TokenBalance>>,
42 #[serde(skip_serializing_if = "Option::is_none")]
43 #[serde(rename = "preBalances")]
44 pub pre_balances: Option<Vec<i64>>,
45 #[serde(skip_serializing_if = "Option::is_none")]
46 #[serde(rename = "preTokenBalances")]
47 pub pre_token_balances: Option<Vec<TokenBalance>>,
48 #[serde(skip_serializing_if = "Option::is_none")]
49 pub rewards: Option<Vec<Option<serde_json::Value>>>,
50 pub status: Option<Status>,
51}
52
53
54#[derive(Debug, Serialize, Deserialize)]
55pub struct Err {
56 #[serde(rename = "InstructionError")]
57 pub instruction_error: Option<Vec<InstructionErrorElement>>,
58}
59
60#[derive(Debug, Serialize, Deserialize)]
61pub struct InstructionErrorClass {
62 #[serde(skip_serializing_if = "Option::is_none")]
63 #[serde(rename = "Custom")]
64 pub custom: Option<i64>,
65}
66
67#[derive(Debug, Serialize, Deserialize)]
68pub struct LoadedAddresses {
69 pub readonly: Option<Vec<Option<serde_json::Value>>>,
70 pub writable: Option<Vec<Option<serde_json::Value>>>,
71}
72
73#[derive(Debug, Serialize, Deserialize)]
74pub struct TokenBalance {
75 #[serde(rename = "accountIndex")]
76 pub account_index: Option<i64>,
77 pub mint: Option<String>,
78 pub owner: Option<String>,
79 #[serde(rename = "uiTokenAmount")]
80 pub ui_token_amount: Option<UiTokenAmount>,
81 #[serde(skip_serializing_if = "Option::is_none")]
82 #[serde(rename = "programId")]
83 pub program_id: Option<String>,
84}
85
86#[derive(Debug, Serialize, Deserialize)]
87pub struct UiTokenAmount {
88 pub amount: Option<String>,
89 pub decimals: Option<i64>,
90 #[serde(rename = "uiAmount")]
91 pub ui_amount: Option<f64>,
92 #[serde(rename = "uiAmountString")]
93 pub ui_amount_string: Option<String>,
94
95}
96
97#[derive(Debug, Serialize, Deserialize, Default)]
98#[serde(default)]
99pub struct Status {
100 #[serde(deserialize_with = "deserialize_optional_field")]
101 #[serde(skip_serializing_if = "Option::is_none")]
102 #[serde(rename = "Ok")]
103 pub ok: Option<Option<String>>,
104 #[serde(skip_serializing_if = "Option::is_none")]
105 #[serde(rename = "Err")]
106 pub err: Option<Err>,
107}
108
109#[derive(Debug, Serialize, Deserialize)]
110pub struct Transaction {
111 #[serde(skip_serializing_if = "Option::is_none")]
112 pub message: Option<Message>,
113 #[serde(skip_serializing_if = "Option::is_none")]
114 pub signatures: Option<Vec<String>>,
115}
116
117#[derive(Debug, Serialize, Deserialize)]
118pub struct Message {
119 #[serde(rename = "accountKeys")]
120 pub account_keys: Option<Vec<AccountKey>>,
121 #[serde(rename = "addressTableLookups")]
122 pub address_table_lookups: Option<serde_json::Value>,
123 pub instructions: Option<Vec<Instruction>>,
124 #[serde(rename = "recentBlockhash")]
125 pub recent_blockhash: Option<String>,
126}
127
128#[derive(Debug, Serialize, Deserialize)]
129pub struct AccountKey {
130 pub pubkey: Option<String>,
131 pub signer: Option<bool>,
132 pub writable: Option<bool>,
133}
134
135#[derive(Debug, Serialize, Deserialize)]
136pub struct Instruction {
137 #[serde(skip_serializing_if = "Option::is_none")]
138 pub accounts: Option<Vec<String>>,
139 #[serde(skip_serializing_if = "Option::is_none")]
140 pub data: Option<String>,
141 #[serde(rename = "programId")]
142 pub program_id: Option<String>,
143 #[serde(skip_serializing_if = "Option::is_none")]
144 pub parsed: Option<Parsed>,
145 #[serde(skip_serializing_if = "Option::is_none")]
146 pub program: Option<String>,
147}
148
149#[derive(Debug, Serialize, Deserialize)]
150pub struct Parsed {
151 #[serde(skip_serializing_if = "Option::is_none")]
152 pub info: Option<Info>,
153 #[serde(skip_serializing_if = "Option::is_none")]
154 #[serde(rename = "type")]
155 pub parsed_type: Option<String>,
156}
157
158#[derive(Debug, Serialize, Deserialize)]
159pub struct Info {
160 #[serde(skip_serializing_if = "Option::is_none")]
161 pub destination: Option<String>,
162 #[serde(skip_serializing_if = "Option::is_none")]
163 pub lamports: Option<i64>,
164 #[serde(skip_serializing_if = "Option::is_none")]
165 pub source: Option<String>,
166 #[serde(skip_serializing_if = "Option::is_none")]
167 #[serde(rename = "clockSysvar")]
168 pub clock_sysvar: Option<String>,
169 #[serde(skip_serializing_if = "Option::is_none")]
170 #[serde(rename = "slotHashesSysvar")]
171 pub slot_hashes_sysvar: Option<String>,
172 #[serde(skip_serializing_if = "Option::is_none")]
173 pub vote: Option<Vote>,
174 #[serde(skip_serializing_if = "Option::is_none")]
175 #[serde(rename = "voteAccount")]
176 pub vote_account: Option<String>,
177 #[serde(skip_serializing_if = "Option::is_none")]
178 #[serde(rename = "voteAuthority")]
179 pub vote_authority: Option<String>,
180 #[serde(skip_serializing_if = "Option::is_none")]
181 pub hash: Option<String>,
182 #[serde(skip_serializing_if = "Option::is_none")]
183 pub amount: Option<String>,
184 #[serde(skip_serializing_if = "Option::is_none")]
185 pub authority: Option<String>,
186}
187
188#[derive(Debug, Serialize, Deserialize)]
189pub struct Vote {
190 pub hash: Option<String>,
191 pub slots: Option<Vec<i64>>,
192 pub timestamp: Option<i64>,
193}
194
195#[derive(Debug, Serialize, Deserialize)]
196#[serde(untagged)]
197pub enum InstructionErrorElement {
198 InstructionErrorClass(InstructionErrorClass),
199 Integer(i64),
200 String(String),
201}