syntax = "proto3";
package kava.earn.v1beta1;

import "cosmos/base/query/v1beta1/pagination.proto";
import "cosmos/base/v1beta1/coin.proto";
import "cosmos_proto/cosmos.proto";
import "gogoproto/gogo.proto";
import "google/api/annotations.proto";
import "kava/earn/v1beta1/params.proto";
import "kava/earn/v1beta1/strategy.proto";
import "kava/earn/v1beta1/vault.proto";

option go_package = "github.com/kava-labs/kava/x/earn/types";
option (gogoproto.goproto_getters_all) = false;

// Query defines the gRPC querier service for earn module
service Query {
  // Params queries all parameters of the earn module.
  rpc Params(QueryParamsRequest) returns (QueryParamsResponse) {
    option (google.api.http).get = "/kava/earn/v1beta1/params";
  }

  // Vaults queries all vaults
  rpc Vaults(QueryVaultsRequest) returns (QueryVaultsResponse) {
    option (google.api.http).get = "/kava/earn/v1beta1/vaults";
  }

  // Vault queries a single vault based on the vault denom
  rpc Vault(QueryVaultRequest) returns (QueryVaultResponse) {
    option (google.api.http).get = "/kava/earn/v1beta1/vaults/{denom=**}";
  }

  // Deposits queries deposit details based on depositor address and vault
  rpc Deposits(QueryDepositsRequest) returns (QueryDepositsResponse) {
    option (google.api.http).get = "/kava/earn/v1beta1/deposits";
  }

  // TotalSupply returns the total sum of all coins currently locked into the earn module.
  rpc TotalSupply(QueryTotalSupplyRequest) returns (QueryTotalSupplyResponse) {
    option (google.api.http).get = "/kava/earn/v1beta1/total_supply";
  }
}

// QueryParamsRequest defines the request type for querying x/earn parameters.
message QueryParamsRequest {}

// QueryParamsResponse defines the response type for querying x/earn parameters.
message QueryParamsResponse {
  // params represents the earn module parameters
  Params params = 1 [(gogoproto.nullable) = false];
}

// QueryVaultsRequest is the request type for the Query/Vaults RPC method.
message QueryVaultsRequest {}

// QueryVaultsResponse is the response type for the Query/Vaults RPC method.
message QueryVaultsResponse {
  // vaults represents the earn module vaults
  repeated VaultResponse vaults = 1 [(gogoproto.nullable) = false];
}

// QueryVaultRequest is the request type for the Query/Vault RPC method.
message QueryVaultRequest {
  // vault filters vault by denom
  string denom = 1;
}

// QueryVaultResponse is the response type for the Query/Vault RPC method.
message QueryVaultResponse {
  // vault represents the queried earn module vault
  VaultResponse vault = 1 [(gogoproto.nullable) = false];
}

// VaultResponse is the response type for a vault.
message VaultResponse {
  // denom represents the denom of the vault
  string denom = 1;

  // VaultStrategy is the strategy used for this vault.
  repeated StrategyType strategies = 2 [(gogoproto.castrepeated) = "StrategyTypes"];

  // IsPrivateVault is true if the vault only allows depositors contained in
  // AllowedDepositors.
  bool is_private_vault = 3;

  // AllowedDepositors is a list of addresses that are allowed to deposit to
  // this vault if IsPrivateVault is true. Addresses not contained in this list
  // are not allowed to deposit into this vault. If IsPrivateVault is false,
  // this should be empty and ignored.
  repeated string allowed_depositors = 4 [(cosmos_proto.scalar) = "cosmos.AddressString"];

  // TotalShares is the total amount of shares issued to depositors.
  string total_shares = 5;

  // TotalValue is the total value of denom coins supplied to the vault if the
  // vault were to be liquidated.
  string total_value = 6 [
    (cosmos_proto.scalar) = "cosmos.Int",
    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
    (gogoproto.nullable) = false
  ];
}

// QueryDepositsRequest is the request type for the Query/Deposits RPC method.
message QueryDepositsRequest {
  // depositor optionally filters deposits by depositor
  string depositor = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];

  // denom optionally filters deposits by vault denom
  string denom = 2;

  // respond with vault value in ukava for bkava vaults
  bool value_in_staked_tokens = 3;

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

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

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

// DepositResponse defines a deposit query response type.
message DepositResponse {
  // depositor represents the owner of the deposit.
  string depositor = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];

  // Shares represent the issued shares from their corresponding vaults.
  repeated VaultShare shares = 2 [
    (gogoproto.castrepeated) = "VaultShares",
    (gogoproto.nullable) = false
  ];

  // Value represents the total accumulated value of denom coins supplied to
  // vaults. This may be greater than or equal to amount_supplied depending on
  // the strategy.
  repeated cosmos.base.v1beta1.Coin value = 3 [
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins",
    (gogoproto.nullable) = false
  ];
}

// QueryTotalSupplyRequest defines the request type for Query/TotalSupply method.
message QueryTotalSupplyRequest {}

// TotalSupplyResponse defines the response type for the Query/TotalSupply method.
message QueryTotalSupplyResponse {
  // Height is the block height at which these totals apply
  int64 height = 1;
  // Result is a list of coins supplied to earn
  repeated cosmos.base.v1beta1.Coin result = 2 [
    (gogoproto.nullable) = false,
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"
  ];
}