syntax = "proto3";

package ibc.applications.fee.v1;

option go_package = "github.com/cosmos/ibc-go/v6/modules/apps/29-fee/types";

import "gogoproto/gogo.proto";
import "google/api/annotations.proto";
import "cosmos/base/v1beta1/coin.proto";
import "cosmos/base/query/v1beta1/pagination.proto";
import "ibc/applications/fee/v1/fee.proto";
import "ibc/applications/fee/v1/genesis.proto";
import "ibc/core/channel/v1/channel.proto";

// Query defines the ICS29 gRPC querier service.
service Query {
  // IncentivizedPackets returns all incentivized packets and their associated fees
  rpc IncentivizedPackets(QueryIncentivizedPacketsRequest) returns (QueryIncentivizedPacketsResponse) {
    option (google.api.http).get = "/ibc/apps/fee/v1/incentivized_packets";
  }

  // IncentivizedPacket returns all packet fees for a packet given its identifier
  rpc IncentivizedPacket(QueryIncentivizedPacketRequest) returns (QueryIncentivizedPacketResponse) {
    option (google.api.http).get =
        "/ibc/apps/fee/v1/channels/{packet_id.channel_id}/ports/{packet_id.port_id}/sequences/"
        "{packet_id.sequence}/incentivized_packet";
  }

  // Gets all incentivized packets for a specific channel
  rpc IncentivizedPacketsForChannel(QueryIncentivizedPacketsForChannelRequest)
      returns (QueryIncentivizedPacketsForChannelResponse) {
    option (google.api.http).get = "/ibc/apps/fee/v1/channels/{channel_id}/ports/{port_id}/incentivized_packets";
  }

  // TotalRecvFees returns the total receive fees for a packet given its identifier
  rpc TotalRecvFees(QueryTotalRecvFeesRequest) returns (QueryTotalRecvFeesResponse) {
    option (google.api.http).get = "/ibc/apps/fee/v1/channels/{packet_id.channel_id}/ports/{packet_id.port_id}/"
                                   "sequences/{packet_id.sequence}/total_recv_fees";
  }

  // TotalAckFees returns the total acknowledgement fees for a packet given its identifier
  rpc TotalAckFees(QueryTotalAckFeesRequest) returns (QueryTotalAckFeesResponse) {
    option (google.api.http).get = "/ibc/apps/fee/v1/channels/{packet_id.channel_id}/ports/{packet_id.port_id}/"
                                   "sequences/{packet_id.sequence}/total_ack_fees";
  }

  // TotalTimeoutFees returns the total timeout fees for a packet given its identifier
  rpc TotalTimeoutFees(QueryTotalTimeoutFeesRequest) returns (QueryTotalTimeoutFeesResponse) {
    option (google.api.http).get = "/ibc/apps/fee/v1/channels/{packet_id.channel_id}/ports/{packet_id.port_id}/"
                                   "sequences/{packet_id.sequence}/total_timeout_fees";
  }

  // Payee returns the registered payee address for a specific channel given the relayer address
  rpc Payee(QueryPayeeRequest) returns (QueryPayeeResponse) {
    option (google.api.http).get = "/ibc/apps/fee/v1/channels/{channel_id}/relayers/{relayer}/payee";
  }

  // CounterpartyPayee returns the registered counterparty payee for forward relaying
  rpc CounterpartyPayee(QueryCounterpartyPayeeRequest) returns (QueryCounterpartyPayeeResponse) {
    option (google.api.http).get = "/ibc/apps/fee/v1/channels/{channel_id}/relayers/{relayer}/counterparty_payee";
  }

  // FeeEnabledChannels returns a list of all fee enabled channels
  rpc FeeEnabledChannels(QueryFeeEnabledChannelsRequest) returns (QueryFeeEnabledChannelsResponse) {
    option (google.api.http).get = "/ibc/apps/fee/v1/fee_enabled";
  }

  // FeeEnabledChannel returns true if the provided port and channel identifiers belong to a fee enabled channel
  rpc FeeEnabledChannel(QueryFeeEnabledChannelRequest) returns (QueryFeeEnabledChannelResponse) {
    option (google.api.http).get = "/ibc/apps/fee/v1/channels/{channel_id}/ports/{port_id}/fee_enabled";
  }
}

// QueryIncentivizedPacketsRequest defines the request type for the IncentivizedPackets rpc
message QueryIncentivizedPacketsRequest {
  // pagination defines an optional pagination for the request.
  cosmos.base.query.v1beta1.PageRequest pagination = 1;
  // block height at which to query
  uint64 query_height = 2;
}

// QueryIncentivizedPacketsResponse defines the response type for the IncentivizedPackets rpc
message QueryIncentivizedPacketsResponse {
  // list of identified fees for incentivized packets
  repeated ibc.applications.fee.v1.IdentifiedPacketFees incentivized_packets = 1 [(gogoproto.nullable) = false];
}

// QueryIncentivizedPacketRequest defines the request type for the IncentivizedPacket rpc
message QueryIncentivizedPacketRequest {
  // unique packet identifier comprised of channel ID, port ID and sequence
  ibc.core.channel.v1.PacketId packet_id = 1 [(gogoproto.nullable) = false];
  // block height at which to query
  uint64 query_height = 2;
}

// QueryIncentivizedPacketsResponse defines the response type for the IncentivizedPacket rpc
message QueryIncentivizedPacketResponse {
  // the identified fees for the incentivized packet
  ibc.applications.fee.v1.IdentifiedPacketFees incentivized_packet = 1 [(gogoproto.nullable) = false];
}

// QueryIncentivizedPacketsForChannelRequest defines the request type for querying for all incentivized packets
// for a specific channel
message QueryIncentivizedPacketsForChannelRequest {
  // pagination defines an optional pagination for the request.
  cosmos.base.query.v1beta1.PageRequest pagination = 1;
  string                                port_id    = 2;
  string                                channel_id = 3;
  // Height to query at
  uint64 query_height = 4;
}

// QueryIncentivizedPacketsResponse defines the response type for the incentivized packets RPC
message QueryIncentivizedPacketsForChannelResponse {
  // Map of all incentivized_packets
  repeated ibc.applications.fee.v1.IdentifiedPacketFees incentivized_packets = 1;
}

// QueryTotalRecvFeesRequest defines the request type for the TotalRecvFees rpc
message QueryTotalRecvFeesRequest {
  // the packet identifier for the associated fees
  ibc.core.channel.v1.PacketId packet_id = 1 [(gogoproto.nullable) = false];
}

// QueryTotalRecvFeesResponse defines the response type for the TotalRecvFees rpc
message QueryTotalRecvFeesResponse {
  // the total packet receive fees
  repeated cosmos.base.v1beta1.Coin recv_fees = 1 [
    (gogoproto.moretags)     = "yaml:\"recv_fees\"",
    (gogoproto.nullable)     = false,
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"
  ];
}

// QueryTotalAckFeesRequest defines the request type for the TotalAckFees rpc
message QueryTotalAckFeesRequest {
  // the packet identifier for the associated fees
  ibc.core.channel.v1.PacketId packet_id = 1 [(gogoproto.nullable) = false];
}

// QueryTotalAckFeesResponse defines the response type for the TotalAckFees rpc
message QueryTotalAckFeesResponse {
  // the total packet acknowledgement fees
  repeated cosmos.base.v1beta1.Coin ack_fees = 1 [
    (gogoproto.moretags)     = "yaml:\"ack_fees\"",
    (gogoproto.nullable)     = false,
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"
  ];
}

// QueryTotalTimeoutFeesRequest defines the request type for the TotalTimeoutFees rpc
message QueryTotalTimeoutFeesRequest {
  // the packet identifier for the associated fees
  ibc.core.channel.v1.PacketId packet_id = 1 [(gogoproto.nullable) = false];
}

// QueryTotalTimeoutFeesResponse defines the response type for the TotalTimeoutFees rpc
message QueryTotalTimeoutFeesResponse {
  // the total packet timeout fees
  repeated cosmos.base.v1beta1.Coin timeout_fees = 1 [
    (gogoproto.moretags)     = "yaml:\"timeout_fees\"",
    (gogoproto.nullable)     = false,
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"
  ];
}

// QueryPayeeRequest defines the request type for the Payee rpc
message QueryPayeeRequest {
  // unique channel identifier
  string channel_id = 1 [(gogoproto.moretags) = "yaml:\"channel_id\""];
  // the relayer address to which the distribution address is registered
  string relayer = 2;
}

// QueryPayeeResponse defines the response type for the Payee rpc
message QueryPayeeResponse {
  // the payee address to which packet fees are paid out
  string payee_address = 1 [(gogoproto.moretags) = "yaml:\"payee_address\""];
}

// QueryCounterpartyPayeeRequest defines the request type for the CounterpartyPayee rpc
message QueryCounterpartyPayeeRequest {
  // unique channel identifier
  string channel_id = 1 [(gogoproto.moretags) = "yaml:\"channel_id\""];
  // the relayer address to which the counterparty is registered
  string relayer = 2;
}

// QueryCounterpartyPayeeResponse defines the response type for the CounterpartyPayee rpc
message QueryCounterpartyPayeeResponse {
  // the counterparty payee address used to compensate forward relaying
  string counterparty_payee = 1 [(gogoproto.moretags) = "yaml:\"counterparty_payee\""];
}

// QueryFeeEnabledChannelsRequest defines the request type for the FeeEnabledChannels rpc
message QueryFeeEnabledChannelsRequest {
  // pagination defines an optional pagination for the request.
  cosmos.base.query.v1beta1.PageRequest pagination = 1;
  // block height at which to query
  uint64 query_height = 2;
}

// QueryFeeEnabledChannelsResponse defines the response type for the FeeEnabledChannels rpc
message QueryFeeEnabledChannelsResponse {
  // list of fee enabled channels
  repeated ibc.applications.fee.v1.FeeEnabledChannel fee_enabled_channels = 1
      [(gogoproto.moretags) = "yaml:\"fee_enabled_channels\"", (gogoproto.nullable) = false];
}

// QueryFeeEnabledChannelRequest defines the request type for the FeeEnabledChannel rpc
message QueryFeeEnabledChannelRequest {
  // unique port identifier
  string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""];
  // unique channel identifier
  string channel_id = 2 [(gogoproto.moretags) = "yaml:\"channel_id\""];
}

// QueryFeeEnabledChannelResponse defines the response type for the FeeEnabledChannel rpc
message QueryFeeEnabledChannelResponse {
  // boolean flag representing the fee enabled channel status
  bool fee_enabled = 1 [(gogoproto.moretags) = "yaml:\"fee_enabled\""];
}
