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

import "cosmos/base/query/v1beta1/pagination.proto";
import "gogoproto/gogo.proto";
import "google/api/annotations.proto";
import "cosmos/gov/v1beta1/gov.proto";

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

// Query defines the gRPC querier service for gov module
service Query {
  // Proposal queries proposal details based on ProposalID.
  rpc Proposal(QueryProposalRequest) returns (QueryProposalResponse) {
    option (google.api.http).get = "/cosmos/gov/v1beta1/proposals/{proposal_id}";
  }

  // Proposals queries all proposals based on given status.
  rpc Proposals(QueryProposalsRequest) returns (QueryProposalsResponse) {
    option (google.api.http).get = "/cosmos/gov/v1beta1/proposals";
  }

  // Vote queries voted information based on proposalID, voterAddr.
  rpc Vote(QueryVoteRequest) returns (QueryVoteResponse) {
    option (google.api.http).get = "/cosmos/gov/v1beta1/proposals/{proposal_id}/votes/{voter}";
  }

  // Votes queries votes of a given proposal.
  rpc Votes(QueryVotesRequest) returns (QueryVotesResponse) {
    option (google.api.http).get = "/cosmos/gov/v1beta1/proposals/{proposal_id}/votes";
  }

  // Params queries all parameters of the gov module.
  rpc Params(QueryParamsRequest) returns (QueryParamsResponse) {
    option (google.api.http).get = "/cosmos/gov/v1beta1/params/{params_type}";
  }

  // Deposit queries single deposit information based proposalID, depositAddr.
  rpc Deposit(QueryDepositRequest) returns (QueryDepositResponse) {
    option (google.api.http).get = "/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits/{depositor}";
  }

  // Deposits queries all deposits of a single proposal.
  rpc Deposits(QueryDepositsRequest) returns (QueryDepositsResponse) {
    option (google.api.http).get = "/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits";
  }

  // TallyResult queries the tally of a proposal vote.
  rpc TallyResult(QueryTallyResultRequest) returns (QueryTallyResultResponse) {
    option (google.api.http).get = "/cosmos/gov/v1beta1/proposals/{proposal_id}/tally";
  }
}

// QueryProposalRequest is the request type for the Query/Proposal RPC method.
message QueryProposalRequest {
  // proposal_id defines the unique id of the proposal.
  uint64 proposal_id = 1;
}

// QueryProposalResponse is the response type for the Query/Proposal RPC method.
message QueryProposalResponse {
  Proposal proposal = 1 [(gogoproto.nullable) = false];
}

// QueryProposalsRequest is the request type for the Query/Proposals RPC method.
message QueryProposalsRequest {
  option (gogoproto.equal)           = false;
  option (gogoproto.goproto_getters) = false;

  // proposal_status defines the status of the proposals.
  ProposalStatus proposal_status = 1;

  // voter defines the voter address for the proposals.
  string voter = 2;

  // depositor defines the deposit addresses from the proposals.
  string depositor = 3;

  // pagination defines an optional pagination for the request.
  cosmos.base.query.v1beta1.PageRequest pagination = 4;
}

// QueryProposalsResponse is the response type for the Query/Proposals RPC
// method.
message QueryProposalsResponse {
  repeated Proposal proposals = 1 [(gogoproto.nullable) = false];

  // pagination defines the pagination in the response.
  cosmos.base.query.v1beta1.PageResponse pagination = 2;
}

// QueryVoteRequest is the request type for the Query/Vote RPC method.
message QueryVoteRequest {
  option (gogoproto.equal)           = false;
  option (gogoproto.goproto_getters) = false;

  // proposal_id defines the unique id of the proposal.
  uint64 proposal_id = 1;

  // voter defines the oter address for the proposals.
  string voter = 2;
}

// QueryVoteResponse is the response type for the Query/Vote RPC method.
message QueryVoteResponse {
  // vote defined the queried vote.
  Vote vote = 1 [(gogoproto.nullable) = false];
}

// QueryVotesRequest is the request type for the Query/Votes RPC method.
message QueryVotesRequest {
  // proposal_id defines the unique id of the proposal.
  uint64 proposal_id = 1;

  // pagination defines an optional pagination for the request.
  cosmos.base.query.v1beta1.PageRequest pagination = 2;
}

// QueryVotesResponse is the response type for the Query/Votes RPC method.
message QueryVotesResponse {
  // votes defined the queried votes.
  repeated Vote votes = 1 [(gogoproto.nullable) = false];

  // pagination defines the pagination in the response.
  cosmos.base.query.v1beta1.PageResponse pagination = 2;
}

// QueryParamsRequest is the request type for the Query/Params RPC method.
message QueryParamsRequest {
  // params_type defines which parameters to query for, can be one of "voting",
  // "tallying" or "deposit".
  string params_type = 1;
}

// QueryParamsResponse is the response type for the Query/Params RPC method.
message QueryParamsResponse {
  // voting_params defines the parameters related to voting.
  VotingParams voting_params = 1 [(gogoproto.nullable) = false];
  // deposit_params defines the parameters related to deposit.
  DepositParams deposit_params = 2 [(gogoproto.nullable) = false];
  // tally_params defines the parameters related to tally.
  TallyParams tally_params = 3 [(gogoproto.nullable) = false];
}

// QueryDepositRequest is the request type for the Query/Deposit RPC method.
message QueryDepositRequest {
  option (gogoproto.goproto_getters) = false;
  option (gogoproto.equal)           = false;

  // proposal_id defines the unique id of the proposal.
  uint64 proposal_id = 1;

  // depositor defines the deposit addresses from the proposals.
  string depositor = 2;
}

// QueryDepositResponse is the response type for the Query/Deposit RPC method.
message QueryDepositResponse {
  // deposit defines the requested deposit.
  Deposit deposit = 1 [(gogoproto.nullable) = false];
}

// QueryDepositsRequest is the request type for the Query/Deposits RPC method.
message QueryDepositsRequest {
  // proposal_id defines the unique id of the proposal.
  uint64 proposal_id = 1;

  // pagination defines an optional pagination for the request.
  cosmos.base.query.v1beta1.PageRequest pagination = 2;
}

// QueryDepositsResponse is the response type for the Query/Deposits RPC method.
message QueryDepositsResponse {
  repeated Deposit deposits = 1 [(gogoproto.nullable) = false];

  // pagination defines the pagination in the response.
  cosmos.base.query.v1beta1.PageResponse pagination = 2;
}

// QueryTallyResultRequest is the request type for the Query/Tally RPC method.
message QueryTallyResultRequest {
  // proposal_id defines the unique id of the proposal.
  uint64 proposal_id = 1;
}

// QueryTallyResultResponse is the response type for the Query/Tally RPC method.
message QueryTallyResultResponse {
  // tally defines the requested tally.
  TallyResult tally = 1 [(gogoproto.nullable) = false];
}