[R4R] kava 5 migration (#848)

* wip: kava-5 migration

* feat: kava 5 migration

* fix: don't repeat genesis time
This commit is contained in:
Kevin Davis 2021-02-22 18:28:07 -07:00 committed by GitHub
parent 3bf40b97f9
commit 667ad87825
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 118 additions and 3 deletions

View File

@ -5,11 +5,17 @@ import (
"sort"
"time"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth"
authexported "github.com/cosmos/cosmos-sdk/x/auth/exported"
"github.com/cosmos/cosmos-sdk/x/genutil"
"github.com/cosmos/cosmos-sdk/x/supply"
cryptoAmino "github.com/tendermint/tendermint/crypto/encoding/amino"
tmtypes "github.com/tendermint/tendermint/types"
"github.com/kava-labs/kava/app"
"github.com/kava-labs/kava/x/bep3"
v0_13cdp "github.com/kava-labs/kava/x/cdp"
v0_11cdp "github.com/kava-labs/kava/x/cdp/legacy/v0_11"
@ -31,6 +37,87 @@ var (
ClaimEndTime = time.Date(2026, 2, 25, 14, 0, 0, 0, time.UTC)
)
// Migrate translates a genesis file from kava v0.11 (or v0.12) format to kava v0.13.x format.
func Migrate(genDoc tmtypes.GenesisDoc) tmtypes.GenesisDoc {
// migrate app state
var appStateMap genutil.AppMap
cdc := codec.New()
cryptoAmino.RegisterAmino(cdc)
tmtypes.RegisterEvidences(cdc)
if err := cdc.UnmarshalJSON(genDoc.AppState, &appStateMap); err != nil {
panic(err)
}
newAppState := MigrateAppState(appStateMap)
v0_13Codec := app.MakeCodec()
marshaledNewAppState, err := v0_13Codec.MarshalJSON(newAppState)
if err != nil {
panic(err)
}
genDoc.AppState = marshaledNewAppState
genDoc.GenesisTime = GenesisTime
genDoc.ChainID = "kava-5"
genDoc.ConsensusParams.Block.MaxGas = 20000000
return genDoc
}
// MigrateAppState migrates application state from v0.11 (or v0.12) format to a kava v0.13.x format
func MigrateAppState(v0_11AppState genutil.AppMap) genutil.AppMap {
v0_13AppState := v0_11AppState
cdc := app.MakeCodec()
var hardGenState v0_11hard.GenesisState
if v0_11AppState[v0_13hard.ModuleName] == nil {
cdc.MustUnmarshalJSON(v0_11AppState[v0_11hard.ModuleName], &hardGenState)
delete(v0_11AppState, v0_11hard.ModuleName)
v0_13AppState[v0_13hard.ModuleName] = cdc.MustMarshalJSON(
Hard(hardGenState))
}
delete(v0_13AppState, v0_11hard.ModuleName)
if v0_11AppState[v0_11cdp.ModuleName] != nil {
var cdpGenState v0_11cdp.GenesisState
cdc.MustUnmarshalJSON(v0_11AppState[v0_11cdp.ModuleName], &cdpGenState)
delete(v0_11AppState, v0_11cdp.ModuleName)
v0_13AppState[v0_13cdp.ModuleName] = cdc.MustMarshalJSON(
CDP(cdpGenState))
}
if v0_11AppState[v0_11incentive.ModuleName] != nil {
var incentiveGenState v0_11incentive.GenesisState
cdc.MustUnmarshalJSON(v0_11AppState[v0_13incentive.ModuleName], &incentiveGenState)
delete(v0_11AppState, v0_11incentive.ModuleName)
v0_13AppState[v0_13incentive.ModuleName] = cdc.MustMarshalJSON(Incentive(hardGenState, incentiveGenState))
}
if v0_11AppState[v0_11pricefeed.ModuleName] != nil {
var pricefeedGS v0_11pricefeed.GenesisState
cdc.MustUnmarshalJSON(v0_11AppState[v0_13pricefeed.ModuleName], &pricefeedGS)
delete(v0_11AppState, v0_11pricefeed.ModuleName)
v0_13AppState[v0_13pricefeed.ModuleName] = cdc.MustMarshalJSON(Pricefeed(pricefeedGS))
}
if v0_11AppState[bep3.ModuleName] != nil {
var bep3GS bep3.GenesisState
cdc.MustUnmarshalJSON(v0_11AppState[bep3.ModuleName], &bep3GS)
delete(v0_11AppState, bep3.ModuleName)
v0_13AppState[bep3.ModuleName] = cdc.MustMarshalJSON(Bep3(bep3GS))
}
if v0_11AppState[v0_11committee.ModuleName] != nil {
var committeeGS v0_11committee.GenesisState
cdc := codec.New()
sdk.RegisterCodec(cdc)
v0_11committee.RegisterCodec(cdc)
cdc.MustUnmarshalJSON(v0_11AppState[v0_11committee.ModuleName], &committeeGS)
delete(v0_11AppState, v0_11committee.ModuleName)
cdc = app.MakeCodec()
v0_13AppState[v0_13committee.ModuleName] = cdc.MustMarshalJSON(Committee(committeeGS))
}
if v0_11AppState[auth.ModuleName] != nil {
var authGS auth.GenesisState
cdc.MustUnmarshalJSON(v0_11AppState[auth.ModuleName], &authGS)
delete(v0_11AppState, auth.ModuleName)
v0_13AppState[auth.ModuleName] = cdc.MustMarshalJSON(Auth(authGS))
}
return v0_13AppState
}
// CDP migrates from a v0.11 cdp genesis state to a v0.13 cdp genesis state
func CDP(oldGenState v0_11cdp.GenesisState) v0_13cdp.GenesisState {
var newCDPs v0_13cdp.CDPs

View File

@ -11,9 +11,12 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth"
authexported "github.com/cosmos/cosmos-sdk/x/auth/exported"
"github.com/cosmos/cosmos-sdk/x/genutil"
"github.com/cosmos/cosmos-sdk/x/supply"
supplyexported "github.com/cosmos/cosmos-sdk/x/supply/exported"
tmtypes "github.com/tendermint/tendermint/types"
"github.com/kava-labs/kava/app"
"github.com/kava-labs/kava/x/bep3"
v0_11cdp "github.com/kava-labs/kava/x/cdp/legacy/v0_11"
@ -223,3 +226,25 @@ func TestBep3(t *testing.T) {
require.Equal(t, uint64(24686), newGenState.Params.AssetParams[0].MinBlockLock)
require.Equal(t, uint64(86400), newGenState.Params.AssetParams[0].MaxBlockLock)
}
func TestMigrateFull(t *testing.T) {
oldGenDoc, err := tmtypes.GenesisDocFromFile(filepath.Join("testdata", "kava-4-export.json"))
require.NoError(t, err)
// 2) migrate
newGenDoc := Migrate(*oldGenDoc)
tApp := app.NewTestApp()
cdc := app.MakeCodec()
var newAppState genutil.AppMap
require.NoError(t,
cdc.UnmarshalJSON(newGenDoc.AppState, &newAppState),
)
err = app.ModuleBasics.ValidateGenesis(newAppState)
if err != nil {
require.NoError(t, err)
}
require.NotPanics(t, func() {
// this runs both InitGenesis for all modules (which panic on errors) and runs all invariants
tApp.InitializeFromGenesisStatesWithTime(newGenDoc.GenesisTime, app.GenesisState(newAppState))
})
}

File diff suppressed because one or more lines are too long

View File

@ -21,6 +21,7 @@ import (
const (
MaxCommitteeDescriptionLength int = 512
ModuleName = "committee"
)
// Permission is anything with a method that validates whether a proposal is allowed by it or not.

View File

@ -11,9 +11,10 @@ import (
// Valid reward multipliers
const (
Small MultiplierName = "small"
Medium MultiplierName = "medium"
Large MultiplierName = "large"
Small MultiplierName = "small"
Medium MultiplierName = "medium"
Large MultiplierName = "large"
ModuleName = "incentive"
)
// GenesisClaimPeriodID stores the next claim id and its corresponding collateral type