Skip to content

Commit

Permalink
[CLOB-1031] add query to get all liquidity tiers (#841)
Browse files Browse the repository at this point in the history
* [CLOB-1031] add query to get all liquidity tiers

* add pagination

* nit
  • Loading branch information
jayy04 authored Dec 6, 2023
1 parent 56d653a commit af8b6a4
Show file tree
Hide file tree
Showing 8 changed files with 872 additions and 50 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { setPaginationParams } from "../../helpers";
import { LCDClient } from "@osmonauts/lcd";
import { QueryPerpetualRequest, QueryPerpetualResponseSDKType, QueryAllPerpetualsRequest, QueryAllPerpetualsResponseSDKType, QueryPremiumVotesRequest, QueryPremiumVotesResponseSDKType, QueryPremiumSamplesRequest, QueryPremiumSamplesResponseSDKType, QueryParamsRequest, QueryParamsResponseSDKType } from "./query";
import { QueryPerpetualRequest, QueryPerpetualResponseSDKType, QueryAllPerpetualsRequest, QueryAllPerpetualsResponseSDKType, QueryAllLiquidityTiersRequest, QueryAllLiquidityTiersResponseSDKType, QueryPremiumVotesRequest, QueryPremiumVotesResponseSDKType, QueryPremiumSamplesRequest, QueryPremiumSamplesResponseSDKType, QueryParamsRequest, QueryParamsResponseSDKType } from "./query";
export class LCDQueryClient {
req: LCDClient;

Expand All @@ -12,6 +12,7 @@ export class LCDQueryClient {
this.req = requestClient;
this.perpetual = this.perpetual.bind(this);
this.allPerpetuals = this.allPerpetuals.bind(this);
this.allLiquidityTiers = this.allLiquidityTiers.bind(this);
this.premiumVotes = this.premiumVotes.bind(this);
this.premiumSamples = this.premiumSamples.bind(this);
this.params = this.params.bind(this);
Expand Down Expand Up @@ -40,6 +41,23 @@ export class LCDQueryClient {
const endpoint = `dydxprotocol/perpetuals/perpetual`;
return await this.req.get<QueryAllPerpetualsResponseSDKType>(endpoint, options);
}
/* Queries a list of LiquidityTiers. */


async allLiquidityTiers(params: QueryAllLiquidityTiersRequest = {
pagination: undefined
}): Promise<QueryAllLiquidityTiersResponseSDKType> {
const options: any = {
params: {}
};

if (typeof params?.pagination !== "undefined") {
setPaginationParams(options, params.pagination);
}

const endpoint = `dydxprotocol/perpetuals/liquidity_tiers`;
return await this.req.get<QueryAllLiquidityTiersResponseSDKType>(endpoint, options);
}
/* Queries a list of premium votes. */


Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Rpc } from "../../helpers";
import * as _m0 from "protobufjs/minimal";
import { QueryClient, createProtobufRpcClient } from "@cosmjs/stargate";
import { QueryPerpetualRequest, QueryPerpetualResponse, QueryAllPerpetualsRequest, QueryAllPerpetualsResponse, QueryPremiumVotesRequest, QueryPremiumVotesResponse, QueryPremiumSamplesRequest, QueryPremiumSamplesResponse, QueryParamsRequest, QueryParamsResponse } from "./query";
import { QueryPerpetualRequest, QueryPerpetualResponse, QueryAllPerpetualsRequest, QueryAllPerpetualsResponse, QueryAllLiquidityTiersRequest, QueryAllLiquidityTiersResponse, QueryPremiumVotesRequest, QueryPremiumVotesResponse, QueryPremiumSamplesRequest, QueryPremiumSamplesResponse, QueryParamsRequest, QueryParamsResponse } from "./query";
/** Query defines the gRPC querier service. */

export interface Query {
Expand All @@ -10,6 +10,9 @@ export interface Query {
/** Queries a list of Perpetual items. */

allPerpetuals(request?: QueryAllPerpetualsRequest): Promise<QueryAllPerpetualsResponse>;
/** Queries a list of LiquidityTiers. */

allLiquidityTiers(request?: QueryAllLiquidityTiersRequest): Promise<QueryAllLiquidityTiersResponse>;
/** Queries a list of premium votes. */

premiumVotes(request?: QueryPremiumVotesRequest): Promise<QueryPremiumVotesResponse>;
Expand All @@ -27,6 +30,7 @@ export class QueryClientImpl implements Query {
this.rpc = rpc;
this.perpetual = this.perpetual.bind(this);
this.allPerpetuals = this.allPerpetuals.bind(this);
this.allLiquidityTiers = this.allLiquidityTiers.bind(this);
this.premiumVotes = this.premiumVotes.bind(this);
this.premiumSamples = this.premiumSamples.bind(this);
this.params = this.params.bind(this);
Expand All @@ -46,6 +50,14 @@ export class QueryClientImpl implements Query {
return promise.then(data => QueryAllPerpetualsResponse.decode(new _m0.Reader(data)));
}

allLiquidityTiers(request: QueryAllLiquidityTiersRequest = {
pagination: undefined
}): Promise<QueryAllLiquidityTiersResponse> {
const data = QueryAllLiquidityTiersRequest.encode(request).finish();
const promise = this.rpc.request("dydxprotocol.perpetuals.Query", "AllLiquidityTiers", data);
return promise.then(data => QueryAllLiquidityTiersResponse.decode(new _m0.Reader(data)));
}

premiumVotes(request: QueryPremiumVotesRequest = {}): Promise<QueryPremiumVotesResponse> {
const data = QueryPremiumVotesRequest.encode(request).finish();
const promise = this.rpc.request("dydxprotocol.perpetuals.Query", "PremiumVotes", data);
Expand Down Expand Up @@ -77,6 +89,10 @@ export const createRpcQueryExtension = (base: QueryClient) => {
return queryService.allPerpetuals(request);
},

allLiquidityTiers(request?: QueryAllLiquidityTiersRequest): Promise<QueryAllLiquidityTiersResponse> {
return queryService.allLiquidityTiers(request);
},

premiumVotes(request?: QueryPremiumVotesRequest): Promise<QueryPremiumVotesResponse> {
return queryService.premiumVotes(request);
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { PageRequest, PageRequestSDKType, PageResponse, PageResponseSDKType } from "../../cosmos/base/query/v1beta1/pagination";
import { Perpetual, PerpetualSDKType, PremiumStore, PremiumStoreSDKType } from "./perpetual";
import { Perpetual, PerpetualSDKType, LiquidityTier, LiquidityTierSDKType, PremiumStore, PremiumStoreSDKType } from "./perpetual";
import { Params, ParamsSDKType } from "./params";
import * as _m0 from "protobufjs/minimal";
import { DeepPartial } from "../../helpers";
Expand Down Expand Up @@ -47,6 +47,34 @@ export interface QueryAllPerpetualsResponseSDKType {
perpetual: PerpetualSDKType[];
pagination?: PageResponseSDKType;
}
/** Queries a list of LiquidityTier items. */

export interface QueryAllLiquidityTiersRequest {
pagination?: PageRequest;
}
/** Queries a list of LiquidityTier items. */

export interface QueryAllLiquidityTiersRequestSDKType {
pagination?: PageRequestSDKType;
}
/**
* QueryAllLiquidityTiersResponse is response type for the AllLiquidityTiers RPC
* method.
*/

export interface QueryAllLiquidityTiersResponse {
liquidityTiers: LiquidityTier[];
pagination?: PageResponse;
}
/**
* QueryAllLiquidityTiersResponse is response type for the AllLiquidityTiers RPC
* method.
*/

export interface QueryAllLiquidityTiersResponseSDKType {
liquidity_tiers: LiquidityTierSDKType[];
pagination?: PageResponseSDKType;
}
/** QueryPremiumVotesRequest is the request type for the PremiumVotes RPC method. */

export interface QueryPremiumVotesRequest {}
Expand Down Expand Up @@ -304,6 +332,106 @@ export const QueryAllPerpetualsResponse = {

};

function createBaseQueryAllLiquidityTiersRequest(): QueryAllLiquidityTiersRequest {
return {
pagination: undefined
};
}

export const QueryAllLiquidityTiersRequest = {
encode(message: QueryAllLiquidityTiersRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
if (message.pagination !== undefined) {
PageRequest.encode(message.pagination, writer.uint32(10).fork()).ldelim();
}

return writer;
},

decode(input: _m0.Reader | Uint8Array, length?: number): QueryAllLiquidityTiersRequest {
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseQueryAllLiquidityTiersRequest();

while (reader.pos < end) {
const tag = reader.uint32();

switch (tag >>> 3) {
case 1:
message.pagination = PageRequest.decode(reader, reader.uint32());
break;

default:
reader.skipType(tag & 7);
break;
}
}

return message;
},

fromPartial(object: DeepPartial<QueryAllLiquidityTiersRequest>): QueryAllLiquidityTiersRequest {
const message = createBaseQueryAllLiquidityTiersRequest();
message.pagination = object.pagination !== undefined && object.pagination !== null ? PageRequest.fromPartial(object.pagination) : undefined;
return message;
}

};

function createBaseQueryAllLiquidityTiersResponse(): QueryAllLiquidityTiersResponse {
return {
liquidityTiers: [],
pagination: undefined
};
}

export const QueryAllLiquidityTiersResponse = {
encode(message: QueryAllLiquidityTiersResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
for (const v of message.liquidityTiers) {
LiquidityTier.encode(v!, writer.uint32(10).fork()).ldelim();
}

if (message.pagination !== undefined) {
PageResponse.encode(message.pagination, writer.uint32(18).fork()).ldelim();
}

return writer;
},

decode(input: _m0.Reader | Uint8Array, length?: number): QueryAllLiquidityTiersResponse {
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseQueryAllLiquidityTiersResponse();

while (reader.pos < end) {
const tag = reader.uint32();

switch (tag >>> 3) {
case 1:
message.liquidityTiers.push(LiquidityTier.decode(reader, reader.uint32()));
break;

case 2:
message.pagination = PageResponse.decode(reader, reader.uint32());
break;

default:
reader.skipType(tag & 7);
break;
}
}

return message;
},

fromPartial(object: DeepPartial<QueryAllLiquidityTiersResponse>): QueryAllLiquidityTiersResponse {
const message = createBaseQueryAllLiquidityTiersResponse();
message.liquidityTiers = object.liquidityTiers?.map(e => LiquidityTier.fromPartial(e)) || [];
message.pagination = object.pagination !== undefined && object.pagination !== null ? PageResponse.fromPartial(object.pagination) : undefined;
return message;
}

};

function createBaseQueryPremiumVotesRequest(): QueryPremiumVotesRequest {
return {};
}
Expand Down
18 changes: 18 additions & 0 deletions proto/dydxprotocol/perpetuals/query.proto
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ service Query {
option (google.api.http).get = "/dydxprotocol/perpetuals/perpetual";
}

// Queries a list of LiquidityTiers.
rpc AllLiquidityTiers(QueryAllLiquidityTiersRequest)
returns (QueryAllLiquidityTiersResponse) {
option (google.api.http).get = "/dydxprotocol/perpetuals/liquidity_tiers";
}

// Queries a list of premium votes.
rpc PremiumVotes(QueryPremiumVotesRequest)
returns (QueryPremiumVotesResponse) {
Expand Down Expand Up @@ -59,6 +65,18 @@ message QueryAllPerpetualsResponse {
cosmos.base.query.v1beta1.PageResponse pagination = 2;
}

// Queries a list of LiquidityTier items.
message QueryAllLiquidityTiersRequest {
cosmos.base.query.v1beta1.PageRequest pagination = 1;
}

// QueryAllLiquidityTiersResponse is response type for the AllLiquidityTiers RPC
// method.
message QueryAllLiquidityTiersResponse {
repeated LiquidityTier liquidity_tiers = 1 [ (gogoproto.nullable) = false ];
cosmos.base.query.v1beta1.PageResponse pagination = 2;
}

// QueryPremiumVotesRequest is the request type for the PremiumVotes RPC method.
message QueryPremiumVotesRequest {}

Expand Down
46 changes: 46 additions & 0 deletions protocol/x/perpetuals/keeper/grpc_query_liquidity_tiers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package keeper

import (
"context"

"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/query"
"github.com/dydxprotocol/v4-chain/protocol/x/perpetuals/types"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)

func (k Keeper) AllLiquidityTiers(
c context.Context,
req *types.QueryAllLiquidityTiersRequest,
) (*types.QueryAllLiquidityTiersResponse, error) {
if req == nil {
return nil, status.Error(codes.InvalidArgument, "invalid request")
}

ctx := sdk.UnwrapSDKContext(c)
var liquidityTiers []types.LiquidityTier

store := ctx.KVStore(k.storeKey)
liquidityTierStore := prefix.NewStore(store, []byte(types.LiquidityTierKeyPrefix))

pageRes, err := query.Paginate(liquidityTierStore, req.Pagination, func(key []byte, value []byte) error {
var liquidityTier types.LiquidityTier
if err := k.cdc.Unmarshal(value, &liquidityTier); err != nil {
return err
}

liquidityTiers = append(liquidityTiers, liquidityTier)
return nil
})

if err != nil {
return nil, status.Error(codes.Internal, err.Error())
}

return &types.QueryAllLiquidityTiersResponse{
LiquidityTiers: liquidityTiers,
Pagination: pageRes,
}, nil
}
47 changes: 47 additions & 0 deletions protocol/x/perpetuals/keeper/grpc_query_liquidity_tiers_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package keeper_test

import (
"testing"

abci "github.com/cometbft/cometbft/abci/types"
"github.com/cometbft/cometbft/types"
"github.com/cosmos/cosmos-sdk/types/query"
testapp "github.com/dydxprotocol/v4-chain/protocol/testutil/app"
"github.com/dydxprotocol/v4-chain/protocol/testutil/constants"
perptypes "github.com/dydxprotocol/v4-chain/protocol/x/perpetuals/types"
"github.com/stretchr/testify/require"
)

func TestAllLiquidityTiers(
t *testing.T,
) {
tApp := testapp.NewTestAppBuilder(t).
WithGenesisDocFn(func() types.GenesisDoc {
genesis := testapp.DefaultGenesis()
testapp.UpdateGenesisDocWithAppStateForModule(&genesis, func(state *perptypes.GenesisState) {
state.LiquidityTiers = constants.LiquidityTiers
})
return genesis
}).Build()

tApp.InitChain()

request := perptypes.QueryAllLiquidityTiersRequest{}
abciResponse := tApp.App.Query(abci.RequestQuery{
Path: "/dydxprotocol.perpetuals.Query/AllLiquidityTiers",
Data: tApp.App.AppCodec().MustMarshal(&request),
})
require.True(t, abciResponse.IsOK())

var actual perptypes.QueryAllLiquidityTiersResponse
tApp.App.AppCodec().MustUnmarshal(abciResponse.Value, &actual)

expected := perptypes.QueryAllLiquidityTiersResponse{
LiquidityTiers: constants.LiquidityTiers,
Pagination: &query.PageResponse{
NextKey: nil,
Total: uint64(len(constants.LiquidityTiers)),
},
}
require.Equal(t, expected, actual)
}
Loading

0 comments on commit af8b6a4

Please sign in to comment.