1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4use super::{
5 governance::{ProposalWithdrawal, VoterRole},
6 AssetItem, ProposalType, Vote,
7};
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct TransactionInfo {
11 pub tx_hash: String,
12 pub block_hash: String,
13 pub block_height: u64,
14 pub epoch_no: u64,
15 pub epoch_slot: u64,
16 pub absolute_slot: u64,
17 pub tx_timestamp: u64,
18 pub tx_block_index: u64,
19 pub tx_size: u64,
20 pub total_output: String,
21 pub fee: String,
22 pub treasury_donation: String,
23 pub deposit: String,
24 #[serde(skip_serializing_if = "Option::is_none")]
25 pub invalid_before: Option<String>,
26 #[serde(skip_serializing_if = "Option::is_none")]
27 pub invalid_after: Option<String>,
28 #[serde(skip_serializing_if = "Option::is_none")]
29 pub collateral_inputs: Option<Vec<TransactionOutput>>,
30 #[serde(skip_serializing_if = "Option::is_none")]
31 pub collateral_output: Option<Vec<TransactionOutput>>,
32 #[serde(skip_serializing_if = "Option::is_none")]
33 pub reference_inputs: Option<Vec<TransactionOutput>>,
34 pub inputs: Vec<TransactionOutput>,
35 pub outputs: Vec<TransactionOutput>,
36 #[serde(skip_serializing_if = "Option::is_none")]
37 pub withdrawals: Option<Vec<Withdrawal>>,
38 #[serde(skip_serializing_if = "Option::is_none")]
39 pub assets_minted: Option<Vec<AssetItem>>,
40 #[serde(skip_serializing_if = "Option::is_none")]
41 pub metadata: Option<HashMap<String, serde_json::Value>>,
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub certificates: Option<Vec<Certificate>>,
44 #[serde(skip_serializing_if = "Option::is_none")]
45 pub native_scripts: Option<Vec<NativeScript>>,
46 #[serde(skip_serializing_if = "Option::is_none")]
47 pub plutus_contracts: Option<Vec<PlutusContract>>,
48 #[serde(skip_serializing_if = "Option::is_none")]
49 pub voting_procedures: Option<Vec<VotingProcedure>>,
50 #[serde(skip_serializing_if = "Option::is_none")]
51 pub proposal_procedures: Option<Vec<ProposalProcedure>>,
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize)]
55pub struct VotingProcedure {
56 pub proposal_tx_hash: String,
57 pub proposal_index: u64,
58 pub voter_role: VoterRole,
59 pub voter: String,
60 pub voter_hex: String,
61 pub vote: Vote,
62 #[serde(skip_serializing_if = "Option::is_none")]
63 pub meta_url: Option<String>,
64 #[serde(skip_serializing_if = "Option::is_none")]
65 pub meta_hash: Option<String>,
66}
67
68#[derive(Debug, Clone, Serialize, Deserialize)]
69pub struct ProposalProcedure {
70 pub index: u64,
71 #[serde(rename = "type")]
72 pub proposal_type: ProposalType,
73 pub description: String,
74 pub deposit: String,
75 pub return_address: String,
76 pub expiration: Option<u64>,
77 #[serde(skip_serializing_if = "Option::is_none")]
78 pub meta_url: Option<String>,
79 #[serde(skip_serializing_if = "Option::is_none")]
80 pub meta_hash: Option<String>,
81 #[serde(skip_serializing_if = "Option::is_none")]
82 pub withdrawal: Option<ProposalWithdrawal>,
83 #[serde(skip_serializing_if = "Option::is_none")]
84 pub param_proposal: Option<serde_json::Value>,
85}
86
87#[derive(Debug, Clone, Serialize, Deserialize)]
88pub struct TransactionOutput {
89 pub payment_addr: PaymentAddress,
90 #[serde(skip_serializing_if = "Option::is_none")]
91 pub stake_addr: Option<String>,
92 pub tx_hash: String,
93 pub tx_index: u64,
94 pub value: String,
95 #[serde(skip_serializing_if = "Option::is_none")]
96 pub datum_hash: Option<String>,
97 #[serde(skip_serializing_if = "Option::is_none")]
98 pub inline_datum: Option<InlineDatum>,
99 #[serde(skip_serializing_if = "Option::is_none")]
100 pub reference_script: Option<ReferenceScript>,
101 #[serde(skip_serializing_if = "Option::is_none")]
102 pub asset_list: Option<Vec<AssetItem>>,
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize)]
106pub struct PaymentAddress {
107 pub bech32: String,
108 pub cred: String,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize)]
112pub struct InlineDatum {
113 pub bytes: String,
114 pub value: serde_json::Value,
115}
116
117#[derive(Debug, Clone, Serialize, Deserialize)]
118pub struct ReferenceScript {
119 pub hash: String,
120 pub size: u64,
121 #[serde(rename = "type")]
122 pub script_type: String,
123 pub bytes: String,
124 #[serde(skip_serializing_if = "Option::is_none")]
125 pub value: Option<serde_json::Value>,
126}
127
128#[derive(Debug, Clone, Serialize, Deserialize)]
129pub struct Withdrawal {
130 pub amount: String,
131 pub stake_addr: String,
132}
133
134#[derive(Debug, Clone, Serialize, Deserialize)]
135pub struct Certificate {
136 #[serde(skip_serializing_if = "Option::is_none")]
137 pub index: Option<u64>,
138 #[serde(rename = "type")]
139 pub cert_type: String,
140 #[serde(skip_serializing_if = "Option::is_none")]
141 pub info: Option<serde_json::Value>,
142}
143
144#[derive(Debug, Clone, Serialize, Deserialize)]
145pub struct NativeScript {
146 pub script_hash: String,
147 pub script_json: Option<serde_json::Value>,
148}
149
150#[derive(Debug, Clone, Serialize, Deserialize)]
151pub struct PlutusContract {
152 #[serde(skip_serializing_if = "Option::is_none")]
153 pub address: Option<String>,
154 #[serde(skip_serializing_if = "Option::is_none")]
155 pub spends_input: Option<SpendInput>,
156 pub script_hash: String,
157 pub bytecode: String,
158 pub size: u64,
159 pub valid_contract: bool,
160 pub input: PlutusInput,
161}
162
163#[derive(Debug, Clone, Serialize, Deserialize)]
164pub struct SpendInput {
165 pub tx_hash: String,
166 pub tx_index: u64,
167}
168
169#[derive(Debug, Clone, Serialize, Deserialize)]
170pub struct PlutusInput {
171 pub redeemer: Redeemer,
172 pub datum: Datum,
173}
174
175#[derive(Debug, Clone, Serialize, Deserialize)]
176pub struct Redeemer {
177 pub purpose: String,
178 pub fee: String,
179 pub unit: RedeemerUnit,
180 pub datum: Datum,
181}
182
183#[derive(Debug, Clone, Serialize, Copy, Deserialize)]
184pub struct RedeemerUnit {
185 pub steps: u64,
186 pub mem: u64,
187}
188
189#[derive(Debug, Clone, Serialize, Deserialize)]
190pub struct Datum {
191 pub hash: String,
192 pub value: serde_json::Value,
193}
194
195#[derive(Debug, Clone, Serialize, Deserialize)]
196pub struct TransactionCbor {
197 pub tx_hash: String,
198 pub block_hash: String,
199 pub block_height: u64,
200 pub epoch_no: u64,
201 pub absolute_slot: u64,
202 pub tx_timestamp: u64,
203 pub cbor: String,
204}
205
206#[derive(Debug, Clone, Serialize, Deserialize)]
207pub struct TransactionStatus {
208 pub tx_hash: String,
209 #[serde(skip_serializing_if = "Option::is_none")]
210 pub num_confirmations: Option<u64>,
211}
212
213#[derive(Debug, Clone, Serialize, Deserialize)]
214pub struct TransactionMetadata {
215 pub tx_hash: String,
216 #[serde(skip_serializing_if = "Option::is_none")]
217 pub metadata: Option<serde_json::Value>,
218}
219
220impl TransactionInfo {
222 pub fn new(
223 tx_hash: String,
224 block_hash: String,
225 block_height: u64,
226 epoch_no: u64,
227 epoch_slot: u64,
228 absolute_slot: u64,
229 tx_timestamp: u64,
230 tx_block_index: u64,
231 tx_size: u64,
232 total_output: String,
233 fee: String,
234 treasury_donation: String,
235 deposit: String,
236 inputs: Vec<TransactionOutput>,
237 outputs: Vec<TransactionOutput>,
238 ) -> Self {
239 Self {
240 tx_hash,
241 block_hash,
242 block_height,
243 epoch_no,
244 epoch_slot,
245 absolute_slot,
246 tx_timestamp,
247 tx_block_index,
248 tx_size,
249 total_output,
250 fee,
251 treasury_donation,
252 deposit,
253 invalid_before: None,
254 invalid_after: None,
255 collateral_inputs: None,
256 collateral_output: None,
257 reference_inputs: None,
258 inputs,
259 outputs,
260 withdrawals: None,
261 assets_minted: None,
262 metadata: None,
263 certificates: None,
264 native_scripts: None,
265 plutus_contracts: None,
266 voting_procedures: None,
267 proposal_procedures: None,
268 }
269 }
270}
271
272#[derive(Debug, Clone, Serialize, Deserialize)]
273pub struct TxMetaLabels {
274 pub key: String,
275}
276
277#[derive(Debug, Clone, Serialize, Deserialize)]
278pub struct UtxoInfo {
279 pub tx_hash: String,
280 pub tx_index: u64,
281 pub address: String,
282 pub value: String,
283 #[serde(skip_serializing_if = "Option::is_none")]
284 pub stake_address: Option<String>,
285 #[serde(skip_serializing_if = "Option::is_none")]
286 pub payment_cred: Option<String>,
287 pub epoch_no: u64,
288 pub block_height: u64,
289 pub block_time: u64,
290 #[serde(skip_serializing_if = "Option::is_none")]
291 pub datum_hash: Option<String>,
292 #[serde(skip_serializing_if = "Option::is_none")]
293 pub inline_datum: Option<serde_json::Value>,
294 #[serde(skip_serializing_if = "Option::is_none")]
295 pub reference_script: Option<serde_json::Value>,
296 #[serde(skip_serializing_if = "Option::is_none")]
297 pub asset_list: Option<Vec<AssetItem>>,
298 pub is_spent: bool,
299}
300impl UtxoInfo {
301 pub fn new(
302 tx_hash: String,
303 tx_index: u64,
304 address: String,
305 value: String,
306 epoch_no: u64,
307 block_height: u64,
308 block_time: u64,
309 is_spent: bool,
310 ) -> Self {
311 Self {
312 tx_hash,
313 tx_index,
314 address,
315 value,
316 stake_address: None,
317 payment_cred: None,
318 epoch_no,
319 block_height,
320 block_time,
321 datum_hash: None,
322 inline_datum: None,
323 reference_script: None,
324 asset_list: None,
325 is_spent,
326 }
327 }
328}