koios_sdk/models/
governance.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
4pub struct DrepInfo {
5    pub drep_id: String,
6    pub hex: String,
7    pub has_script: bool,
8    pub registered: bool,
9    #[serde(skip_serializing_if = "Option::is_none")]
10    pub deposit: Option<String>,
11    pub active: bool,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub expires_epoch_no: Option<u64>,
14    pub amount: String,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub meta_url: Option<String>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub meta_hash: Option<String>,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct DrepEpochSummary {
23    pub epoch_no: u64,
24    pub amount: String,
25    pub dreps: u64,
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct DrepMetadata {
30    pub drep_id: String,
31    pub hex: String,
32    pub has_script: bool,
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub meta_url: Option<String>,
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub meta_hash: Option<String>,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub meta_json: Option<serde_json::Value>,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub bytes: Option<String>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub warning: Option<String>,
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub language: Option<String>,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub comment: Option<String>,
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub is_valid: Option<bool>,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct DrepUpdate {
53    pub drep_id: String,
54    pub hex: String,
55    pub has_script: bool,
56    pub update_tx_hash: String,
57    pub cert_index: u64,
58    pub block_time: u64,
59    pub action: DrepAction,
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub deposit: Option<String>,
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    #[serde(skip_serializing_if = "Option::is_none")]
67    pub meta_json: Option<serde_json::Value>,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
71#[serde(rename_all = "lowercase")]
72pub enum DrepAction {
73    Updated,
74    Registered,
75    Deregistered,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct DrepVote {
80    pub proposal_id: String,
81    pub proposal_tx_hash: String,
82    pub proposal_index: u64,
83    pub vote_tx_hash: String,
84    pub block_time: u64,
85    pub vote: Vote,
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub meta_url: Option<String>,
88    #[serde(skip_serializing_if = "Option::is_none")]
89    pub meta_hash: Option<String>,
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
93#[serde(rename_all = "lowercase")]
94pub enum Vote {
95    Yes,
96    No,
97    Abstain,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
101pub struct ProposalList {
102    pub block_time: u64,
103    pub proposal_id: String,
104    pub proposal_tx_hash: String,
105    pub proposal_index: u64,
106    pub proposal_type: ProposalType,
107    pub proposal_description: serde_json::Value,
108    pub deposit: String,
109    pub return_address: String,
110    pub proposed_epoch: u64,
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub ratified_epoch: Option<u64>,
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub enacted_epoch: Option<u64>,
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub dropped_epoch: Option<u64>,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub expired_epoch: Option<u64>,
119    #[serde(skip_serializing_if = "Option::is_none")]
120    pub expiration: Option<u64>,
121    #[serde(skip_serializing_if = "Option::is_none")]
122    pub meta_url: Option<String>,
123    #[serde(skip_serializing_if = "Option::is_none")]
124    pub meta_hash: Option<String>,
125    #[serde(skip_serializing_if = "Option::is_none")]
126    pub meta_json: Option<serde_json::Value>,
127    #[serde(skip_serializing_if = "Option::is_none")]
128    pub meta_comment: Option<String>,
129    #[serde(skip_serializing_if = "Option::is_none")]
130    pub meta_language: Option<String>,
131    #[serde(skip_serializing_if = "Option::is_none")]
132    pub meta_is_valid: Option<bool>,
133    #[serde(skip_serializing_if = "Option::is_none")]
134    pub withdrawal: Option<ProposalWithdrawal>,
135    #[serde(skip_serializing_if = "Option::is_none")]
136    pub param_proposal: Option<serde_json::Value>,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
140#[serde(rename_all = "snake_case")]
141pub enum ProposalType {
142    ParameterChange,
143    HardForkInitiation,
144    TreasuryWithdrawals,
145    NoConfidence,
146    NewCommittee,
147    NewConstitution,
148    InfoAction,
149}
150
151#[derive(Debug, Clone, Serialize, Deserialize)]
152pub struct ProposalWithdrawal {
153    pub stake_address: String,
154    pub amount: String,
155}
156
157#[derive(Debug, Clone, Serialize, Deserialize)]
158pub struct ProposalVote {
159    pub block_time: u64,
160    pub voter_role: VoterRole,
161    pub voter_id: String,
162    pub voter_hex: String,
163    pub voter_has_script: bool,
164    pub vote: Vote,
165    #[serde(skip_serializing_if = "Option::is_none")]
166    pub meta_url: Option<String>,
167    #[serde(skip_serializing_if = "Option::is_none")]
168    pub meta_hash: Option<String>,
169}
170
171#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
172#[serde(rename_all = "snake_case")]
173pub enum VoterRole {
174    ConstitutionalCommittee,
175    DRep,
176    SPO,
177}
178
179// Fix for CommitteeInfo voting power
180#[derive(Debug, Clone, Serialize, Deserialize)]
181pub struct CommitteeInfo {
182    pub proposal_id: String,
183    pub proposal_tx_hash: String,
184    pub proposal_index: u64,
185    pub quorum_numerator: u64,
186    pub quorum_denominator: u64,
187    pub members: Vec<CommitteeMember>,
188}
189#[derive(Debug, Clone, Serialize, Deserialize)]
190pub struct CommitteeMember {
191    pub status: CommitteeMemberStatus,
192    pub cc_cold_hex: String,
193    pub cc_cold_has_script: bool,
194    #[serde(skip_serializing_if = "Option::is_none")]
195    pub cc_hot_hex: Option<String>,
196    #[serde(skip_serializing_if = "Option::is_none")]
197    pub cc_hot_has_script: Option<bool>,
198    pub expiration_epoch: u64,
199}
200
201#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
202#[serde(rename_all = "snake_case")]
203pub enum CommitteeMemberStatus {
204    Authorized,
205    NotAuthorized,
206    Resigned,
207}
208
209// Implementation blocks for key types
210impl DrepInfo {
211    pub fn new(
212        drep_id: String,
213        hex: String,
214        has_script: bool,
215        registered: bool,
216        active: bool,
217        amount: String,
218    ) -> Self {
219        Self {
220            drep_id,
221            hex,
222            has_script,
223            registered,
224            deposit: None,
225            active,
226            expires_epoch_no: None,
227            amount,
228            meta_url: None,
229            meta_hash: None,
230        }
231    }
232}
233
234impl ProposalList {
235    pub fn new(
236        block_time: u64,
237        proposal_id: String,
238        proposal_tx_hash: String,
239        proposal_index: u64,
240        proposal_type: ProposalType,
241        proposal_description: serde_json::Value,
242        deposit: String,
243        return_address: String,
244        proposed_epoch: u64,
245    ) -> Self {
246        Self {
247            block_time,
248            proposal_id,
249            proposal_tx_hash,
250            proposal_index,
251            proposal_type,
252            proposal_description,
253            deposit,
254            return_address,
255            proposed_epoch,
256            ratified_epoch: None,
257            enacted_epoch: None,
258            dropped_epoch: None,
259            expired_epoch: None,
260            expiration: None,
261            meta_url: None,
262            meta_hash: None,
263            meta_json: None,
264            meta_comment: None,
265            meta_language: None,
266            meta_is_valid: None,
267            withdrawal: None,
268            param_proposal: None,
269        }
270    }
271}
272
273#[derive(Debug, Clone, Serialize, Deserialize)]
274pub struct DrepHistory {
275    pub drep_id: String,
276    pub epoch_no: u64,
277    pub amount: String,
278}
279
280#[derive(Debug, Clone, Serialize, Deserialize)]
281pub struct CommitteeVotes {
282    pub proposal_id: String,
283    pub proposal_tx_hash: String,
284    pub proposal_index: u64,
285    pub vote_tx_hash: String,
286    pub block_time: u64,
287    pub vote: Vote,
288    #[serde(skip_serializing_if = "Option::is_none")]
289    pub meta_url: Option<String>,
290    #[serde(skip_serializing_if = "Option::is_none")]
291    pub meta_hash: Option<String>,
292}
293
294#[derive(Debug, Clone, Serialize, Deserialize)]
295pub struct VoterProposalList {
296    pub block_time: u64,
297    pub proposal_id: String,
298    pub proposal_tx_hash: String,
299    pub proposal_index: u64,
300    pub proposal_type: ProposalType,
301    pub proposal_description: serde_json::Value,
302    pub deposit: String,
303    pub return_address: String,
304    pub proposed_epoch: u64,
305    #[serde(skip_serializing_if = "Option::is_none")]
306    pub ratified_epoch: Option<u64>,
307    #[serde(skip_serializing_if = "Option::is_none")]
308    pub enacted_epoch: Option<u64>,
309    #[serde(skip_serializing_if = "Option::is_none")]
310    pub dropped_epoch: Option<u64>,
311    #[serde(skip_serializing_if = "Option::is_none")]
312    pub expired_epoch: Option<u64>,
313    #[serde(skip_serializing_if = "Option::is_none")]
314    pub expiration: Option<u64>,
315    #[serde(skip_serializing_if = "Option::is_none")]
316    pub meta_url: Option<String>,
317    #[serde(skip_serializing_if = "Option::is_none")]
318    pub meta_hash: Option<String>,
319    #[serde(skip_serializing_if = "Option::is_none")]
320    pub meta_json: Option<serde_json::Value>,
321    #[serde(skip_serializing_if = "Option::is_none")]
322    pub meta_comment: Option<String>,
323    #[serde(skip_serializing_if = "Option::is_none")]
324    pub meta_language: Option<String>,
325    #[serde(skip_serializing_if = "Option::is_none")]
326    pub meta_is_valid: Option<bool>,
327    #[serde(skip_serializing_if = "Option::is_none")]
328    pub withdrawal: Option<ProposalWithdrawal>,
329    #[serde(skip_serializing_if = "Option::is_none")]
330    pub param_proposal: Option<serde_json::Value>,
331}
332
333// Implementation blocks
334impl DrepHistory {
335    pub fn new(drep_id: String, epoch_no: u64, amount: String) -> Self {
336        Self {
337            drep_id,
338            epoch_no,
339            amount,
340        }
341    }
342}
343
344impl VoterProposalList {
345    pub fn new(
346        block_time: u64,
347        proposal_id: String,
348        proposal_tx_hash: String,
349        proposal_index: u64,
350        proposal_type: ProposalType,
351        proposal_description: serde_json::Value,
352        deposit: String,
353        return_address: String,
354        proposed_epoch: u64,
355    ) -> Self {
356        Self {
357            block_time,
358            proposal_id,
359            proposal_tx_hash,
360            proposal_index,
361            proposal_type,
362            proposal_description,
363            deposit,
364            return_address,
365            proposed_epoch,
366            ratified_epoch: None,
367            enacted_epoch: None,
368            dropped_epoch: None,
369            expired_epoch: None,
370            expiration: None,
371            meta_url: None,
372            meta_hash: None,
373            meta_json: None,
374            meta_comment: None,
375            meta_language: None,
376            meta_is_valid: None,
377            withdrawal: None,
378            param_proposal: None,
379        }
380    }
381}