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#[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
162impl 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
286impl 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
325impl 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}