kava-3 to kava-4 migration (#676)

* feat: kava-3 to kava-4 migration function

* update migrate command
This commit is contained in:
Kevin Davis 2020-10-03 13:48:57 -04:00 committed by GitHub
parent d15e3a43dd
commit 04946493ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 149 additions and 9 deletions

View File

@ -138,7 +138,7 @@ func (tApp TestApp) InitializeFromGenesisStatesWithTime(genTime time.Time, genes
},
)
tApp.Commit()
tApp.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{Height: tApp.LastBlockHeight() + 1}})
tApp.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{Height: tApp.LastBlockHeight() + 1, Time: genTime}})
return tApp
}

View File

@ -11,8 +11,8 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/version"
"github.com/kava-labs/kava/migrate/v0_8"
v032tendermint "github.com/kava-labs/kava/migrate/v0_8/tendermint/v0_32"
"github.com/kava-labs/kava/migrate/v0_11"
tmtypes "github.com/tendermint/tendermint/types"
)
const (
@ -24,8 +24,8 @@ const (
func MigrateGenesisCmd(_ *server.Context, cdc *codec.Codec) *cobra.Command {
cmd := &cobra.Command{
Use: "migrate [genesis-file]",
Short: "Migrate genesis from kava v0.3 to v0.8",
Long: "Migrate the source genesis into the current version, sorts it, and print to STDOUT.",
Short: "Migrate genesis file from kava v0.10 to v0.11",
Long: "Migrate the source genesis into the current version, sorts it, and print to STDOUT. If not provided, chain-id is set to kava-4 and genesis time is set to 2020-10-15T:14:00:00Z",
Example: fmt.Sprintf(`%s migrate /path/to/genesis.json --chain-id=new-chain-id --genesis-time=1998-01-01T00:00:00Z`, version.ServerName),
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
@ -33,14 +33,14 @@ func MigrateGenesisCmd(_ *server.Context, cdc *codec.Codec) *cobra.Command {
// 1) Unmarshal existing genesis.json
importGenesis := args[0]
genDoc, err := v032tendermint.GenesisDocFromFile(importGenesis)
genDoc, err := tmtypes.GenesisDocFromFile(importGenesis)
if err != nil {
return fmt.Errorf("failed to read genesis document from file %s: %w", importGenesis, err)
}
// 2) Migrate state from kava v0.3 to v0.8
newGenDoc := v0_8.Migrate(*genDoc)
newGenDoc := v0_11.Migrate(*genDoc)
// 3) Create and output a new genesis file

View File

@ -4,14 +4,20 @@ import (
"fmt"
"time"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
v39_1auth "github.com/cosmos/cosmos-sdk/x/auth"
v39_1authexported "github.com/cosmos/cosmos-sdk/x/auth/exported"
"github.com/cosmos/cosmos-sdk/x/auth/vesting"
v39_1vesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types"
v39_genutil "github.com/cosmos/cosmos-sdk/x/genutil"
v39_1gov "github.com/cosmos/cosmos-sdk/x/gov"
v39_1supply "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"
v38_5auth "github.com/kava-labs/kava/migrate/v0_11/legacy/cosmos-sdk/v0.38.5/auth"
v38_5supply "github.com/kava-labs/kava/migrate/v0_11/legacy/cosmos-sdk/v0.38.5/supply"
v0_11bep3 "github.com/kava-labs/kava/x/bep3"
@ -23,6 +29,7 @@ import (
v0_11harvest "github.com/kava-labs/kava/x/harvest"
v0_11incentive "github.com/kava-labs/kava/x/incentive"
v0_9incentive "github.com/kava-labs/kava/x/incentive/legacy/v0_9"
v0_11issuance "github.com/kava-labs/kava/x/issuance"
v0_11pricefeed "github.com/kava-labs/kava/x/pricefeed"
v0_9pricefeed "github.com/kava-labs/kava/x/pricefeed/legacy/v0_9"
v0_11validator_vesting "github.com/kava-labs/kava/x/validator-vesting"
@ -32,6 +39,101 @@ import (
var deputyBnbBalance sdk.Coin
var hardBalance sdk.Coin
// Migrate translates a genesis file from kava v0.9 (or v0.10) format to kava v0.11.x format.
func Migrate(genDoc tmtypes.GenesisDoc) tmtypes.GenesisDoc {
// migrate app state
var appStateMap v39_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_11Codec := app.MakeCodec()
marshaledNewAppState, err := v0_11Codec.MarshalJSON(newAppState)
if err != nil {
panic(err)
}
genDoc.AppState = marshaledNewAppState
genDoc.GenesisTime = time.Date(2020, 10, 15, 14, 0, 0, 0, time.UTC)
genDoc.ChainID = "kava-4"
return genDoc
}
// MigrateAppState migrates application state from v0.9 (or v0.10) format to a kava v0.11.x format
func MigrateAppState(v0_9AppState v39_genutil.AppMap) v39_genutil.AppMap {
v0_11AppState := v0_9AppState
v0_11Codec := app.MakeCodec()
if v0_9AppState[v38_5auth.ModuleName] != nil {
v0_9cdc := codec.New()
codec.RegisterCrypto(v0_9cdc)
v38_5auth.RegisterCodec(v0_9cdc)
v38_5auth.RegisterCodecVesting(v0_9cdc)
v38_5supply.RegisterCodec(v0_9cdc)
v0_9validator_vesting.RegisterCodec(v0_9cdc)
var authGenState v38_5auth.GenesisState
v0_9cdc.MustUnmarshalJSON(v0_9AppState[v38_5auth.ModuleName], &authGenState)
delete(v0_9AppState, v38_5auth.ModuleName)
newAuthGS := MigrateAuth(authGenState)
v0_11AppState[v39_1auth.ModuleName] = v0_11Codec.MustMarshalJSON(newAuthGS)
}
if v0_9AppState[v39_1supply.ModuleName] != nil {
var supplyGenstate v39_1supply.GenesisState
v0_11Codec.MustUnmarshalJSON(v0_9AppState[v39_1supply.ModuleName], &supplyGenstate)
delete(v0_9AppState, v39_1supply.ModuleName)
v0_11AppState[v39_1supply.ModuleName] = v0_11Codec.MustMarshalJSON(
MigrateSupply(
supplyGenstate, deputyBnbBalance, sdk.NewCoin("hard", sdk.NewInt(200000000000000))))
}
if v0_9AppState[v39_1gov.ModuleName] != nil {
var govGenstate v39_1gov.GenesisState
v0_11Codec.MustUnmarshalJSON(v0_9AppState[v39_1gov.ModuleName], &govGenstate)
delete(v0_9AppState, v39_1gov.ModuleName)
v0_11AppState[v39_1gov.ModuleName] = v0_11Codec.MustMarshalJSON(
MigrateGov(govGenstate))
}
if v0_9AppState[v0_9bep3.ModuleName] != nil {
var bep3GenState v0_9bep3.GenesisState
v0_11Codec.MustUnmarshalJSON(v0_9AppState[v0_9bep3.ModuleName], &bep3GenState)
delete(v0_9AppState, v0_9bep3.ModuleName)
v0_11AppState[v0_9bep3.ModuleName] = v0_11Codec.MustMarshalJSON(MigrateBep3(bep3GenState))
}
if v0_9AppState[v0_9cdp.ModuleName] != nil {
var cdpGenState v0_9cdp.GenesisState
v0_11Codec.MustUnmarshalJSON(v0_9AppState[v0_9cdp.ModuleName], &cdpGenState)
delete(v0_9AppState, v0_9cdp.ModuleName)
v0_11AppState[v0_9cdp.ModuleName] = v0_11Codec.MustMarshalJSON(MigrateCDP(cdpGenState))
}
if v0_9AppState[v0_9committee.ModuleName] != nil {
var committeeGenState v0_9committee.GenesisState
cdc := codec.New()
sdk.RegisterCodec(cdc)
v0_9committee.RegisterCodec(cdc)
cdc.MustUnmarshalJSON(v0_9AppState[v0_9committee.ModuleName], &committeeGenState)
delete(v0_9AppState, v0_9committee.ModuleName)
v0_11AppState[v0_9committee.ModuleName] = v0_11Codec.MustMarshalJSON(MigrateCommittee(committeeGenState))
}
if v0_9AppState[v0_9incentive.ModuleName] != nil {
var incentiveGenState v0_9incentive.GenesisState
v0_11Codec.MustUnmarshalJSON(v0_9AppState[v0_9incentive.ModuleName], &incentiveGenState)
delete(v0_9AppState, v0_9incentive.ModuleName)
v0_11AppState[v0_9incentive.ModuleName] = v0_11Codec.MustMarshalJSON(MigrateIncentive(incentiveGenState))
}
if v0_9AppState[v0_9pricefeed.ModuleName] != nil {
var pricefeedGenState v0_9pricefeed.GenesisState
v0_11Codec.MustUnmarshalJSON(v0_9AppState[v0_9pricefeed.ModuleName], &pricefeedGenState)
delete(v0_9AppState, v0_9pricefeed.ModuleName)
v0_11AppState[v0_9pricefeed.ModuleName] = v0_11Codec.MustMarshalJSON(MigratePricefeed(pricefeedGenState))
}
v0_11AppState[v0_11harvest.ModuleName] = v0_11Codec.MustMarshalJSON(MigrateHarvest())
v0_11AppState[v0_11issuance.ModuleName] = v0_11Codec.MustMarshalJSON(v0_11issuance.DefaultGenesisState())
return v0_11AppState
}
// MigrateBep3 migrates from a v0.9 (or v0.10) bep3 genesis state to a v0.11 bep3 genesis state
func MigrateBep3(oldGenState v0_9bep3.GenesisState) v0_11bep3.GenesisState {
var assetParams v0_11bep3.AssetParams

View File

@ -10,11 +10,13 @@ import (
"github.com/stretchr/testify/require"
sdk "github.com/cosmos/cosmos-sdk/types"
v39_1auth "github.com/cosmos/cosmos-sdk/x/auth"
v39_1auth_vesting "github.com/cosmos/cosmos-sdk/x/auth/vesting"
"github.com/cosmos/cosmos-sdk/x/genutil"
v39_1supply "github.com/cosmos/cosmos-sdk/x/supply"
tmtypes "github.com/tendermint/tendermint/types"
"github.com/kava-labs/kava/app"
v38_5auth "github.com/kava-labs/kava/migrate/v0_11/legacy/cosmos-sdk/v0.38.5/auth"
v38_5supply "github.com/kava-labs/kava/migrate/v0_11/legacy/cosmos-sdk/v0.38.5/supply"
@ -165,3 +167,25 @@ func TestMigratePricefeed(t *testing.T) {
err = newGenState.Validate()
require.NoError(t, err)
}
func TestMigrateFull(t *testing.T) {
oldGenDoc, err := tmtypes.GenesisDocFromFile(filepath.Join("testdata", "kava-3-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

@ -6,6 +6,10 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
)
const (
ModuleName = "cdp"
)
// CDP is the state of a single collateralized debt position.
type CDP struct {
ID uint64 `json:"id" yaml:"id"` // unique id for cdp

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

@ -8,6 +8,10 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
)
const (
ModuleName = "incentive"
)
// GenesisClaimPeriodID stores the next claim id and its corresponding denom
type GenesisClaimPeriodID struct {
Denom string `json:"denom" yaml:"denom"`

View File

@ -9,6 +9,10 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
)
const (
ModuleName = "pricefeed"
)
// GenesisState - pricefeed state that must be provided at genesis
type GenesisState struct {
Params Params `json:"params" yaml:"params"`