Spend Genesis State

Spend genesis state, GenesisState, is composed of accounts, various module states and metadata such as genesis transactions. Each module may specify its own GenesisState. In addition, each module may specify its own genesis state validation, import and export functionality.

The Spend genesis state is defined as follows:

type GenesisState struct {
  Accounts     []GenesisAccount      `json:"accounts"`
  AuthData     auth.GenesisState     `json:"auth"`
  BankData     bank.GenesisState     `json:"bank"`
  StakingData  staking.GenesisState  `json:"staking"`
  MintData     mint.GenesisState     `json:"mint"`
  DistrData    distr.GenesisState    `json:"distr"`
  GovData      gov.GenesisState      `json:"gov"`
  SlashingData slashing.GenesisState `json:"slashing"`
  GenTxs       []json.RawMessage     `json:"gentxs"`
}

In the ABCI initChainer definition of Spend the initFromGenesisState is called which internally calls each module's InitGenesis providing its own respective GenesisState as a parameter.

Accounts

Genesis accounts defined in the GenesisState are defined as follows:

type GenesisAccount struct {
  Address       sdk.AccAddress `json:"address"`
  Coins         sdk.Coins      `json:"coins"`
  Sequence      uint64         `json:"sequence_number"`
  AccountNumber uint64         `json:"account_number"`

  // vesting account fields
  OriginalVesting  sdk.Coins `json:"original_vesting"`  // total vesting coins upon initialization
  DelegatedFree    sdk.Coins `json:"delegated_free"`    // delegated vested coins at time of delegation
  DelegatedVesting sdk.Coins `json:"delegated_vesting"` // delegated vesting coins at time of delegation
  StartTime        int64     `json:"start_time"`        // vesting start time (UNIX Epoch time)
  EndTime          int64     `json:"end_time"`          // vesting end time (UNIX Epoch time)
}

Each account must have a valid and unique account number in addition to a sequence number (nonce) and address.

Accounts may also be vesting, in which case they must provide the necessary vesting information. Vesting accounts must provide at a minimum OriginalVesting and EndTime. If StartTime is also provided, the account will be treated as a "continuous" vesting account in which it vests coins at a predefined schedule. Providing a StartTime must be less than EndTime but may be in the future. In other words, it does not have to be equal to the genesis time. In a new chain starting from a fresh state (not exported), OriginalVesting must be less than or equal to Coins.