From f45acfbd777d0217382d9e52fa721a4cdc1e626d Mon Sep 17 00:00:00 2001 From: AgentSmithMatrix <98403347+AgentSmithMatrix@users.noreply.github.com> Date: Sat, 28 May 2022 13:04:53 -0400 Subject: [PATCH] Combine assetpair and tokenpair (#504) * fix linter * Add newline to satisfy linter Co-authored-by: Walter White --- x/common/common.go | 48 ++++--- x/common/common_test.go | 12 +- x/perp/client/cli/cli_test.go | 15 ++- x/perp/client/cli/query.go | 2 +- x/perp/client/cli/tx.go | 2 +- x/perp/keeper/calc.go | 6 +- x/perp/keeper/calc_test.go | 18 +-- x/perp/keeper/calc_unit_test.go | 26 +++- x/perp/keeper/clearing_house.go | 24 ++-- x/perp/keeper/clearing_house_test.go | 180 +++++++++++++------------ x/perp/keeper/grpc_query.go | 8 +- x/perp/keeper/grpc_query_test.go | 2 +- x/perp/keeper/liquidate.go | 10 +- x/perp/keeper/liquidate_test.go | 23 ++-- x/perp/keeper/liquidate_unit_test.go | 25 ++-- x/perp/keeper/margin.go | 6 +- x/perp/keeper/margin_test.go | 60 +++++---- x/perp/keeper/margin_unit_test.go | 17 ++- x/perp/keeper/msg_server.go | 2 +- x/perp/keeper/perp.go | 8 +- x/perp/keeper/perp_test.go | 10 +- x/perp/keeper/perp_unit_test.go | 6 +- x/perp/keeper/state.go | 12 +- x/perp/types/expected_keepers.go | 24 ++-- x/perp/types/msgs.go | 4 +- x/perp/types/state.go | 12 ++ x/perp/types/types.go | 2 +- x/pricefeed/client/cli/query.go | 2 +- x/testutil/cli/query.go | 8 +- x/testutil/mock/perp_interfaces.go | 31 +++-- x/vpool/client/cli/query.go | 2 +- x/vpool/genesis.go | 2 +- x/vpool/genesis_test.go | 3 +- x/vpool/keeper/get_settlement_price.go | 2 +- x/vpool/keeper/keeper.go | 17 ++- x/vpool/keeper/keeper_test.go | 36 ++--- x/vpool/keeper/pool_state.go | 14 +- x/vpool/keeper/pool_state_test.go | 11 +- x/vpool/keeper/prices.go | 14 +- x/vpool/keeper/prices_test.go | 52 +++---- x/vpool/keeper/query_server.go | 2 +- x/vpool/keeper/query_server_test.go | 2 +- x/vpool/keeper/snapshot.go | 18 +-- x/vpool/keeper/snapshot_test.go | 34 ++--- x/vpool/keeper/util_test.go | 14 +- x/vpool/types/keys.go | 12 +- x/vpool/types/pool.go | 15 ++- x/vpool/types/pool_test.go | 22 ++- x/vpool/types/vpool.pb.go | 11 +- 49 files changed, 498 insertions(+), 390 deletions(-) create mode 100644 x/perp/types/state.go diff --git a/x/common/common.go b/x/common/common.go index 968928e2a..df4558fc9 100644 --- a/x/common/common.go +++ b/x/common/common.go @@ -23,6 +23,19 @@ var ( ErrInvalidTokenPair = fmt.Errorf("invalid token pair") ) +func NewAssetPairFromStr(pair string) (AssetPair, error) { + split := strings.Split(pair, PairSeparator) + if len(split) != 2 { + return AssetPair{}, ErrInvalidTokenPair + } + + if split[0] == "" || split[1] == "" { + return AssetPair{}, ErrInvalidTokenPair + } + + return AssetPair{Token0: split[0], Token1: split[1]}, nil +} + type AssetPair struct { Token0 string Token1 string @@ -38,7 +51,7 @@ func (pair AssetPair) PairID() string { } func (pair AssetPair) String() string { - return fmt.Sprintf("%s:%s", pair.Token0, pair.Token1) + return fmt.Sprintf("%s%s%s", pair.Token0, PairSeparator, pair.Token1) } func (pair AssetPair) IsProperOrder() bool { @@ -57,6 +70,14 @@ func (pair AssetPair) Proper() AssetPair { } } +func (pair AssetPair) GetBaseTokenDenom() string { + return pair.Token0 +} + +func (pair AssetPair) GetQuoteTokenDenom() string { + return pair.Token1 +} + func DenomsFromPoolName(pool string) (denoms []string) { return strings.Split(pool, ":") } @@ -73,31 +94,8 @@ func RawPoolNameFromDenoms(denoms []string) string { poolName := denoms[0] for idx, denom := range denoms { if idx != 0 { - poolName += fmt.Sprintf(":%s", denom) + poolName += fmt.Sprintf("%s%s", PairSeparator, denom) } } return poolName } - -type TokenPair string - -func NewTokenPairFromStr(pair string) (TokenPair, error) { - split := strings.Split(pair, PairSeparator) - if len(split) != 2 { - return "", ErrInvalidTokenPair - } - - return TokenPair(pair), nil -} - -func (p TokenPair) GetBaseTokenDenom() string { - return strings.Split(string(p), ":")[0] -} - -func (p TokenPair) GetQuoteTokenDenom() string { - return strings.Split(string(p), ":")[1] -} - -func (p TokenPair) String() string { - return string(p) -} diff --git a/x/common/common_test.go b/x/common/common_test.go index dfec875fc..fa483f6e5 100644 --- a/x/common/common_test.go +++ b/x/common/common_test.go @@ -54,12 +54,12 @@ func TestAssetPair(t *testing.T) { }{ { name: "proper and improper order pairs are inverses-1", - pair: common.AssetPair{"atom", "osmo"}, + pair: common.AssetPair{Token0: "atom", Token1: "osmo"}, proper: true, }, { name: "proper and improper order pairs are inverses-2", - pair: common.AssetPair{"osmo", "atom"}, + pair: common.AssetPair{Token0: "osmo", Token1: "atom"}, proper: false, }, } @@ -80,7 +80,7 @@ func TestAssetPair(t *testing.T) { } } -func TestPair_Constructor(t *testing.T) { +func TestAsset_Constructor(t *testing.T) { tests := []struct { name string tokenPair string @@ -112,7 +112,7 @@ func TestPair_Constructor(t *testing.T) { for _, tc := range tests { tc := tc t.Run(tc.name, func(t *testing.T) { - _, err := common.NewTokenPairFromStr(tc.tokenPair) + _, err := common.NewAssetPairFromStr(tc.tokenPair) if tc.err != nil { require.Equal(t, tc.err, err) } else { @@ -122,8 +122,8 @@ func TestPair_Constructor(t *testing.T) { } } -func TestPair_GetBaseToken(t *testing.T) { - pair, err := common.NewTokenPairFromStr("uatom:unibi") +func TestAsset_GetQuoteBaseToken(t *testing.T) { + pair, err := common.NewAssetPairFromStr("uatom:unibi") require.NoError(t, err) require.Equal(t, "uatom", pair.GetBaseTokenDenom()) diff --git a/x/perp/client/cli/cli_test.go b/x/perp/client/cli/cli_test.go index ab500e8ee..f2e34b5fe 100644 --- a/x/perp/client/cli/cli_test.go +++ b/x/perp/client/cli/cli_test.go @@ -85,7 +85,10 @@ func (s *IntegrationTestSuite) TearDownSuite() { func (s *IntegrationTestSuite) TestOpenPositionCmd() { val := s.network.Validators[0] - pair := fmt.Sprintf("%s%s%s", "ubtc", common.PairSeparator, "unibi") + pair := common.AssetPair{ + Token0: "ubtc", + Token1: "unibi", + } info, _, err := val.ClientCtx.Keyring. NewMnemonic("user1", keyring.English, sdk.FullFundraiserPath, "", hd.Secp256k1) @@ -105,7 +108,7 @@ func (s *IntegrationTestSuite) TestOpenPositionCmd() { s.Require().NoError(err) // Check vpool balances - reserveAssets, err := testutilcli.QueryVpoolReserveAssets(val.ClientCtx, common.TokenPair(pair)) + reserveAssets, err := testutilcli.QueryVpoolReserveAssets(val.ClientCtx, pair) s.Require().NoError(err) s.Require().Equal(sdk.MustNewDecFromStr("10000000"), reserveAssets.BaseAssetReserve) s.Require().Equal(sdk.MustNewDecFromStr("60000000000"), reserveAssets.QuoteAssetReserve) @@ -125,23 +128,23 @@ func (s *IntegrationTestSuite) TestOpenPositionCmd() { fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10))).String()), } - _, err = testutilcli.QueryTraderPosition(val.ClientCtx, common.TokenPair(pair), user) + _, err = testutilcli.QueryTraderPosition(val.ClientCtx, pair, user) s.Require().True(strings.Contains(err.Error(), "no position found")) _, err = clitestutil.ExecTestCLICmd(val.ClientCtx, cli.OpenPositionCmd(), append(args, commonArgs...)) s.Require().NoError(err) // Check vpool after opening position - reserveAssets, err = testutilcli.QueryVpoolReserveAssets(val.ClientCtx, "ubtc:unibi") + reserveAssets, err = testutilcli.QueryVpoolReserveAssets(val.ClientCtx, pair) s.Require().NoError(err) s.Require().Equal(sdk.MustNewDecFromStr("9999833.336111064815586407"), reserveAssets.BaseAssetReserve) s.Require().Equal(sdk.MustNewDecFromStr("60001000000"), reserveAssets.QuoteAssetReserve) // Check position - queryResp, err := testutilcli.QueryTraderPosition(val.ClientCtx, common.TokenPair(pair), user) + queryResp, err := testutilcli.QueryTraderPosition(val.ClientCtx, pair, user) s.Require().NoError(err) s.Require().Equal(user, queryResp.Position.TraderAddress) - s.Require().Equal(pair, queryResp.Position.Pair) + s.Require().Equal(pair.String(), queryResp.Position.Pair) s.Require().Equal(sdk.MustNewDecFromStr("1000000"), queryResp.Position.Margin) s.Require().Equal(sdk.MustNewDecFromStr("1000000"), queryResp.Position.OpenNotional) } diff --git a/x/perp/client/cli/query.go b/x/perp/client/cli/query.go index abd25085f..c6ee5b9ee 100644 --- a/x/perp/client/cli/query.go +++ b/x/perp/client/cli/query.go @@ -83,7 +83,7 @@ func CmdQueryPosition() *cobra.Command { return fmt.Errorf("invalid trader address: %w", err) } - tokenPair, err := common.NewTokenPairFromStr(args[1]) + tokenPair, err := common.NewAssetPairFromStr(args[1]) if err != nil { return err } diff --git a/x/perp/client/cli/tx.go b/x/perp/client/cli/tx.go index 43da4316a..481c1c02f 100644 --- a/x/perp/client/cli/tx.go +++ b/x/perp/client/cli/tx.go @@ -58,7 +58,7 @@ func OpenPositionCmd() *cobra.Command { return fmt.Errorf("invalid side: %s", args[0]) } - _, err = common.NewTokenPairFromStr(args[1]) + _, err = common.NewAssetPairFromStr(args[1]) if err != nil { return err } diff --git a/x/perp/keeper/calc.go b/x/perp/keeper/calc.go index 0b99cc008..0cfef294c 100644 --- a/x/perp/keeper/calc.go +++ b/x/perp/keeper/calc.go @@ -37,7 +37,7 @@ func (k Keeper) CalcRemainMarginWithFundingPayment( marginDelta sdk.Dec, ) (remaining RemainingMarginWithFundingPayment, err error) { remaining.LatestCumulativePremiumFraction, err = k. - getLatestCumulativePremiumFraction(ctx, common.TokenPair(currentPosition.Pair)) + getLatestCumulativePremiumFraction(ctx, currentPosition.GetAssetPair()) if err != nil { return remaining, err } @@ -85,9 +85,9 @@ position without making it go underwater. func (k Keeper) calcFreeCollateral( ctx sdk.Context, pos types.Position, fundingPayment sdk.Dec, ) (accountExcessEquity sdk.Int, err error) { - pair, err := common.NewTokenPairFromStr(pos.Pair) + pair, err := common.NewAssetPairFromStr(pos.Pair) if err != nil { - return sdk.Int{}, err + return sdk.Int{}, common.ErrInvalidTokenPair } err = k.requireVpool(ctx, pair) if err != nil { diff --git a/x/perp/keeper/calc_test.go b/x/perp/keeper/calc_test.go index 866bd024f..0f9360930 100644 --- a/x/perp/keeper/calc_test.go +++ b/x/perp/keeper/calc_test.go @@ -39,10 +39,10 @@ func TestCalcRemainMarginWithFundingPayment(t *testing.T) { the3pool := "dai:usdc:usdt" marginDelta := sdk.OneDec() - _, err := nibiruApp.PerpKeeper.CalcRemainMarginWithFundingPayment( - ctx, types.Position{Pair: the3pool}, marginDelta) - require.Error(t, err) - require.ErrorContains(t, err, types.ErrPairMetadataNotFound.Error()) + require.Panics(t, func() { + _, _ = nibiruApp.PerpKeeper.CalcRemainMarginWithFundingPayment( + ctx, types.Position{Pair: the3pool}, marginDelta) + }) }, }, { @@ -51,13 +51,14 @@ func TestCalcRemainMarginWithFundingPayment(t *testing.T) { t.Log("Setup Nibiru app, pair, and trader") nibiruApp, ctx := testutil.NewNibiruApp(true) alice := sample.AccAddress() - pair := common.TokenPair("osmo:nusd") + pair, err := common.NewAssetPairFromStr("osmo:nusd") + require.NoError(t, err) t.Log("Set vpool defined by pair on VpoolKeeper") vpoolKeeper := &nibiruApp.VpoolKeeper vpoolKeeper.CreatePool( ctx, - pair.String(), + pair, sdk.MustNewDecFromStr("0.9"), // 0.9 ratio /* y */ sdk.NewDec(1_000_000), // /* x */ sdk.NewDec(1_000_000), // @@ -100,13 +101,14 @@ func TestCalcRemainMarginWithFundingPayment(t *testing.T) { t.Log("Setup Nibiru app, pair, and trader") nibiruApp, ctx := testutil.NewNibiruApp(true) alice := sample.AccAddress() - pair := common.TokenPair("osmo:nusd") + pair, err := common.NewAssetPairFromStr("osmo:nusd") + require.NoError(t, err) t.Log("Set vpool defined by pair on VpoolKeeper") vpoolKeeper := &nibiruApp.VpoolKeeper vpoolKeeper.CreatePool( ctx, - pair.String(), + pair, sdk.MustNewDecFromStr("0.9"), // 0.9 ratio /* y */ sdk.NewDec(1_000_000), // /* x */ sdk.NewDec(1_000_000), // diff --git a/x/perp/keeper/calc_unit_test.go b/x/perp/keeper/calc_unit_test.go index 178b48e61..21fe88901 100644 --- a/x/perp/keeper/calc_unit_test.go +++ b/x/perp/keeper/calc_unit_test.go @@ -21,9 +21,11 @@ func Test_calcFreeCollateral(t *testing.T) { test: func() { k, _, ctx := getKeeper(t) fundingPayment := sdk.ZeroDec() - the3pool := "dai:usdc:usdt" alice := sample.AccAddress() - pos := types.ZeroPosition(ctx, common.TokenPair(the3pool), alice) + pos := types.ZeroPosition(ctx, common.AssetPair{ + Token0: "", + Token1: "", + }, alice) _, err := k.calcFreeCollateral(ctx, *pos, fundingPayment) assert.Error(t, err) assert.ErrorContains(t, err, common.ErrInvalidTokenPair.Error()) @@ -35,7 +37,10 @@ func Test_calcFreeCollateral(t *testing.T) { k, mocks, ctx := getKeeper(t) fundingPayment := sdk.ZeroDec() - validPair := common.TokenPair("xxx:yyy") + validPair := common.AssetPair{ + Token0: "xxx", + Token1: "yyy", + } alice := sample.AccAddress() pos := types.ZeroPosition(ctx, validPair, alice) mocks.mockVpoolKeeper.EXPECT().ExistsPool(ctx, validPair). @@ -51,7 +56,10 @@ func Test_calcFreeCollateral(t *testing.T) { k, mocks, ctx := getKeeper(t) fundingPayment := sdk.ZeroDec() - validPair := common.TokenPair("xxx:yyy") + validPair := common.AssetPair{ + Token0: "xxx", + Token1: "yyy", + } alice := sample.AccAddress() pos := types.ZeroPosition(ctx, validPair, alice) mocks.mockVpoolKeeper.EXPECT().ExistsPool(ctx, validPair). @@ -67,7 +75,10 @@ func Test_calcFreeCollateral(t *testing.T) { k, mocks, ctx := getKeeper(t) fundingPayment := sdk.NewDec(10) - validPair := common.TokenPair("xxx:yyy") + validPair := common.AssetPair{ + Token0: "xxx", + Token1: "yyy", + } alice := sample.AccAddress() pos := types.ZeroPosition(ctx, validPair, alice) mocks.mockVpoolKeeper.EXPECT().ExistsPool(ctx, validPair). @@ -83,7 +94,10 @@ func Test_calcFreeCollateral(t *testing.T) { k, mocks, ctx := getKeeper(t) fundingPayment := sdk.NewDec(-100) - validPair := common.TokenPair("xxx:yyy") + validPair := common.AssetPair{ + Token0: "xxx", + Token1: "yyy", + } alice := sample.AccAddress() pos := types.ZeroPosition(ctx, validPair, alice) mocks.mockVpoolKeeper.EXPECT().ExistsPool(ctx, validPair). diff --git a/x/perp/keeper/clearing_house.go b/x/perp/keeper/clearing_house.go index 8abe13af9..180d0a883 100644 --- a/x/perp/keeper/clearing_house.go +++ b/x/perp/keeper/clearing_house.go @@ -16,7 +16,7 @@ import ( // TODO test: OpenPosition | https://github.com/NibiruChain/nibiru/issues/299 func (k Keeper) OpenPosition( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, side types.Side, traderAddr sdk.AccAddress, quoteAssetAmount sdk.Int, @@ -189,7 +189,7 @@ func (k Keeper) increasePosition( positionResp.ExchangedPositionSize, err = k.swapQuoteForBase( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), side, increasedNotional, baseAssetAmountLimit, @@ -248,7 +248,7 @@ func (k Keeper) increasePosition( // getLatestCumulativePremiumFraction returns the last cumulative premium fraction recorded for the // specific pair. func (k Keeper) getLatestCumulativePremiumFraction( - ctx sdk.Context, pair common.TokenPair, + ctx sdk.Context, pair common.AssetPair, ) (sdk.Dec, error) { pairMetadata, err := k.PairMetadata().Get(ctx, pair) if err != nil { @@ -301,7 +301,7 @@ func (k Keeper) getPositionNotionalAndUnrealizedPnL( case types.PnLCalcOption_TWAP: positionNotional, err = k.VpoolKeeper.GetBaseAssetTWAP( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), baseAssetDirection, positionSizeAbs, /*lookbackInterval=*/ 15*time.Minute, @@ -313,7 +313,7 @@ func (k Keeper) getPositionNotionalAndUnrealizedPnL( case types.PnLCalcOption_SPOT_PRICE: positionNotional, err = k.VpoolKeeper.GetBaseAssetPrice( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), baseAssetDirection, positionSizeAbs, ) @@ -323,7 +323,7 @@ func (k Keeper) getPositionNotionalAndUnrealizedPnL( } case types.PnLCalcOption_ORACLE: oraclePrice, err := k.VpoolKeeper.GetUnderlyingPrice( - ctx, common.TokenPair(currentPosition.Pair)) + ctx, currentPosition.GetAssetPair()) if err != nil { k.Logger(ctx).Error(err.Error(), "calc_option", pnlCalcOption.String()) return sdk.ZeroDec(), sdk.ZeroDec(), err @@ -453,7 +453,7 @@ func (k Keeper) decreasePosition( positionResp.ExchangedPositionSize, err = k.swapQuoteForBase( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), sideToTake, decreasedNotional, baseAssetAmountLimit, @@ -585,7 +585,7 @@ func (k Keeper) closeAndOpenReversePosition( newPosition := types.ZeroPosition( ctx, - common.TokenPair(existingPosition.Pair), + existingPosition.GetAssetPair(), existingPosition.TraderAddress, ) increasePositionResp, err := k.increasePosition( @@ -684,7 +684,7 @@ func (k Keeper) closePositionEntirely( exchangedQuoteAssetAmount, err := k.VpoolKeeper.SwapBaseForQuote( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), baseAssetDirection, currentPosition.Size_.Abs(), quoteAssetAmountLimit, @@ -706,7 +706,7 @@ func (k Keeper) closePositionEntirely( if err = k.ClearPosition( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), currentPosition.TraderAddress, ); err != nil { return nil, err @@ -725,7 +725,7 @@ func (k Keeper) closePositionEntirely( // TODO test: transferFee | https://github.com/NibiruChain/nibiru/issues/299 func (k Keeper) transferFee( - ctx sdk.Context, pair common.TokenPair, trader sdk.AccAddress, + ctx sdk.Context, pair common.AssetPair, trader sdk.AccAddress, positionNotional sdk.Dec, ) (sdk.Int, error) { toll, spread, err := k.CalcPerpTxFee(ctx, positionNotional) @@ -845,7 +845,7 @@ ret: */ func (k Keeper) swapQuoteForBase( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, side types.Side, quoteAssetAmount sdk.Dec, baseAssetLimit sdk.Dec, diff --git a/x/perp/keeper/clearing_house_test.go b/x/perp/keeper/clearing_house_test.go index b803948d8..5110dbdd6 100644 --- a/x/perp/keeper/clearing_house_test.go +++ b/x/perp/keeper/clearing_house_test.go @@ -27,6 +27,11 @@ import ( vpooltypes "github.com/NibiruChain/nibiru/x/vpool/types" ) +var BtcNusdPair = common.AssetPair{ + Token0: "BTC", + Token1: "NUSD", +} + func TestKeeper_getLatestCumulativePremiumFraction(t *testing.T) { testCases := []struct { name string @@ -47,7 +52,7 @@ func TestKeeper_getLatestCumulativePremiumFraction(t *testing.T) { } keeper.PairMetadata().Set(ctx, metadata) - tokenPair, err := common.NewTokenPairFromStr(pair) + tokenPair, err := common.NewAssetPairFromStr(pair) require.NoError(t, err) latestCumulativePremiumFraction, err := keeper. getLatestCumulativePremiumFraction(ctx, tokenPair) @@ -60,7 +65,10 @@ func TestKeeper_getLatestCumulativePremiumFraction(t *testing.T) { name: "uninitialized vpool has no metadata | fail", test: func() { perpKeeper, _, ctx := getKeeper(t) - vpool := common.TokenPair("xxx:yyy") + vpool := common.AssetPair{ + Token0: "xxx", + Token1: "yyy", + } lcpf, err := perpKeeper.getLatestCumulativePremiumFraction( ctx, vpool) require.Error(t, err) @@ -168,7 +176,7 @@ func TestGetPositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, sdk.NewDec(10), ). @@ -204,7 +212,7 @@ func TestGetPositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, sdk.NewDec(10), ). @@ -240,7 +248,7 @@ func TestGetPositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetTWAP( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, sdk.NewDec(10), 15*time.Minute, @@ -277,7 +285,7 @@ func TestGetPositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetTWAP( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, sdk.NewDec(10), 15*time.Minute, @@ -314,7 +322,7 @@ func TestGetPositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetUnderlyingPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, ). Return(sdk.NewDec(2), nil) @@ -348,7 +356,7 @@ func TestGetPositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetUnderlyingPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, ). Return(sdk.MustNewDecFromStr("0.5"), nil) @@ -382,7 +390,7 @@ func TestGetPositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_REMOVE_FROM_POOL, sdk.NewDec(10), ). @@ -418,7 +426,7 @@ func TestGetPositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_REMOVE_FROM_POOL, sdk.NewDec(10), ). @@ -454,7 +462,7 @@ func TestGetPositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetTWAP( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_REMOVE_FROM_POOL, sdk.NewDec(10), 15*time.Minute, @@ -491,7 +499,7 @@ func TestGetPositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetTWAP( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_REMOVE_FROM_POOL, sdk.NewDec(10), 15*time.Minute, @@ -528,7 +536,7 @@ func TestGetPositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetUnderlyingPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, ). Return(sdk.MustNewDecFromStr("0.5"), nil) @@ -562,7 +570,7 @@ func TestGetPositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetUnderlyingPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, ). Return(sdk.NewDec(2), nil) @@ -602,7 +610,7 @@ func TestSwapQuoteAssetForBase(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, /*quoteAmount=*/ sdk.NewDec(10), /*baseLimit=*/ sdk.NewDec(1), @@ -610,7 +618,7 @@ func TestSwapQuoteAssetForBase(t *testing.T) { baseAmount, err := perpKeeper.swapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, types.Side_BUY, sdk.NewDec(10), sdk.NewDec(1), @@ -630,7 +638,7 @@ func TestSwapQuoteAssetForBase(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_REMOVE_FROM_POOL, /*quoteAmount=*/ sdk.NewDec(10), /*baseLimit=*/ sdk.NewDec(1), @@ -638,7 +646,7 @@ func TestSwapQuoteAssetForBase(t *testing.T) { baseAmount, err := perpKeeper.swapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, types.Side_SELL, sdk.NewDec(10), sdk.NewDec(1), @@ -685,7 +693,7 @@ func TestGetPreferencePositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, sdk.NewDec(10), ). @@ -694,7 +702,7 @@ func TestGetPreferencePositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetTWAP( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, sdk.NewDec(10), 15*time.Minute, @@ -731,7 +739,7 @@ func TestGetPreferencePositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, sdk.NewDec(10), ). @@ -740,7 +748,7 @@ func TestGetPreferencePositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetTWAP( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, sdk.NewDec(10), 15*time.Minute, @@ -777,7 +785,7 @@ func TestGetPreferencePositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, sdk.NewDec(10), ). @@ -786,7 +794,7 @@ func TestGetPreferencePositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetTWAP( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, sdk.NewDec(10), 15*time.Minute, @@ -823,7 +831,7 @@ func TestGetPreferencePositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, sdk.NewDec(10), ). @@ -832,7 +840,7 @@ func TestGetPreferencePositionNotionalAndUnrealizedPnl(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetTWAP( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, sdk.NewDec(10), 15*time.Minute, @@ -889,7 +897,7 @@ func TestIncreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_ADD_TO_POOL, /*quoteAssetAmount=*/ sdk.NewDec(100), /*baseAssetLimit=*/ sdk.NewDec(50), @@ -898,7 +906,7 @@ func TestIncreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -964,7 +972,7 @@ func TestIncreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_ADD_TO_POOL, /*quoteAssetAmount=*/ sdk.NewDec(100), /*baseAssetLimit=*/ sdk.NewDec(101), @@ -973,7 +981,7 @@ func TestIncreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -1042,7 +1050,7 @@ func TestIncreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_ADD_TO_POOL, /*quoteAssetAmount=*/ sdk.NewDec(100), /*baseAssetLimit=*/ sdk.NewDec(110), @@ -1051,7 +1059,7 @@ func TestIncreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(110), ). @@ -1119,7 +1127,7 @@ func TestIncreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_REMOVE_FROM_POOL, /*quoteAssetAmount=*/ sdk.NewDec(100), /*baseAssetLimit=*/ sdk.NewDec(200), @@ -1128,7 +1136,7 @@ func TestIncreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -1195,7 +1203,7 @@ func TestIncreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_REMOVE_FROM_POOL, /*quoteAssetAmount=*/ sdk.NewDec(100), /*baseAssetLimit=*/ sdk.NewDec(99), @@ -1204,7 +1212,7 @@ func TestIncreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -1274,7 +1282,7 @@ func TestIncreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_REMOVE_FROM_POOL, /*quoteAssetAmount=*/ sdk.NewDec(105), /*baseAssetLimit=*/ sdk.NewDec(100), @@ -1283,7 +1291,7 @@ func TestIncreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -1364,7 +1372,7 @@ func TestClosePositionEntirely(t *testing.T) { } perpKeeper.SetPosition( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), currentPosition.TraderAddress, ¤tPosition, ) @@ -1373,7 +1381,7 @@ func TestClosePositionEntirely(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -1382,7 +1390,7 @@ func TestClosePositionEntirely(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapBaseForQuote( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), /*quoteAssetLimit=*/ sdk.NewDec(200), @@ -1443,7 +1451,7 @@ func TestClosePositionEntirely(t *testing.T) { } perpKeeper.SetPosition( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), currentPosition.TraderAddress, ¤tPosition, ) @@ -1452,7 +1460,7 @@ func TestClosePositionEntirely(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -1461,7 +1469,7 @@ func TestClosePositionEntirely(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapBaseForQuote( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), /*quoteAssetLimit=*/ sdk.NewDec(100), @@ -1522,7 +1530,7 @@ func TestClosePositionEntirely(t *testing.T) { } perpKeeper.SetPosition( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), currentPosition.TraderAddress, ¤tPosition, ) @@ -1531,7 +1539,7 @@ func TestClosePositionEntirely(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -1540,7 +1548,7 @@ func TestClosePositionEntirely(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapBaseForQuote( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), /*quoteAssetLimit=*/ sdk.NewDec(100), @@ -1603,7 +1611,7 @@ func TestClosePositionEntirely(t *testing.T) { } perpKeeper.SetPosition( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), currentPosition.TraderAddress, ¤tPosition, ) @@ -1612,7 +1620,7 @@ func TestClosePositionEntirely(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(150), ). @@ -1621,7 +1629,7 @@ func TestClosePositionEntirely(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapBaseForQuote( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*baseAssetDirection=*/ vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(150), /*quoteAssetLimit=*/ sdk.NewDec(100), @@ -1682,7 +1690,7 @@ func TestClosePositionEntirely(t *testing.T) { } perpKeeper.SetPosition( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), currentPosition.TraderAddress, ¤tPosition, ) @@ -1691,7 +1699,7 @@ func TestClosePositionEntirely(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -1700,7 +1708,7 @@ func TestClosePositionEntirely(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapBaseForQuote( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*baseAssetDirection=*/ vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), /*quoteAssetLimit=*/ sdk.NewDec(105), @@ -1761,7 +1769,7 @@ func TestClosePositionEntirely(t *testing.T) { } perpKeeper.SetPosition( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), currentPosition.TraderAddress, ¤tPosition, ) @@ -1770,7 +1778,7 @@ func TestClosePositionEntirely(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -1779,7 +1787,7 @@ func TestClosePositionEntirely(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapBaseForQuote( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*baseAssetDirection=*/ vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), /*quoteAssetLimit=*/ sdk.NewDec(150), @@ -1861,7 +1869,7 @@ func TestDecreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -1870,7 +1878,7 @@ func TestDecreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_REMOVE_FROM_POOL, /*quoteAssetAmount=*/ sdk.NewDec(100), /*baseAssetLimit=*/ sdk.NewDec(50), @@ -1939,7 +1947,7 @@ func TestDecreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(105), ). @@ -1948,7 +1956,7 @@ func TestDecreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_REMOVE_FROM_POOL, /*quoteAssetAmount=*/ sdk.NewDec(5), /*baseAssetLimit=*/ sdk.MustNewDecFromStr("5.25"), @@ -2023,7 +2031,7 @@ func TestDecreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(105), ). @@ -2032,7 +2040,7 @@ func TestDecreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_ADD_TO_POOL, /*quoteAssetAmount=*/ sdk.NewDec(5), /*baseAssetLimit=*/ sdk.MustNewDecFromStr("5.25"), @@ -2101,7 +2109,7 @@ func TestDecreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -2110,7 +2118,7 @@ func TestDecreasePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_ADD_TO_POOL, /*quoteAssetAmount=*/ sdk.MustNewDecFromStr("5.25"), /*baseAssetLimit=*/ sdk.NewDec(5), @@ -2191,7 +2199,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { } perpKeeper.SetPosition( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), currentPosition.TraderAddress, ¤tPosition, ) @@ -2200,7 +2208,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -2209,7 +2217,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapBaseForQuote( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), /*quoteAssetLimit=*/ sdk.ZeroDec(), @@ -2218,7 +2226,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_REMOVE_FROM_POOL, /*quoteAssetAmount=*/ sdk.NewDec(100), /*baseAssetLimit=*/ sdk.NewDec(50), @@ -2282,7 +2290,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { } perpKeeper.SetPosition( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), currentPosition.TraderAddress, ¤tPosition, ) @@ -2291,7 +2299,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -2300,7 +2308,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapBaseForQuote( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), /*quoteAssetLimit=*/ sdk.ZeroDec(), @@ -2309,7 +2317,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_REMOVE_FROM_POOL, /*quoteAssetAmount=*/ sdk.NewDec(100), /*baseAssetLimit=*/ sdk.NewDec(100), @@ -2377,7 +2385,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { } perpKeeper.SetPosition( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), currentPosition.TraderAddress, ¤tPosition, ) @@ -2386,7 +2394,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -2395,7 +2403,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapBaseForQuote( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_ADD_TO_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), /*quoteAssetLimit=*/ sdk.ZeroDec(), @@ -2447,7 +2455,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { } perpKeeper.SetPosition( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), currentPosition.TraderAddress, ¤tPosition, ) @@ -2456,7 +2464,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(150), ). @@ -2465,7 +2473,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapBaseForQuote( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*baseAssetDirection=*/ vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(150), /*quoteAssetLimit=*/ sdk.ZeroDec(), @@ -2474,7 +2482,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_ADD_TO_POOL, /*quoteAssetAmount=*/ sdk.NewDec(100), /*baseAssetLimit=*/ sdk.NewDec(150), @@ -2538,7 +2546,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { } perpKeeper.SetPosition( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), currentPosition.TraderAddress, ¤tPosition, ) @@ -2547,7 +2555,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -2556,7 +2564,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapBaseForQuote( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*baseAssetDirection=*/ vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), /*quoteAssetLimit=*/ sdk.ZeroDec(), @@ -2565,7 +2573,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapQuoteForBase( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*quoteAssetDirection=*/ vpooltypes.Direction_ADD_TO_POOL, /*quoteAssetAmount=*/ sdk.NewDec(105), /*baseAssetLimit=*/ sdk.NewDec(100), @@ -2629,7 +2637,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { } perpKeeper.SetPosition( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), currentPosition.TraderAddress, ¤tPosition, ) @@ -2638,7 +2646,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), ). @@ -2647,7 +2655,7 @@ func TestCloseAndOpenReversePosition(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapBaseForQuote( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, /*baseAssetDirection=*/ vpooltypes.Direction_REMOVE_FROM_POOL, /*baseAssetAmount=*/ sdk.NewDec(100), /*quoteAssetLimit=*/ sdk.ZeroDec(), diff --git a/x/perp/keeper/grpc_query.go b/x/perp/keeper/grpc_query.go index 9507d7367..e197704ab 100644 --- a/x/perp/keeper/grpc_query.go +++ b/x/perp/keeper/grpc_query.go @@ -29,7 +29,13 @@ func (q queryServer) TraderPosition( } ctx := sdk.UnwrapSDKContext(goCtx) - position, err := q.Keeper.Positions().Get(ctx, common.TokenPair(req.TokenPair), req.Trader) + + pair, err := common.NewAssetPairFromStr(req.TokenPair) + if err != nil { + return nil, err + } + + position, err := q.Keeper.Positions().Get(ctx, pair, req.Trader) if err != nil { return nil, err } diff --git a/x/perp/keeper/grpc_query_test.go b/x/perp/keeper/grpc_query_test.go index e44ef9421..b0be28c5c 100644 --- a/x/perp/keeper/grpc_query_test.go +++ b/x/perp/keeper/grpc_query_test.go @@ -23,7 +23,7 @@ func TestQueryPosition_Ok(t *testing.T) { queryServer := keeper.NewQuerier(*perpKeeper) trader := sample.AccAddress() - vpoolPair, err := common.NewTokenPairFromStr("btc:nusd") + vpoolPair, err := common.NewAssetPairFromStr("btc:nusd") require.NoError(t, err) oldPosition := &types.Position{ diff --git a/x/perp/keeper/liquidate.go b/x/perp/keeper/liquidate.go index 5155addb1..294b2b553 100644 --- a/x/perp/keeper/liquidate.go +++ b/x/perp/keeper/liquidate.go @@ -32,7 +32,7 @@ func (k Keeper) Liquidate( } // validate pair - pair, err := common.NewTokenPairFromStr(msg.TokenPair) + pair, err := common.NewAssetPairFromStr(msg.TokenPair) if err != nil { return res, err } @@ -122,7 +122,7 @@ func (k Keeper) ExecuteFullLiquidation( ctx sdk.Context, liquidator sdk.AccAddress, position *types.Position, ) (liquidationResp types.LiquidateResp, err error) { params := k.GetParams(ctx) - tokenPair, err := common.NewTokenPairFromStr(position.Pair) + tokenPair, err := common.NewAssetPairFromStr(position.Pair) if err != nil { return types.LiquidateResp{}, err } @@ -195,7 +195,7 @@ func (k Keeper) distributeLiquidateRewards( } // validate pair - pair, err := common.NewTokenPairFromStr(liquidateResp.PositionResp.Position.Pair) + pair, err := common.NewAssetPairFromStr(liquidateResp.PositionResp.Position.Pair) if err != nil { return err } @@ -271,7 +271,7 @@ func (k Keeper) ExecutePartialLiquidation( partiallyLiquidatedPositionNotional, err := k.VpoolKeeper.GetBaseAssetPrice( ctx, - common.TokenPair(currentPosition.Pair), + currentPosition.GetAssetPair(), baseAssetDir, /* abs= */ currentPosition.Size_.Mul(params.GetPartialLiquidationRatioAsDec()), ) @@ -296,7 +296,7 @@ func (k Keeper) ExecutePartialLiquidation( Mul(params.GetLiquidationFeeAsDec()) positionResp.Position.Margin = positionResp.Position.Margin. Sub(liquidationFeeAmount) - k.SetPosition(ctx, common.TokenPair(currentPosition.Pair), currentPosition.TraderAddress, + k.SetPosition(ctx, currentPosition.GetAssetPair(), currentPosition.TraderAddress, positionResp.Position) // Compute splits for the liquidation fee diff --git a/x/perp/keeper/liquidate_test.go b/x/perp/keeper/liquidate_test.go index dd299d830..617cb40bd 100644 --- a/x/perp/keeper/liquidate_test.go +++ b/x/perp/keeper/liquidate_test.go @@ -52,13 +52,14 @@ func TestExecuteFullLiquidation_EmptyPosition(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { nibiruApp, ctx := testutil.NewNibiruApp(true) - pair := common.TokenPair("BTC:NUSD") + pair, err2 := common.NewAssetPairFromStr("BTC:NUSD") + require.NoError(t, err2) t.Log("Set vpool defined by pair on VpoolKeeper") vpoolKeeper := &nibiruApp.VpoolKeeper vpoolKeeper.CreatePool( ctx, - pair.String(), + pair, /* tradeLimitRatio */ sdk.MustNewDecFromStr("0.9"), /* quoteAssetReserves */ sdk.NewDec(10_000_000), /* baseAssetReserves */ sdk.NewDec(5_000_000), @@ -127,7 +128,9 @@ func TestExecuteFullLiquidation_EmptyPosition(t *testing.T) { func TestExecuteFullLiquidation(t *testing.T) { // constants for this suite - pair := common.TokenPair("BTC:NUSD") + pair, err := common.NewAssetPairFromStr("BTC:NUSD") + require.NoError(t, err) + trader := sample.AccAddress() testCases := []struct { @@ -300,7 +303,7 @@ func TestExecuteFullLiquidation(t *testing.T) { vpoolKeeper := &nibiruApp.VpoolKeeper vpoolKeeper.CreatePool( ctx, - pair.String(), + pair, /* tradeLimitRatio */ sdk.MustNewDecFromStr("0.9"), /* quoteAssetReserves */ sdk.NewDec(10_000_000), /* baseAssetReserves */ sdk.NewDec(5_000_000), @@ -413,15 +416,15 @@ func TestExecutePartialLiquidation_EmptyPosition(t *testing.T) { t.Run(tc.name, func(t *testing.T) { t.Log("Initialize keepers, pair, and liquidator") nibiruApp, ctx := testutil.NewNibiruApp(true) - pair := common.TokenPair("xxx:yyy") + pair, err := common.NewAssetPairFromStr("xxx:yyy") + require.NoError(t, err) vpoolKeeper := &nibiruApp.VpoolKeeper perpKeeper := &nibiruApp.PerpKeeper - var err error t.Log("Create vpool") vpoolKeeper.CreatePool( ctx, - pair.String(), + pair, /* tradeLimitRatio */ sdk.MustNewDecFromStr("0.9"), /* quoteAssetReserves */ sdk.NewDec(10_000_000), /* baseAssetReserves */ sdk.NewDec(5_000_000), @@ -477,7 +480,9 @@ func TestExecutePartialLiquidation_EmptyPosition(t *testing.T) { func TestExecutePartialLiquidation(t *testing.T) { // constants for this suite - pair := common.TokenPair("xxx:yyy") + pair, err := common.NewAssetPairFromStr("xxx:yyy") + require.NoError(t, err) + trader := sample.AccAddress() partialLiquidationRatio := sdk.MustNewDecFromStr("0.4") @@ -599,7 +604,7 @@ func TestExecutePartialLiquidation(t *testing.T) { vpoolKeeper := &nibiruApp.VpoolKeeper vpoolKeeper.CreatePool( ctx, - pair.String(), + pair, /* tradeLimitRatio */ sdk.MustNewDecFromStr("0.9"), /* quoteAssetReserves */ sdk.NewDec(10_000_000_000_000_000), /* baseAssetReserves */ sdk.NewDec(5_000_000_000_000_000), diff --git a/x/perp/keeper/liquidate_unit_test.go b/x/perp/keeper/liquidate_unit_test.go index dd3ed0b7f..98206bf25 100644 --- a/x/perp/keeper/liquidate_unit_test.go +++ b/x/perp/keeper/liquidate_unit_test.go @@ -69,15 +69,14 @@ func Test_distributeLiquidateRewards_Error(t *testing.T) { test: func() { perpKeeper, mocks, ctx := getKeeper(t) liquidator := sample.AccAddress() - pair := common.TokenPair("BTC:NUSD") - mocks.mockVpoolKeeper.EXPECT().ExistsPool(ctx, pair).Return(false) + mocks.mockVpoolKeeper.EXPECT().ExistsPool(ctx, BtcNusdPair).Return(false) err := perpKeeper.distributeLiquidateRewards(ctx, types.LiquidateResp{BadDebt: sdk.OneDec(), FeeToLiquidator: sdk.OneInt(), FeeToPerpEcosystemFund: sdk.OneInt(), Liquidator: liquidator, PositionResp: &types.PositionResp{ Position: &types.Position{ - Pair: pair.String(), + Pair: BtcNusdPair.String(), }}, }, ) @@ -105,9 +104,8 @@ func Test_distributeLiquidateRewards_Happy(t *testing.T) { test: func() { perpKeeper, mocks, ctx := getKeeper(t) liquidator := sample.AccAddress() - pair := common.TokenPair("BTC:NUSD") - mocks.mockVpoolKeeper.EXPECT().ExistsPool(ctx, pair).Return(true) + mocks.mockVpoolKeeper.EXPECT().ExistsPool(ctx, BtcNusdPair).Return(true) vaultAddr := authtypes.NewModuleAddress(types.VaultModuleAccount) perpEFAddr := authtypes.NewModuleAddress(types.VaultModuleAccount) @@ -133,7 +131,7 @@ func Test_distributeLiquidateRewards_Happy(t *testing.T) { Liquidator: liquidator, PositionResp: &types.PositionResp{ Position: &types.Position{ - Pair: pair.String(), + Pair: BtcNusdPair.String(), }}, }, ) @@ -403,7 +401,6 @@ func TestExecuteFullLiquidation_UnitWithMocks(t *testing.T) { perpKeeper, mocks, ctx := getKeeper(t) liquidatorAddr := sample.AccAddress() traderAddr := sample.AccAddress() - pair := common.TokenPair("BTC:NUSD") baseAssetDirection := vpooltypes.Direction_ADD_TO_POOL if tc.initialPositionSize.IsNegative() { baseAssetDirection = vpooltypes.Direction_REMOVE_FROM_POOL @@ -443,18 +440,18 @@ func TestExecuteFullLiquidation_UnitWithMocks(t *testing.T) { newParams.LiquidationFee = tc.liquidationFee perpKeeper.SetParams(ctx, newParams) perpKeeper.PairMetadata().Set(ctx, &types.PairMetadata{ - Pair: pair.String(), + Pair: BtcNusdPair.String(), CumulativePremiumFractions: []sdk.Dec{ sdk.ZeroDec(), // zero funding payment for this test case }, }) t.Log("mock vpool") - mocks.mockVpoolKeeper.EXPECT().ExistsPool(ctx, pair).AnyTimes().Return(true) + mocks.mockVpoolKeeper.EXPECT().ExistsPool(ctx, BtcNusdPair).AnyTimes().Return(true) mocks.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - pair, + BtcNusdPair, baseAssetDirection, /*baseAssetAmount=*/ tc.initialPositionSize.Abs(), ). @@ -462,7 +459,7 @@ func TestExecuteFullLiquidation_UnitWithMocks(t *testing.T) { mocks.mockVpoolKeeper.EXPECT(). SwapBaseForQuote( ctx, - pair, + BtcNusdPair, baseAssetDirection, /*baseAssetAmount=*/ tc.initialPositionSize.Abs(), /*quoteAssetAssetLimit=*/ sdk.ZeroDec(), @@ -471,14 +468,14 @@ func TestExecuteFullLiquidation_UnitWithMocks(t *testing.T) { t.Log("create and set the initial position") position := types.Position{ TraderAddress: traderAddr, - Pair: pair.String(), + Pair: BtcNusdPair.String(), Size_: tc.initialPositionSize, Margin: tc.initialMargin, OpenNotional: tc.initialOpenNotional, LastUpdateCumulativePremiumFraction: sdk.ZeroDec(), BlockNumber: ctx.BlockHeight(), } - perpKeeper.SetPosition(ctx, pair, traderAddr, &position) + perpKeeper.SetPosition(ctx, BtcNusdPair, traderAddr, &position) t.Log("execute full liquidation") liquidationResp, err := perpKeeper.ExecuteFullLiquidation( @@ -509,7 +506,7 @@ func TestExecuteFullLiquidation_UnitWithMocks(t *testing.T) { t.Log("assert new position fields") newPosition := positionResp.Position assert.EqualValues(t, traderAddr, newPosition.TraderAddress) - assert.EqualValues(t, pair.String(), newPosition.Pair) + assert.EqualValues(t, BtcNusdPair.String(), newPosition.Pair) assert.True(t, newPosition.Size_.IsZero()) // always zero assert.True(t, newPosition.Margin.IsZero()) // always zero assert.True(t, newPosition.OpenNotional.IsZero()) // always zero diff --git a/x/perp/keeper/margin.go b/x/perp/keeper/margin.go index 1b18558f3..70c4406cd 100644 --- a/x/perp/keeper/margin.go +++ b/x/perp/keeper/margin.go @@ -38,7 +38,7 @@ func (k Keeper) AddMargin( } // validate token pair - pair, err := common.NewTokenPairFromStr(msg.TokenPair) + pair, err := common.NewAssetPairFromStr(msg.TokenPair) if err != nil { k.Logger(ctx).Debug( err.Error(), @@ -134,7 +134,7 @@ func (k Keeper) RemoveMargin( } // validate token pair - pair, err := common.NewTokenPairFromStr(msg.TokenPair) + pair, err := common.NewAssetPairFromStr(msg.TokenPair) if err != nil { k.Logger(ctx).Debug( err.Error(), @@ -294,7 +294,7 @@ func (k Keeper) GetMarginRatio( return marginRatio, nil } -func (k Keeper) requireVpool(ctx sdk.Context, pair common.TokenPair) (err error) { +func (k Keeper) requireVpool(ctx sdk.Context, pair common.AssetPair) (err error) { if !k.VpoolKeeper.ExistsPool(ctx, pair) { err = fmt.Errorf("%v: %v", types.ErrPairNotFound.Error(), pair.String()) k.Logger(ctx).Error( diff --git a/x/perp/keeper/margin_test.go b/x/perp/keeper/margin_test.go index f78bba9f9..327e29022 100644 --- a/x/perp/keeper/margin_test.go +++ b/x/perp/keeper/margin_test.go @@ -26,7 +26,9 @@ func TestOpenPosition_Setup(t *testing.T) { test: func() { t.Log("Setup Nibiru app, pair, and trader without a vpool.") nibiruApp, ctx := testutil.NewNibiruApp(true) - pair := common.TokenPair("xxx:yyy") + pair, err := common.NewAssetPairFromStr("xxx:yyy") + require.NoError(t, err) + alice := sample.AccAddress() t.Log("open a position on invalid 'pair'") @@ -34,7 +36,7 @@ func TestOpenPosition_Setup(t *testing.T) { quote := sdk.NewInt(60) leverage := sdk.NewDec(10) baseLimit := sdk.NewDec(150) - err := nibiruApp.PerpKeeper.OpenPosition( + err = nibiruApp.PerpKeeper.OpenPosition( ctx, pair, side, alice, quote, leverage, baseLimit) require.Error(t, err) require.ErrorContains(t, err, types.ErrPairNotFound.Error()) @@ -45,13 +47,14 @@ func TestOpenPosition_Setup(t *testing.T) { test: func() { t.Log("Setup Nibiru app, pair, and trader") nibiruApp, ctx := testutil.NewNibiruApp(true) - pair := common.TokenPair("xxx:yyy") + pair, err := common.NewAssetPairFromStr("xxx:yyy") + require.NoError(t, err) t.Log("Set vpool defined by pair on VpoolKeeper") vpoolKeeper := &nibiruApp.VpoolKeeper vpoolKeeper.CreatePool( ctx, - pair.String(), + pair, sdk.MustNewDecFromStr("0.9"), // 0.9 ratio sdk.NewDec(10_000_000), // sdk.NewDec(5_000_000), // 5 tokens @@ -67,7 +70,7 @@ func TestOpenPosition_Setup(t *testing.T) { quote := sdk.NewInt(60) leverage := sdk.NewDec(10) baseLimit := sdk.NewDec(150) - err := nibiruApp.PerpKeeper.OpenPosition( + err = nibiruApp.PerpKeeper.OpenPosition( ctx, pair, side, alice, quote, leverage, baseLimit) require.Error(t, err) @@ -79,13 +82,14 @@ func TestOpenPosition_Setup(t *testing.T) { test: func() { t.Log("Setup Nibiru app, pair, and trader") nibiruApp, ctx := testutil.NewNibiruApp(true) - pair := common.TokenPair("xxx:yyy") + pair, err := common.NewAssetPairFromStr("xxx:yyy") + require.NoError(t, err) t.Log("Set vpool defined by pair on VpoolKeeper") vpoolKeeper := &nibiruApp.VpoolKeeper vpoolKeeper.CreatePool( ctx, - pair.String(), + pair, sdk.MustNewDecFromStr("0.9"), // 0.9 ratio sdk.NewDec(10_000_000), // sdk.NewDec(5_000_000), // 5 tokens @@ -103,7 +107,7 @@ func TestOpenPosition_Setup(t *testing.T) { }) t.Log("Fund trader (Alice) account with sufficient quote") - var err error + alice := sample.AccAddress() err = simapp.FundAccount(nibiruApp.BankKeeper, ctx, alice, sdk.NewCoins(sdk.NewInt64Coin("yyy", 60))) @@ -140,14 +144,14 @@ func TestAddMargin_ShouldRaiseError(t *testing.T) { test: func() { nibiruApp, ctx := testutil.NewNibiruApp(true) - tokenPair, err := common.NewTokenPairFromStr("atom:nusd") + tokenPair, err := common.NewAssetPairFromStr("atom:nusd") require.NoError(t, err) t.Log("Set vpool defined by pair on VpoolKeeper") vpoolKeeper := &nibiruApp.VpoolKeeper vpoolKeeper.CreatePool( ctx, - /* pair */ tokenPair.String(), + /* pair */ tokenPair, /* tradeLimitRatio */ sdk.MustNewDecFromStr("0.9"), /* quoteReserves */ sdk.NewDec(10_000_000), // /* baseReserves */ sdk.NewDec(5_000_000), // 5 tokens @@ -200,7 +204,7 @@ func TestAddMargin_HappyPath(t *testing.T) { t.Run(tc.name, func(t *testing.T) { nibiruApp, ctx := testutil.NewNibiruApp(true) - tokenPair, err := common.NewTokenPairFromStr("atom:nusd") + tokenPair, err := common.NewAssetPairFromStr("atom:nusd") require.NoError(t, err) t.Log("add margin funds (NUSD) to trader's account") @@ -219,7 +223,7 @@ func TestAddMargin_HappyPath(t *testing.T) { vpoolKeeper := &nibiruApp.VpoolKeeper vpoolKeeper.CreatePool( ctx, - tokenPair.String(), + tokenPair, sdk.MustNewDecFromStr("0.9"), // 0.9 ratio sdk.NewDec(10_000_000), // sdk.NewDec(5_000_000), // 5 tokens @@ -277,12 +281,14 @@ func TestRemoveMargin(t *testing.T) { nibiruApp, ctx := testutil.NewNibiruApp(true) alice := sample.AccAddress() - pair := common.TokenPair("osmo:nusd") + pair, err := common.NewAssetPairFromStr("osmo:nusd") + require.NoError(t, err) + goCtx := sdk.WrapSDKContext(ctx) msg := &types.MsgRemoveMargin{ Sender: alice, TokenPair: pair.String(), Margin: sdk.Coin{Denom: common.StableDenom, Amount: removeAmt}} - _, err := nibiruApp.PerpKeeper.RemoveMargin(goCtx, msg) + _, err = nibiruApp.PerpKeeper.RemoveMargin(goCtx, msg) require.Error(t, err) require.ErrorContains(t, err, "margin must be positive") }, @@ -292,7 +298,9 @@ func TestRemoveMargin(t *testing.T) { test: func() { nibiruApp, ctx := testutil.NewNibiruApp(true) alice := sample.AccAddress() - pair := common.TokenPair("osmo:nusd") + pair, err := common.NewAssetPairFromStr("osmo:nusd") + require.NoError(t, err) + goCtx := sdk.WrapSDKContext(ctx) msg := &types.MsgRemoveMargin{ Sender: alice, @@ -302,7 +310,7 @@ func TestRemoveMargin(t *testing.T) { Amount: sdk.ZeroInt(), }, } - _, err := nibiruApp.PerpKeeper.RemoveMargin(goCtx, msg) + _, err = nibiruApp.PerpKeeper.RemoveMargin(goCtx, msg) require.Error(t, err) require.ErrorContains(t, err, "margin must be positive") }, @@ -314,12 +322,14 @@ func TestRemoveMargin(t *testing.T) { nibiruApp, ctx := testutil.NewNibiruApp(true) alice := sample.AccAddress() - pair := common.TokenPair("osmo:nusd") + pair, err := common.NewAssetPairFromStr("osmo:nusd") + require.NoError(t, err) + goCtx := sdk.WrapSDKContext(ctx) msg := &types.MsgRemoveMargin{ Sender: alice, TokenPair: pair.String(), Margin: sdk.Coin{Denom: common.StableDenom, Amount: removeAmt}} - _, err := nibiruApp.PerpKeeper.RemoveMargin(goCtx, msg) + _, err = nibiruApp.PerpKeeper.RemoveMargin(goCtx, msg) require.Error(t, err) require.ErrorContains(t, err, types.ErrPairNotFound.Error()) }, @@ -330,14 +340,15 @@ func TestRemoveMargin(t *testing.T) { t.Log("Setup Nibiru app, pair, and trader") nibiruApp, ctx := testutil.NewNibiruApp(true) alice := sample.AccAddress() - pair := common.TokenPair("osmo:nusd") + pair, err := common.NewAssetPairFromStr("osmo:nusd") + require.NoError(t, err) t.Log("Setup vpool defined by pair") vpoolKeeper := &nibiruApp.VpoolKeeper perpKeeper := &nibiruApp.PerpKeeper vpoolKeeper.CreatePool( ctx, - pair.String(), + pair, sdk.MustNewDecFromStr("0.9"), // 0.9 ratio /* y */ sdk.NewDec(1_000_000), // /* x */ sdk.NewDec(1_000_000), // @@ -350,7 +361,7 @@ func TestRemoveMargin(t *testing.T) { msg := &types.MsgRemoveMargin{ Sender: alice, TokenPair: pair.String(), Margin: sdk.Coin{Denom: pair.GetQuoteTokenDenom(), Amount: removeAmt}} - _, err := perpKeeper.RemoveMargin( + _, err = perpKeeper.RemoveMargin( goCtx, msg) require.Error(t, err) require.ErrorContains(t, err, types.ErrPositionNotFound.Error()) @@ -362,7 +373,8 @@ func TestRemoveMargin(t *testing.T) { t.Log("Setup Nibiru app, pair, and trader") nibiruApp, ctx := testutil.NewNibiruApp(true) alice := sample.AccAddress() - pair := common.TokenPair("xxx:yyy") + pair, err := common.NewAssetPairFromStr("xxx:yyy") + require.NoError(t, err) t.Log("Set vpool defined by pair on VpoolKeeper") vpoolKeeper := &nibiruApp.VpoolKeeper @@ -370,7 +382,7 @@ func TestRemoveMargin(t *testing.T) { baseReserves := sdk.NewDec(1_000_000) vpoolKeeper.CreatePool( ctx, - pair.String(), + pair, /* tradeLimitRatio */ sdk.MustNewDecFromStr("0.9"), // 0.9 ratio /* y */ quoteReserves, /* x */ baseReserves, @@ -393,7 +405,7 @@ func TestRemoveMargin(t *testing.T) { WithBlockTime(time.Now().Add(time.Minute)) t.Log("Fund trader (Alice) account with sufficient quote") - var err error + err = simapp.FundAccount(nibiruApp.BankKeeper, ctx, alice, sdk.NewCoins( sdk.NewInt64Coin("yyy", 66), diff --git a/x/perp/keeper/margin_unit_test.go b/x/perp/keeper/margin_unit_test.go index fb39fcf76..5d7454b20 100644 --- a/x/perp/keeper/margin_unit_test.go +++ b/x/perp/keeper/margin_unit_test.go @@ -142,7 +142,7 @@ func TestGetMarginRatio_Unit(t *testing.T) { deps.mockVpoolKeeper.EXPECT(). GetBaseAssetPrice( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, sdk.NewDec(10), ). @@ -151,7 +151,7 @@ func TestGetMarginRatio_Unit(t *testing.T) { deps.mockVpoolKeeper.EXPECT(). GetBaseAssetTWAP( ctx, - common.TokenPair("BTC:NUSD"), + BtcNusdPair, vpooltypes.Direction_ADD_TO_POOL, sdk.NewDec(10), 15*time.Minute, @@ -212,7 +212,10 @@ func TestRemoveMargin_Unit(t *testing.T) { t.Log("Build msg that specifies an impossible margin removal (too high)") alice := sample.AccAddress() - pair := common.TokenPair("osmo:nusd") + pair := common.AssetPair{ + Token0: "osmo", + Token1: "nusd", + } msg := &types.MsgRemoveMargin{ Sender: alice, TokenPair: pair.String(), @@ -257,7 +260,8 @@ func TestRemoveMargin_Unit(t *testing.T) { Margin: sdk.NewCoin("nusd", sdk.NewInt(100)), } - pair := common.TokenPair(msg.TokenPair) + pair, err := common.NewAssetPairFromStr(msg.TokenPair) + require.NoError(t, err) mocks.mockVpoolKeeper.EXPECT().ExistsPool(ctx, pair). AnyTimes().Return(true) @@ -294,7 +298,7 @@ func TestRemoveMargin_Unit(t *testing.T) { ctx, types.VaultModuleAccount, alice, sdk.NewCoins(msg.Margin), ).Return(expectedError) - _, err := k.RemoveMargin(goCtx, msg) + _, err = k.RemoveMargin(goCtx, msg) require.Error(t, err) require.ErrorContains(t, err, expectedError.Error()) }, @@ -312,7 +316,8 @@ func TestRemoveMargin_Unit(t *testing.T) { Margin: sdk.NewCoin("nusd", sdk.NewInt(100)), } - pair := common.TokenPair(msg.TokenPair) + pair, err := common.NewAssetPairFromStr(msg.TokenPair) + require.NoError(t, err) mocks.mockVpoolKeeper.EXPECT().ExistsPool(ctx, pair). AnyTimes().Return(true) diff --git a/x/perp/keeper/msg_server.go b/x/perp/keeper/msg_server.go index 2fc4d1934..184afc0fa 100644 --- a/x/perp/keeper/msg_server.go +++ b/x/perp/keeper/msg_server.go @@ -35,7 +35,7 @@ func (k msgServer) AddMargin(ctx context.Context, margin *types.MsgAddMargin, func (k msgServer) OpenPosition(goCtx context.Context, req *types.MsgOpenPosition, ) (*types.MsgOpenPositionResponse, error) { - pair, err := common.NewTokenPairFromStr(req.TokenPair) + pair, err := common.NewAssetPairFromStr(req.TokenPair) if err != nil { panic(err) // must not happen } diff --git a/x/perp/keeper/perp.go b/x/perp/keeper/perp.go index 0fe54c841..12b6ab4b2 100644 --- a/x/perp/keeper/perp.go +++ b/x/perp/keeper/perp.go @@ -9,7 +9,7 @@ import ( ) // TODO test: ClearPosition | https://github.com/NibiruChain/nibiru/issues/299 -func (k Keeper) ClearPosition(ctx sdk.Context, pair common.TokenPair, traderAddr sdk.AccAddress) error { +func (k Keeper) ClearPosition(ctx sdk.Context, pair common.AssetPair, traderAddr sdk.AccAddress) error { return k.Positions().Update(ctx, &types.Position{ TraderAddress: traderAddr, Pair: pair.String(), @@ -22,13 +22,13 @@ func (k Keeper) ClearPosition(ctx sdk.Context, pair common.TokenPair, traderAddr } func (k Keeper) GetPosition( - ctx sdk.Context, pair common.TokenPair, traderAddr sdk.AccAddress, + ctx sdk.Context, pair common.AssetPair, traderAddr sdk.AccAddress, ) (*types.Position, error) { return k.Positions().Get(ctx, pair, traderAddr) } func (k Keeper) SetPosition( - ctx sdk.Context, pair common.TokenPair, traderAddr sdk.AccAddress, + ctx sdk.Context, pair common.AssetPair, traderAddr sdk.AccAddress, position *types.Position) { k.Positions().Set(ctx, pair, traderAddr, position) } @@ -38,7 +38,7 @@ func (k Keeper) SettlePosition( ctx sdk.Context, currentPosition types.Position, ) (transferredCoins sdk.Coins, err error) { - tokenPair, err := common.NewTokenPairFromStr(currentPosition.Pair) + tokenPair, err := common.NewAssetPairFromStr(currentPosition.Pair) if err != nil { return sdk.Coins{}, err } diff --git a/x/perp/keeper/perp_test.go b/x/perp/keeper/perp_test.go index 03042680a..db274be9e 100644 --- a/x/perp/keeper/perp_test.go +++ b/x/perp/keeper/perp_test.go @@ -24,9 +24,11 @@ func TestGetAndSetPosition(t *testing.T) { test: func() { trader := sample.AccAddress() nibiruApp, ctx := testutil.NewNibiruApp(true) + pair, err := common.NewAssetPairFromStr("osmo:nusd") + require.NoError(t, err) - _, err := nibiruApp.PerpKeeper.GetPosition( - ctx, "osmo:nusd", trader) + _, err = nibiruApp.PerpKeeper.GetPosition( + ctx, pair, trader) require.Error(t, err) require.ErrorContains(t, err, types.ErrPositionNotFound.Error()) }, @@ -34,7 +36,7 @@ func TestGetAndSetPosition(t *testing.T) { { name: "set - creating position with set works and shows up in get", test: func() { - vpoolPair, err := common.NewTokenPairFromStr("osmo:nusd") + vpoolPair, err := common.NewAssetPairFromStr("osmo:nusd") require.NoError(t, err) traderAddr := sample.AccAddress() @@ -77,7 +79,7 @@ func TestClearPosition(t *testing.T) { { name: "set - creating position with set works and shows up in get", test: func() { - vpoolPair, err := common.NewTokenPairFromStr("osmo:nusd") + vpoolPair, err := common.NewAssetPairFromStr("osmo:nusd") require.NoError(t, err) traders := []sdk.AccAddress{ diff --git a/x/perp/keeper/perp_unit_test.go b/x/perp/keeper/perp_unit_test.go index 022814fe4..776dd4cf6 100644 --- a/x/perp/keeper/perp_unit_test.go +++ b/x/perp/keeper/perp_unit_test.go @@ -16,7 +16,7 @@ func TestSettlePosition(t *testing.T) { t.Run("success - settlement price zero", func(t *testing.T) { k, dep, ctx := getKeeper(t) traderAddr := sample.AccAddress() - pair, err := common.NewTokenPairFromStr("LUNA:UST") + pair, err := common.NewAssetPairFromStr("LUNA:UST") require.NoError(t, err) dep.mockVpoolKeeper. @@ -52,7 +52,7 @@ func TestSettlePosition(t *testing.T) { t.Run("success - settlement price not zero", func(t *testing.T) { k, dep, ctx := getKeeper(t) traderAddr := sample.AccAddress() - pair, err := common.NewTokenPairFromStr("LUNA:UST") // memeing + pair, err := common.NewAssetPairFromStr("LUNA:UST") // memeing require.NoError(t, err) dep.mockVpoolKeeper. @@ -94,7 +94,7 @@ func TestSettlePosition(t *testing.T) { t.Run("position size is zero", func(t *testing.T) { k, _, ctx := getKeeper(t) traderAddr := sample.AccAddress() - pair, err := common.NewTokenPairFromStr("LUNA:UST") + pair, err := common.NewAssetPairFromStr("LUNA:UST") require.NoError(t, err) pos := types.Position{ diff --git a/x/perp/keeper/state.go b/x/perp/keeper/state.go index 1c87af845..9d9c18158 100644 --- a/x/perp/keeper/state.go +++ b/x/perp/keeper/state.go @@ -77,10 +77,10 @@ func (p PositionsState) getKV(ctx sdk.Context) sdk.KVStore { } func (p PositionsState) keyFromType(position *types.Position) []byte { - return p.keyFromRaw(common.TokenPair(position.Pair), position.TraderAddress) + return p.keyFromRaw(position.GetAssetPair(), position.TraderAddress) } -func (p PositionsState) keyFromRaw(pair common.TokenPair, address sdk.AccAddress) []byte { +func (p PositionsState) keyFromRaw(pair common.AssetPair, address sdk.AccAddress) []byte { // TODO(mercilex): not sure if namespace overlap safe | update(mercilex) it is not overlap safe return []byte(pair.String() + address.String()) } @@ -96,7 +96,7 @@ func (p PositionsState) Create(ctx sdk.Context, position *types.Position) error return nil } -func (p PositionsState) Get(ctx sdk.Context, pair common.TokenPair, traderAddr sdk.AccAddress) (*types.Position, error) { +func (p PositionsState) Get(ctx sdk.Context, pair common.AssetPair, traderAddr sdk.AccAddress) (*types.Position, error) { kv := p.getKV(ctx) key := p.keyFromRaw(pair, traderAddr) @@ -124,7 +124,7 @@ func (p PositionsState) Update(ctx sdk.Context, position *types.Position) error } func (p PositionsState) Set( - ctx sdk.Context, pair common.TokenPair, traderAddr sdk.AccAddress, position *types.Position, + ctx sdk.Context, pair common.AssetPair, traderAddr sdk.AccAddress, position *types.Position, ) { positionID := p.keyFromRaw(pair, traderAddr) kvStore := p.getKV(ctx) @@ -139,10 +139,10 @@ func (p PairMetadata) getKV(ctx sdk.Context) sdk.KVStore { return prefix.NewStore(ctx.KVStore(p.storeKey), pairMetadataNamespace) } -func (p PairMetadata) Get(ctx sdk.Context, pair common.TokenPair) (*types.PairMetadata, error) { +func (p PairMetadata) Get(ctx sdk.Context, pair common.AssetPair) (*types.PairMetadata, error) { kv := p.getKV(ctx) - v := kv.Get([]byte(pair)) + v := kv.Get([]byte(pair.String())) if v == nil { return nil, types.ErrPairMetadataNotFound } diff --git a/x/perp/types/expected_keepers.go b/x/perp/types/expected_keepers.go index 52180a442..031e2d2b4 100644 --- a/x/perp/types/expected_keepers.go +++ b/x/perp/types/expected_keepers.go @@ -78,7 +78,7 @@ type VpoolKeeper interface { */ SwapBaseForQuote( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, dir vpooltypes.Direction, abs sdk.Dec, limit sdk.Dec, @@ -101,7 +101,7 @@ type VpoolKeeper interface { */ SwapQuoteForBase( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, dir vpooltypes.Direction, quoteAssetAmount sdk.Dec, baseAmountLimit sdk.Dec, @@ -124,7 +124,7 @@ type VpoolKeeper interface { */ GetBaseAssetTWAP( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, direction vpooltypes.Direction, baseAssetAmount sdk.Dec, lookbackInterval time.Duration, @@ -147,7 +147,7 @@ type VpoolKeeper interface { */ GetQuoteAssetTWAP( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, direction vpooltypes.Direction, quoteAssetAmount sdk.Dec, lookbackInterval time.Duration, @@ -168,7 +168,7 @@ type VpoolKeeper interface { */ GetBaseAssetPrice( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, direction vpooltypes.Direction, baseAssetAmount sdk.Dec, ) (quoteAssetAmount sdk.Dec, err error) @@ -188,7 +188,7 @@ type VpoolKeeper interface { */ GetQuoteAssetPrice( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, dir vpooltypes.Direction, quoteAmount sdk.Dec, ) (baseAssetAmount sdk.Dec, err error) @@ -211,7 +211,7 @@ type VpoolKeeper interface { */ GetSpotPrice( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, ) (price sdk.Dec, err error) /* Retrieves the base asset's price from PricefeedKeeper (oracle). @@ -227,13 +227,13 @@ type VpoolKeeper interface { */ GetUnderlyingPrice( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, ) (price sdk.Dec, err error) - CalcPerpTxFee(ctx sdk.Context, pair common.TokenPair, quoteAmt sdk.Int, + CalcPerpTxFee(ctx sdk.Context, pair common.AssetPair, quoteAmt sdk.Int, ) (toll sdk.Int, spread sdk.Int, err error) - IsOverSpreadLimit(ctx sdk.Context, pair common.TokenPair) bool + IsOverSpreadLimit(ctx sdk.Context, pair common.AssetPair) bool // ExistsPool returns true if pool exists, false if not. - ExistsPool(ctx sdk.Context, pair common.TokenPair) bool - GetSettlementPrice(ctx sdk.Context, pair common.TokenPair) (sdk.Dec, error) + ExistsPool(ctx sdk.Context, pair common.AssetPair) bool + GetSettlementPrice(ctx sdk.Context, pair common.AssetPair) (sdk.Dec, error) } diff --git a/x/perp/types/msgs.go b/x/perp/types/msgs.go index 31537413d..b134d8aab 100644 --- a/x/perp/types/msgs.go +++ b/x/perp/types/msgs.go @@ -53,7 +53,7 @@ func (m *MsgOpenPosition) ValidateBasic() error { if m.Side != Side_SELL && m.Side != Side_BUY { return fmt.Errorf("invalid side") } - if _, err := common.NewTokenPairFromStr(m.TokenPair); err != nil { + if _, err := common.NewAssetPairFromStr(m.TokenPair); err != nil { return err } if err := sdk.VerifyAddressFormat(m.Sender); err != nil { @@ -88,7 +88,7 @@ func (m MsgLiquidate) ValidateBasic() error { if err := sdk.VerifyAddressFormat(m.Trader); err != nil { return err } - if _, err := common.NewTokenPairFromStr(m.TokenPair); err != nil { + if _, err := common.NewAssetPairFromStr(m.TokenPair); err != nil { return err } return nil diff --git a/x/perp/types/state.go b/x/perp/types/state.go new file mode 100644 index 000000000..f01b3c348 --- /dev/null +++ b/x/perp/types/state.go @@ -0,0 +1,12 @@ +package types + +import "github.com/NibiruChain/nibiru/x/common" + +func (p *Position) GetAssetPair() common.AssetPair { + pair, err := common.NewAssetPairFromStr(p.Pair) + if err != nil { + panic(err) + } + + return pair +} diff --git a/x/perp/types/types.go b/x/perp/types/types.go index 02ed6e131..60304f5d2 100644 --- a/x/perp/types/types.go +++ b/x/perp/types/types.go @@ -27,7 +27,7 @@ var ( ErrPositionZero = errors.New("position is zero") ) -func ZeroPosition(ctx sdk.Context, tokenPair common.TokenPair, traderAddr sdk.AccAddress) *Position { +func ZeroPosition(ctx sdk.Context, tokenPair common.AssetPair, traderAddr sdk.AccAddress) *Position { return &Position{ TraderAddress: traderAddr, Pair: tokenPair.String(), diff --git a/x/pricefeed/client/cli/query.go b/x/pricefeed/client/cli/query.go index 7c9cf2557..d5d5eac97 100644 --- a/x/pricefeed/client/cli/query.go +++ b/x/pricefeed/client/cli/query.go @@ -48,7 +48,7 @@ func CmdPrice() *cobra.Command { queryClient := types.NewQueryClient(clientCtx) - pair, err := common.NewTokenPairFromStr(args[0]) + pair, err := common.NewAssetPairFromStr(args[0]) if err != nil { return fmt.Errorf("invalid pair: %w", err) } diff --git a/x/testutil/cli/query.go b/x/testutil/cli/query.go index 1436d668b..741926938 100644 --- a/x/testutil/cli/query.go +++ b/x/testutil/cli/query.go @@ -16,8 +16,8 @@ import ( vpooltypes "github.com/NibiruChain/nibiru/x/vpool/types" ) -func QueryVpoolReserveAssets(ctx client.Context, pair common.TokenPair) (vpooltypes.QueryReserveAssetsResponse, error) { - out, err := clitestutil.ExecTestCLICmd(ctx, cli2.CmdGetVpoolReserveAssets(), []string{string(pair), fmt.Sprintf("--%s=json", tmcli.OutputFlag)}) +func QueryVpoolReserveAssets(ctx client.Context, pair common.AssetPair) (vpooltypes.QueryReserveAssetsResponse, error) { + out, err := clitestutil.ExecTestCLICmd(ctx, cli2.CmdGetVpoolReserveAssets(), []string{pair.String(), fmt.Sprintf("--%s=json", tmcli.OutputFlag)}) if err != nil { return vpooltypes.QueryReserveAssetsResponse{}, err } @@ -31,11 +31,11 @@ func QueryVpoolReserveAssets(ctx client.Context, pair common.TokenPair) (vpoolty return queryResp, nil } -func QueryTraderPosition(ctx client.Context, pair common.TokenPair, trader sdk.AccAddress) (types.QueryTraderPositionResponse, error) { +func QueryTraderPosition(ctx client.Context, pair common.AssetPair, trader sdk.AccAddress) (types.QueryTraderPositionResponse, error) { out, err := clitestutil.ExecTestCLICmd( ctx, cli.CmdQueryPosition(), - []string{trader.String(), string(pair), fmt.Sprintf("--%s=json", tmcli.OutputFlag)}, + []string{trader.String(), pair.String(), fmt.Sprintf("--%s=json", tmcli.OutputFlag)}, ) if err != nil { return types.QueryTraderPositionResponse{}, err diff --git a/x/testutil/mock/perp_interfaces.go b/x/testutil/mock/perp_interfaces.go index 9d1243885..0906884ae 100644 --- a/x/testutil/mock/perp_interfaces.go +++ b/x/testutil/mock/perp_interfaces.go @@ -8,13 +8,12 @@ import ( reflect "reflect" time "time" - types1 "github.com/cosmos/cosmos-sdk/types" - types2 "github.com/cosmos/cosmos-sdk/x/auth/types" - gomock "github.com/golang/mock/gomock" - common "github.com/NibiruChain/nibiru/x/common" types "github.com/NibiruChain/nibiru/x/pricefeed/types" types0 "github.com/NibiruChain/nibiru/x/vpool/types" + types1 "github.com/cosmos/cosmos-sdk/types" + types2 "github.com/cosmos/cosmos-sdk/x/auth/types" + gomock "github.com/golang/mock/gomock" ) // MockAccountKeeper is a mock of AccountKeeper interface. @@ -366,7 +365,7 @@ func (m *MockVpoolKeeper) EXPECT() *MockVpoolKeeperMockRecorder { } // CalcPerpTxFee mocks base method. -func (m *MockVpoolKeeper) CalcPerpTxFee(arg0 types1.Context, arg1 common.TokenPair, arg2 types1.Int) (types1.Int, types1.Int, error) { +func (m *MockVpoolKeeper) CalcPerpTxFee(arg0 types1.Context, arg1 common.AssetPair, arg2 types1.Int) (types1.Int, types1.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CalcPerpTxFee", arg0, arg1, arg2) ret0, _ := ret[0].(types1.Int) @@ -382,7 +381,7 @@ func (mr *MockVpoolKeeperMockRecorder) CalcPerpTxFee(arg0, arg1, arg2 interface{ } // ExistsPool mocks base method. -func (m *MockVpoolKeeper) ExistsPool(arg0 types1.Context, arg1 common.TokenPair) bool { +func (m *MockVpoolKeeper) ExistsPool(arg0 types1.Context, arg1 common.AssetPair) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ExistsPool", arg0, arg1) ret0, _ := ret[0].(bool) @@ -396,7 +395,7 @@ func (mr *MockVpoolKeeperMockRecorder) ExistsPool(arg0, arg1 interface{}) *gomoc } // GetBaseAssetPrice mocks base method. -func (m *MockVpoolKeeper) GetBaseAssetPrice(arg0 types1.Context, arg1 common.TokenPair, arg2 types0.Direction, arg3 types1.Dec) (types1.Dec, error) { +func (m *MockVpoolKeeper) GetBaseAssetPrice(arg0 types1.Context, arg1 common.AssetPair, arg2 types0.Direction, arg3 types1.Dec) (types1.Dec, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBaseAssetPrice", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(types1.Dec) @@ -411,7 +410,7 @@ func (mr *MockVpoolKeeperMockRecorder) GetBaseAssetPrice(arg0, arg1, arg2, arg3 } // GetBaseAssetTWAP mocks base method. -func (m *MockVpoolKeeper) GetBaseAssetTWAP(arg0 types1.Context, arg1 common.TokenPair, arg2 types0.Direction, arg3 types1.Dec, arg4 time.Duration) (types1.Dec, error) { +func (m *MockVpoolKeeper) GetBaseAssetTWAP(arg0 types1.Context, arg1 common.AssetPair, arg2 types0.Direction, arg3 types1.Dec, arg4 time.Duration) (types1.Dec, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBaseAssetTWAP", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(types1.Dec) @@ -426,7 +425,7 @@ func (mr *MockVpoolKeeperMockRecorder) GetBaseAssetTWAP(arg0, arg1, arg2, arg3, } // GetQuoteAssetPrice mocks base method. -func (m *MockVpoolKeeper) GetQuoteAssetPrice(arg0 types1.Context, arg1 common.TokenPair, arg2 types0.Direction, arg3 types1.Dec) (types1.Dec, error) { +func (m *MockVpoolKeeper) GetQuoteAssetPrice(arg0 types1.Context, arg1 common.AssetPair, arg2 types0.Direction, arg3 types1.Dec) (types1.Dec, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetQuoteAssetPrice", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(types1.Dec) @@ -441,7 +440,7 @@ func (mr *MockVpoolKeeperMockRecorder) GetQuoteAssetPrice(arg0, arg1, arg2, arg3 } // GetQuoteAssetTWAP mocks base method. -func (m *MockVpoolKeeper) GetQuoteAssetTWAP(arg0 types1.Context, arg1 common.TokenPair, arg2 types0.Direction, arg3 types1.Dec, arg4 time.Duration) (types1.Dec, error) { +func (m *MockVpoolKeeper) GetQuoteAssetTWAP(arg0 types1.Context, arg1 common.AssetPair, arg2 types0.Direction, arg3 types1.Dec, arg4 time.Duration) (types1.Dec, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetQuoteAssetTWAP", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(types1.Dec) @@ -456,7 +455,7 @@ func (mr *MockVpoolKeeperMockRecorder) GetQuoteAssetTWAP(arg0, arg1, arg2, arg3, } // GetSettlementPrice mocks base method. -func (m *MockVpoolKeeper) GetSettlementPrice(arg0 types1.Context, arg1 common.TokenPair) (types1.Dec, error) { +func (m *MockVpoolKeeper) GetSettlementPrice(arg0 types1.Context, arg1 common.AssetPair) (types1.Dec, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetSettlementPrice", arg0, arg1) ret0, _ := ret[0].(types1.Dec) @@ -471,7 +470,7 @@ func (mr *MockVpoolKeeperMockRecorder) GetSettlementPrice(arg0, arg1 interface{} } // GetSpotPrice mocks base method. -func (m *MockVpoolKeeper) GetSpotPrice(arg0 types1.Context, arg1 common.TokenPair) (types1.Dec, error) { +func (m *MockVpoolKeeper) GetSpotPrice(arg0 types1.Context, arg1 common.AssetPair) (types1.Dec, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetSpotPrice", arg0, arg1) ret0, _ := ret[0].(types1.Dec) @@ -486,7 +485,7 @@ func (mr *MockVpoolKeeperMockRecorder) GetSpotPrice(arg0, arg1 interface{}) *gom } // GetUnderlyingPrice mocks base method. -func (m *MockVpoolKeeper) GetUnderlyingPrice(arg0 types1.Context, arg1 common.TokenPair) (types1.Dec, error) { +func (m *MockVpoolKeeper) GetUnderlyingPrice(arg0 types1.Context, arg1 common.AssetPair) (types1.Dec, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetUnderlyingPrice", arg0, arg1) ret0, _ := ret[0].(types1.Dec) @@ -501,7 +500,7 @@ func (mr *MockVpoolKeeperMockRecorder) GetUnderlyingPrice(arg0, arg1 interface{} } // IsOverSpreadLimit mocks base method. -func (m *MockVpoolKeeper) IsOverSpreadLimit(arg0 types1.Context, arg1 common.TokenPair) bool { +func (m *MockVpoolKeeper) IsOverSpreadLimit(arg0 types1.Context, arg1 common.AssetPair) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "IsOverSpreadLimit", arg0, arg1) ret0, _ := ret[0].(bool) @@ -515,7 +514,7 @@ func (mr *MockVpoolKeeperMockRecorder) IsOverSpreadLimit(arg0, arg1 interface{}) } // SwapBaseForQuote mocks base method. -func (m *MockVpoolKeeper) SwapBaseForQuote(arg0 types1.Context, arg1 common.TokenPair, arg2 types0.Direction, arg3, arg4 types1.Dec) (types1.Dec, error) { +func (m *MockVpoolKeeper) SwapBaseForQuote(arg0 types1.Context, arg1 common.AssetPair, arg2 types0.Direction, arg3, arg4 types1.Dec) (types1.Dec, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SwapBaseForQuote", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(types1.Dec) @@ -530,7 +529,7 @@ func (mr *MockVpoolKeeperMockRecorder) SwapBaseForQuote(arg0, arg1, arg2, arg3, } // SwapQuoteForBase mocks base method. -func (m *MockVpoolKeeper) SwapQuoteForBase(arg0 types1.Context, arg1 common.TokenPair, arg2 types0.Direction, arg3, arg4 types1.Dec) (types1.Dec, error) { +func (m *MockVpoolKeeper) SwapQuoteForBase(arg0 types1.Context, arg1 common.AssetPair, arg2 types0.Direction, arg3, arg4 types1.Dec) (types1.Dec, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SwapQuoteForBase", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(types1.Dec) diff --git a/x/vpool/client/cli/query.go b/x/vpool/client/cli/query.go index ea328deb5..5dcb5f15e 100644 --- a/x/vpool/client/cli/query.go +++ b/x/vpool/client/cli/query.go @@ -49,7 +49,7 @@ func CmdGetVpoolReserveAssets() *cobra.Command { queryClient := types.NewQueryClient(clientCtx) - tokenPair, err := common.NewTokenPairFromStr(args[0]) + tokenPair, err := common.NewAssetPairFromStr(args[0]) if err != nil { return err } diff --git a/x/vpool/genesis.go b/x/vpool/genesis.go index da8bc0ce5..aec763871 100644 --- a/x/vpool/genesis.go +++ b/x/vpool/genesis.go @@ -13,7 +13,7 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) for _, vp := range genState.Vpools { k.CreatePool( ctx, - vp.Pair, + vp.GetAssetPair(), vp.TradeLimitRatio, vp.QuoteAssetReserve, vp.BaseAssetReserve, diff --git a/x/vpool/genesis_test.go b/x/vpool/genesis_test.go index 701a12f38..1561af125 100644 --- a/x/vpool/genesis_test.go +++ b/x/vpool/genesis_test.go @@ -6,7 +6,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - "github.com/NibiruChain/nibiru/x/common" "github.com/NibiruChain/nibiru/x/testutil" "github.com/NibiruChain/nibiru/x/vpool" "github.com/NibiruChain/nibiru/x/vpool/types" @@ -40,7 +39,7 @@ func TestGenesis(t *testing.T) { vpool.InitGenesis(ctx, k, genesisState) for _, vp := range vpools { - require.True(t, k.ExistsPool(ctx, common.TokenPair(vp.Pair))) + require.True(t, k.ExistsPool(ctx, vp.GetAssetPair())) } exportedGenesis := vpool.ExportGenesis(ctx, k) diff --git a/x/vpool/keeper/get_settlement_price.go b/x/vpool/keeper/get_settlement_price.go index 987bd53ce..b832c88c4 100644 --- a/x/vpool/keeper/get_settlement_price.go +++ b/x/vpool/keeper/get_settlement_price.go @@ -7,6 +7,6 @@ import ( ) // TODO(mercilex): implement -func (k Keeper) GetSettlementPrice(ctx sdk.Context, pair common.TokenPair) (sdk.Dec, error) { +func (k Keeper) GetSettlementPrice(ctx sdk.Context, pair common.AssetPair) (sdk.Dec, error) { panic("impl") } diff --git a/x/vpool/keeper/keeper.go b/x/vpool/keeper/keeper.go index 310f11fc4..89071e36e 100644 --- a/x/vpool/keeper/keeper.go +++ b/x/vpool/keeper/keeper.go @@ -38,7 +38,7 @@ type Keeper struct { // toll (sdk.Int): Amount of tokens transferred to the the fee pool. // spread (sdk.Int): Amount of tokens transferred to the PerpEF. // -func (k Keeper) CalcPerpTxFee(ctx sdk.Context, pair common.TokenPair, quoteAmt sdk.Int) (toll sdk.Int, spread sdk.Int, err error) { +func (k Keeper) CalcPerpTxFee(ctx sdk.Context, pair common.AssetPair, quoteAmt sdk.Int) (toll sdk.Int, spread sdk.Int, err error) { //TODO implement me panic("implement me") } @@ -61,7 +61,7 @@ ret: */ func (k Keeper) SwapBaseForQuote( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, dir types.Direction, baseAssetAmount sdk.Dec, quoteAmountLimit sdk.Dec, @@ -148,7 +148,7 @@ ret: */ func (k Keeper) SwapQuoteForBase( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, dir types.Direction, quoteAssetAmount sdk.Dec, baseAmountLimit sdk.Dec, @@ -219,13 +219,18 @@ func (k Keeper) SwapQuoteForBase( func (k Keeper) checkFluctuationLimitRatio(ctx sdk.Context, pool *types.Pool) error { if pool.FluctuationLimitRatio.GT(sdk.ZeroDec()) { - latestSnapshot, counter, err := k.getLatestReserveSnapshot(ctx, common.TokenPair(pool.Pair)) + pair, err := common.NewAssetPairFromStr(pool.Pair) + if err != nil { + return err + } + + latestSnapshot, counter, err := k.getLatestReserveSnapshot(ctx, pair) if err != nil { return fmt.Errorf("error getting last snapshot number for pair %s", pool.Pair) } if latestSnapshot.BlockNumber == ctx.BlockHeight() && counter > 0 { - latestSnapshot, err = k.getSnapshot(ctx, common.TokenPair(pool.Pair), counter-1) + latestSnapshot, err = k.getSnapshot(ctx, pair, counter-1) if err != nil { return fmt.Errorf("error getting snapshot number %d from pair %s", counter-1, pool.Pair) } @@ -253,7 +258,7 @@ func isOverFluctuationLimit(pool *types.Pool, snapshot types.ReserveSnapshot) bo return false } -func (k Keeper) IsOverSpreadLimit(ctx sdk.Context, pair common.TokenPair) (isIt bool) { +func (k Keeper) IsOverSpreadLimit(ctx sdk.Context, pair common.AssetPair) (isIt bool) { spotPrice, err := k.GetSpotPrice(ctx, pair) if err != nil { panic(err) diff --git a/x/vpool/keeper/keeper_test.go b/x/vpool/keeper/keeper_test.go index 29f0df6d0..7398a5f72 100644 --- a/x/vpool/keeper/keeper_test.go +++ b/x/vpool/keeper/keeper_test.go @@ -15,7 +15,7 @@ import ( func TestSwapQuoteForBase(t *testing.T) { tests := []struct { name string - pair common.TokenPair + pair common.AssetPair direction types.Direction quoteAmount sdk.Dec baseLimit sdk.Dec @@ -26,7 +26,7 @@ func TestSwapQuoteForBase(t *testing.T) { }{ { name: "quote amount == 0", - pair: NUSDPair, + pair: BTCNusdPair, direction: types.Direction_ADD_TO_POOL, quoteAmount: sdk.NewDec(0), baseLimit: sdk.NewDec(10), @@ -36,7 +36,7 @@ func TestSwapQuoteForBase(t *testing.T) { }, { name: "normal swap add", - pair: NUSDPair, + pair: BTCNusdPair, direction: types.Direction_ADD_TO_POOL, quoteAmount: sdk.NewDec(100_000), baseLimit: sdk.NewDec(49504), @@ -46,7 +46,7 @@ func TestSwapQuoteForBase(t *testing.T) { }, { name: "normal swap remove", - pair: NUSDPair, + pair: BTCNusdPair, direction: types.Direction_REMOVE_FROM_POOL, quoteAmount: sdk.NewDec(100_000), baseLimit: sdk.NewDec(50506), @@ -56,7 +56,7 @@ func TestSwapQuoteForBase(t *testing.T) { }, { name: "pair not supported", - pair: "xxx:yyy", + pair: common.AssetPair{Token0: "abc", Token1: "xyz"}, direction: types.Direction_ADD_TO_POOL, quoteAmount: sdk.NewDec(10), baseLimit: sdk.NewDec(10), @@ -64,7 +64,7 @@ func TestSwapQuoteForBase(t *testing.T) { }, { name: "base amount less than base limit in Long", - pair: NUSDPair, + pair: BTCNusdPair, direction: types.Direction_ADD_TO_POOL, quoteAmount: sdk.NewDec(500_000), baseLimit: sdk.NewDec(454_500), @@ -72,7 +72,7 @@ func TestSwapQuoteForBase(t *testing.T) { }, { name: "base amount more than base limit in Short", - pair: NUSDPair, + pair: BTCNusdPair, direction: types.Direction_REMOVE_FROM_POOL, quoteAmount: sdk.NewDec(1_000_000), baseLimit: sdk.NewDec(454_500), @@ -80,7 +80,7 @@ func TestSwapQuoteForBase(t *testing.T) { }, { name: "quote input bigger than reserve ratio", - pair: NUSDPair, + pair: BTCNusdPair, direction: types.Direction_REMOVE_FROM_POOL, quoteAmount: sdk.NewDec(10_000_000), baseLimit: sdk.NewDec(10), @@ -88,7 +88,7 @@ func TestSwapQuoteForBase(t *testing.T) { }, { name: "over fluctuation limit fails", - pair: NUSDPair, + pair: BTCNusdPair, direction: types.Direction_ADD_TO_POOL, quoteAmount: sdk.NewDec(1_000_000), baseLimit: sdk.NewDec(454_544), @@ -105,7 +105,7 @@ func TestSwapQuoteForBase(t *testing.T) { vpoolKeeper.CreatePool( ctx, - NUSDPair, + BTCNusdPair, sdk.MustNewDecFromStr("0.9"), // 0.9 ratio sdk.NewDec(10_000_000), // 10 tokens sdk.NewDec(5_000_000), // 5 tokens @@ -127,12 +127,12 @@ func TestSwapQuoteForBase(t *testing.T) { require.NoError(t, err) require.Equal(t, tc.expectedBaseAmount, res) - pool, err := vpoolKeeper.getPool(ctx, NUSDPair) + pool, err := vpoolKeeper.getPool(ctx, BTCNusdPair) require.NoError(t, err) require.Equal(t, tc.expectedQuoteReserve, pool.QuoteAssetReserve) require.Equal(t, tc.expectedBaseReserve, pool.BaseAssetReserve) - snapshot, _, err := vpoolKeeper.getLatestReserveSnapshot(ctx, NUSDPair) + snapshot, _, err := vpoolKeeper.getLatestReserveSnapshot(ctx, BTCNusdPair) require.NoError(t, err) require.EqualValues(t, tc.expectedQuoteReserve, snapshot.QuoteAssetReserve) require.EqualValues(t, tc.expectedBaseReserve, snapshot.BaseAssetReserve) @@ -198,7 +198,7 @@ func TestSwapBaseForQuote(t *testing.T) { vpoolKeeper.CreatePool( ctx, - NUSDPair, + BTCNusdPair, sdk.OneDec(), tc.initialQuoteReserve, tc.initialBaseReserve, @@ -208,7 +208,7 @@ func TestSwapBaseForQuote(t *testing.T) { quoteAssetAmount, err := vpoolKeeper.SwapBaseForQuote( ctx, - NUSDPair, + BTCNusdPair, tc.direction, tc.baseAssetAmount, tc.quoteAssetLimit, @@ -217,7 +217,7 @@ func TestSwapBaseForQuote(t *testing.T) { if tc.expectedErr != nil { require.Error(t, err) } else { - pool, err := vpoolKeeper.getPool(ctx, NUSDPair) + pool, err := vpoolKeeper.getPool(ctx, BTCNusdPair) require.NoError(t, err) require.EqualValuesf(t, tc.expectedQuoteAssetAmount, quoteAssetAmount, @@ -226,7 +226,7 @@ func TestSwapBaseForQuote(t *testing.T) { require.Equal(t, tc.expectedQuoteReserve, pool.QuoteAssetReserve) require.Equal(t, tc.expectedBaseReserve, pool.BaseAssetReserve) - snapshot, _, err := vpoolKeeper.getLatestReserveSnapshot(ctx, NUSDPair) + snapshot, _, err := vpoolKeeper.getLatestReserveSnapshot(ctx, BTCNusdPair) require.NoError(t, err) require.EqualValues(t, tc.expectedQuoteReserve, snapshot.QuoteAssetReserve) require.EqualValues(t, tc.expectedBaseReserve, snapshot.BaseAssetReserve) @@ -243,7 +243,7 @@ func TestGetVpools(t *testing.T) { vpoolKeeper.CreatePool( ctx, - "BTC:NUSD", + BTCNusdPair, sdk.OneDec(), sdk.NewDec(10_000_000), sdk.NewDec(5_000_000), @@ -252,7 +252,7 @@ func TestGetVpools(t *testing.T) { ) vpoolKeeper.CreatePool( ctx, - "ETH:NUSD", + ETHNusdPair, sdk.OneDec(), sdk.NewDec(5_000_000), sdk.NewDec(10_000_000), diff --git a/x/vpool/keeper/pool_state.go b/x/vpool/keeper/pool_state.go index d44b8f68d..d5bf3eb8c 100644 --- a/x/vpool/keeper/pool_state.go +++ b/x/vpool/keeper/pool_state.go @@ -12,7 +12,7 @@ import ( // CreatePool creates a pool for a specific pair. func (k Keeper) CreatePool( ctx sdk.Context, - pair string, + pair common.AssetPair, tradeLimitRatio sdk.Dec, // integer with 6 decimals, 1_000_000 means 1.0 quoteAssetReserve sdk.Dec, baseAssetReserve sdk.Dec, @@ -29,12 +29,12 @@ func (k Keeper) CreatePool( ) k.savePool(ctx, pool) - k.saveSnapshot(ctx, common.TokenPair(pool.Pair), 0, pool.QuoteAssetReserve, pool.BaseAssetReserve, ctx.BlockTime(), ctx.BlockHeight()) - k.saveSnapshotCounter(ctx, common.TokenPair(pair), 0) + k.saveSnapshot(ctx, pair, 0, pool.QuoteAssetReserve, pool.BaseAssetReserve, ctx.BlockTime(), ctx.BlockHeight()) + k.saveSnapshotCounter(ctx, pair, 0) } // getPool returns the pool from database -func (k Keeper) getPool(ctx sdk.Context, pair common.TokenPair) ( +func (k Keeper) getPool(ctx sdk.Context, pair common.AssetPair) ( *types.Pool, error, ) { bz := ctx.KVStore(k.storeKey).Get(types.GetPoolKey(pair)) @@ -52,7 +52,7 @@ func (k Keeper) savePool( pool *types.Pool, ) { bz := k.codec.MustMarshal(pool) - ctx.KVStore(k.storeKey).Set(types.GetPoolKey(common.TokenPair(pool.Pair)), bz) + ctx.KVStore(k.storeKey).Set(types.GetPoolKey(pool.GetAssetPair()), bz) } /* @@ -80,7 +80,7 @@ func (k Keeper) savePoolAndSnapshot( if err = k.addReserveSnapshot( ctx, - common.TokenPair(updatedPool.Pair), + updatedPool.GetAssetPair(), updatedPool.QuoteAssetReserve, updatedPool.BaseAssetReserve, ); err != nil { @@ -93,7 +93,7 @@ func (k Keeper) savePoolAndSnapshot( } // ExistsPool returns true if pool exists, false if not. -func (k Keeper) ExistsPool(ctx sdk.Context, pair common.TokenPair) bool { +func (k Keeper) ExistsPool(ctx sdk.Context, pair common.AssetPair) bool { return ctx.KVStore(k.storeKey).Has(types.GetPoolKey(pair)) } diff --git a/x/vpool/keeper/pool_state_test.go b/x/vpool/keeper/pool_state_test.go index 63de9706f..7149c0f03 100644 --- a/x/vpool/keeper/pool_state_test.go +++ b/x/vpool/keeper/pool_state_test.go @@ -7,6 +7,8 @@ import ( "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" + "github.com/NibiruChain/nibiru/x/common" + types2 "github.com/NibiruChain/nibiru/x/vpool/types" "github.com/NibiruChain/nibiru/x/testutil/mock" @@ -19,7 +21,7 @@ func TestCreatePool(t *testing.T) { vpoolKeeper.CreatePool( ctx, - NUSDPair, + BTCNusdPair, sdk.MustNewDecFromStr("0.9"), // 0.9 ratio sdk.NewDec(10_000_000), // 10 tokens sdk.NewDec(5_000_000), // 5 tokens @@ -27,10 +29,13 @@ func TestCreatePool(t *testing.T) { sdk.MustNewDecFromStr("0.1"), // 0.9 ratio ) - exists := vpoolKeeper.ExistsPool(ctx, NUSDPair) + exists := vpoolKeeper.ExistsPool(ctx, BTCNusdPair) require.True(t, exists) - notExist := vpoolKeeper.ExistsPool(ctx, "BTC:OTHER") + notExist := vpoolKeeper.ExistsPool(ctx, common.AssetPair{ + Token0: "BTC", + Token1: "OTHER", + }) require.False(t, notExist) } diff --git a/x/vpool/keeper/prices.go b/x/vpool/keeper/prices.go index 90df069dd..62a57a065 100644 --- a/x/vpool/keeper/prices.go +++ b/x/vpool/keeper/prices.go @@ -27,7 +27,7 @@ ret: - price: the price of the token pair as sdk.Dec - err: error */ -func (k Keeper) GetSpotPrice(ctx sdk.Context, pair common.TokenPair) ( +func (k Keeper) GetSpotPrice(ctx sdk.Context, pair common.AssetPair) ( price sdk.Dec, err error, ) { pool, err := k.getPool(ctx, pair) @@ -50,7 +50,7 @@ ret: - price: price as sdk.Dec - err: error */ -func (k Keeper) GetUnderlyingPrice(ctx sdk.Context, pair common.TokenPair) ( +func (k Keeper) GetUnderlyingPrice(ctx sdk.Context, pair common.AssetPair) ( price sdk.Dec, err error, ) { currentPrice, err := k.pricefeedKeeper.GetCurrentPrice( @@ -81,7 +81,7 @@ ret: */ func (k Keeper) GetBaseAssetPrice( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, dir types.Direction, baseAssetAmount sdk.Dec, ) (quoteAmount sdk.Dec, err error) { @@ -109,7 +109,7 @@ ret: */ func (k Keeper) GetQuoteAssetPrice( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, dir types.Direction, quoteAmount sdk.Dec, ) (baseAssetAmount sdk.Dec, err error) { @@ -139,7 +139,7 @@ ret: */ func (k Keeper) GetBaseAssetTWAP( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, direction types.Direction, baseAssetAmount sdk.Dec, lookbackInterval time.Duration, @@ -172,7 +172,7 @@ ret: */ func (k Keeper) GetQuoteAssetTWAP( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, direction types.Direction, quoteAssetAmount sdk.Dec, lookbackInterval time.Duration, @@ -205,7 +205,7 @@ ret: */ func (k Keeper) calcTwap( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, twapCalcOption types.TwapCalcOption, direction types.Direction, assetAmount sdk.Dec, diff --git a/x/vpool/keeper/prices_test.go b/x/vpool/keeper/prices_test.go index 4428c616e..fe0882310 100644 --- a/x/vpool/keeper/prices_test.go +++ b/x/vpool/keeper/prices_test.go @@ -17,12 +17,12 @@ import ( func TestGetUnderlyingPrice(t *testing.T) { tests := []struct { name string - pair common.TokenPair + pair common.AssetPair pricefeedPrice sdk.Dec }{ { name: "correctly fetch underlying price", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, pricefeedPrice: sdk.NewDec(40000), }, } @@ -57,21 +57,21 @@ func TestGetUnderlyingPrice(t *testing.T) { func TestGetSpotPrice(t *testing.T) { tests := []struct { name string - pair common.TokenPair + pair common.AssetPair quoteAssetReserve sdk.Dec baseAssetReserve sdk.Dec expectedPrice sdk.Dec }{ { name: "correctly fetch underlying price", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, quoteAssetReserve: sdk.NewDec(40_000), baseAssetReserve: sdk.NewDec(1), expectedPrice: sdk.NewDec(40000), }, { name: "complex price", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, quoteAssetReserve: sdk.NewDec(2_489_723_947), baseAssetReserve: sdk.NewDec(34_597_234), expectedPrice: sdk.MustNewDecFromStr("71.963092396345904415"), @@ -86,7 +86,7 @@ func TestGetSpotPrice(t *testing.T) { vpoolKeeper.CreatePool( ctx, - tc.pair.String(), + tc.pair, /*tradeLimitRatio=*/ sdk.OneDec(), tc.quoteAssetReserve, tc.baseAssetReserve, @@ -104,7 +104,7 @@ func TestGetSpotPrice(t *testing.T) { func TestGetBaseAssetPrice(t *testing.T) { tests := []struct { name string - pair common.TokenPair + pair common.AssetPair quoteAssetReserve sdk.Dec baseAssetReserve sdk.Dec baseAmount sdk.Dec @@ -114,7 +114,7 @@ func TestGetBaseAssetPrice(t *testing.T) { }{ { name: "zero base asset means zero price", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, quoteAssetReserve: sdk.NewDec(40_000), baseAssetReserve: sdk.NewDec(10_000), baseAmount: sdk.ZeroDec(), @@ -123,7 +123,7 @@ func TestGetBaseAssetPrice(t *testing.T) { }, { name: "simple add base to pool", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, baseAssetReserve: sdk.NewDec(1000), quoteAssetReserve: sdk.NewDec(1000), baseAmount: sdk.MustNewDecFromStr("500"), @@ -132,7 +132,7 @@ func TestGetBaseAssetPrice(t *testing.T) { }, { name: "simple remove base from pool", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, baseAssetReserve: sdk.NewDec(1000), quoteAssetReserve: sdk.NewDec(1000), baseAmount: sdk.MustNewDecFromStr("500"), @@ -141,7 +141,7 @@ func TestGetBaseAssetPrice(t *testing.T) { }, { name: "too much base removed results in error", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, baseAssetReserve: sdk.NewDec(1000), quoteAssetReserve: sdk.NewDec(1000), baseAmount: sdk.MustNewDecFromStr("1000"), @@ -158,7 +158,7 @@ func TestGetBaseAssetPrice(t *testing.T) { vpoolKeeper.CreatePool( ctx, - tc.pair.String(), + tc.pair, /*tradeLimitRatio=*/ sdk.OneDec(), tc.quoteAssetReserve, tc.baseAssetReserve, @@ -183,7 +183,7 @@ func TestGetBaseAssetPrice(t *testing.T) { func TestGetQuoteAssetPrice(t *testing.T) { tests := []struct { name string - pair common.TokenPair + pair common.AssetPair quoteAssetReserve sdk.Dec baseAssetReserve sdk.Dec quoteAmount sdk.Dec @@ -193,7 +193,7 @@ func TestGetQuoteAssetPrice(t *testing.T) { }{ { name: "zero base asset means zero price", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, quoteAssetReserve: sdk.NewDec(40_000), baseAssetReserve: sdk.NewDec(10_000), quoteAmount: sdk.ZeroDec(), @@ -202,7 +202,7 @@ func TestGetQuoteAssetPrice(t *testing.T) { }, { name: "simple add base to pool", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, baseAssetReserve: sdk.NewDec(1000), quoteAssetReserve: sdk.NewDec(1000), quoteAmount: sdk.NewDec(500), @@ -211,7 +211,7 @@ func TestGetQuoteAssetPrice(t *testing.T) { }, { name: "simple remove base from pool", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, baseAssetReserve: sdk.NewDec(1000), quoteAssetReserve: sdk.NewDec(1000), quoteAmount: sdk.NewDec(500), @@ -220,7 +220,7 @@ func TestGetQuoteAssetPrice(t *testing.T) { }, { name: "too much base removed results in error", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, baseAssetReserve: sdk.NewDec(1000), quoteAssetReserve: sdk.NewDec(1000), quoteAmount: sdk.NewDec(1000), @@ -237,7 +237,7 @@ func TestGetQuoteAssetPrice(t *testing.T) { vpoolKeeper.CreatePool( ctx, - tc.pair.String(), + tc.pair, /*tradeLimitRatio=*/ sdk.OneDec(), tc.quoteAssetReserve, tc.baseAssetReserve, @@ -262,7 +262,7 @@ func TestGetQuoteAssetPrice(t *testing.T) { func TestCalcTwap(t *testing.T) { tests := []struct { name string - pair common.TokenPair + pair common.AssetPair reserveSnapshots []types.ReserveSnapshot currentBlocktime time.Time currentBlockheight int64 @@ -275,7 +275,7 @@ func TestCalcTwap(t *testing.T) { }{ { name: "spot price twap calc, t=[10,30]", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, reserveSnapshots: []types.ReserveSnapshot{ { QuoteAssetReserve: sdk.NewDec(90), @@ -304,7 +304,7 @@ func TestCalcTwap(t *testing.T) { }, { name: "spot price twap calc, t=[11,35]", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, reserveSnapshots: []types.ReserveSnapshot{ { QuoteAssetReserve: sdk.NewDec(90), @@ -333,7 +333,7 @@ func TestCalcTwap(t *testing.T) { }, { name: "quote asset swap twap calc, add to pool, t=[10,30]", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, reserveSnapshots: []types.ReserveSnapshot{ { QuoteAssetReserve: sdk.NewDec(30), @@ -358,7 +358,7 @@ func TestCalcTwap(t *testing.T) { }, { name: "quote asset swap twap calc, remove from pool, t=[10,30]", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, reserveSnapshots: []types.ReserveSnapshot{ { QuoteAssetReserve: sdk.NewDec(60), @@ -383,7 +383,7 @@ func TestCalcTwap(t *testing.T) { }, { name: "base asset swap twap calc, add to pool, t=[10,30]", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, reserveSnapshots: []types.ReserveSnapshot{ { QuoteAssetReserve: sdk.NewDec(60), @@ -408,7 +408,7 @@ func TestCalcTwap(t *testing.T) { }, { name: "base asset swap twap calc, remove from pool, t=[10,30]", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, reserveSnapshots: []types.ReserveSnapshot{ { QuoteAssetReserve: sdk.NewDec(60), @@ -443,7 +443,7 @@ func TestCalcTwap(t *testing.T) { t.Log("Create an empty pool for the first block, it's snapshot won't be used") vpoolKeeper.CreatePool( ctx, - tc.pair.String(), + tc.pair, sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec(), diff --git a/x/vpool/keeper/query_server.go b/x/vpool/keeper/query_server.go index 9259e8376..4205ca1db 100644 --- a/x/vpool/keeper/query_server.go +++ b/x/vpool/keeper/query_server.go @@ -31,7 +31,7 @@ func (q queryServer) ReserveAssets( ctx := sdk.UnwrapSDKContext(goCtx) - tokenPair, err := common.NewTokenPairFromStr(req.Pair) + tokenPair, err := common.NewAssetPairFromStr(req.Pair) if err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) } diff --git a/x/vpool/keeper/query_server_test.go b/x/vpool/keeper/query_server_test.go index dae8f300b..fbe9c1823 100644 --- a/x/vpool/keeper/query_server_test.go +++ b/x/vpool/keeper/query_server_test.go @@ -21,7 +21,7 @@ func TestQueryReserveAssets(t *testing.T) { t.Log("initialize vpool") pool := types.NewPool( - /* pair */ "BTC:NUSD", + /* pair */ BTCNusdPair, /* tradeLimitRatio */ sdk.ZeroDec(), /* quoteAmount */ sdk.NewDec(1_000_000), /* baseAmount */ sdk.NewDec(1000), diff --git a/x/vpool/keeper/snapshot.go b/x/vpool/keeper/snapshot.go index a2565a38c..eb2b0f854 100644 --- a/x/vpool/keeper/snapshot.go +++ b/x/vpool/keeper/snapshot.go @@ -13,7 +13,7 @@ import ( // addReserveSnapshot adds a snapshot of the current pool status and blocktime and blocknum. func (k Keeper) addReserveSnapshot( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, quoteAssetReserve sdk.Dec, baseAssetReserve sdk.Dec, ) error { @@ -43,7 +43,7 @@ func (k Keeper) addReserveSnapshot( } // getSnapshot returns the snapshot saved by counter num -func (k Keeper) getSnapshot(ctx sdk.Context, pair common.TokenPair, counter uint64) ( +func (k Keeper) getSnapshot(ctx sdk.Context, pair common.AssetPair, counter uint64) ( snapshot types.ReserveSnapshot, err error, ) { bz := ctx.KVStore(k.storeKey).Get(types.GetSnapshotKey(pair, counter)) @@ -59,7 +59,7 @@ func (k Keeper) getSnapshot(ctx sdk.Context, pair common.TokenPair, counter uint func (k Keeper) saveSnapshot( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, counter uint64, quoteAssetReserve sdk.Dec, baseAssetReserve sdk.Dec, @@ -81,7 +81,7 @@ func (k Keeper) saveSnapshot( } // getSnapshotCounter returns the counter and if it has been found or not. -func (k Keeper) getSnapshotCounter(ctx sdk.Context, pair common.TokenPair) ( +func (k Keeper) getSnapshotCounter(ctx sdk.Context, pair common.AssetPair) ( snapshotCounter uint64, found bool, ) { bz := ctx.KVStore(k.storeKey).Get(types.GetSnapshotCounterKey(pair)) @@ -94,7 +94,7 @@ func (k Keeper) getSnapshotCounter(ctx sdk.Context, pair common.TokenPair) ( func (k Keeper) saveSnapshotCounter( ctx sdk.Context, - pair common.TokenPair, + pair common.AssetPair, counter uint64, ) { ctx.KVStore(k.storeKey).Set( @@ -104,7 +104,7 @@ func (k Keeper) saveSnapshotCounter( } // getLatestReserveSnapshot returns the last snapshot that was saved -func (k Keeper) getLatestReserveSnapshot(ctx sdk.Context, pair common.TokenPair) ( +func (k Keeper) getLatestReserveSnapshot(ctx sdk.Context, pair common.AssetPair) ( snapshot types.ReserveSnapshot, counter uint64, err error, ) { counter, found := k.getSnapshotCounter(ctx, pair) @@ -130,7 +130,7 @@ BASE_ASSET_SWAP: price when swapping x amount of base assets */ type snapshotPriceOptions struct { // required - pair common.TokenPair + pair common.AssetPair twapCalcOption types.TwapCalcOption // required only if twapCalcOption == QUOTE_ASSET_SWAP or BASE_ASSET_SWAP @@ -166,7 +166,7 @@ func getPriceWithSnapshot( case types.TwapCalcOption_QUOTE_ASSET_SWAP: pool := types.NewPool( - snapshotPriceOpts.pair.String(), + snapshotPriceOpts.pair, sdk.OneDec(), snapshot.QuoteAssetReserve, snapshot.BaseAssetReserve, @@ -177,7 +177,7 @@ func getPriceWithSnapshot( case types.TwapCalcOption_BASE_ASSET_SWAP: pool := types.NewPool( - snapshotPriceOpts.pair.String(), + snapshotPriceOpts.pair, sdk.OneDec(), snapshot.QuoteAssetReserve, snapshot.BaseAssetReserve, diff --git a/x/vpool/keeper/snapshot_test.go b/x/vpool/keeper/snapshot_test.go index 918fb22e1..86b1a3c5a 100644 --- a/x/vpool/keeper/snapshot_test.go +++ b/x/vpool/keeper/snapshot_test.go @@ -21,10 +21,10 @@ func TestKeeper_saveOrGetReserveSnapshotFailsIfNotSnapshotSavedBefore(t *testing pool := getSamplePool() - err := vpoolKeeper.addReserveSnapshot(ctx, common.TokenPair(pool.Pair), pool.QuoteAssetReserve, pool.BaseAssetReserve) + err := vpoolKeeper.addReserveSnapshot(ctx, pool.GetAssetPair(), pool.QuoteAssetReserve, pool.BaseAssetReserve) require.Error(t, err, types.ErrNoLastSnapshotSaved) - _, _, err = vpoolKeeper.getLatestReserveSnapshot(ctx, NUSDPair) + _, _, err = vpoolKeeper.getLatestReserveSnapshot(ctx, BTCNusdPair) require.Error(t, err, types.ErrNoLastSnapshotSaved) } @@ -44,10 +44,10 @@ func TestKeeper_SaveSnapshot(t *testing.T) { mock.NewMockPricefeedKeeper(gomock.NewController(t)), ) ctx = ctx.WithBlockHeight(expectedBlockHeight).WithBlockTime(expectedTime) - vpoolKeeper.saveSnapshot(ctx, common.TokenPair(pool.Pair), 0, pool.QuoteAssetReserve, pool.BaseAssetReserve, expectedTime, expectedBlockHeight) - vpoolKeeper.saveSnapshotCounter(ctx, common.TokenPair(pool.Pair), 0) + vpoolKeeper.saveSnapshot(ctx, pool.GetAssetPair(), 0, pool.QuoteAssetReserve, pool.BaseAssetReserve, expectedTime, expectedBlockHeight) + vpoolKeeper.saveSnapshotCounter(ctx, pool.GetAssetPair(), 0) - snapshot, counter, err := vpoolKeeper.getLatestReserveSnapshot(ctx, NUSDPair) + snapshot, counter, err := vpoolKeeper.getLatestReserveSnapshot(ctx, BTCNusdPair) require.NoError(t, err) require.Equal(t, expectedSnapshot, snapshot) require.Equal(t, uint64(0), counter) @@ -74,18 +74,18 @@ func TestNewKeeper_getSnapshot(t *testing.T) { t.Log("Save snapshot 0") vpoolKeeper.saveSnapshot( ctx, - common.TokenPair(pool.Pair), + pool.GetAssetPair(), 0, pool.QuoteAssetReserve, pool.BaseAssetReserve, expectedTime, expectedHeight, ) - vpoolKeeper.saveSnapshotCounter(ctx, common.TokenPair(pool.Pair), 0) + vpoolKeeper.saveSnapshotCounter(ctx, pool.GetAssetPair(), 0) t.Log("Check snapshot 0") requireLastSnapshotCounterEqual(t, ctx, vpoolKeeper, pool, 0) - oldSnapshot, counter, err := vpoolKeeper.getLatestReserveSnapshot(ctx, common.TokenPair(pool.Pair)) + oldSnapshot, counter, err := vpoolKeeper.getLatestReserveSnapshot(ctx, pool.GetAssetPair()) require.NoError(t, err) require.Equal(t, firstSnapshot, oldSnapshot) require.Equal(t, uint64(0), counter) @@ -98,7 +98,7 @@ func TestNewKeeper_getSnapshot(t *testing.T) { pool.BaseAssetReserve = differentSnapshot.BaseAssetReserve vpoolKeeper.saveSnapshot( ctx, - common.TokenPair(pool.Pair), + pool.GetAssetPair(), 1, pool.QuoteAssetReserve, pool.BaseAssetReserve, @@ -107,14 +107,14 @@ func TestNewKeeper_getSnapshot(t *testing.T) { ) t.Log("Fetch snapshot 1") - newSnapshot, err := vpoolKeeper.getSnapshot(ctx, common.TokenPair(pool.Pair), 1) + newSnapshot, err := vpoolKeeper.getSnapshot(ctx, pool.GetAssetPair(), 1) require.NoError(t, err) require.Equal(t, differentSnapshot, newSnapshot) require.NotEqual(t, differentSnapshot, oldSnapshot) } func requireLastSnapshotCounterEqual(t *testing.T, ctx sdk.Context, keeper Keeper, pool *types.Pool, counter uint64) { - c, found := keeper.getSnapshotCounter(ctx, common.TokenPair(pool.Pair)) + c, found := keeper.getSnapshotCounter(ctx, pool.GetAssetPair()) require.True(t, found) require.Equal(t, counter, c) } @@ -122,7 +122,7 @@ func requireLastSnapshotCounterEqual(t *testing.T, ctx sdk.Context, keeper Keepe func TestGetSnapshotPrice(t *testing.T) { tests := []struct { name string - pair common.TokenPair + pair common.AssetPair quoteAssetReserve sdk.Dec baseAssetReserve sdk.Dec twapCalcOption types.TwapCalcOption @@ -132,7 +132,7 @@ func TestGetSnapshotPrice(t *testing.T) { }{ { name: "spot price calc", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, quoteAssetReserve: sdk.NewDec(40_000), baseAssetReserve: sdk.NewDec(2), twapCalcOption: types.TwapCalcOption_SPOT, @@ -140,7 +140,7 @@ func TestGetSnapshotPrice(t *testing.T) { }, { name: "quote asset swap add to pool calc", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, quoteAssetReserve: sdk.NewDec(3_000), baseAssetReserve: sdk.NewDec(1_000), twapCalcOption: types.TwapCalcOption_QUOTE_ASSET_SWAP, @@ -150,7 +150,7 @@ func TestGetSnapshotPrice(t *testing.T) { }, { name: "quote asset swap remove from pool calc", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, quoteAssetReserve: sdk.NewDec(3_000), baseAssetReserve: sdk.NewDec(1_000), twapCalcOption: types.TwapCalcOption_QUOTE_ASSET_SWAP, @@ -160,7 +160,7 @@ func TestGetSnapshotPrice(t *testing.T) { }, { name: "base asset swap add to pool calc", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, quoteAssetReserve: sdk.NewDec(3_000), baseAssetReserve: sdk.NewDec(1_000), twapCalcOption: types.TwapCalcOption_BASE_ASSET_SWAP, @@ -170,7 +170,7 @@ func TestGetSnapshotPrice(t *testing.T) { }, { name: "base asset swap remove from pool calc", - pair: common.TokenPair("btc:nusd"), + pair: BTCNusdPair, quoteAssetReserve: sdk.NewDec(3_000), baseAssetReserve: sdk.NewDec(1_000), twapCalcOption: types.TwapCalcOption_BASE_ASSET_SWAP, diff --git a/x/vpool/keeper/util_test.go b/x/vpool/keeper/util_test.go index 2762960a4..8b8c1fd20 100644 --- a/x/vpool/keeper/util_test.go +++ b/x/vpool/keeper/util_test.go @@ -12,10 +12,20 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmdb "github.com/tendermint/tm-db" + "github.com/NibiruChain/nibiru/x/common" + "github.com/NibiruChain/nibiru/x/vpool/types" ) -const NUSDPair = "BTC:NUSD" +var BTCNusdPair = common.AssetPair{ + Token0: "BTC", + Token1: "NUSD", +} + +var ETHNusdPair = common.AssetPair{ + Token0: "ETH", + Token1: "NUSD", +} func VpoolKeeper(t *testing.T, pricefeedKeeper types.PricefeedKeeper) ( vpoolKeeper Keeper, ctx sdk.Context, @@ -43,7 +53,7 @@ func getSamplePool() *types.Pool { maxOracleSpreadRatio := sdk.MustNewDecFromStr("0.1") pool := types.NewPool( - NUSDPair, + BTCNusdPair, ratioLimit, sdk.NewDec(10_000_000), sdk.NewDec(5_000_000), diff --git a/x/vpool/types/keys.go b/x/vpool/types/keys.go index fb55b0d0d..9a74d4559 100644 --- a/x/vpool/types/keys.go +++ b/x/vpool/types/keys.go @@ -25,21 +25,21 @@ var ( ) // GetPoolKey returns pool key for KVStore -func GetPoolKey(pair common.TokenPair) []byte { - return append(PoolKey, []byte(pair)...) +func GetPoolKey(pair common.AssetPair) []byte { + return append(PoolKey, []byte(pair.String())...) } // GetSnapshotCounterKey returns the KVStore for the Snapshot Pool counters. -func GetSnapshotCounterKey(pair common.TokenPair) []byte { - return append(PoolReserveSnapshotCounter, []byte(pair)...) +func GetSnapshotCounterKey(pair common.AssetPair) []byte { + return append(PoolReserveSnapshotCounter, []byte(pair.String())...) } // GetSnapshotKey returns the KVStore for the pool reserve snapshots. -func GetSnapshotKey(pair common.TokenPair, counter uint64) []byte { +func GetSnapshotKey(pair common.AssetPair, counter uint64) []byte { return append( PoolReserveSnapshots, append( - []byte(pair), + []byte(pair.String()), sdk.Uint64ToBigEndian(counter)..., )..., ) diff --git a/x/vpool/types/pool.go b/x/vpool/types/pool.go index 13865dd2b..4375ec57f 100644 --- a/x/vpool/types/pool.go +++ b/x/vpool/types/pool.go @@ -2,10 +2,12 @@ package types import ( sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/NibiruChain/nibiru/x/common" ) func NewPool( - pair string, + pair common.AssetPair, tradeLimitRatio sdk.Dec, quoteAssetReserve sdk.Dec, baseAssetReserve sdk.Dec, @@ -13,7 +15,7 @@ func NewPool( maxOracleSpreadRatio sdk.Dec, ) *Pool { return &Pool{ - Pair: pair, + Pair: pair.String(), BaseAssetReserve: baseAssetReserve, QuoteAssetReserve: quoteAssetReserve, TradeLimitRatio: tradeLimitRatio, @@ -22,6 +24,15 @@ func NewPool( } } +func (p *Pool) GetAssetPair() common.AssetPair { + pair, err := common.NewAssetPairFromStr(p.Pair) + if err != nil { + panic(err) + } + + return pair +} + // HasEnoughQuoteReserve returns true if there is enough quote reserve based on // quoteReserve * tradeLimitRatio func (p *Pool) HasEnoughQuoteReserve(quoteAmount sdk.Dec) bool { diff --git a/x/vpool/types/pool_test.go b/x/vpool/types/pool_test.go index e518fbd2e..c9de5df05 100644 --- a/x/vpool/types/pool_test.go +++ b/x/vpool/types/pool_test.go @@ -5,11 +5,16 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" + + "github.com/NibiruChain/nibiru/x/common" ) func TestPoolHasEnoughQuoteReserve(t *testing.T) { + pair, err := common.NewAssetPairFromStr("BTC:NUSD") + require.NoError(t, err) + pool := NewPool( - "BTC:NUSD", + pair, sdk.MustNewDecFromStr("0.9"), // 0.9 sdk.NewDec(10_000_000), // 10 sdk.NewDec(10_000_000), // 10 @@ -28,6 +33,9 @@ func TestPoolHasEnoughQuoteReserve(t *testing.T) { } func TestGetBaseAmountByQuoteAmount(t *testing.T) { + pair, err := common.NewAssetPairFromStr("BTC:NUSD") + require.NoError(t, err) + tests := []struct { name string baseAssetReserve sdk.Dec @@ -75,7 +83,7 @@ func TestGetBaseAmountByQuoteAmount(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { pool := NewPool( - /*pair=*/ "BTC:NUSD", + /*pair=*/ pair, /*tradeLimitRatio=*/ sdk.MustNewDecFromStr("0.9"), /*quoteAssetReserve=*/ tc.quoteAssetReserve, /*baseAssetReserve=*/ tc.baseAssetReserve, @@ -98,6 +106,9 @@ func TestGetBaseAmountByQuoteAmount(t *testing.T) { } func TestGetQuoteAmountByBaseAmount(t *testing.T) { + pair, err := common.NewAssetPairFromStr("BTC:NUSD") + require.NoError(t, err) + tests := []struct { name string baseAssetReserve sdk.Dec @@ -145,7 +156,7 @@ func TestGetQuoteAmountByBaseAmount(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { pool := NewPool( - /*pair=*/ "BTC:NUSD", + /*pair=*/ pair, /*tradeLimitRatio=*/ sdk.OneDec(), /*quoteAssetReserve=*/ tc.quoteAssetReserve, /*baseAssetReserve=*/ tc.baseAssetReserve, @@ -168,8 +179,11 @@ func TestGetQuoteAmountByBaseAmount(t *testing.T) { } func TestIncreaseDecreaseReserves(t *testing.T) { + pair, err := common.NewAssetPairFromStr("ATOM:NUSD") + require.NoError(t, err) + pool := NewPool( - "ATOM:NUSD", + pair, /*tradeLimitRatio=*/ sdk.MustNewDecFromStr("0.9"), /*quoteAssetReserve=*/ sdk.NewDec(1_000_000), /*baseAssetReserve*/ sdk.NewDec(1_000_000), diff --git a/x/vpool/types/vpool.pb.go b/x/vpool/types/vpool.pb.go index edd766239..2d5353ad7 100644 --- a/x/vpool/types/vpool.pb.go +++ b/x/vpool/types/vpool.pb.go @@ -4,14 +4,15 @@ package types import ( - fmt "fmt" + "fmt" + "io" + "math" + math_bits "math/bits" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + "github.com/gogo/protobuf/proto" _ "github.com/regen-network/cosmos-proto" - io "io" - math "math" - math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used.