1use serde::{Deserialize, Serialize};
5use serde_with::{IfIsHumanReadable, serde_as};
6use sui_sdk_types::{Address, Bls12381PublicKey, EpochId};
7
8use super::SuiValidatorSummary;
9use crate::serde::BigInt;
10
11pub type StakeUnit = u64;
13
14#[serde_as]
21#[derive(Debug, Serialize, Deserialize, Clone)]
22#[serde(rename_all = "camelCase")]
23pub struct SuiSystemStateSummary {
24 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
26 pub epoch: u64,
27 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
29 pub protocol_version: u64,
30 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
32 pub system_state_version: u64,
33 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
35 pub storage_fund_total_object_storage_rebates: u64,
36 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
39 pub storage_fund_non_refundable_balance: u64,
40 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
42 pub reference_gas_price: u64,
43 pub safe_mode: bool,
47 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
49 pub safe_mode_storage_rewards: u64,
50 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
52 pub safe_mode_computation_rewards: u64,
53 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
55 pub safe_mode_storage_rebates: u64,
56 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
58 pub safe_mode_non_refundable_storage_fee: u64,
59 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
61 pub epoch_start_timestamp_ms: u64,
62
63 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
66 pub epoch_duration_ms: u64,
67
68 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
70 pub stake_subsidy_start_epoch: u64,
71
72 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
75 pub max_validator_count: u64,
76
77 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
79 pub min_validator_joining_stake: u64,
80
81 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
85 pub validator_low_stake_threshold: u64,
86
87 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
90 pub validator_very_low_stake_threshold: u64,
91
92 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
95 pub validator_low_stake_grace_period: u64,
96
97 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
100 pub stake_subsidy_balance: u64,
101 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
104 pub stake_subsidy_distribution_counter: u64,
105 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
108 pub stake_subsidy_current_distribution_amount: u64,
109 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
111 pub stake_subsidy_period_length: u64,
112 pub stake_subsidy_decrease_rate: u16,
115
116 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
119 pub total_stake: u64,
120 pub active_validators: Vec<SuiValidatorSummary>,
122 pub pending_active_validators_id: Address,
124 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
126 pub pending_active_validators_size: u64,
127 #[serde_as(as = "Vec<IfIsHumanReadable<BigInt<u64>, _>>")]
130 pub pending_removals: Vec<u64>,
131 pub staking_pool_mappings_id: Address,
133 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
135 pub staking_pool_mappings_size: u64,
136 pub inactive_pools_id: Address,
138 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
140 pub inactive_pools_size: u64,
141 pub validator_candidates_id: Address,
143 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
145 pub validator_candidates_size: u64,
146 #[serde_as(as = "Vec<(_, IfIsHumanReadable<BigInt<u64>, _>)>")]
148 pub at_risk_validators: Vec<(Address, u64)>,
149 pub validator_report_records: Vec<(Address, Vec<Address>)>,
151}
152
153#[serde_as]
156#[derive(Debug, Serialize, Deserialize, Clone)]
157#[serde(rename = "CommitteeInfo")]
158pub struct SuiCommittee {
159 #[serde_as(as = "BigInt<u64>")]
160 pub epoch: EpochId,
161 #[serde_as(as = "Vec<(_, BigInt<u64>)>")]
162 pub validators: Vec<(Bls12381PublicKey, StakeUnit)>,
163}
164
165#[derive(Debug, Serialize, Deserialize, Clone)]
166#[serde(rename_all = "camelCase")]
167pub struct DelegatedStake {
168 pub validator_address: Address,
170 pub staking_pool: Address,
172 pub stakes: Vec<Stake>,
173}
174
175#[serde_as]
176#[derive(Debug, Serialize, Deserialize, Clone)]
177#[serde(tag = "status")]
178pub enum StakeStatus {
179 Pending,
180 #[serde(rename_all = "camelCase")]
181 Active {
182 #[serde_as(as = "BigInt<u64>")]
183 estimated_reward: u64,
184 },
185 Unstaked,
186}
187
188#[serde_as]
189#[derive(Debug, Serialize, Deserialize, Clone)]
190#[serde(rename_all = "camelCase")]
191pub struct Stake {
192 pub staked_sui_id: Address,
194 #[serde_as(as = "BigInt<u64>")]
195 pub stake_request_epoch: EpochId,
196 #[serde_as(as = "BigInt<u64>")]
197 pub stake_active_epoch: EpochId,
198 #[serde_as(as = "BigInt<u64>")]
199 pub principal: u64,
200 #[serde(flatten)]
201 pub status: StakeStatus,
202}
203
204#[serde_as]
205#[derive(Debug, Serialize, Deserialize, Clone)]
206pub struct ValidatorApys {
207 pub apys: Vec<ValidatorApy>,
208 #[serde_as(as = "BigInt<u64>")]
209 pub epoch: EpochId,
210}
211
212#[serde_as]
213#[derive(Debug, Serialize, Deserialize, Clone)]
214pub struct ValidatorApy {
215 pub address: Address,
216 pub apy: f64,
217}