syntax = "proto3";
package cosmos.staking.v1beta1;

option go_package = "github.com/cosmos/cosmos-sdk/x/staking/types";

import "gogoproto/gogo.proto";
import "cosmos/staking/v1beta1/staking.proto";
import "cosmos_proto/cosmos.proto";
import "amino/amino.proto";

// GenesisState defines the staking module's genesis state.
message GenesisState {
  // params defines all the parameters of related to deposit.
  Params params = 1 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true];

  // last_total_power tracks the total amounts of bonded tokens recorded during
  // the previous end block.
  bytes last_total_power = 2 [
    (cosmos_proto.scalar)  = "cosmos.Int",
    (gogoproto.customtype) = "cosmossdk.io/math.Int",
    (gogoproto.nullable)   = false,
    (amino.dont_omitempty) = true
  ];

  // last_validator_powers is a special index that provides a historical list
  // of the last-block's bonded validators.
  repeated LastValidatorPower last_validator_powers = 3 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true];

  // validators defines the validator set at genesis.
  repeated Validator validators = 4 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true];

  // delegations defines the delegations active at genesis.
  repeated Delegation delegations = 5 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true];

  // unbonding_delegations defines the unbonding delegations active at genesis.
  repeated UnbondingDelegation unbonding_delegations = 6 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true];

  // redelegations defines the redelegations active at genesis.
  repeated Redelegation redelegations = 7 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true];

  // exported defines a bool to identify whether the chain dealing with exported or initialized genesis.
  bool exported = 8;
}

// LastValidatorPower required for validator set update logic.
message LastValidatorPower {
  option (gogoproto.equal)           = false;
  option (gogoproto.goproto_getters) = false;

  // address is the address of the validator.
  string address = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];

  // power defines the power of the validator.
  int64 power = 2;
}
