From a78c68b0f012c79cf352f38171a06d126bd78637 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Wed, 6 Mar 2024 18:16:20 -0500 Subject: [PATCH 1/5] wip upgrade handler Signed-off-by: Shrenuj Bansal --- protocol/app/upgrades.go | 15 +++++++ protocol/app/upgrades/v5.0.0/constants.go | 17 ++++++++ protocol/app/upgrades/v5.0.0/upgrade.go | 52 +++++++++++++++++++++++ protocol/x/perpetuals/keeper/perpetual.go | 28 ++++++++++++ protocol/x/perpetuals/types/types.go | 8 ++++ 5 files changed, 120 insertions(+) create mode 100644 protocol/app/upgrades/v5.0.0/constants.go create mode 100644 protocol/app/upgrades/v5.0.0/upgrade.go diff --git a/protocol/app/upgrades.go b/protocol/app/upgrades.go index 41d69b8577..884ef32fc2 100644 --- a/protocol/app/upgrades.go +++ b/protocol/app/upgrades.go @@ -3,6 +3,8 @@ package app import ( "fmt" + v5_0_0 "github.com/dydxprotocol/v4-chain/protocol/app/upgrades/v5.0.0" + upgradetypes "cosmossdk.io/x/upgrade/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/dydxprotocol/v4-chain/protocol/app/upgrades" @@ -14,6 +16,7 @@ var ( // New upgrades should be added to this slice after they are implemented. Upgrades = []upgrades.Upgrade{ v4_0_0.Upgrade, + v5_0_0.Upgrade, } Forks = []upgrades.Fork{} ) @@ -32,6 +35,18 @@ func (app *App) setupUpgradeHandlers() { app.RatelimitKeeper, ), ) + + if app.UpgradeKeeper.HasHandler(v5_0_0.UpgradeName) { + panic(fmt.Sprintf("Cannot register duplicate upgrade handler '%s'", v5_0_0.UpgradeName)) + } + app.UpgradeKeeper.SetUpgradeHandler( + v5_0_0.UpgradeName, + v5_0_0.CreateUpgradeHandler( + app.ModuleManager, + app.configurator, + app.PerpetualsKeeper, + ), + ) } // setUpgradeStoreLoaders sets custom store loaders to customize the rootMultiStore diff --git a/protocol/app/upgrades/v5.0.0/constants.go b/protocol/app/upgrades/v5.0.0/constants.go new file mode 100644 index 0000000000..b79bf75d31 --- /dev/null +++ b/protocol/app/upgrades/v5.0.0/constants.go @@ -0,0 +1,17 @@ +package v5_0_0 + +import ( + store "cosmossdk.io/store/types" + "github.com/dydxprotocol/v4-chain/protocol/app/upgrades" +) + +const ( + UpgradeName = "v5.0.0" +) + +var Upgrade = upgrades.Upgrade{ + UpgradeName: UpgradeName, + StoreUpgrades: store.StoreUpgrades{ + Added: []string{}, + }, +} diff --git a/protocol/app/upgrades/v5.0.0/upgrade.go b/protocol/app/upgrades/v5.0.0/upgrade.go new file mode 100644 index 0000000000..693547a14e --- /dev/null +++ b/protocol/app/upgrades/v5.0.0/upgrade.go @@ -0,0 +1,52 @@ +package v5_0_0 + +import ( + "context" + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + + perptypes "github.com/dydxprotocol/v4-chain/protocol/x/perpetuals/types" + + upgradetypes "cosmossdk.io/x/upgrade/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/dydxprotocol/v4-chain/protocol/lib" +) + +// Set all existing perpetuals to cross market type +func perpetualsUpgrade( + ctx sdk.Context, + perpetualsKeeper perptypes.PerpetualsKeeper, +) error { + + // Set all perpetuals to cross market type + perpetuals, err := perpetualsKeeper.GetAllPerpetuals(ctx) + if err != nil { + panic(fmt.Sprintf("failed to get all perpetuals: %s", err)) + } + for _, p := range perpetuals { + _, err = perpetualsKeeper.SetPerpetualMarketType(ctx, p.GetId(), + perptypes.PerpetualMarketType_PERPETUAL_MARKET_TYPE_CROSS) + if err != nil { + panic(fmt.Sprintf("failed to set perpetual market type for perpetual %d: %s", p.GetId(), err)) + } + } + + return nil +} + +func CreateUpgradeHandler( + mm *module.Manager, + configurator module.Configurator, + perpetualsKeeper perptypes.PerpetualsKeeper, +) upgradetypes.UpgradeHandler { + return func(ctx context.Context, plan upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { + sdkCtx := lib.UnwrapSDKContext(ctx, "app/upgrades") + sdkCtx.Logger().Info(fmt.Sprintf("Running %s Upgrade...", UpgradeName)) + + // Set all perpetuals to cross market type + perpetualsUpgrade(sdkCtx, perpetualsKeeper) + + return mm.RunMigrations(ctx, configurator, vm) + } +} diff --git a/protocol/x/perpetuals/keeper/perpetual.go b/protocol/x/perpetuals/keeper/perpetual.go index eda836e508..cdeb64e590 100644 --- a/protocol/x/perpetuals/keeper/perpetual.go +++ b/protocol/x/perpetuals/keeper/perpetual.go @@ -185,6 +185,34 @@ func (k Keeper) ModifyPerpetual( return perpetual, nil } +func (k Keeper) SetPerpetualMarketType( + ctx sdk.Context, + perpetualId uint32, + marketType types.PerpetualMarketType, +) (types.Perpetual, error) { + + if marketType == types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_UNSPECIFIED { + return types.Perpetual{}, errorsmod.Wrap( + types.ErrInvalidMarketType, + fmt.Sprintf("market type %v", marketType), + ) + } + + // Get perpetual. + perpetual, err := k.GetPerpetual(ctx, perpetualId) + if err != nil { + return perpetual, err + } + + // Modify perpetual. + perpetual.Params.MarketType = marketType + + // Store the modified perpetual. + k.setPerpetual(ctx, perpetual) + + return perpetual, nil +} + // GetPerpetual returns a perpetual from its id. func (k Keeper) GetPerpetual( ctx sdk.Context, diff --git a/protocol/x/perpetuals/types/types.go b/protocol/x/perpetuals/types/types.go index 7b7489cf06..b6c2d895c5 100644 --- a/protocol/x/perpetuals/types/types.go +++ b/protocol/x/perpetuals/types/types.go @@ -101,4 +101,12 @@ type PerpetualsKeeper interface { ctx sdk.Context, params Params, ) error + SetPerpetualMarketType( + ctx sdk.Context, + id uint32, + marketType PerpetualMarketType, + ) (Perpetual, error) + GetAllPerpetuals( + ctx sdk.Context, + ) []Perpetual } From 142696a633b0d286a810dbd820cf9a089f0d9829 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Thu, 7 Mar 2024 18:55:29 -0500 Subject: [PATCH 2/5] fix lint and gen mocks Signed-off-by: Shrenuj Bansal --- protocol/app/upgrades/v5.0.0/upgrade.go | 5 +-- protocol/mocks/PerpetualsKeeper.go | 40 +++++++++++++++++++++++ protocol/x/perpetuals/keeper/perpetual.go | 1 - 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/protocol/app/upgrades/v5.0.0/upgrade.go b/protocol/app/upgrades/v5.0.0/upgrade.go index b3326fe4e2..56f78e72c5 100644 --- a/protocol/app/upgrades/v5.0.0/upgrade.go +++ b/protocol/app/upgrades/v5.0.0/upgrade.go @@ -17,8 +17,7 @@ import ( func perpetualsUpgrade( ctx sdk.Context, perpetualsKeeper perptypes.PerpetualsKeeper, -) error { - +) { // Set all perpetuals to cross market type perpetuals := perpetualsKeeper.GetAllPerpetuals(ctx) for _, p := range perpetuals { @@ -29,8 +28,6 @@ func perpetualsUpgrade( panic(fmt.Sprintf("failed to set perpetual market type for perpetual %d: %s", p.GetId(), err)) } } - - return nil } func CreateUpgradeHandler( diff --git a/protocol/mocks/PerpetualsKeeper.go b/protocol/mocks/PerpetualsKeeper.go index 46a4afac45..a82605b354 100644 --- a/protocol/mocks/PerpetualsKeeper.go +++ b/protocol/mocks/PerpetualsKeeper.go @@ -70,6 +70,22 @@ func (_m *PerpetualsKeeper) GetAddPremiumVotes(ctx types.Context) *perpetualstyp return r0 } +// GetAllPerpetuals provides a mock function with given fields: ctx +func (_m *PerpetualsKeeper) GetAllPerpetuals(ctx types.Context) []perpetualstypes.Perpetual { + ret := _m.Called(ctx) + + var r0 []perpetualstypes.Perpetual + if rf, ok := ret.Get(0).(func(types.Context) []perpetualstypes.Perpetual); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]perpetualstypes.Perpetual) + } + } + + return r0 +} + // GetMarginRequirements provides a mock function with given fields: ctx, id, bigQuantums func (_m *PerpetualsKeeper) GetMarginRequirements(ctx types.Context, id uint32, bigQuantums *big.Int) (*big.Int, *big.Int, error) { ret := _m.Called(ctx, id, bigQuantums) @@ -283,6 +299,30 @@ func (_m *PerpetualsKeeper) SetParams(ctx types.Context, params perpetualstypes. return r0 } +// SetPerpetualMarketType provides a mock function with given fields: ctx, id, marketType +func (_m *PerpetualsKeeper) SetPerpetualMarketType(ctx types.Context, id uint32, marketType perpetualstypes.PerpetualMarketType) (perpetualstypes.Perpetual, error) { + ret := _m.Called(ctx, id, marketType) + + var r0 perpetualstypes.Perpetual + var r1 error + if rf, ok := ret.Get(0).(func(types.Context, uint32, perpetualstypes.PerpetualMarketType) (perpetualstypes.Perpetual, error)); ok { + return rf(ctx, id, marketType) + } + if rf, ok := ret.Get(0).(func(types.Context, uint32, perpetualstypes.PerpetualMarketType) perpetualstypes.Perpetual); ok { + r0 = rf(ctx, id, marketType) + } else { + r0 = ret.Get(0).(perpetualstypes.Perpetual) + } + + if rf, ok := ret.Get(1).(func(types.Context, uint32, perpetualstypes.PerpetualMarketType) error); ok { + r1 = rf(ctx, id, marketType) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + type mockConstructorTestingTNewPerpetualsKeeper interface { mock.TestingT Cleanup(func()) diff --git a/protocol/x/perpetuals/keeper/perpetual.go b/protocol/x/perpetuals/keeper/perpetual.go index dc0f0e9b31..3cb063d3de 100644 --- a/protocol/x/perpetuals/keeper/perpetual.go +++ b/protocol/x/perpetuals/keeper/perpetual.go @@ -191,7 +191,6 @@ func (k Keeper) SetPerpetualMarketType( perpetualId uint32, marketType types.PerpetualMarketType, ) (types.Perpetual, error) { - if marketType == types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_UNSPECIFIED { return types.Perpetual{}, errorsmod.Wrap( types.ErrInvalidMarketType, From 321628db50c3694e7a6793da96b6f203494fe250 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Fri, 8 Mar 2024 13:55:26 -0500 Subject: [PATCH 3/5] address comments, add tests Signed-off-by: Shrenuj Bansal --- protocol/app/upgrades/v5.0.0/constants.go | 1 - protocol/x/perpetuals/keeper/perpetual.go | 2 +- .../x/perpetuals/keeper/perpetual_test.go | 44 +++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/protocol/app/upgrades/v5.0.0/constants.go b/protocol/app/upgrades/v5.0.0/constants.go index a0cc60328c..a71c343553 100644 --- a/protocol/app/upgrades/v5.0.0/constants.go +++ b/protocol/app/upgrades/v5.0.0/constants.go @@ -14,7 +14,6 @@ const ( var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, StoreUpgrades: store.StoreUpgrades{ - Added: []string{ vaulttypes.StoreKey, }, diff --git a/protocol/x/perpetuals/keeper/perpetual.go b/protocol/x/perpetuals/keeper/perpetual.go index 3cb063d3de..3c3c02476e 100644 --- a/protocol/x/perpetuals/keeper/perpetual.go +++ b/protocol/x/perpetuals/keeper/perpetual.go @@ -194,7 +194,7 @@ func (k Keeper) SetPerpetualMarketType( if marketType == types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_UNSPECIFIED { return types.Perpetual{}, errorsmod.Wrap( types.ErrInvalidMarketType, - fmt.Sprintf("market type %v", marketType), + fmt.Sprintf("invalid market type %v for perpetual %d", marketType, perpetualId), ) } diff --git a/protocol/x/perpetuals/keeper/perpetual_test.go b/protocol/x/perpetuals/keeper/perpetual_test.go index fbae544a07..0142d76a12 100644 --- a/protocol/x/perpetuals/keeper/perpetual_test.go +++ b/protocol/x/perpetuals/keeper/perpetual_test.go @@ -320,6 +320,50 @@ func TestModifyPerpetual_Failure(t *testing.T) { } } +func TestSetPerpetualMarketType_Success(t *testing.T) { + pc := keepertest.PerpetualsKeepers(t) + // Create liquidity tiers and perpetuals, + perp := keepertest.CreateLiquidityTiersAndNPerpetuals(t, pc.Ctx, pc.PerpetualsKeeper, pc.PricesKeeper, 1)[0] + + _, err := pc.PerpetualsKeeper.SetPerpetualMarketType( + pc.Ctx, + perp.Params.Id, + types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_CROSS, + ) + require.NoError(t, err) + + rst, err := pc.PerpetualsKeeper.GetPerpetual( + pc.Ctx, + perp.Params.Id, + ) + require.NoError(t, err) + require.Equal( + t, + types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_CROSS, + rst.Params.MarketType, + ) +} + +func TestSetPerpetualMarketType_Failure(t *testing.T) { + pc := keepertest.PerpetualsKeepers(t) + // Create liquidity tiers and perpetuals, + perp := keepertest.CreateLiquidityTiersAndNPerpetuals(t, pc.Ctx, pc.PerpetualsKeeper, pc.PricesKeeper, 1)[0] + + _, err := pc.PerpetualsKeeper.SetPerpetualMarketType( + pc.Ctx, + perp.Params.Id, + types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_UNSPECIFIED, + ) + expectedErr := errorsmod.Wrap( + types.ErrInvalidMarketType, + fmt.Sprintf( + "invalid market type %v for perpetual %d", + types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_UNSPECIFIED, perp.GetId(), + ), + ) + require.EqualError(t, err, expectedErr.Error()) +} + func TestGetPerpetual_Success(t *testing.T) { pc := keepertest.PerpetualsKeepers(t) // Create liquidity tiers and perpetuals, From f7d05e31fb128de28adfa3cc7146b927627a1a3a Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Fri, 8 Mar 2024 16:11:46 -0500 Subject: [PATCH 4/5] add restriction to only set type if current is UNSPECIFIED Signed-off-by: Shrenuj Bansal --- protocol/x/perpetuals/keeper/perpetual.go | 17 ++++++++++----- .../x/perpetuals/keeper/perpetual_test.go | 21 ++++++++++++++++++- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/protocol/x/perpetuals/keeper/perpetual.go b/protocol/x/perpetuals/keeper/perpetual.go index 3c3c02476e..0e834bcb40 100644 --- a/protocol/x/perpetuals/keeper/perpetual.go +++ b/protocol/x/perpetuals/keeper/perpetual.go @@ -111,7 +111,7 @@ func (k Keeper) CreatePerpetual( } // Store the new perpetual. - k.setPerpetual(ctx, perpetual) + k.SetPerpetual(ctx, perpetual) k.SetEmptyPremiumSamples(ctx) k.SetEmptyPremiumVotes(ctx) @@ -165,7 +165,7 @@ func (k Keeper) ModifyPerpetual( } // Store the modified perpetual. - k.setPerpetual(ctx, perpetual) + k.SetPerpetual(ctx, perpetual) // Emit indexer event. k.GetIndexerEventManager().AddTxnEvent( @@ -204,11 +204,18 @@ func (k Keeper) SetPerpetualMarketType( return perpetual, err } + if perpetual.Params.MarketType != types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_UNSPECIFIED { + return types.Perpetual{}, errorsmod.Wrap( + types.ErrInvalidMarketType, + fmt.Sprintf("perpetual %d already has market type %v", perpetualId, perpetual.Params.MarketType), + ) + } + // Modify perpetual. perpetual.Params.MarketType = marketType // Store the modified perpetual. - k.setPerpetual(ctx, perpetual) + k.SetPerpetual(ctx, perpetual) return perpetual, nil } @@ -1208,7 +1215,7 @@ func (k Keeper) ModifyFundingIndex( bigFundingIndex.Add(bigFundingIndex, bigFundingIndexDelta) perpetual.FundingIndex = dtypes.NewIntFromBigInt(bigFundingIndex) - k.setPerpetual(ctx, perpetual) + k.SetPerpetual(ctx, perpetual) return nil } @@ -1234,7 +1241,7 @@ func (k Keeper) SetEmptyPremiumVotes( ) } -func (k Keeper) setPerpetual( +func (k Keeper) SetPerpetual( ctx sdk.Context, perpetual types.Perpetual, ) { diff --git a/protocol/x/perpetuals/keeper/perpetual_test.go b/protocol/x/perpetuals/keeper/perpetual_test.go index 0142d76a12..102a4143f9 100644 --- a/protocol/x/perpetuals/keeper/perpetual_test.go +++ b/protocol/x/perpetuals/keeper/perpetual_test.go @@ -324,6 +324,8 @@ func TestSetPerpetualMarketType_Success(t *testing.T) { pc := keepertest.PerpetualsKeepers(t) // Create liquidity tiers and perpetuals, perp := keepertest.CreateLiquidityTiersAndNPerpetuals(t, pc.Ctx, pc.PerpetualsKeeper, pc.PricesKeeper, 1)[0] + perp.Params.MarketType = types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_UNSPECIFIED + pc.PerpetualsKeeper.SetPerpetual(pc.Ctx, perp) _, err := pc.PerpetualsKeeper.SetPerpetualMarketType( pc.Ctx, @@ -344,7 +346,7 @@ func TestSetPerpetualMarketType_Success(t *testing.T) { ) } -func TestSetPerpetualMarketType_Failure(t *testing.T) { +func TestSetPerpetualMarketType_Failure_SettingToUnspecified(t *testing.T) { pc := keepertest.PerpetualsKeepers(t) // Create liquidity tiers and perpetuals, perp := keepertest.CreateLiquidityTiersAndNPerpetuals(t, pc.Ctx, pc.PerpetualsKeeper, pc.PricesKeeper, 1)[0] @@ -364,6 +366,23 @@ func TestSetPerpetualMarketType_Failure(t *testing.T) { require.EqualError(t, err, expectedErr.Error()) } +func TestSetPerpetualMarketType_Failure_MarketTypeAlreadySet(t *testing.T) { + pc := keepertest.PerpetualsKeepers(t) + // Create liquidity tiers and perpetuals, + perp := keepertest.CreateLiquidityTiersAndNPerpetuals(t, pc.Ctx, pc.PerpetualsKeeper, pc.PricesKeeper, 1)[0] + + _, err := pc.PerpetualsKeeper.SetPerpetualMarketType( + pc.Ctx, + perp.Params.Id, + types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_ISOLATED, + ) + expectedErr := errorsmod.Wrap( + types.ErrInvalidMarketType, + fmt.Sprintf("perpetual %d already has market type %v", perp.GetId(), perp.Params.MarketType), + ) + require.EqualError(t, err, expectedErr.Error()) +} + func TestGetPerpetual_Success(t *testing.T) { pc := keepertest.PerpetualsKeepers(t) // Create liquidity tiers and perpetuals, From 19a71ad66e534d0ff993daeb77593d25df421c8e Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Fri, 8 Mar 2024 16:53:04 -0500 Subject: [PATCH 5/5] parametrize all set perp market type tests Signed-off-by: Shrenuj Bansal --- .../x/perpetuals/keeper/perpetual_test.go | 129 ++++++++++-------- 1 file changed, 72 insertions(+), 57 deletions(-) diff --git a/protocol/x/perpetuals/keeper/perpetual_test.go b/protocol/x/perpetuals/keeper/perpetual_test.go index 102a4143f9..5cef637e1e 100644 --- a/protocol/x/perpetuals/keeper/perpetual_test.go +++ b/protocol/x/perpetuals/keeper/perpetual_test.go @@ -320,67 +320,82 @@ func TestModifyPerpetual_Failure(t *testing.T) { } } -func TestSetPerpetualMarketType_Success(t *testing.T) { - pc := keepertest.PerpetualsKeepers(t) - // Create liquidity tiers and perpetuals, - perp := keepertest.CreateLiquidityTiersAndNPerpetuals(t, pc.Ctx, pc.PerpetualsKeeper, pc.PricesKeeper, 1)[0] - perp.Params.MarketType = types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_UNSPECIFIED - pc.PerpetualsKeeper.SetPerpetual(pc.Ctx, perp) - - _, err := pc.PerpetualsKeeper.SetPerpetualMarketType( - pc.Ctx, - perp.Params.Id, - types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_CROSS, - ) - require.NoError(t, err) - - rst, err := pc.PerpetualsKeeper.GetPerpetual( - pc.Ctx, - perp.Params.Id, - ) - require.NoError(t, err) - require.Equal( - t, - types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_CROSS, - rst.Params.MarketType, - ) -} +func TestSetPerpetualMarketType(t *testing.T) { + tests := map[string]struct { + currType types.PerpetualMarketType + newType types.PerpetualMarketType + errorExpected bool + expectedError error + }{ + "success": { + currType: types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_UNSPECIFIED, + newType: types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_CROSS, + errorExpected: false, + }, + "failure - setting to unspecified": { + currType: types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_CROSS, + newType: types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_UNSPECIFIED, + errorExpected: true, + expectedError: errorsmod.Wrap( + types.ErrInvalidMarketType, + fmt.Sprintf( + "invalid market type %v for perpetual %d", + types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_UNSPECIFIED, 0, + ), + ), + }, + "failure - market type already set": { + currType: types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_ISOLATED, + newType: types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_CROSS, + errorExpected: true, + expectedError: errorsmod.Wrap( + types.ErrInvalidMarketType, + fmt.Sprintf( + "perpetual %d already has market type %v", + 0, + types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_ISOLATED, + ), + ), + }, + } -func TestSetPerpetualMarketType_Failure_SettingToUnspecified(t *testing.T) { - pc := keepertest.PerpetualsKeepers(t) - // Create liquidity tiers and perpetuals, - perp := keepertest.CreateLiquidityTiersAndNPerpetuals(t, pc.Ctx, pc.PerpetualsKeeper, pc.PricesKeeper, 1)[0] + // Test setup. + for name, tc := range tests { + t.Run( + name, func(t *testing.T) { + pc := keepertest.PerpetualsKeepers(t) + // Create liquidity tiers and perpetuals, + perp := keepertest.CreateLiquidityTiersAndNPerpetuals( + t, + pc.Ctx, + pc.PerpetualsKeeper, + pc.PricesKeeper, + 1, + )[0] + perp.Params.MarketType = tc.currType + pc.PerpetualsKeeper.SetPerpetual(pc.Ctx, perp) - _, err := pc.PerpetualsKeeper.SetPerpetualMarketType( - pc.Ctx, - perp.Params.Id, - types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_UNSPECIFIED, - ) - expectedErr := errorsmod.Wrap( - types.ErrInvalidMarketType, - fmt.Sprintf( - "invalid market type %v for perpetual %d", - types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_UNSPECIFIED, perp.GetId(), - ), - ) - require.EqualError(t, err, expectedErr.Error()) -} + _, err := pc.PerpetualsKeeper.SetPerpetualMarketType( + pc.Ctx, + perp.Params.Id, + tc.newType, + ) -func TestSetPerpetualMarketType_Failure_MarketTypeAlreadySet(t *testing.T) { - pc := keepertest.PerpetualsKeepers(t) - // Create liquidity tiers and perpetuals, - perp := keepertest.CreateLiquidityTiersAndNPerpetuals(t, pc.Ctx, pc.PerpetualsKeeper, pc.PricesKeeper, 1)[0] + if tc.errorExpected { + require.EqualError(t, err, tc.expectedError.Error()) + } else { + require.NoError(t, err) - _, err := pc.PerpetualsKeeper.SetPerpetualMarketType( - pc.Ctx, - perp.Params.Id, - types.PerpetualMarketType_PERPETUAL_MARKET_TYPE_ISOLATED, - ) - expectedErr := errorsmod.Wrap( - types.ErrInvalidMarketType, - fmt.Sprintf("perpetual %d already has market type %v", perp.GetId(), perp.Params.MarketType), - ) - require.EqualError(t, err, expectedErr.Error()) + rst, err := pc.PerpetualsKeeper.GetPerpetual( + pc.Ctx, + perp.Params.Id, + ) + require.NoError(t, err) + require.Equal(t, tc.newType, rst.Params.MarketType) + } + }, + ) + } } func TestGetPerpetual_Success(t *testing.T) {