diff --git a/Makefile b/Makefile index a2a54ab7c..9c8a00e2d 100644 --- a/Makefile +++ b/Makefile @@ -178,7 +178,7 @@ test: test-unit test-all: check test-race test-cover test-unit: - @VERSION=$(VERSION) go test -mod=readonly -tags='ledger test_ledger_mock' `go list ./... | grep -v dex` + @VERSION=$(VERSION) go test -mod=readonly -tags='ledger test_ledger_mock' ./... test-race: @VERSION=$(VERSION) go test -mod=readonly -race -tags='ledger test_ledger_mock' ./... diff --git a/app/app.go b/app/app.go index 67aa7da41..b3d68587a 100644 --- a/app/app.go +++ b/app/app.go @@ -37,6 +37,7 @@ import ( servicemetrics "github.com/skip-mev/connect/v2/service/metrics" v401 "github.com/neutron-org/neutron/v4/app/upgrades/v4.0.1" + v500 "github.com/neutron-org/neutron/v4/app/upgrades/v5.0.0" "github.com/neutron-org/neutron/v4/x/globalfee" globalfeetypes "github.com/neutron-org/neutron/v4/x/globalfee/types" @@ -221,7 +222,7 @@ const ( ) var ( - Upgrades = []upgrades.Upgrade{v401.Upgrade} + Upgrades = []upgrades.Upgrade{v401.Upgrade, v500.Upgrade} // DefaultNodeHome default home directories for the application daemon DefaultNodeHome string @@ -1396,6 +1397,7 @@ func (app *App) setupUpgradeHandlers() { MarketmapKeeper: app.MarketMapKeeper, FeeMarketKeeper: app.FeeMarkerKeeper, DynamicfeesKeeper: app.DynamicFeesKeeper, + DexKeeper: &app.DexKeeper, GlobalFeeSubspace: app.GetSubspace(globalfee.ModuleName), CcvConsumerSubspace: app.GetSubspace(ccvconsumertypes.ModuleName), }, diff --git a/app/upgrades/types.go b/app/upgrades/types.go index b4a1dc9e4..e4c14f517 100644 --- a/app/upgrades/types.go +++ b/app/upgrades/types.go @@ -21,6 +21,7 @@ import ( contractmanagerkeeper "github.com/neutron-org/neutron/v4/x/contractmanager/keeper" cronkeeper "github.com/neutron-org/neutron/v4/x/cron/keeper" + dexkeeper "github.com/neutron-org/neutron/v4/x/dex/keeper" feeburnerkeeper "github.com/neutron-org/neutron/v4/x/feeburner/keeper" icqkeeper "github.com/neutron-org/neutron/v4/x/interchainqueries/keeper" tokenfactorykeeper "github.com/neutron-org/neutron/v4/x/tokenfactory/keeper" @@ -64,6 +65,7 @@ type UpgradeKeepers struct { MarketmapKeeper *marketmapkeeper.Keeper FeeMarketKeeper *feemarketkeeper.Keeper DynamicfeesKeeper *dynamicfeeskeeper.Keeper + DexKeeper *dexkeeper.Keeper // subspaces GlobalFeeSubspace paramtypes.Subspace CcvConsumerSubspace paramtypes.Subspace diff --git a/app/upgrades/v5.0.0/constants.go b/app/upgrades/v5.0.0/constants.go new file mode 100644 index 000000000..1eeb344c5 --- /dev/null +++ b/app/upgrades/v5.0.0/constants.go @@ -0,0 +1,20 @@ +package v400 + +import ( + storetypes "cosmossdk.io/store/types" + + "github.com/neutron-org/neutron/v4/app/upgrades" +) + +const ( + // UpgradeName defines the on-chain upgrade name. + UpgradeName = "v5.0.0" +) + +var Upgrade = upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: CreateUpgradeHandler, + StoreUpgrades: storetypes.StoreUpgrades{ + Added: []string{}, + }, +} diff --git a/app/upgrades/v5.0.0/upgrades.go b/app/upgrades/v5.0.0/upgrades.go new file mode 100644 index 000000000..9c5e46a57 --- /dev/null +++ b/app/upgrades/v5.0.0/upgrades.go @@ -0,0 +1,60 @@ +package v400 + +import ( + "context" + "fmt" + + upgradetypes "cosmossdk.io/x/upgrade/types" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + + "github.com/neutron-org/neutron/v4/app/upgrades" + dexkeeper "github.com/neutron-org/neutron/v4/x/dex/keeper" +) + +func CreateUpgradeHandler( + mm *module.Manager, + configurator module.Configurator, + keepers *upgrades.UpgradeKeepers, + _ upgrades.StoreKeys, + _ codec.Codec, +) upgradetypes.UpgradeHandler { + return func(c context.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { + ctx := sdk.UnwrapSDKContext(c) + + ctx.Logger().Info("Starting module migrations...") + vm, err := mm.RunMigrations(ctx, configurator, vm) + if err != nil { + return vm, err + } + + ctx.Logger().Info("Running dex upgrades...") + // Only pause dex for mainnet + if ctx.ChainID() == "neutron-1" { + err = upgradeDexPause(ctx, *keepers.DexKeeper) + if err != nil { + return nil, err + } + } + + ctx.Logger().Info(fmt.Sprintf("Migration {%s} applied", UpgradeName)) + return vm, nil + } +} + +func upgradeDexPause(ctx sdk.Context, k dexkeeper.Keeper) error { + // Set the dex to paused + ctx.Logger().Info("Pausing dex...") + + params := k.GetParams(ctx) + params.Paused = true + + if err := k.SetParams(ctx, params); err != nil { + return err + } + + ctx.Logger().Info("Dex is paused") + + return nil +} diff --git a/app/upgrades/v5.0.0/upgrades_test.go b/app/upgrades/v5.0.0/upgrades_test.go new file mode 100644 index 000000000..0a5d07207 --- /dev/null +++ b/app/upgrades/v5.0.0/upgrades_test.go @@ -0,0 +1,65 @@ +package v400_test + +import ( + "testing" + + "cosmossdk.io/math" + upgradetypes "cosmossdk.io/x/upgrade/types" + "github.com/stretchr/testify/suite" + + v500 "github.com/neutron-org/neutron/v4/app/upgrades/v5.0.0" + "github.com/neutron-org/neutron/v4/testutil/common/sample" + + "github.com/neutron-org/neutron/v4/testutil" + dexkeeper "github.com/neutron-org/neutron/v4/x/dex/keeper" + dextypes "github.com/neutron-org/neutron/v4/x/dex/types" +) + +type UpgradeTestSuite struct { + testutil.IBCConnectionTestSuite +} + +func TestKeeperTestSuite(t *testing.T) { + suite.Run(t, new(UpgradeTestSuite)) +} + +func (suite *UpgradeTestSuite) SetupTest() { + suite.IBCConnectionTestSuite.SetupTest() +} + +func (suite *UpgradeTestSuite) TestUpgradeDexPause() { + var ( + app = suite.GetNeutronZoneApp(suite.ChainA) + ctx = suite.ChainA.GetContext().WithChainID("neutron-1") + msgServer = dexkeeper.NewMsgServerImpl(app.DexKeeper) + ) + + params := app.DexKeeper.GetParams(ctx) + + suite.False(params.Paused) + + upgrade := upgradetypes.Plan{ + Name: v500.UpgradeName, + Info: "some text here", + Height: 100, + } + suite.NoError(app.UpgradeKeeper.ApplyUpgrade(ctx, upgrade)) + + params = app.DexKeeper.GetParams(ctx) + + suite.True(params.Paused) + + _, err := msgServer.Deposit(ctx, &dextypes.MsgDeposit{ + Creator: sample.AccAddress(), + Receiver: sample.AccAddress(), + TokenA: "TokenA", + TokenB: "TokenB", + TickIndexesAToB: []int64{1}, + Fees: []uint64{1}, + AmountsA: []math.Int{math.OneInt()}, + AmountsB: []math.Int{math.ZeroInt()}, + Options: []*dextypes.DepositOptions{{}}, + }) + + suite.ErrorIs(err, dextypes.ErrDexPaused) +} diff --git a/go.mod b/go.mod index 93a85c23d..c71add937 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( cosmossdk.io/x/tx v0.13.5 cosmossdk.io/x/upgrade v0.1.4 github.com/CosmWasm/wasmd v0.51.0 - github.com/CosmWasm/wasmvm/v2 v2.1.2 + github.com/CosmWasm/wasmvm/v2 v2.1.3 github.com/cometbft/cometbft v0.38.12 github.com/cosmos/admin-module/v2 v2.0.0-20240430142959-8b3328d1b1a2 github.com/cosmos/cosmos-db v1.0.2 diff --git a/go.sum b/go.sum index 00d931492..360e1d381 100644 --- a/go.sum +++ b/go.sum @@ -225,8 +225,8 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25 github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/CosmWasm/wasmvm/v2 v2.1.2 h1:GkJ5bAsRlLHfIQVg/FY1VHwLyBwlCjAhDea0B8L+e20= -github.com/CosmWasm/wasmvm/v2 v2.1.2/go.mod h1:bMhLQL4Yp9CzJi9A83aR7VO9wockOsSlZbT4ztOl6bg= +github.com/CosmWasm/wasmvm/v2 v2.1.3 h1:CSJTauZqkHyb9yic6JVYCjiGUgxI2MJV2QzfSu8m49c= +github.com/CosmWasm/wasmvm/v2 v2.1.3/go.mod h1:bMhLQL4Yp9CzJi9A83aR7VO9wockOsSlZbT4ztOl6bg= github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= diff --git a/x/dex/keeper/msg_server.go b/x/dex/keeper/msg_server.go index 2b3bca666..1211cc57b 100644 --- a/x/dex/keeper/msg_server.go +++ b/x/dex/keeper/msg_server.go @@ -259,6 +259,12 @@ func (k MsgServer) UpdateParams(goCtx context.Context, req *types.MsgUpdateParam return &types.MsgUpdateParamsResponse{}, nil } -func (k MsgServer) AssertNotPaused(_ context.Context) error { - return types.ErrDexPaused +func (k MsgServer) AssertNotPaused(goCtx context.Context) error { + ctx := sdk.UnwrapSDKContext(goCtx) + paused := k.GetParams(ctx).Paused + + if paused { + return types.ErrDexPaused + } + return nil }