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

import "cosmos/base/v1beta1/coin.proto";
import "cosmos/gov/v1beta1/gov.proto";
import "cosmos_proto/cosmos.proto";
import "gogoproto/gogo.proto";
import "google/protobuf/any.proto";

import "cosmos/msg/v1/msg.proto";

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

// Msg defines the bank Msg service.
service Msg {
  // SubmitProposal defines a method to create new proposal given a content.
  rpc SubmitProposal(MsgSubmitProposal) returns (MsgSubmitProposalResponse);

  // Vote defines a method to add a vote on a specific proposal.
  rpc Vote(MsgVote) returns (MsgVoteResponse);

  // VoteWeighted defines a method to add a weighted vote on a specific proposal.
  //
  // Since: cosmos-sdk 0.43
  rpc VoteWeighted(MsgVoteWeighted) returns (MsgVoteWeightedResponse);

  // Deposit defines a method to add deposit on a specific proposal.
  rpc Deposit(MsgDeposit) returns (MsgDepositResponse);
}

// MsgSubmitProposal defines an sdk.Msg type that supports submitting arbitrary
// proposal Content.
message MsgSubmitProposal {
  option (cosmos.msg.v1.signer) = "proposer";

  option (gogoproto.equal)            = false;
  option (gogoproto.goproto_stringer) = false;
  option (gogoproto.stringer)         = false;
  option (gogoproto.goproto_getters)  = false;

  google.protobuf.Any content                       = 1 [(cosmos_proto.accepts_interface) = "Content"];
  repeated cosmos.base.v1beta1.Coin initial_deposit = 2
      [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"];
  string proposer = 3 [(cosmos_proto.scalar) = "cosmos.AddressString"];
}

// MsgSubmitProposalResponse defines the Msg/SubmitProposal response type.
message MsgSubmitProposalResponse {
  uint64 proposal_id = 1 [(gogoproto.jsontag) = "proposal_id"];
}

// MsgVote defines a message to cast a vote.
message MsgVote {
  option (cosmos.msg.v1.signer) = "voter";

  option (gogoproto.equal)            = false;
  option (gogoproto.goproto_stringer) = false;
  option (gogoproto.stringer)         = false;
  option (gogoproto.goproto_getters)  = false;

  uint64     proposal_id = 1;
  string     voter       = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"];
  VoteOption option      = 3;
}

// MsgVoteResponse defines the Msg/Vote response type.
message MsgVoteResponse {}

// MsgVoteWeighted defines a message to cast a vote.
//
// Since: cosmos-sdk 0.43
message MsgVoteWeighted {
  option (cosmos.msg.v1.signer) = "voter";

  option (gogoproto.equal)            = false;
  option (gogoproto.goproto_stringer) = false;
  option (gogoproto.stringer)         = false;
  option (gogoproto.goproto_getters)  = false;

  uint64                      proposal_id = 1 [(gogoproto.jsontag) = "proposal_id"];
  string                      voter       = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"];
  repeated WeightedVoteOption options     = 3 [(gogoproto.nullable) = false];
}

// MsgVoteWeightedResponse defines the Msg/VoteWeighted response type.
//
// Since: cosmos-sdk 0.43
message MsgVoteWeightedResponse {}

// MsgDeposit defines a message to submit a deposit to an existing proposal.
message MsgDeposit {
  option (cosmos.msg.v1.signer) = "depositor";

  option (gogoproto.equal)            = false;
  option (gogoproto.goproto_stringer) = false;
  option (gogoproto.stringer)         = false;
  option (gogoproto.goproto_getters)  = false;

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

// MsgDepositResponse defines the Msg/Deposit response type.
message MsgDepositResponse {}
