1use af_sui_types::{Address as SuiAddress, EpochId, ObjectId};
5use serde::{Deserialize, Serialize};
6use serde_with::{IfIsHumanReadable, serde_as};
7use sui_sdk_types::Bls12381PublicKey;
8
9use super::SuiValidatorSummary;
10use crate::serde::BigInt;
11
12pub type StakeUnit = u64;
14
15#[serde_as]
22#[derive(Debug, Serialize, Deserialize, Clone)]
23#[serde(rename_all = "camelCase")]
24pub struct SuiSystemStateSummary {
25 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
27 pub epoch: u64,
28 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
30 pub protocol_version: u64,
31 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
33 pub system_state_version: u64,
34 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
36 pub storage_fund_total_object_storage_rebates: u64,
37 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
40 pub storage_fund_non_refundable_balance: u64,
41 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
43 pub reference_gas_price: u64,
44 pub safe_mode: bool,
48 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
50 pub safe_mode_storage_rewards: u64,
51 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
53 pub safe_mode_computation_rewards: u64,
54 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
56 pub safe_mode_storage_rebates: u64,
57 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
59 pub safe_mode_non_refundable_storage_fee: u64,
60 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
62 pub epoch_start_timestamp_ms: u64,
63
64 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
67 pub epoch_duration_ms: u64,
68
69 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
71 pub stake_subsidy_start_epoch: u64,
72
73 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
76 pub max_validator_count: u64,
77
78 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
80 pub min_validator_joining_stake: u64,
81
82 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
86 pub validator_low_stake_threshold: u64,
87
88 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
91 pub validator_very_low_stake_threshold: u64,
92
93 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
96 pub validator_low_stake_grace_period: u64,
97
98 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
101 pub stake_subsidy_balance: u64,
102 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
105 pub stake_subsidy_distribution_counter: u64,
106 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
109 pub stake_subsidy_current_distribution_amount: u64,
110 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
112 pub stake_subsidy_period_length: u64,
113 pub stake_subsidy_decrease_rate: u16,
116
117 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
120 pub total_stake: u64,
121 pub active_validators: Vec<SuiValidatorSummary>,
123 pub pending_active_validators_id: ObjectId,
125 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
127 pub pending_active_validators_size: u64,
128 #[serde_as(as = "Vec<IfIsHumanReadable<BigInt<u64>, _>>")]
131 pub pending_removals: Vec<u64>,
132 pub staking_pool_mappings_id: ObjectId,
134 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
136 pub staking_pool_mappings_size: u64,
137 pub inactive_pools_id: ObjectId,
139 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
141 pub inactive_pools_size: u64,
142 pub validator_candidates_id: ObjectId,
144 #[serde_as(as = "IfIsHumanReadable<BigInt<u64>, _>")]
146 pub validator_candidates_size: u64,
147 #[serde_as(as = "Vec<(_, IfIsHumanReadable<BigInt<u64>, _>)>")]
149 pub at_risk_validators: Vec<(SuiAddress, u64)>,
150 pub validator_report_records: Vec<(SuiAddress, Vec<SuiAddress>)>,
152}
153
154#[serde_as]
157#[derive(Debug, Serialize, Deserialize, Clone)]
158#[serde(rename = "CommitteeInfo")]
159pub struct SuiCommittee {
160 #[serde_as(as = "BigInt<u64>")]
161 pub epoch: EpochId,
162 #[serde_as(as = "Vec<(_, BigInt<u64>)>")]
163 pub validators: Vec<(Bls12381PublicKey, StakeUnit)>,
164}
165
166#[derive(Debug, Serialize, Deserialize, Clone)]
167#[serde(rename_all = "camelCase")]
168pub struct DelegatedStake {
169 pub validator_address: SuiAddress,
171 pub staking_pool: ObjectId,
173 pub stakes: Vec<Stake>,
174}
175
176#[serde_as]
177#[derive(Debug, Serialize, Deserialize, Clone)]
178#[serde(tag = "status")]
179pub enum StakeStatus {
180 Pending,
181 #[serde(rename_all = "camelCase")]
182 Active {
183 #[serde_as(as = "BigInt<u64>")]
184 estimated_reward: u64,
185 },
186 Unstaked,
187}
188
189#[serde_as]
190#[derive(Debug, Serialize, Deserialize, Clone)]
191#[serde(rename_all = "camelCase")]
192pub struct Stake {
193 pub staked_sui_id: ObjectId,
195 #[serde_as(as = "BigInt<u64>")]
196 pub stake_request_epoch: EpochId,
197 #[serde_as(as = "BigInt<u64>")]
198 pub stake_active_epoch: EpochId,
199 #[serde_as(as = "BigInt<u64>")]
200 pub principal: u64,
201 #[serde(flatten)]
202 pub status: StakeStatus,
203}
204
205#[serde_as]
206#[derive(Debug, Serialize, Deserialize, Clone)]
207pub struct ValidatorApys {
208 pub apys: Vec<ValidatorApy>,
209 #[serde_as(as = "BigInt<u64>")]
210 pub epoch: EpochId,
211}
212
213#[serde_as]
214#[derive(Debug, Serialize, Deserialize, Clone)]
215pub struct ValidatorApy {
216 pub address: SuiAddress,
217 pub apy: f64,
218}