syntax = "proto3";

package ibc.core.client.v1;

option go_package = "github.com/cosmos/ibc-go/v10/modules/core/02-client/types";

import "cosmos/base/query/v1beta1/pagination.proto";
import "cosmos/query/v1/query.proto";
import "ibc/core/client/v1/client.proto";
import "ibc/core/commitment/v2/commitment.proto";
import "google/protobuf/any.proto";
import "google/api/annotations.proto";
import "gogoproto/gogo.proto";

// Query provides defines the gRPC querier service
service Query {
  // ClientState queries an IBC light client.
  rpc ClientState(QueryClientStateRequest) returns (QueryClientStateResponse) {
    option (google.api.http).get = "/ibc/core/client/v1/client_states/{client_id}";
  }

  // ClientStates queries all the IBC light clients of a chain.
  rpc ClientStates(QueryClientStatesRequest) returns (QueryClientStatesResponse) {
    option (google.api.http).get = "/ibc/core/client/v1/client_states";
  }

  // ConsensusState queries a consensus state associated with a client state at
  // a given height.
  rpc ConsensusState(QueryConsensusStateRequest) returns (QueryConsensusStateResponse) {
    option (google.api.http).get = "/ibc/core/client/v1/consensus_states/"
                                   "{client_id}/revision/{revision_number}/"
                                   "height/{revision_height}";
  }

  // ConsensusStates queries all the consensus state associated with a given
  // client.
  rpc ConsensusStates(QueryConsensusStatesRequest) returns (QueryConsensusStatesResponse) {
    option (google.api.http).get = "/ibc/core/client/v1/consensus_states/{client_id}";
  }

  // ConsensusStateHeights queries the height of every consensus states associated with a given client.
  rpc ConsensusStateHeights(QueryConsensusStateHeightsRequest) returns (QueryConsensusStateHeightsResponse) {
    option (google.api.http).get = "/ibc/core/client/v1/consensus_states/{client_id}/heights";
  }

  // Status queries the status of an IBC client.
  rpc ClientStatus(QueryClientStatusRequest) returns (QueryClientStatusResponse) {
    option (google.api.http).get = "/ibc/core/client/v1/client_status/{client_id}";
  }

  // ClientParams queries all parameters of the ibc client submodule.
  rpc ClientParams(QueryClientParamsRequest) returns (QueryClientParamsResponse) {
    option (google.api.http).get = "/ibc/core/client/v1/params";
  }

  // ClientCreator queries the creator of a given client.
  rpc ClientCreator(QueryClientCreatorRequest) returns (QueryClientCreatorResponse) {
    option (google.api.http).get = "/ibc/core/client/v1/client_creator/{client_id}";
  }

  // UpgradedClientState queries an Upgraded IBC light client.
  rpc UpgradedClientState(QueryUpgradedClientStateRequest) returns (QueryUpgradedClientStateResponse) {
    option (google.api.http).get = "/ibc/core/client/v1/upgraded_client_states";
  }

  // UpgradedConsensusState queries an Upgraded IBC consensus state.
  rpc UpgradedConsensusState(QueryUpgradedConsensusStateRequest) returns (QueryUpgradedConsensusStateResponse) {
    option (google.api.http).get = "/ibc/core/client/v1/upgraded_consensus_states";
  }

  // VerifyMembership queries an IBC light client for proof verification of a value at a given key path.
  rpc VerifyMembership(QueryVerifyMembershipRequest) returns (QueryVerifyMembershipResponse) {
    option (cosmos.query.v1.module_query_safe) = true;
    option (google.api.http)                   = {
      post: "/ibc/core/client/v1/verify_membership"
      body: "*"
    };
  }
}

// QueryClientStateRequest is the request type for the Query/ClientState RPC
// method
message QueryClientStateRequest {
  // client state unique identifier
  string client_id = 1;
}

// QueryClientStateResponse is the response type for the Query/ClientState RPC
// method. Besides the client state, it includes a proof and the height from
// which the proof was retrieved.
message QueryClientStateResponse {
  // client state associated with the request identifier
  google.protobuf.Any client_state = 1;
  // merkle proof of existence
  bytes proof = 2;
  // height at which the proof was retrieved
  ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false];
}

// QueryClientStatesRequest is the request type for the Query/ClientStates RPC
// method
message QueryClientStatesRequest {
  // pagination request
  cosmos.base.query.v1beta1.PageRequest pagination = 1;
}

// QueryClientStatesResponse is the response type for the Query/ClientStates RPC
// method.
message QueryClientStatesResponse {
  // list of stored ClientStates of the chain.
  repeated IdentifiedClientState client_states = 1
      [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "IdentifiedClientStates"];
  // pagination response
  cosmos.base.query.v1beta1.PageResponse pagination = 2;
}

// QueryConsensusStateRequest is the request type for the Query/ConsensusState
// RPC method. Besides the consensus state, it includes a proof and the height
// from which the proof was retrieved.
message QueryConsensusStateRequest {
  // client identifier
  string client_id = 1;
  // consensus state revision number
  uint64 revision_number = 2;
  // consensus state revision height
  uint64 revision_height = 3;
  // latest_height overrides the height field and queries the latest stored
  // ConsensusState
  bool latest_height = 4;
}

// QueryConsensusStateResponse is the response type for the Query/ConsensusState
// RPC method
message QueryConsensusStateResponse {
  // consensus state associated with the client identifier at the given height
  google.protobuf.Any consensus_state = 1;
  // merkle proof of existence
  bytes proof = 2;
  // height at which the proof was retrieved
  ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false];
}

// QueryConsensusStatesRequest is the request type for the Query/ConsensusStates
// RPC method.
message QueryConsensusStatesRequest {
  // client identifier
  string client_id = 1;
  // pagination request
  cosmos.base.query.v1beta1.PageRequest pagination = 2;
}

// QueryConsensusStatesResponse is the response type for the
// Query/ConsensusStates RPC method
message QueryConsensusStatesResponse {
  // consensus states associated with the identifier
  repeated ConsensusStateWithHeight consensus_states = 1 [(gogoproto.nullable) = false];
  // pagination response
  cosmos.base.query.v1beta1.PageResponse pagination = 2;
}

// QueryConsensusStateHeightsRequest is the request type for Query/ConsensusStateHeights
// RPC method.
message QueryConsensusStateHeightsRequest {
  // client identifier
  string client_id = 1;
  // pagination request
  cosmos.base.query.v1beta1.PageRequest pagination = 2;
}

// QueryConsensusStateHeightsResponse is the response type for the
// Query/ConsensusStateHeights RPC method
message QueryConsensusStateHeightsResponse {
  // consensus state heights
  repeated Height consensus_state_heights = 1 [(gogoproto.nullable) = false];
  // pagination response
  cosmos.base.query.v1beta1.PageResponse pagination = 2;
}

// QueryClientStatusRequest is the request type for the Query/ClientStatus RPC
// method
message QueryClientStatusRequest {
  // client unique identifier
  string client_id = 1;
}

// QueryClientStatusResponse is the response type for the Query/ClientStatus RPC
// method. It returns the current status of the IBC client.
message QueryClientStatusResponse {
  string status = 1;
}

// QueryClientParamsRequest is the request type for the Query/ClientParams RPC
// method.
message QueryClientParamsRequest {}

// QueryClientParamsResponse is the response type for the Query/ClientParams RPC
// method.
message QueryClientParamsResponse {
  // params defines the parameters of the module.
  Params params = 1;
}

// QueryClientCreatorRequest is the request type for the Query/ClientCreator RPC
// method.
message QueryClientCreatorRequest {
  // client unique identifier
  string client_id = 1;
}

// QueryClientCreatorResponse is the response type for the Query/ClientCreator RPC
// method.
message QueryClientCreatorResponse {
  // creator of the client
  string creator = 1;
}

// QueryUpgradedClientStateRequest is the request type for the
// Query/UpgradedClientState RPC method
message QueryUpgradedClientStateRequest {}

// QueryUpgradedClientStateResponse is the response type for the
// Query/UpgradedClientState RPC method.
message QueryUpgradedClientStateResponse {
  // client state associated with the request identifier
  google.protobuf.Any upgraded_client_state = 1;
}

// QueryUpgradedConsensusStateRequest is the request type for the
// Query/UpgradedConsensusState RPC method
message QueryUpgradedConsensusStateRequest {}

// QueryUpgradedConsensusStateResponse is the response type for the
// Query/UpgradedConsensusState RPC method.
message QueryUpgradedConsensusStateResponse {
  // Consensus state associated with the request identifier
  google.protobuf.Any upgraded_consensus_state = 1;
}

// QueryVerifyMembershipRequest is the request type for the Query/VerifyMembership RPC method
message QueryVerifyMembershipRequest {
  // client unique identifier.
  string client_id = 1;
  // the proof to be verified by the client.
  bytes proof = 2;
  // the height of the commitment root at which the proof is verified.
  ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false];
  // reserved: deprecated field.
  reserved 4;
  // the value which is proven.
  bytes value = 5;
  // optional time delay
  uint64 time_delay = 6;
  // optional block delay
  uint64 block_delay = 7;
  // the commitment key path.
  ibc.core.commitment.v2.MerklePath merkle_path = 8 [(gogoproto.nullable) = false];
}

// QueryVerifyMembershipResponse is the response type for the Query/VerifyMembership RPC method
message QueryVerifyMembershipResponse {
  // boolean indicating success or failure of proof verification.
  bool success = 1;
}
