crates/sui-framework/docs/sui_system/genesis.md
GenesisValidatorMetadataGenesisChainParametersTokenDistributionScheduleTokenAllocationcreateallocate_tokens<a name="sui_system_genesis_GenesisValidatorMetadata"></a>
GenesisValidatorMetadata<a name="sui_system_genesis_GenesisChainParameters"></a>
GenesisChainParameters<a name="sui_system_genesis_TokenDistributionSchedule"></a>
TokenDistributionSchedule<a name="sui_system_genesis_TokenAllocation"></a>
TokenAllocation<a name="@Constants_0"></a>
<a name="sui_system_genesis_ENotCalledAtGenesis"></a>
The <code><a href="../sui_system/genesis.md#sui_system_genesis_create">create</a></code> function was called at a non-genesis epoch.
<pre><code><b>const</b> <a href="../sui_system/genesis.md#sui_system_genesis_ENotCalledAtGenesis">ENotCalledAtGenesis</a>: u64 = 0; </code></pre><a name="sui_system_genesis_EDuplicateValidator"></a>
The <code><a href="../sui_system/genesis.md#sui_system_genesis_create">create</a></code> function was called with duplicate validators.
<pre><code><b>const</b> <a href="../sui_system/genesis.md#sui_system_genesis_EDuplicateValidator">EDuplicateValidator</a>: u64 = 1; </code></pre><a name="sui_system_genesis_ENotAValidator"></a>
The validator address is not in the validator set.
<pre><code><b>const</b> <a href="../sui_system/genesis.md#sui_system_genesis_ENotAValidator">ENotAValidator</a>: u64 = 2; </code></pre><a name="sui_system_genesis_create"></a>
createThis function will be explicitly called once at genesis. It will create a singleton SuiSystemState object, which contains all the information we need in the system.
<pre><code><b>fun</b> <a href="../sui_system/genesis.md#sui_system_genesis_create">create</a>(sui_system_state_id: <a href="../sui/object.md#sui_object_UID">sui::object::UID</a>, sui_supply: <a href="../sui/balance.md#sui_balance_Balance">sui::balance::Balance</a><<a href="../sui/sui.md#sui_sui_SUI">sui::sui::SUI</a>>, genesis_chain_parameters: <a href="../sui_system/genesis.md#sui_system_genesis_GenesisChainParameters">sui_system::genesis::GenesisChainParameters</a>, genesis_validators: vector<<a href="../sui_system/genesis.md#sui_system_genesis_GenesisValidatorMetadata">sui_system::genesis::GenesisValidatorMetadata</a>>, token_distribution_schedule: <a href="../sui_system/genesis.md#sui_system_genesis_TokenDistributionSchedule">sui_system::genesis::TokenDistributionSchedule</a>, ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>fun</b> <a href="../sui_system/genesis.md#sui_system_genesis_create">create</a>( sui_system_state_id: UID, <b>mut</b> sui_supply: Balance<SUI>, genesis_chain_parameters: <a href="../sui_system/genesis.md#sui_system_genesis_GenesisChainParameters">GenesisChainParameters</a>, genesis_validators: vector<<a href="../sui_system/genesis.md#sui_system_genesis_GenesisValidatorMetadata">GenesisValidatorMetadata</a>>, token_distribution_schedule: <a href="../sui_system/genesis.md#sui_system_genesis_TokenDistributionSchedule">TokenDistributionSchedule</a>, ctx: &<b>mut</b> TxContext, ) { // Ensure this is only called at <a href="../sui_system/genesis.md#sui_system_genesis">genesis</a> <b>assert</b>!(ctx.epoch() == 0, <a href="../sui_system/genesis.md#sui_system_genesis_ENotCalledAtGenesis">ENotCalledAtGenesis</a>); // Create all the `Validator` structs <b>let</b> <b>mut</b> validators = vector[]; genesis_validators.do!(|genesis_validator| { <b>let</b> <a href="../sui_system/genesis.md#sui_system_genesis_GenesisValidatorMetadata">GenesisValidatorMetadata</a> { name, description, image_url, project_url, sui_address, gas_price, commission_rate, protocol_public_key, proof_of_possession, network_public_key, worker_public_key, network_address, p2p_address, primary_address, worker_address, } = genesis_validator; <b>let</b> <a href="../sui_system/validator.md#sui_system_validator">validator</a> = <a href="../sui_system/validator.md#sui_system_validator_new">validator::new</a>( sui_address, protocol_public_key, network_public_key, worker_public_key, proof_of_possession, name, description, image_url, project_url, network_address, p2p_address, primary_address, worker_address, gas_price, commission_rate, ctx, ); // Ensure that each <a href="../sui_system/validator.md#sui_system_validator">validator</a> is unique <b>assert</b>!( !<a href="../sui_system/validator_set.md#sui_system_validator_set_is_duplicate_validator">validator_set::is_duplicate_validator</a>(&validators, &<a href="../sui_system/validator.md#sui_system_validator">validator</a>), <a href="../sui_system/genesis.md#sui_system_genesis_EDuplicateValidator">EDuplicateValidator</a>, ); validators.push_back(<a href="../sui_system/validator.md#sui_system_validator">validator</a>); }); <b>let</b> <a href="../sui_system/genesis.md#sui_system_genesis_TokenDistributionSchedule">TokenDistributionSchedule</a> { stake_subsidy_fund_mist, allocations, } = token_distribution_schedule; <b>let</b> subsidy_fund = sui_supply.split(stake_subsidy_fund_mist); <b>let</b> <a href="../sui_system/storage_fund.md#sui_system_storage_fund">storage_fund</a> = balance::zero(); // Allocate tokens and staking operations <a href="../sui_system/genesis.md#sui_system_genesis_allocate_tokens">allocate_tokens</a>(sui_supply, allocations, &<b>mut</b> validators, ctx); // Activate all validators validators.do_mut!(|<a href="../sui_system/validator.md#sui_system_validator">validator</a>| <a href="../sui_system/validator.md#sui_system_validator">validator</a>.activate(0)); <b>let</b> system_parameters = <a href="../sui_system/sui_system_state_inner.md#sui_system_sui_system_state_inner_create_system_parameters">sui_system_state_inner::create_system_parameters</a>( genesis_chain_parameters.epoch_duration_ms, genesis_chain_parameters.stake_subsidy_start_epoch, // Validator committee parameters genesis_chain_parameters.max_validator_count, genesis_chain_parameters.min_validator_joining_stake, genesis_chain_parameters.validator_low_stake_threshold, genesis_chain_parameters.validator_very_low_stake_threshold, genesis_chain_parameters.validator_low_stake_grace_period, ctx, ); <b>let</b> <a href="../sui_system/stake_subsidy.md#sui_system_stake_subsidy">stake_subsidy</a> = <a href="../sui_system/stake_subsidy.md#sui_system_stake_subsidy_create">stake_subsidy::create</a>( subsidy_fund, genesis_chain_parameters.stake_subsidy_initial_distribution_amount, genesis_chain_parameters.stake_subsidy_period_length, genesis_chain_parameters.stake_subsidy_decrease_rate, ctx, ); sui_system::create( sui_system_state_id, validators, <a href="../sui_system/storage_fund.md#sui_system_storage_fund">storage_fund</a>, genesis_chain_parameters.protocol_version, genesis_chain_parameters.chain_start_timestamp_ms, system_parameters, <a href="../sui_system/stake_subsidy.md#sui_system_stake_subsidy">stake_subsidy</a>, ctx, ); } </code></pre> </details><a name="sui_system_genesis_allocate_tokens"></a>
allocate_tokens