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";

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

  // last_total_power tracks the total amounts of bonded tokens recorded during
  // the previous end block.
  bytes last_total_power = 2 [
    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
    (gogoproto.moretags)   = "yaml:\"last_total_power\"",
    (gogoproto.nullable)   = false
  ];

  // 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.moretags) = "yaml:\"last_validator_powers\"", (gogoproto.nullable) = false];

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

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

  // unbonding_delegations defines the unbonding delegations active at genesis.
  repeated UnbondingDelegation unbonding_delegations = 6
      [(gogoproto.moretags) = "yaml:\"unbonding_delegations\"", (gogoproto.nullable) = false];

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

  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;

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