Skip to content

Commit

Permalink
[Perpetual] net open interest was added (#804)
Browse files Browse the repository at this point in the history
* net open interest was added

* test was fixed

* logic was migrated to query

* logic was migrated to query

* logic was migrated to query

* test was fixed
  • Loading branch information
fenriz07 authored Sep 20, 2024
1 parent aa9ced8 commit 2dff667
Show file tree
Hide file tree
Showing 7 changed files with 821 additions and 116 deletions.
30 changes: 28 additions & 2 deletions proto/elys/perpetual/query.proto
Original file line number Diff line number Diff line change
Expand Up @@ -156,15 +156,15 @@ message QueryGetPoolRequest {
}

message QueryGetPoolResponse {
Pool pool = 1 [(gogoproto.nullable) = false];
PoolResponse pool = 1 [(gogoproto.nullable) = false];
}

message QueryAllPoolRequest {
cosmos.base.query.v1beta1.PageRequest pagination = 1;
}

message QueryAllPoolResponse {
repeated Pool pool = 1 [(gogoproto.nullable) = false];
repeated PoolResponse pool = 1 [(gogoproto.nullable) = false];
cosmos.base.query.v1beta1.PageResponse pagination = 2;
}

Expand Down Expand Up @@ -215,3 +215,29 @@ message QueryGetAllToPayResponse {
repeated ToPay to_pay = 1;
}

message PoolResponse {
uint64 amm_pool_id = 1;
string health = 2 [
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
(gogoproto.nullable) = false
];
bool enabled = 3;
bool closed = 4;
string borrow_interest_rate = 5 [
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
(gogoproto.nullable) = false
];
repeated PoolAsset pool_assets_long = 6 [(gogoproto.nullable) = false];
repeated PoolAsset pool_assets_short = 7 [(gogoproto.nullable) = false];
int64 last_height_borrow_interest_rate_computed = 8;
// funding rate, if positive longs pay shorts, if negative shorts pay longs
string funding_rate = 9 [
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
(gogoproto.nullable) = false
];
string net_open_interest = 10 [
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
(gogoproto.nullable) = false
];
}

20 changes: 18 additions & 2 deletions x/perpetual/client/cli/query_pool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/elys-network/elys/testutil/network"
"github.com/elys-network/elys/testutil/nullify"
"github.com/elys-network/elys/x/perpetual/client/cli"
Expand All @@ -32,7 +33,22 @@ func networkWithPoolObjects(t *testing.T, n int) (*network.Network, []types.Pool
}

func TestShowPool(t *testing.T) {
net, objs := networkWithPoolObjects(t, 2)
net, objspool := networkWithPoolObjects(t, 2)

objs := make([]types.PoolResponse, len(objspool))

for k, v := range objspool {
objs[k].AmmPoolId = v.AmmPoolId
objs[k].BorrowInterestRate = v.BorrowInterestRate
objs[k].Health = v.Health
objs[k].Closed = v.Closed
objs[k].Enabled = v.Enabled
objs[k].FundingRate = v.FundingRate
objs[k].LastHeightBorrowInterestRateComputed = v.LastHeightBorrowInterestRateComputed
objs[k].PoolAssetsLong = v.PoolAssetsLong
objs[k].PoolAssetsShort = v.PoolAssetsShort
objs[k].NetOpenInterest = sdk.ZeroInt()
}

ctx := net.Validators[0].ClientCtx
common := []string{
Expand All @@ -44,7 +60,7 @@ func TestShowPool(t *testing.T) {

args []string
err error
obj types.Pool
obj types.PoolResponse
}{
{
desc: "found",
Expand Down
23 changes: 23 additions & 0 deletions x/perpetual/keeper/get_net_open_interest.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package keeper

import (
"cosmossdk.io/math"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/elys-network/elys/x/perpetual/types"
)

func (k Keeper) GetNetOpenInterest(pool types.Pool) math.Int {
assetLiabilitiesLong := sdk.ZeroInt()
assetLiabilitiesShort := sdk.ZeroInt()

for _, asset := range pool.PoolAssetsLong {
assetLiabilitiesLong = assetLiabilitiesLong.Add(asset.Liabilities)
}

for _, asset := range pool.PoolAssetsShort {
assetLiabilitiesShort = assetLiabilitiesShort.Add(asset.Liabilities)
}

netOpenInterest := assetLiabilitiesLong.Sub(assetLiabilitiesShort)
return netOpenInterest
}
21 changes: 21 additions & 0 deletions x/perpetual/keeper/pool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,27 @@ func createNPool(keeper *keeper.Keeper, ctx sdk.Context, n int) []types.Pool {
return items
}

func createNPoolResponse(keeper *keeper.Keeper, ctx sdk.Context, n int) []types.PoolResponse {
items := make([]types.PoolResponse, n)
for i := range items {
items[i] = types.PoolResponse{
AmmPoolId: uint64(i),
Health: sdk.NewDec(100),
Enabled: true,
Closed: false,
BorrowInterestRate: sdk.MustNewDecFromStr("0.000000000000000001"),
PoolAssetsLong: []types.PoolAsset{},
PoolAssetsShort: []types.PoolAsset{},
LastHeightBorrowInterestRateComputed: 0,
FundingRate: sdk.ZeroDec(),
NetOpenInterest: sdk.ZeroInt(),
}

keeper.SetPool(ctx, types.NewPool(uint64(i)))
}
return items
}

func TestPoolGet(t *testing.T) {
keeper, ctx := keepertest.PerpetualKeeper(t)
items := createNPool(keeper, ctx, 10)
Expand Down
30 changes: 27 additions & 3 deletions x/perpetual/keeper/query_pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ func (k Keeper) Pools(goCtx context.Context, req *types.QueryAllPoolRequest) (*t
return nil, status.Error(codes.InvalidArgument, "invalid request")
}

var pools []types.Pool
var pools []types.PoolResponse
ctx := sdk.UnwrapSDKContext(goCtx)

store := ctx.KVStore(k.storeKey)
Expand All @@ -34,7 +34,18 @@ func (k Keeper) Pools(goCtx context.Context, req *types.QueryAllPoolRequest) (*t
}

if ammPool.PoolParams.UseOracle {
pools = append(pools, pool)
pools = append(pools, types.PoolResponse{
AmmPoolId: pool.AmmPoolId,
Health: pool.Health,
Enabled: pool.Enabled,
Closed: pool.Closed,
BorrowInterestRate: pool.BorrowInterestRate,
PoolAssetsLong: pool.PoolAssetsLong,
PoolAssetsShort: pool.PoolAssetsShort,
LastHeightBorrowInterestRateComputed: pool.LastHeightBorrowInterestRateComputed,
FundingRate: pool.FundingRate,
NetOpenInterest: k.GetNetOpenInterest(pool),
})
}

return nil
Expand All @@ -60,5 +71,18 @@ func (k Keeper) Pool(goCtx context.Context, req *types.QueryGetPoolRequest) (*ty
return nil, status.Error(codes.NotFound, "not found")
}

return &types.QueryGetPoolResponse{Pool: val}, nil
pool := types.PoolResponse{
AmmPoolId: val.AmmPoolId,
Health: val.Health,
Enabled: val.Enabled,
Closed: val.Closed,
BorrowInterestRate: val.BorrowInterestRate,
PoolAssetsLong: val.PoolAssetsLong,
PoolAssetsShort: val.PoolAssetsShort,
LastHeightBorrowInterestRateComputed: val.LastHeightBorrowInterestRateComputed,
FundingRate: val.FundingRate,
NetOpenInterest: k.GetNetOpenInterest(val),
}

return &types.QueryGetPoolResponse{Pool: pool}, nil
}
2 changes: 1 addition & 1 deletion x/perpetual/keeper/query_pool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ func TestPools_Success(t *testing.T) {
func TestPoolQuerySingle(t *testing.T) {
keeper, ctx := keepertest.PerpetualKeeper(t)
wctx := sdk.WrapSDKContext(ctx)
msgs := createNPool(keeper, ctx, 2)
msgs := createNPoolResponse(keeper, ctx, 2)
tests := []struct {
desc string
request *types.QueryGetPoolRequest
Expand Down
Loading

0 comments on commit 2dff667

Please sign in to comment.