koios_sdk/models/
transaction.rs

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
220// Implementation blocks for key types
221impl 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}