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";
import "google/protobuf/timestamp.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;

  // store tokenize share records to provide reward to record owners
  repeated TokenizeShareRecord tokenize_share_records = 9 [(gogoproto.nullable) = false];

  // last tokenize share record id, used for next share record id calculation
  uint64 last_tokenize_share_record_id = 10;

  // total number of liquid staked tokens at genesis
  bytes total_liquid_staked_tokens = 11 [
    (gogoproto.customtype) = "cosmossdk.io/math.Int",
    (gogoproto.moretags)   = "yaml:\"total_liquid_staked_tokens\"",
    (gogoproto.nullable)   = false
  ];

  // tokenize shares locks at genesis
  repeated TokenizeShareLock tokenize_share_locks = 12 [(gogoproto.nullable) = false];
}

// TokenizeSharesLock required for specifying account locks at genesis
message TokenizeShareLock {
  // Address of the account that is locked
  string address = 1;
  // Status of the lock (LOCKED or LOCK_EXPIRING)
  string status = 2;
  // Completion time if the lock is expiring
  google.protobuf.Timestamp completion_time = 3
      [(gogoproto.nullable) = false, (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"completion_time\""];
}

// 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;
}
