koios_sdk/models/
pool.rs

1use serde::{Deserialize, Serialize};
2
3use super::Vote;
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct PoolMetadata {
7    pub name: String,
8    pub ticker: String,
9    pub homepage: String,
10    pub description: String,
11}
12
13#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
14#[serde(rename_all = "lowercase")]
15pub enum PoolStatus {
16    Registered,
17    Retiring,
18    Retired,
19}
20#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct PoolInfo {
22    pub pool_id_bech32: String,
23    pub pool_id_hex: String,
24    pub active_epoch_no: u64,
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub vrf_key_hash: Option<String>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub margin: Option<f64>,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub fixed_cost: Option<String>,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub pledge: Option<String>,
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub deposit: Option<String>,
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub reward_addr: Option<String>,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub reward_addr_delegated_drep: Option<String>,
39    pub owners: Option<Vec<String>>,
40    pub relays: Vec<RelayInfo>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub meta_url: Option<String>,
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub meta_hash: Option<String>,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub meta_json: Option<PoolMetadata>,
47    pub pool_status: PoolStatus,
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub retiring_epoch: Option<u64>,
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub op_cert: Option<String>,
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub op_cert_counter: Option<u64>,
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub active_stake: Option<String>,
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub sigma: Option<f64>,
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub block_count: Option<u64>,
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub live_pledge: Option<String>,
62    #[serde(skip_serializing_if = "Option::is_none")]
63    pub live_stake: Option<String>,
64    pub live_delegators: u64,
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub live_saturation: Option<f64>,
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub voting_power: Option<String>,
69}
70
71// Fix for PoolList struct
72#[derive(Debug, Clone, Serialize, Deserialize)]
73pub struct PoolList {
74    pub pool_id_bech32: String,
75    pub pool_id_hex: String,
76    pub active_epoch_no: u64,
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub margin: Option<f64>,
79    #[serde(skip_serializing_if = "Option::is_none")]
80    pub fixed_cost: Option<String>,
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub pledge: Option<String>,
83    #[serde(skip_serializing_if = "Option::is_none")]
84    pub deposit: Option<String>,
85    #[serde(skip_serializing_if = "Option::is_none")]
86    pub reward_addr: Option<String>,
87    #[serde(skip_serializing_if = "Option::is_none")]
88    pub reward_addr_delegated_drep: Option<String>,
89    pub owners: Vec<String>,
90    pub relays: Vec<RelayInfo>,
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub ticker: Option<String>,
93    #[serde(skip_serializing_if = "Option::is_none")]
94    pub meta_url: Option<String>,
95    #[serde(skip_serializing_if = "Option::is_none")]
96    pub meta_hash: Option<String>,
97    pub pool_status: PoolStatus,
98    #[serde(skip_serializing_if = "Option::is_none")]
99    pub active_stake: Option<String>,
100    #[serde(skip_serializing_if = "Option::is_none")]
101    pub retiring_epoch: Option<u64>,
102}
103#[derive(Debug, Clone, Serialize, Deserialize)]
104pub struct PoolHistoryInfo {
105    pub epoch_no: u64,
106    #[serde(skip_serializing_if = "Option::is_none")]
107    pub active_stake: Option<String>,
108    #[serde(skip_serializing_if = "Option::is_none")]
109    pub active_stake_pct: Option<f64>,
110    pub saturation_pct: f64,
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub block_cnt: Option<u64>,
113    pub delegator_cnt: u64,
114    pub margin: f64,
115    pub fixed_cost: String,
116    pub pool_fees: String,
117    pub deleg_rewards: String,
118    #[serde(skip_serializing_if = "Option::is_none")]
119    pub member_rewards: Option<String>,
120    pub epoch_ros: f64,
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize)]
124pub struct PoolSnapshot {
125    pub snapshot: SnapshotType,
126    pub epoch_no: u64,
127    #[serde(skip_serializing_if = "Option::is_none")]
128    pub nonce: Option<String>,
129    pub pool_stake: String,
130    pub active_stake: String,
131}
132
133#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
134#[serde(rename_all = "lowercase")]
135pub enum SnapshotType {
136    Mark,
137    Set,
138    Go,
139}
140
141#[derive(Debug, Clone, Serialize, Deserialize)]
142pub struct PoolDelegatorsHistory {
143    pub stake_address: String,
144    pub amount: String,
145    pub epoch_no: u64,
146}
147
148#[derive(Debug, Clone, Serialize, Deserialize)]
149pub struct PoolVotes {
150    pub proposal_id: String,
151    pub proposal_tx_hash: String,
152    pub proposal_index: u64,
153    pub vote_tx_hash: String,
154    pub block_time: u64,
155    pub vote: Vote,
156    #[serde(skip_serializing_if = "Option::is_none")]
157    pub meta_url: Option<String>,
158    #[serde(skip_serializing_if = "Option::is_none")]
159    pub meta_hash: Option<String>,
160}
161
162// Implementation blocks
163impl PoolHistoryInfo {
164    pub fn new(
165        epoch_no: u64,
166        saturation_pct: f64,
167        delegator_cnt: u64,
168        margin: f64,
169        fixed_cost: String,
170        pool_fees: String,
171        deleg_rewards: String,
172        epoch_ros: f64,
173    ) -> Self {
174        Self {
175            epoch_no,
176            active_stake: None,
177            active_stake_pct: None,
178            saturation_pct,
179            block_cnt: None,
180            delegator_cnt,
181            margin,
182            fixed_cost,
183            pool_fees,
184            deleg_rewards,
185            member_rewards: None,
186            epoch_ros,
187        }
188    }
189}
190
191#[derive(Debug, Clone, Serialize, Deserialize)]
192pub struct PoolDelegator {
193    pub stake_address: String,
194    pub amount: String,
195    pub active_epoch_no: u64,
196    pub latest_delegation_tx_hash: String,
197}
198
199#[derive(Debug, Clone, Serialize, Deserialize)]
200pub struct PoolRegistration {
201    pub pool_id_bech32: String,
202    pub tx_hash: String,
203    pub block_hash: String,
204    pub block_height: u64,
205    pub epoch_no: u64,
206    pub epoch_slot: u64,
207    pub active_epoch_no: u64,
208}
209
210#[derive(Debug, Clone, Serialize, Deserialize)]
211pub struct PoolDelegatorHistory {
212    pub stake_address: String,
213    pub amount: String,
214    pub epoch_no: u64,
215}
216
217#[derive(Debug, Clone, Serialize, Deserialize)]
218pub struct PoolBlock {
219    pub epoch_no: u64,
220    pub epoch_slot: u64,
221    pub abs_slot: u64,
222    pub block_height: u64,
223    pub block_hash: String,
224    pub block_time: u64,
225}
226
227#[derive(Debug, Clone, Serialize, Deserialize)]
228pub struct PoolUpdate {
229    pub tx_hash: String,
230    pub block_time: u64,
231    pub pool_id_bech32: String,
232    pub pool_id_hex: String,
233    #[serde(skip_serializing_if = "Option::is_none")]
234    pub active_epoch_no: Option<u64>,
235    #[serde(skip_serializing_if = "Option::is_none")]
236    pub vrf_key_hash: Option<String>,
237    #[serde(skip_serializing_if = "Option::is_none")]
238    pub margin: Option<f64>,
239    #[serde(skip_serializing_if = "Option::is_none")]
240    pub fixed_cost: Option<String>,
241    #[serde(skip_serializing_if = "Option::is_none")]
242    pub pledge: Option<String>,
243    #[serde(skip_serializing_if = "Option::is_none")]
244    pub reward_addr: Option<String>,
245    #[serde(skip_serializing_if = "Option::is_none")]
246    pub owners: Option<Vec<String>>,
247    pub relays: Vec<PoolRelay>,
248    #[serde(skip_serializing_if = "Option::is_none")]
249    pub meta_url: Option<String>,
250    #[serde(skip_serializing_if = "Option::is_none")]
251    pub meta_hash: Option<String>,
252    #[serde(skip_serializing_if = "Option::is_none")]
253    pub meta_json: Option<PoolMetadata>,
254    pub update_type: UpdateType,
255    #[serde(skip_serializing_if = "Option::is_none")]
256    pub retiring_epoch: Option<u64>,
257}
258
259#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
260#[serde(rename_all = "lowercase")]
261pub enum UpdateType {
262    Registration,
263    Deregistration,
264}
265
266#[derive(Debug, Clone, Serialize, Deserialize)]
267pub struct PoolRelay {
268    pub pool_id_bech32: String,
269    pub relays: Vec<RelayInfo>,
270}
271
272#[derive(Debug, Clone, Serialize, Deserialize)]
273pub struct RelayInfo {
274    #[serde(skip_serializing_if = "Option::is_none")]
275    pub dns: Option<String>,
276    #[serde(skip_serializing_if = "Option::is_none")]
277    pub srv: Option<String>,
278    #[serde(skip_serializing_if = "Option::is_none")]
279    pub ipv4: Option<String>,
280    #[serde(skip_serializing_if = "Option::is_none")]
281    pub ipv6: Option<String>,
282    #[serde(skip_serializing_if = "Option::is_none")]
283    pub port: Option<u16>,
284}
285
286// Implementation blocks
287impl PoolRelay {
288    pub fn new(pool_id_bech32: String) -> Self {
289        Self {
290            pool_id_bech32,
291            relays: Vec::new(),
292        }
293    }
294}
295
296impl Default for RelayInfo {
297    fn default() -> Self {
298        Self::new()
299    }
300}
301
302impl RelayInfo {
303    pub fn new() -> Self {
304        Self {
305            dns: None,
306            srv: None,
307            ipv4: None,
308            ipv6: None,
309            port: None,
310        }
311    }
312}
313
314#[derive(Debug, Clone, Serialize, Deserialize)]
315pub struct PoolMetadataInfo {
316    pub pool_id_bech32: String,
317    #[serde(skip_serializing_if = "Option::is_none")]
318    pub meta_url: Option<String>,
319    #[serde(skip_serializing_if = "Option::is_none")]
320    pub meta_hash: Option<String>,
321    #[serde(skip_serializing_if = "Option::is_none")]
322    pub meta_json: Option<PoolMetadata>,
323}
324
325// Implementation blocks for constructors and utility methods
326impl PoolDelegator {
327    pub fn new(
328        stake_address: String,
329        amount: String,
330        active_epoch_no: u64,
331        latest_delegation_tx_hash: String,
332    ) -> Self {
333        Self {
334            stake_address,
335            amount,
336            active_epoch_no,
337            latest_delegation_tx_hash,
338        }
339    }
340}
341
342impl PoolBlock {
343    pub fn new(
344        epoch_no: u64,
345        epoch_slot: u64,
346        abs_slot: u64,
347        block_height: u64,
348        block_hash: String,
349        block_time: u64,
350    ) -> Self {
351        Self {
352            epoch_no,
353            epoch_slot,
354            abs_slot,
355            block_height,
356            block_hash,
357            block_time,
358        }
359    }
360}
361
362impl PoolUpdate {
363    pub fn new(
364        tx_hash: String,
365        block_time: u64,
366        pool_id_bech32: String,
367        pool_id_hex: String,
368        update_type: UpdateType,
369    ) -> Self {
370        Self {
371            tx_hash,
372            block_time,
373            pool_id_bech32,
374            pool_id_hex,
375            active_epoch_no: None,
376            vrf_key_hash: None,
377            margin: None,
378            fixed_cost: None,
379            pledge: None,
380            reward_addr: None,
381            owners: None,
382            relays: Vec::new(),
383            meta_url: None,
384            meta_hash: None,
385            meta_json: None,
386            update_type,
387            retiring_epoch: None,
388        }
389    }
390}