Skip to content

Commit

Permalink
chore: v0.3.2 upgrade handler (backport #481) (#485)
Browse files Browse the repository at this point in the history
* chore: v0.3.2 upgrade handler (#481)

* chore: v0.3.2 upgrade handler

* convert proposals

* lint

* migrate proposal test

(cherry picked from commit faac055)

# Conflicts:
#	app/upgrades.go

* fix conflicts

* new pf version in e2w

---------

Co-authored-by: ryanbajollari <[email protected]>
Co-authored-by: rbajollari <[email protected]>
  • Loading branch information
3 people authored Jul 29, 2024
1 parent 787e16e commit 57ad05f
Show file tree
Hide file tree
Showing 4 changed files with 142 additions and 7 deletions.
18 changes: 14 additions & 4 deletions app/upgrades.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
5 changes: 2 additions & 3 deletions tests/e2e/orchestrator/orchestrator.go
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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,
)
Expand Down
72 changes: 72 additions & 0 deletions x/oracle/keeper/migrate_proposal.go
Original file line number Diff line number Diff line change
@@ -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
}
54 changes: 54 additions & 0 deletions x/oracle/keeper/migrate_proposal_test.go
Original file line number Diff line number Diff line change
@@ -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)
})
}

0 comments on commit 57ad05f

Please sign in to comment.