syntax = "proto3";
package ibc.core.channel.v1;

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

option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types";

// Query provides defines the gRPC querier service
service Query {
  // Channel queries an IBC Channel.
  rpc Channel(QueryChannelRequest) returns (QueryChannelResponse) {
    option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}";
  }

  // Channels queries all the IBC channels of a chain.
  rpc Channels(QueryChannelsRequest) returns (QueryChannelsResponse) {
    option (google.api.http).get = "/ibc/channel/v1beta1/channels";
  }

  // ConnectionChannels queries all the channels associated with a connection
  // end.
  rpc ConnectionChannels(QueryConnectionChannelsRequest) returns (QueryConnectionChannelsResponse) {
    option (google.api.http).get = "/ibc/channel/v1beta1/connections/{connection}/channels";
  }

  // ChannelClientState queries for the client state for the channel associated
  // with the provided channel identifiers.
  rpc ChannelClientState(QueryChannelClientStateRequest) returns (QueryChannelClientStateResponse) {
    option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/client_state";
  }

  // ChannelConsensusState queries for the consensus state for the channel
  // associated with the provided channel identifiers.
  rpc ChannelConsensusState(QueryChannelConsensusStateRequest) returns (QueryChannelConsensusStateResponse) {
    option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/consensus_state/version/"
                                   "{version_number}/height/{version_height}";
  }

  // PacketCommitment queries a stored packet commitment hash.
  rpc PacketCommitment(QueryPacketCommitmentRequest) returns (QueryPacketCommitmentResponse) {
    option (google.api.http).get =
        "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{sequence}";
  }

  // PacketCommitments returns the all the packet commitments hashes associated
  // with a channel.
  rpc PacketCommitments(QueryPacketCommitmentsRequest) returns (QueryPacketCommitmentsResponse) {
    option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments";
  }

  // PacketAcknowledgement queries a stored packet acknowledgement hash.
  rpc PacketAcknowledgement(QueryPacketAcknowledgementRequest) returns (QueryPacketAcknowledgementResponse) {
    option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}";
  }

  // UnreceivedPackets returns all the unrelayed IBC packets associated with a
  // channel and sequences.
  rpc UnreceivedPackets(QueryUnreceivedPacketsRequest) returns (QueryUnreceivedPacketsResponse) {
    option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/"
                                   "{packet_commitment_sequences}/unreceived_packets";
  }

  // UnrelayedAcks returns all the unrelayed IBC acknowledgements associated with a
  // channel and sequences.
  rpc UnrelayedAcks(QueryUnrelayedAcksRequest) returns (QueryUnrelayedAcksResponse) {
    option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/"
                                   "{packet_commitment_sequences}/unrelayed_acks";
  }

  // NextSequenceReceive returns the next receive sequence for a given channel.
  rpc NextSequenceReceive(QueryNextSequenceReceiveRequest) returns (QueryNextSequenceReceiveResponse) {
    option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/next_sequence";
  }
}

// QueryChannelRequest is the request type for the Query/Channel RPC method
message QueryChannelRequest {
  // port unique identifier
  string port_id = 1;
  // channel unique identifier
  string channel_id = 2;
}

// QueryChannelResponse is the response type for the Query/Channel RPC method.
// Besides the Channel end, it includes a proof and the height from which the
// proof was retrieved.
message QueryChannelResponse {
  // channel associated with the request identifiers
  ibc.core.channel.v1.Channel channel = 1;
  // merkle proof of existence
  bytes proof = 2;
  // merkle proof path
  string proof_path = 3;
  // height at which the proof was retrieved
  ibc.core.client.v1.Height proof_height = 4 [(gogoproto.nullable) = false];
}

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

// QueryChannelsResponse is the response type for the Query/Channels RPC method.
message QueryChannelsResponse {
  // list of stored channels of the chain.
  repeated ibc.core.channel.v1.IdentifiedChannel channels = 1;
  // pagination response
  cosmos.base.query.v1beta1.PageResponse pagination = 2;
  // query block height
  ibc.core.client.v1.Height height = 3 [(gogoproto.nullable) = false];
}

// QueryConnectionChannelsRequest is the request type for the
// Query/QueryConnectionChannels RPC method
message QueryConnectionChannelsRequest {
  // connection unique identifier
  string connection = 1;
  // pagination request
  cosmos.base.query.v1beta1.PageRequest pagination = 2;
}

// QueryConnectionChannelsResponse is the Response type for the
// Query/QueryConnectionChannels RPC method
message QueryConnectionChannelsResponse {
  // list of channels associated with a connection.
  repeated ibc.core.channel.v1.IdentifiedChannel channels = 1;
  // pagination response
  cosmos.base.query.v1beta1.PageResponse pagination = 2;
  // query block height
  ibc.core.client.v1.Height height = 3 [(gogoproto.nullable) = false];
}

// QueryChannelClientStateRequest is the request type for the Query/ClientState
// RPC method
message QueryChannelClientStateRequest {
  // port unique identifier
  string port_id = 1;
  // channel unique identifier
  string channel_id = 2;
}

// QueryChannelClientStateResponse is the Response type for the
// Query/QueryChannelClientState RPC method
message QueryChannelClientStateResponse {
  // client state associated with the channel
  ibc.core.client.v1.IdentifiedClientState identified_client_state = 1;
  // merkle proof of existence
  bytes proof = 2;
  // merkle proof path
  string proof_path = 3;
  // height at which the proof was retrieved
  ibc.core.client.v1.Height proof_height = 4 [(gogoproto.nullable) = false];
}

// QueryChannelConsensusStateRequest is the request type for the
// Query/ConsensusState RPC method
message QueryChannelConsensusStateRequest {
  // port unique identifier
  string port_id = 1;
  // channel unique identifier
  string channel_id = 2;
  // version number of the consensus state
  uint64 version_number = 3;
  // version height of the consensus state
  uint64 version_height = 4;
}

// QueryChannelClientStateResponse is the Response type for the
// Query/QueryChannelClientState RPC method
message QueryChannelConsensusStateResponse {
  // consensus state associated with the channel
  google.protobuf.Any consensus_state = 1;
  // client ID associated with the consensus state
  string client_id = 2;
  // merkle proof of existence
  bytes proof = 3;
  // merkle proof path
  string proof_path = 4;
  // height at which the proof was retrieved
  ibc.core.client.v1.Height proof_height = 5 [(gogoproto.nullable) = false];
}

// QueryPacketCommitmentRequest is the request type for the
// Query/PacketCommitment RPC method
message QueryPacketCommitmentRequest {
  // port unique identifier
  string port_id = 1;
  // channel unique identifier
  string channel_id = 2;
  // packet sequence
  uint64 sequence = 3;
}

// QueryPacketCommitmentResponse defines the client query response for a packet
// which also includes a proof, its path and the height form which the proof was
// retrieved
message QueryPacketCommitmentResponse {
  // packet associated with the request fields
  bytes commitment = 1;
  // merkle proof of existence
  bytes proof = 2;
  // merkle proof path
  string proof_path = 3;
  // height at which the proof was retrieved
  ibc.core.client.v1.Height proof_height = 4 [(gogoproto.nullable) = false];
}

// QueryPacketCommitmentsRequest is the request type for the
// Query/QueryPacketCommitments RPC method
message QueryPacketCommitmentsRequest {
  // port unique identifier
  string port_id = 1;
  // channel unique identifier
  string channel_id = 2;
  // pagination request
  cosmos.base.query.v1beta1.PageRequest pagination = 3;
}

// QueryPacketCommitmentsResponse is the request type for the
// Query/QueryPacketCommitments RPC method
message QueryPacketCommitmentsResponse {
  repeated ibc.core.channel.v1.PacketAckCommitment commitments = 1;
  // pagination response
  cosmos.base.query.v1beta1.PageResponse pagination = 2;
  // query block height
  ibc.core.client.v1.Height height = 3 [(gogoproto.nullable) = false];
}

// QueryPacketAcknowledgementRequest is the request type for the
// Query/PacketAcknowledgement RPC method
message QueryPacketAcknowledgementRequest {
  // port unique identifier
  string port_id = 1;
  // channel unique identifier
  string channel_id = 2;
  // packet sequence
  uint64 sequence = 3;
}

// QueryPacketAcknowledgementResponse defines the client query response for a
// packet which also includes a proof, its path and the height form which the
// proof was retrieved
message QueryPacketAcknowledgementResponse {
  // packet associated with the request fields
  bytes acknowledgement = 1;
  // merkle proof of existence
  bytes proof = 2;
  // merkle proof path
  string proof_path = 3;
  // height at which the proof was retrieved
  ibc.core.client.v1.Height proof_height = 4 [(gogoproto.nullable) = false];
}

// QueryUnreceivedPacketsRequest is the request type for the
// Query/UnreceivedPackets RPC method
message QueryUnreceivedPacketsRequest {
  // port unique identifier
  string port_id = 1;
  // channel unique identifier
  string channel_id = 2;
  // list of packet sequences
  repeated uint64 packet_commitment_sequences = 3;
}

// QueryUnreceivedPacketsResponse is the response type for the
// Query/UnreceivedPacketCommitments RPC method
message QueryUnreceivedPacketsResponse {
  // list of unreceived packet sequences
  repeated uint64 sequences = 1;
  // query block height
  ibc.core.client.v1.Height height = 2 [(gogoproto.nullable) = false];
}

// QueryUnrelayedAcksRequest is the request type for the
// Query/UnrelayedAcks RPC method
message QueryUnrelayedAcksRequest {
  // port unique identifier
  string port_id = 1;
  // channel unique identifier
  string channel_id = 2;
  // list of commitment sequences
  repeated uint64 packet_commitment_sequences = 3;
}

// QueryUnrelayedAcksResponse is the response type for the
// Query/UnrelayedAcks RPC method
message QueryUnrelayedAcksResponse {
  // list of unrelayed acknowledgement sequences
  repeated uint64 sequences = 1;
  // query block height
  ibc.core.client.v1.Height height = 2 [(gogoproto.nullable) = false];
}

// QueryNextSequenceReceiveRequest is the request type for the
// Query/QueryNextSequenceReceiveRequest RPC method
message QueryNextSequenceReceiveRequest {
  // port unique identifier
  string port_id = 1;
  // channel unique identifier
  string channel_id = 2;
}

// QuerySequenceResponse is the request type for the
// Query/QueryNextSequenceReceiveResponse RPC method
message QueryNextSequenceReceiveResponse {
  // next sequence receive number
  uint64 next_sequence_receive = 1;
  // merkle proof of existence
  bytes proof = 2;
  // merkle proof path
  string proof_path = 3;
  // height at which the proof was retrieved
  ibc.core.client.v1.Height proof_height = 4 [(gogoproto.nullable) = false];
}
