sui_types/sui_system_state/
mock.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use crate::balance::Balance;
5use crate::base_types::{MoveObjectType, TransactionDigest};
6use crate::collection_types::VecMap;
7use crate::dynamic_field::{derive_dynamic_field_id, serialize_dynamic_field};
8use crate::id::UID;
9use crate::object::{MoveObject, Object, Owner};
10use crate::sui_system_state::sui_system_state_inner_v1::{
11    StakeSubsidyV1, StorageFundV1, SuiSystemStateInnerV1, SystemParametersV1, ValidatorSetV1,
12};
13use crate::sui_system_state::sui_system_state_inner_v2::{
14    SuiSystemStateInnerV2, SystemParametersV2,
15};
16use crate::sui_system_state::{SuiSystemState, SuiSystemStateWrapper};
17use crate::{MoveTypeTagTrait, SUI_SYSTEM_STATE_OBJECT_ID};
18use sui_protocol_config::ProtocolConfig;
19
20pub fn validator_set_v1() -> ValidatorSetV1 {
21    ValidatorSetV1 {
22        total_stake: 0,
23        active_validators: vec![],
24        pending_active_validators: Default::default(),
25        pending_removals: vec![],
26        staking_pool_mappings: Default::default(),
27        inactive_validators: Default::default(),
28        validator_candidates: Default::default(),
29        at_risk_validators: VecMap { contents: vec![] },
30        extra_fields: Default::default(),
31    }
32}
33
34pub fn storage_fund_v1() -> StorageFundV1 {
35    StorageFundV1 {
36        total_object_storage_rebates: Balance::new(0),
37        non_refundable_balance: Balance::new(0),
38    }
39}
40
41pub fn system_parameters_v1() -> SystemParametersV1 {
42    SystemParametersV1 {
43        epoch_duration_ms: 0,
44        stake_subsidy_start_epoch: 0,
45        max_validator_count: 0,
46        min_validator_joining_stake: 0,
47        validator_low_stake_threshold: 0,
48        validator_very_low_stake_threshold: 0,
49        validator_low_stake_grace_period: 0,
50        extra_fields: Default::default(),
51    }
52}
53
54pub fn stake_subsidy_v1() -> StakeSubsidyV1 {
55    StakeSubsidyV1 {
56        balance: Balance::new(0),
57        distribution_counter: 0,
58        current_distribution_amount: 0,
59        stake_subsidy_period_length: 0,
60        stake_subsidy_decrease_rate: 0,
61        extra_fields: Default::default(),
62    }
63}
64
65pub fn sui_system_state_inner_v1() -> SuiSystemStateInnerV1 {
66    SuiSystemStateInnerV1 {
67        epoch: 0,
68        protocol_version: 0,
69        // must be 1
70        system_state_version: 1,
71        validators: validator_set_v1(),
72        storage_fund: storage_fund_v1(),
73        parameters: system_parameters_v1(),
74        reference_gas_price: 0,
75        validator_report_records: VecMap { contents: vec![] },
76        stake_subsidy: stake_subsidy_v1(),
77        safe_mode: false,
78        safe_mode_storage_rewards: Balance::new(0),
79        safe_mode_computation_rewards: Balance::new(0),
80        safe_mode_storage_rebates: 0,
81        safe_mode_non_refundable_storage_fee: 0,
82        epoch_start_timestamp_ms: 0,
83        extra_fields: Default::default(),
84    }
85}
86
87pub fn system_parameters_v2() -> SystemParametersV2 {
88    SystemParametersV2 {
89        epoch_duration_ms: 0,
90        stake_subsidy_start_epoch: 0,
91        min_validator_count: 0,
92        max_validator_count: 0,
93        min_validator_joining_stake: 0,
94        validator_low_stake_threshold: 0,
95        validator_very_low_stake_threshold: 0,
96        validator_low_stake_grace_period: 0,
97        extra_fields: Default::default(),
98    }
99}
100
101pub fn sui_system_state_inner_v2() -> SuiSystemStateInnerV2 {
102    SuiSystemStateInnerV2 {
103        epoch: 0,
104        protocol_version: 0,
105        // must be 2
106        system_state_version: 2,
107        validators: validator_set_v1(),
108        storage_fund: storage_fund_v1(),
109        parameters: system_parameters_v2(),
110        reference_gas_price: 0,
111        validator_report_records: VecMap { contents: vec![] },
112        stake_subsidy: stake_subsidy_v1(),
113        safe_mode: false,
114        safe_mode_storage_rewards: Balance::new(0),
115        safe_mode_computation_rewards: Balance::new(0),
116        safe_mode_storage_rebates: 0,
117        safe_mode_non_refundable_storage_fee: 0,
118        epoch_start_timestamp_ms: 0,
119        extra_fields: Default::default(),
120    }
121}
122
123pub fn system_state_output_objects(sui_system_state: SuiSystemState) -> Vec<Object> {
124    let version = sui_system_state.version();
125    let system_state_wrapper_object = Object::new_move(
126        unsafe {
127            MoveObject::new_from_execution(
128                MoveObjectType::gas_coin(),
129                // must be true to pass validation
130                true,
131                0.into(),
132                bcs::to_bytes(&SuiSystemStateWrapper {
133                    // must be SUI_SYSTEM_STATE_OBJECT_ID
134                    id: UID::new(SUI_SYSTEM_STATE_OBJECT_ID),
135                    version,
136                })
137                .unwrap(),
138                &ProtocolConfig::get_for_max_version_UNSAFE(),
139                false,
140            )
141            .unwrap()
142        },
143        Owner::Immutable,
144        TransactionDigest::genesis_marker(),
145    );
146    let dynamic_field_key = 0u64; // value does not matter
147
148    // hash based on system_state_wrapper_object
149    let system_state_object_id = derive_dynamic_field_id(
150        SUI_SYSTEM_STATE_OBJECT_ID,
151        &dynamic_field_key.get_instance_type_tag(),
152        &bcs::to_bytes(&version).unwrap(),
153    )
154    .unwrap();
155
156    let field_id = UID::new(system_state_object_id);
157    let object_bytes = match sui_system_state {
158        SuiSystemState::V1(inner) => serialize_dynamic_field(&field_id, &dynamic_field_key, inner),
159        SuiSystemState::V2(inner) => serialize_dynamic_field(&field_id, &dynamic_field_key, inner),
160        #[cfg(msim)]
161        SuiSystemState::SimTestV1(_)
162        | SuiSystemState::SimTestShallowV2(_)
163        | SuiSystemState::SimTestDeepV2(_) => unimplemented!(),
164    }
165    .unwrap();
166    let system_state_inner_object = Object::new_move(
167        unsafe {
168            MoveObject::new_from_execution(
169                MoveObjectType::gas_coin(),
170                true,
171                0.into(),
172                object_bytes,
173                &ProtocolConfig::get_for_max_version_UNSAFE(),
174                false,
175            )
176            .unwrap()
177        },
178        Owner::Immutable,
179        TransactionDigest::genesis_marker(),
180    );
181    vec![system_state_wrapper_object, system_state_inner_object]
182}