diff --git a/app/upgrades.go b/app/upgrades.go index 74fb4e00..7c52549c 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -10,7 +10,6 @@ import ( consensustypes "github.com/cosmos/cosmos-sdk/x/consensus/types" crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" @@ -40,6 +39,7 @@ func (app App) RegisterUpgradeHandlers() { app.registerUpgrade0_3_1Rc1(upgradeInfo) app.registerUpgrade0_3_1Rc2(upgradeInfo) app.registerUpgrade0_3_1(upgradeInfo) + app.registerUpgrade0_3_2(upgradeInfo) } // performs upgrade from v0.1.3 to v0.1.4 @@ -188,13 +188,23 @@ func (app *App) registerUpgrade0_3_1Rc2(_ upgradetypes.Plan) { func (app *App) registerUpgrade0_3_1(_ upgradetypes.Plan) { const planName = "v0.3.1" + app.UpgradeKeeper.SetUpgradeHandler(planName, + func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + ctx.Logger().Info("Upgrade handler execution", "name", planName) + return app.mm.RunMigrations(ctx, app.configurator, fromVM) + }, + ) +} + +func (app *App) registerUpgrade0_3_2(_ upgradetypes.Plan) { + const planName = "v0.3.2" + app.UpgradeKeeper.SetUpgradeHandler(planName, func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { // migrate old proposals - govMigrator := govkeeper.NewMigrator(&app.GovKeeper, app.GetSubspace(govtypes.ModuleName)) - err := govMigrator.Migrate2to3(ctx) + err := oraclekeeper.MigrateProposals(ctx, app.keys[govtypes.StoreKey], app.appCodec) if err != nil { - panic("failed to migrate governance module") + ctx.Logger().Error("failed to migrate governance proposals", "err", err) } ctx.Logger().Info("Upgrade handler execution", "name", planName) diff --git a/tests/e2e/orchestrator/orchestrator.go b/tests/e2e/orchestrator/orchestrator.go index d6abe5b4..0a95d31f 100644 --- a/tests/e2e/orchestrator/orchestrator.go +++ b/tests/e2e/orchestrator/orchestrator.go @@ -44,8 +44,7 @@ const ( ojoGrpcPort = "9090" ojoMaxStartupTime = 40 // seconds - // TODO: update original pf instance with sdk 0.47 - priceFeederContainerRepo = "ghcr.io/ojo-network/price-feeder-ojo-47" + priceFeederContainerRepo = "ghcr.io/ojo-network/price-feeder-ojo-v0.1.11" priceFeederServerPort = "7171/tcp" priceFeederMaxStartupTime = 20 // seconds @@ -427,7 +426,7 @@ func (o *Orchestrator) runPriceFeeder(t *testing.T) { fmt.Sprintf("RPC_GRPC_ENDPOINT=%s", grpcEndpoint), fmt.Sprintf("RPC_TMRPC_ENDPOINT=%s", tmrpcEndpoint), }, - Cmd: []string{"--skip-provider-check", "--log-level=debug"}, + Cmd: []string{"--skip-provider-check", "--config-currency-providers", "--log-level=debug"}, }, noRestart, ) diff --git a/x/oracle/keeper/migrate_proposal.go b/x/oracle/keeper/migrate_proposal.go new file mode 100644 index 00000000..9c135f79 --- /dev/null +++ b/x/oracle/keeper/migrate_proposal.go @@ -0,0 +1,72 @@ +package keeper + +import ( + "github.com/cosmos/cosmos-sdk/store/prefix" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + v1migrations "github.com/cosmos/cosmos-sdk/x/gov/migrations/v1" + + "github.com/cosmos/cosmos-sdk/codec" + govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + oracletypes "github.com/ojo-network/ojo/x/oracle/types" +) + +// MigrateProposals migrates all legacy MsgUpgateGovParam proposals into non legacy param update versions. +func MigrateProposals(ctx sdk.Context, storeKey storetypes.StoreKey, cdc codec.BinaryCodec) error { + store := ctx.KVStore(storeKey) + propStore := prefix.NewStore(store, v1migrations.ProposalsKeyPrefix) + + iter := propStore.Iterator(nil, nil) + defer iter.Close() + + for ; iter.Valid(); iter.Next() { + var prop govv1.Proposal + err := cdc.Unmarshal(iter.Value(), &prop) + // if error unmarshaling prop, convert to non legacy prop + if err != nil { + newProp, err := convertProposal(prop, cdc) + if err != nil { + return err + } + bz, err := cdc.Marshal(&newProp) + if err != nil { + return err + } + // Set new value on store. + propStore.Set(iter.Key(), bz) + } + } + + return nil +} + +func convertProposal(prop govv1.Proposal, cdc codec.BinaryCodec) (govv1.Proposal, error) { + msgs := prop.Messages + + for _, msg := range msgs { + var oldUpdateParamMsg oracletypes.MsgLegacyGovUpdateParams + err := cdc.Unmarshal(msg.GetValue(), &oldUpdateParamMsg) + if err != nil { + return govv1.Proposal{}, err + } + + newUpdateParamMsg := oracletypes.MsgGovUpdateParams{ + Authority: oldUpdateParamMsg.Authority, + Title: oldUpdateParamMsg.Title, + Description: oldUpdateParamMsg.Description, + Plan: oracletypes.ParamUpdatePlan{ + Keys: oldUpdateParamMsg.Keys, + Height: 0, // placeholder value for height + Changes: oldUpdateParamMsg.Changes, + }, + } + + msg.Value, err = newUpdateParamMsg.Marshal() + if err != nil { + return govv1.Proposal{}, err + } + } + + prop.Messages = msgs + return prop, nil +} diff --git a/x/oracle/keeper/migrate_proposal_test.go b/x/oracle/keeper/migrate_proposal_test.go new file mode 100644 index 00000000..1434a34d --- /dev/null +++ b/x/oracle/keeper/migrate_proposal_test.go @@ -0,0 +1,54 @@ +package keeper_test + +import ( + types1 "github.com/cosmos/cosmos-sdk/codec/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + + "github.com/ojo-network/ojo/x/oracle/keeper" + "github.com/ojo-network/ojo/x/oracle/types" +) + +func (s *IntegrationTestSuite) TestMigrateProposal() { + ctx := s.ctx + cdc := s.app.AppCodec() + storeKey := s.app.GetKey(govtypes.StoreKey) + + // create legacy prop and set it in store + legacyMsg := types.MsgLegacyGovUpdateParams{ + Authority: "ojo10d07y265gmmuvt4z0w9aw880jnsr700jcz4krc", + Title: "title", + Description: "desc", + Keys: []string{ + "VotePeriod", + }, + Changes: types.Params{ + VotePeriod: 5, + }, + } + bz, err := cdc.Marshal(&legacyMsg) + s.Require().NoError(err) + prop := govv1.Proposal{ + Id: 1, + Messages: []*types1.Any{ + { + TypeUrl: "/ojo.oracle.v1.MsgGovUpdateParams", + Value: bz, + XXX_unrecognized: []byte{}, + }, + }, + Status: govv1.ProposalStatus_PROPOSAL_STATUS_PASSED, + } + s.app.GovKeeper.SetProposal(ctx, prop) + + // try to retreive proposal and fail + s.Require().Panics(func() { + s.app.GovKeeper.GetProposal(ctx, prop.Id) + }) + + // succesfully retreive proposal after migration + err = keeper.MigrateProposals(ctx, storeKey, cdc) + s.Require().NotPanics(func() { + s.app.GovKeeper.GetProposal(ctx, prop.Id) + }) +}