syntax = "proto3";
package cosmos.base.tendermint.v1beta1;

import "gogoproto/gogo.proto";
import "google/protobuf/any.proto";
import "google/api/annotations.proto";
import "tendermint/p2p/types.proto";
import "tendermint/types/block.proto";
import "tendermint/types/types.proto";
import "cosmos/base/query/v1beta1/pagination.proto";

option go_package = "github.com/cosmos/cosmos-sdk/client/grpc/tmservice";

// Service defines the gRPC querier service for tendermint queries.
service Service {
  // GetNodeInfo queries the current node info.
  rpc GetNodeInfo(GetNodeInfoRequest) returns (GetNodeInfoResponse) {
    option (google.api.http).get = "/cosmos/base/tendermint/v1beta1/node_info";
  }
  // GetSyncing queries node syncing.
  rpc GetSyncing(GetSyncingRequest) returns (GetSyncingResponse) {
    option (google.api.http).get = "/cosmos/base/tendermint/v1beta1/syncing";
  }
  // GetLatestBlock returns the latest block.
  rpc GetLatestBlock(GetLatestBlockRequest) returns (GetLatestBlockResponse) {
    option (google.api.http).get = "/cosmos/base/tendermint/v1beta1/blocks/latest";
  }
  // GetBlockByHeight queries block for given height.
  rpc GetBlockByHeight(GetBlockByHeightRequest) returns (GetBlockByHeightResponse) {
    option (google.api.http).get = "/cosmos/base/tendermint/v1beta1/blocks/{height}";
  }

  // GetLatestValidatorSet queries latest validator-set.
  rpc GetLatestValidatorSet(GetLatestValidatorSetRequest) returns (GetLatestValidatorSetResponse) {
    option (google.api.http).get = "/cosmos/base/tendermint/v1beta1/validatorsets/latest";
  }
  // GetValidatorSetByHeight queries validator-set at a given height.
  rpc GetValidatorSetByHeight(GetValidatorSetByHeightRequest) returns (GetValidatorSetByHeightResponse) {
    option (google.api.http).get = "/cosmos/base/tendermint/v1beta1/validatorsets/{height}";
  }
}

// GetValidatorSetByHeightRequest is the request type for the Query/GetValidatorSetByHeight RPC method.
message GetValidatorSetByHeightRequest {
  int64 height = 1;
  // pagination defines an pagination for the request.
  cosmos.base.query.v1beta1.PageRequest pagination = 2;
}

// GetValidatorSetByHeightResponse is the response type for the Query/GetValidatorSetByHeight RPC method.
message GetValidatorSetByHeightResponse {
  int64              block_height = 1;
  repeated Validator validators   = 2;
  // pagination defines an pagination for the response.
  cosmos.base.query.v1beta1.PageResponse pagination = 3;
}

// GetLatestValidatorSetRequest is the request type for the Query/GetValidatorSetByHeight RPC method.
message GetLatestValidatorSetRequest {
  // pagination defines an pagination for the request.
  cosmos.base.query.v1beta1.PageRequest pagination = 1;
}

// GetLatestValidatorSetResponse is the response type for the Query/GetValidatorSetByHeight RPC method.
message GetLatestValidatorSetResponse {
  int64              block_height = 1;
  repeated Validator validators   = 2;
  // pagination defines an pagination for the response.
  cosmos.base.query.v1beta1.PageResponse pagination = 3;
}

// Validator is the type for the validator-set.
message Validator {
  string              address           = 1;
  google.protobuf.Any pub_key           = 2;
  int64               voting_power      = 3;
  int64               proposer_priority = 4;
}

// GetBlockByHeightRequest is the request type for the Query/GetBlockByHeight RPC method.
message GetBlockByHeightRequest {
  int64 height = 1;
}

// GetBlockByHeightResponse is the response type for the Query/GetBlockByHeight RPC method.
message GetBlockByHeightResponse {
  .tendermint.types.BlockID block_id = 1;
  .tendermint.types.Block   block    = 2;
}

// GetLatestBlockRequest is the request type for the Query/GetLatestBlock RPC method.
message GetLatestBlockRequest {}

// GetLatestBlockResponse is the response type for the Query/GetLatestBlock RPC method.
message GetLatestBlockResponse {
  .tendermint.types.BlockID block_id = 1;
  .tendermint.types.Block   block    = 2;
}

// GetSyncingRequest is the request type for the Query/GetSyncing RPC method.
message GetSyncingRequest {}

// GetSyncingResponse is the response type for the Query/GetSyncing RPC method.
message GetSyncingResponse {
  bool syncing = 1;
}

// GetNodeInfoRequest is the request type for the Query/GetNodeInfo RPC method.
message GetNodeInfoRequest {}

// GetNodeInfoResponse is the request type for the Query/GetNodeInfo RPC method.
message GetNodeInfoResponse {
  .tendermint.p2p.DefaultNodeInfo default_node_info   = 1;
  VersionInfo                     application_version = 2;
}

// VersionInfo is the type for the GetNodeInfoResponse message.
message VersionInfo {
  string          name               = 1;
  string          app_name           = 2;
  string          version            = 3;
  string          git_commit         = 4;
  string          build_tags         = 5;
  string          go_version         = 6;
  repeated Module build_deps         = 7;
  string          cosmos_sdk_version = 8;
}

// Module is the type for VersionInfo
message Module {
  // module path
  string path = 1;
  // module version
  string version = 2;
  // checksum
  string sum = 3;
}
