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

option go_package            = "github.com/cosmos/cosmos-sdk/x/distribution/types";
option (gogoproto.equal_all) = true;

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

// Params defines the set of params for the distribution module.
message Params {
  option (amino.name) = "cosmos-sdk/x/distribution/Params";

  string community_tax = 1 [
    (cosmos_proto.scalar)  = "cosmos.Dec",
    (gogoproto.customtype) = "cosmossdk.io/math.LegacyDec",
    (amino.dont_omitempty) = true,
    (gogoproto.nullable)   = false
  ];

  // Deprecated: The base_proposer_reward field is deprecated and is no longer used
  // in the x/distribution module's reward mechanism.
  string base_proposer_reward = 2 [
    (cosmos_proto.scalar)  = "cosmos.Dec",
    (gogoproto.customtype) = "cosmossdk.io/math.LegacyDec",
    (gogoproto.nullable)   = false,
    (amino.dont_omitempty) = true,
    deprecated             = true
  ];

  // Deprecated: The bonus_proposer_reward field is deprecated and is no longer used
  // in the x/distribution module's reward mechanism.
  string bonus_proposer_reward = 3 [
    (cosmos_proto.scalar)  = "cosmos.Dec",
    (gogoproto.customtype) = "cosmossdk.io/math.LegacyDec",
    (gogoproto.nullable)   = false,
    (amino.dont_omitempty) = true,
    deprecated             = true
  ];

  bool withdraw_addr_enabled = 4;
}

// ValidatorHistoricalRewards represents historical rewards for a validator.
// Height is implicit within the store key.
// Cumulative reward ratio is the sum from the zeroeth period
// until this period of rewards / tokens, per the spec.
// The reference count indicates the number of objects
// which might need to reference this historical entry at any point.
// ReferenceCount =
//    number of outstanding delegations which ended the associated period (and
//    might need to read that record)
//  + number of slashes which ended the associated period (and might need to
//  read that record)
//  + one per validator for the zeroeth period, set on initialization
message ValidatorHistoricalRewards {
  repeated cosmos.base.v1beta1.DecCoin cumulative_reward_ratio = 1 [
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins",
    (gogoproto.nullable)     = false,
    (amino.dont_omitempty)   = true
  ];
  uint32 reference_count = 2;
}

// ValidatorCurrentRewards represents current rewards and current
// period for a validator kept as a running counter and incremented
// each block as long as the validator's tokens remain constant.
message ValidatorCurrentRewards {
  repeated cosmos.base.v1beta1.DecCoin rewards = 1 [
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins",
    (gogoproto.nullable)     = false,
    (amino.dont_omitempty)   = true
  ];
  uint64 period = 2;
}

// ValidatorAccumulatedCommission represents accumulated commission
// for a validator kept as a running counter, can be withdrawn at any time.
message ValidatorAccumulatedCommission {
  repeated cosmos.base.v1beta1.DecCoin commission = 1 [
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins",
    (gogoproto.nullable)     = false,
    (amino.dont_omitempty)   = true
  ];
}

// ValidatorOutstandingRewards represents outstanding (un-withdrawn) rewards
// for a validator inexpensive to track, allows simple sanity checks.
message ValidatorOutstandingRewards {
  repeated cosmos.base.v1beta1.DecCoin rewards = 1 [
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins",
    (gogoproto.nullable)     = false,
    (amino.dont_omitempty)   = true
  ];
}

// ValidatorSlashEvent represents a validator slash event.
// Height is implicit within the store key.
// This is needed to calculate appropriate amount of staking tokens
// for delegations which are withdrawn after a slash has occurred.
message ValidatorSlashEvent {
  uint64 validator_period = 1;
  string fraction         = 2 [
    (cosmos_proto.scalar)  = "cosmos.Dec",
    (gogoproto.customtype) = "cosmossdk.io/math.LegacyDec",
    (gogoproto.nullable)   = false
  ];
}

// ValidatorSlashEvents is a collection of ValidatorSlashEvent messages.
message ValidatorSlashEvents {
  repeated ValidatorSlashEvent validator_slash_events = 1 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true];
}

// FeePool is the global fee pool for distribution.
message FeePool {
  repeated cosmos.base.v1beta1.DecCoin community_pool = 1 [
    (gogoproto.nullable)     = false,
    (amino.dont_omitempty)   = true,
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins"
  ];
}

// CommunityPoolSpendProposal details a proposal for use of community funds,
// together with how many coins are proposed to be spent, and to which
// recipient account.
//
// Deprecated: Do not use. As of the Cosmos SDK release v0.47.x, there is no
// longer a need for an explicit CommunityPoolSpendProposal. To spend community
// pool funds, a simple MsgCommunityPoolSpend can be invoked from the x/gov
// module via a v1 governance proposal.
message CommunityPoolSpendProposal {
  option deprecated                          = true;
  option (gogoproto.equal)                   = false;
  option (gogoproto.goproto_getters)         = false;
  option (cosmos_proto.implements_interface) = "cosmos.gov.v1beta1.Content";

  string   title                           = 1;
  string   description                     = 2;
  string   recipient                       = 3;
  repeated cosmos.base.v1beta1.Coin amount = 4 [
    (gogoproto.nullable)     = false,
    (amino.dont_omitempty)   = true,
    (amino.encoding)         = "legacy_coins",
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"
  ];
}

// DelegatorStartingInfo represents the starting info for a delegator reward
// period. It tracks the previous validator period, the delegation's amount of
// staking token, and the creation height (to check later on if any slashes have
// occurred). NOTE: Even though validators are slashed to whole staking tokens,
// the delegators within the validator may be left with less than a full token,
// thus sdk.Dec is used.
message DelegatorStartingInfo {
  uint64 previous_period = 1;
  string stake           = 2 [
    (cosmos_proto.scalar)  = "cosmos.Dec",
    (gogoproto.customtype) = "cosmossdk.io/math.LegacyDec",
    (gogoproto.nullable)   = false,
    (amino.dont_omitempty) = true
  ];
  uint64 height = 3
      [(gogoproto.jsontag) = "creation_height", (amino.field_name) = "creation_height", (amino.dont_omitempty) = true];
}

// DelegationDelegatorReward represents the properties
// of a delegator's delegation reward.
message DelegationDelegatorReward {
  option (gogoproto.goproto_getters) = false;

  string validator_address = 1 [(cosmos_proto.scalar) = "cosmos.ValidatorAddressString"];

  repeated cosmos.base.v1beta1.DecCoin reward = 2 [
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins",
    (gogoproto.nullable)     = false,
    (amino.dont_omitempty)   = true
  ];
}

// CommunityPoolSpendProposalWithDeposit defines a CommunityPoolSpendProposal
// with a deposit
message CommunityPoolSpendProposalWithDeposit {
  option (gogoproto.goproto_getters)         = false;
  option (cosmos_proto.implements_interface) = "cosmos.gov.v1beta1.Content";

  string title       = 1;
  string description = 2;
  string recipient   = 3;
  string amount      = 4;
  string deposit     = 5;
}
