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

// Msg defines the distribution Msg service.
service Msg {
  // SetWithdrawAddress defines a method to change the withdraw address
  // for a delegator (or validator self-delegation).
  rpc SetWithdrawAddress(MsgSetWithdrawAddress) returns (MsgSetWithdrawAddressResponse);

  // WithdrawDelegatorReward defines a method to withdraw rewards of delegator
  // from a single validator.
  rpc WithdrawDelegatorReward(MsgWithdrawDelegatorReward) returns (MsgWithdrawDelegatorRewardResponse);

  // WithdrawValidatorCommission defines a method to withdraw the
  // full commission to the validator address.
  rpc WithdrawValidatorCommission(MsgWithdrawValidatorCommission) returns (MsgWithdrawValidatorCommissionResponse);

  // FundCommunityPool defines a method to allow an account to directly
  // fund the community pool.
  rpc FundCommunityPool(MsgFundCommunityPool) returns (MsgFundCommunityPoolResponse);
}

// MsgSetWithdrawAddress sets the withdraw address for
// a delegator (or validator self-delegation).
message MsgSetWithdrawAddress {
  option (gogoproto.equal)           = false;
  option (gogoproto.goproto_getters) = false;

  string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""];
  string withdraw_address  = 2 [(gogoproto.moretags) = "yaml:\"withdraw_address\""];
}

// MsgSetWithdrawAddressResponse defines the Msg/SetWithdrawAddress response type.
message MsgSetWithdrawAddressResponse {}

// MsgWithdrawDelegatorReward represents delegation withdrawal to a delegator
// from a single validator.
message MsgWithdrawDelegatorReward {
  option (gogoproto.equal)           = false;
  option (gogoproto.goproto_getters) = false;

  string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""];
  string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""];
}

// MsgWithdrawDelegatorRewardResponse defines the Msg/WithdrawDelegatorReward response type.
message MsgWithdrawDelegatorRewardResponse {}

// MsgWithdrawValidatorCommission withdraws the full commission to the validator
// address.
message MsgWithdrawValidatorCommission {
  option (gogoproto.equal)           = false;
  option (gogoproto.goproto_getters) = false;

  string validator_address = 1 [(gogoproto.moretags) = "yaml:\"validator_address\""];
}

// MsgWithdrawValidatorCommissionResponse defines the Msg/WithdrawValidatorCommission response type.
message MsgWithdrawValidatorCommissionResponse {}

// MsgFundCommunityPool allows an account to directly
// fund the community pool.
message MsgFundCommunityPool {
  option (gogoproto.equal)           = false;
  option (gogoproto.goproto_getters) = false;

  repeated cosmos.base.v1beta1.Coin amount = 1
      [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"];
  string depositor = 2;
}

// MsgFundCommunityPoolResponse defines the Msg/FundCommunityPool response type.
message MsgFundCommunityPoolResponse {}
