mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-26 16:25:21 +00:00
4a8b5696cb
* initial sketch * add module migrations * add migrations for all accout types * test account migration * add tendermint migration and migrate cmd * remove need for errors pkg dependency * add bech32 decoding fork * add suggested params and cmd to write them * add basic upgrade instructions * fix tests * address some migration todos * tidy contrib folder * finalize params values * align cdp init genesis with other modules * add tendermint and distribution test add custom distribution migration to patch bug * add staking migration test * add slashing, evidence tests, refactor auth tests * add full migration test * remove go-amino dependency from go.mod also tidy up unused indirect dependencies * address remaining TODOs * remove commented out code from legacy types * add spot/liquidation markets ids to kava-3 params * Apply suggestions from code review Co-authored-by: Alexander Bezobchuk <alexanderbez@users.noreply.github.com> Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com> * address code review suggestions * add validate genesis to migrate test * refactor add params func * remove commented out code from old types * fix add params * add deputy address * add tests using exported kava-2 state * incorporate new cdp params from master * update params from review Co-authored-by: Kevin Davis <karzak@users.noreply.github.com> * add deputy account * add committee permissions for new params Co-authored-by: Alexander Bezobchuk <alexanderbez@users.noreply.github.com> Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com> Co-authored-by: Kevin Davis <karzak@users.noreply.github.com>
275 lines
11 KiB
Go
275 lines
11 KiB
Go
package v0_8
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/cosmos/cosmos-sdk/codec"
|
|
tmtypes "github.com/tendermint/tendermint/types"
|
|
|
|
v038auth "github.com/cosmos/cosmos-sdk/x/auth"
|
|
v038authexported "github.com/cosmos/cosmos-sdk/x/auth/exported"
|
|
v038vesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types"
|
|
v038dist "github.com/cosmos/cosmos-sdk/x/distribution"
|
|
v038evidence "github.com/cosmos/cosmos-sdk/x/evidence"
|
|
v038genutil "github.com/cosmos/cosmos-sdk/x/genutil"
|
|
v038genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types"
|
|
v038slashing "github.com/cosmos/cosmos-sdk/x/slashing"
|
|
v038staking "github.com/cosmos/cosmos-sdk/x/staking"
|
|
v038supply "github.com/cosmos/cosmos-sdk/x/supply"
|
|
v038upgrade "github.com/cosmos/cosmos-sdk/x/upgrade"
|
|
|
|
"github.com/kava-labs/kava/app"
|
|
v18de63auth "github.com/kava-labs/kava/migrate/v0_8/sdk/auth/v18de63"
|
|
v038distcustom "github.com/kava-labs/kava/migrate/v0_8/sdk/distribution/v0_38"
|
|
v18de63dist "github.com/kava-labs/kava/migrate/v0_8/sdk/distribution/v18de63"
|
|
v038evidencecustom "github.com/kava-labs/kava/migrate/v0_8/sdk/evidence/v0_38"
|
|
v038slashingcustom "github.com/kava-labs/kava/migrate/v0_8/sdk/slashing/v0_38"
|
|
v18de63slashing "github.com/kava-labs/kava/migrate/v0_8/sdk/slashing/v18de63"
|
|
v038stakingcustom "github.com/kava-labs/kava/migrate/v0_8/sdk/staking/v0_38"
|
|
v18de63staking "github.com/kava-labs/kava/migrate/v0_8/sdk/staking/v18de63"
|
|
v18de63supply "github.com/kava-labs/kava/migrate/v0_8/sdk/supply/v18de63"
|
|
v032tendermint "github.com/kava-labs/kava/migrate/v0_8/tendermint/v0_32"
|
|
v033tendermint "github.com/kava-labs/kava/migrate/v0_8/tendermint/v0_33"
|
|
"github.com/kava-labs/kava/x/auction"
|
|
"github.com/kava-labs/kava/x/bep3"
|
|
"github.com/kava-labs/kava/x/cdp"
|
|
"github.com/kava-labs/kava/x/committee"
|
|
"github.com/kava-labs/kava/x/incentive"
|
|
"github.com/kava-labs/kava/x/kavadist"
|
|
"github.com/kava-labs/kava/x/pricefeed"
|
|
v0_3validator_vesting "github.com/kava-labs/kava/x/validator-vesting/legacy/v0_3"
|
|
v0_8validator_vesting "github.com/kava-labs/kava/x/validator-vesting/types"
|
|
)
|
|
|
|
// Migrate translates a genesis file from kava v0.3.x format to kava v0.8.x format.
|
|
func Migrate(v0_3GenDoc v032tendermint.GenesisDoc) tmtypes.GenesisDoc {
|
|
|
|
// migrate app state
|
|
var appStateMap v038genutil.AppMap
|
|
if err := v032tendermint.Cdc.UnmarshalJSON(v0_3GenDoc.AppState, &appStateMap); err != nil {
|
|
panic(err)
|
|
}
|
|
newAppState := MigrateAppState(appStateMap)
|
|
v0_8Codec := app.MakeCodec()
|
|
marshaledNewAppState, err := v0_8Codec.MarshalJSON(newAppState)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// migrate tendermint state
|
|
newGenDoc := v033tendermint.Migrate(v0_3GenDoc)
|
|
|
|
newGenDoc.AppState = marshaledNewAppState
|
|
return newGenDoc
|
|
}
|
|
|
|
func MigrateAppState(v0_3AppState v038genutil.AppMap) v038genutil.AppMap {
|
|
|
|
// run sdk migrations for commit 18de63 to v0.38, ignoring auth (validator vesting needs a custom migration)
|
|
v0_8AppState := MigrateSDK(v0_3AppState)
|
|
|
|
// create codec for current app version
|
|
v0_8Codec := app.MakeCodec()
|
|
|
|
// migrate auth state
|
|
// recreate the codec from v0.3 (note: current codec and crypto packages are backwards compatible) (note this is not a compete recreation of v0.3's codec)
|
|
v0_3Codec := codec.New()
|
|
codec.RegisterCrypto(v0_3Codec)
|
|
v18de63auth.RegisterCodec(v0_3Codec)
|
|
v18de63auth.RegisterCodecVesting(v0_3Codec)
|
|
v18de63supply.RegisterCodec(v0_3Codec)
|
|
v0_3validator_vesting.RegisterCodec(v0_3Codec)
|
|
|
|
if v0_3AppState[v18de63auth.ModuleName] != nil {
|
|
var authGenState v18de63auth.GenesisState
|
|
v0_3Codec.MustUnmarshalJSON(v0_3AppState[v18de63auth.ModuleName], &authGenState)
|
|
|
|
delete(v0_3AppState, v18de63auth.ModuleName)
|
|
v0_8AppState[v038auth.ModuleName] = v0_8Codec.MustMarshalJSON(MigrateAuth(authGenState))
|
|
}
|
|
|
|
// migrate new modules (by adding new gen states)
|
|
v0_8AppState[auction.ModuleName] = v0_8Codec.MustMarshalJSON(auction.DefaultGenesisState())
|
|
v0_8AppState[bep3.ModuleName] = v0_8Codec.MustMarshalJSON(bep3.DefaultGenesisState())
|
|
v0_8AppState[cdp.ModuleName] = v0_8Codec.MustMarshalJSON(cdp.DefaultGenesisState())
|
|
v0_8AppState[committee.ModuleName] = v0_8Codec.MustMarshalJSON(committee.DefaultGenesisState())
|
|
v0_8AppState[incentive.ModuleName] = v0_8Codec.MustMarshalJSON(incentive.DefaultGenesisState())
|
|
v0_8AppState[kavadist.ModuleName] = v0_8Codec.MustMarshalJSON(kavadist.DefaultGenesisState())
|
|
v0_8AppState[pricefeed.ModuleName] = v0_8Codec.MustMarshalJSON(pricefeed.DefaultGenesisState())
|
|
|
|
return v0_8AppState
|
|
}
|
|
|
|
// migrate the sdk modules from sdk commit 18de63 (v0.37 and half) to v0.38.3, mostly copying v038.Migrate
|
|
func MigrateSDK(appState v038genutil.AppMap) v038genutil.AppMap {
|
|
|
|
v18de63Codec := codec.New() // ideally this would use the exact version of amino from kava v0.3, but the current version is backwards compatible
|
|
codec.RegisterCrypto(v18de63Codec)
|
|
v18de63auth.RegisterCodec(v18de63Codec)
|
|
|
|
v038Codec := app.MakeCodec() // using current kava app codec
|
|
|
|
// for each module, unmarshal old state, run a migrate(genesisStateType) func, marshal returned type into json and set
|
|
|
|
// migrate distribution state
|
|
if appState[v18de63dist.ModuleName] != nil {
|
|
var distGenState v18de63dist.GenesisState
|
|
v18de63Codec.MustUnmarshalJSON(appState[v18de63dist.ModuleName], &distGenState)
|
|
|
|
delete(appState, v18de63dist.ModuleName) // delete old key in case the name changed
|
|
appState[v038dist.ModuleName] = v038Codec.MustMarshalJSON(v038distcustom.Migrate(distGenState))
|
|
}
|
|
|
|
// migrate slashing and evidence state
|
|
if appState[v18de63slashing.ModuleName] != nil {
|
|
var slashingGenState v18de63slashing.GenesisState
|
|
v18de63Codec.MustUnmarshalJSON(appState[v18de63slashing.ModuleName], &slashingGenState)
|
|
|
|
delete(appState, v18de63slashing.ModuleName)
|
|
// remove param
|
|
appState[v038slashing.ModuleName] = v038Codec.MustMarshalJSON(v038slashingcustom.Migrate(slashingGenState))
|
|
// add new evidence module genesis (with above param)
|
|
appState[v038evidence.ModuleName] = v038Codec.MustMarshalJSON(v038evidencecustom.Migrate(slashingGenState))
|
|
}
|
|
|
|
// migrate staking state
|
|
if appState[v18de63staking.ModuleName] != nil {
|
|
var stakingGenState v18de63staking.GenesisState
|
|
v18de63Codec.MustUnmarshalJSON(appState[v18de63staking.ModuleName], &stakingGenState)
|
|
|
|
delete(appState, v18de63staking.ModuleName)
|
|
appState[v038staking.ModuleName] = v038Codec.MustMarshalJSON(v038stakingcustom.Migrate(stakingGenState))
|
|
}
|
|
|
|
// migrate genutil state
|
|
appState[v038genutil.ModuleName] = v038Codec.MustMarshalJSON(v038genutiltypes.DefaultGenesisState())
|
|
|
|
// add upgrade state
|
|
appState[v038upgrade.ModuleName] = []byte(`{}`)
|
|
|
|
return appState
|
|
}
|
|
|
|
func MigrateAuth(oldGenState v18de63auth.GenesisState) v038auth.GenesisState {
|
|
// old and new struct type are identical but with different (un)marshalJSON methods
|
|
var newAccounts v038authexported.GenesisAccounts
|
|
for _, account := range oldGenState.Accounts {
|
|
switch acc := account.(type) {
|
|
|
|
case *v18de63auth.BaseAccount:
|
|
a := v038auth.BaseAccount(*acc)
|
|
newAccounts = append(newAccounts, v038authexported.GenesisAccount(&a))
|
|
|
|
case *v18de63auth.BaseVestingAccount:
|
|
ba := v038auth.BaseAccount(*(acc.BaseAccount))
|
|
bva := v038vesting.BaseVestingAccount{
|
|
BaseAccount: &ba,
|
|
OriginalVesting: acc.OriginalVesting,
|
|
DelegatedFree: acc.DelegatedFree,
|
|
DelegatedVesting: acc.DelegatedVesting,
|
|
EndTime: acc.EndTime,
|
|
}
|
|
newAccounts = append(newAccounts, v038authexported.GenesisAccount(&bva))
|
|
|
|
case *v18de63auth.ContinuousVestingAccount:
|
|
ba := v038auth.BaseAccount(*(acc.BaseVestingAccount.BaseAccount))
|
|
bva := v038vesting.BaseVestingAccount{
|
|
BaseAccount: &ba,
|
|
OriginalVesting: acc.BaseVestingAccount.OriginalVesting,
|
|
DelegatedFree: acc.BaseVestingAccount.DelegatedFree,
|
|
DelegatedVesting: acc.BaseVestingAccount.DelegatedVesting,
|
|
EndTime: acc.BaseVestingAccount.EndTime,
|
|
}
|
|
cva := v038vesting.ContinuousVestingAccount{
|
|
BaseVestingAccount: &bva,
|
|
StartTime: acc.StartTime,
|
|
}
|
|
newAccounts = append(newAccounts, v038authexported.GenesisAccount(&cva))
|
|
|
|
case *v18de63auth.DelayedVestingAccount:
|
|
ba := v038auth.BaseAccount(*(acc.BaseVestingAccount.BaseAccount))
|
|
bva := v038vesting.BaseVestingAccount{
|
|
BaseAccount: &ba,
|
|
OriginalVesting: acc.BaseVestingAccount.OriginalVesting,
|
|
DelegatedFree: acc.BaseVestingAccount.DelegatedFree,
|
|
DelegatedVesting: acc.BaseVestingAccount.DelegatedVesting,
|
|
EndTime: acc.BaseVestingAccount.EndTime,
|
|
}
|
|
dva := v038vesting.DelayedVestingAccount{
|
|
BaseVestingAccount: &bva,
|
|
}
|
|
newAccounts = append(newAccounts, v038authexported.GenesisAccount(&dva))
|
|
|
|
case *v18de63auth.PeriodicVestingAccount:
|
|
ba := v038auth.BaseAccount(*(acc.BaseVestingAccount.BaseAccount))
|
|
bva := v038vesting.BaseVestingAccount{
|
|
BaseAccount: &ba,
|
|
OriginalVesting: acc.BaseVestingAccount.OriginalVesting,
|
|
DelegatedFree: acc.BaseVestingAccount.DelegatedFree,
|
|
DelegatedVesting: acc.BaseVestingAccount.DelegatedVesting,
|
|
EndTime: acc.BaseVestingAccount.EndTime,
|
|
}
|
|
var newPeriods v038vesting.Periods
|
|
for _, p := range acc.VestingPeriods {
|
|
newPeriods = append(newPeriods, v038vesting.Period(p))
|
|
}
|
|
pva := v038vesting.PeriodicVestingAccount{
|
|
BaseVestingAccount: &bva,
|
|
StartTime: acc.StartTime,
|
|
VestingPeriods: newPeriods,
|
|
}
|
|
newAccounts = append(newAccounts, v038authexported.GenesisAccount(&pva))
|
|
|
|
case *v18de63supply.ModuleAccount:
|
|
ba := v038auth.BaseAccount(*(acc.BaseAccount))
|
|
ma := v038supply.ModuleAccount{
|
|
BaseAccount: &ba,
|
|
Name: acc.Name,
|
|
Permissions: acc.Permissions,
|
|
}
|
|
newAccounts = append(newAccounts, v038authexported.GenesisAccount(&ma))
|
|
|
|
case *v0_3validator_vesting.ValidatorVestingAccount:
|
|
ba := v038auth.BaseAccount(*(acc.PeriodicVestingAccount.BaseVestingAccount.BaseAccount))
|
|
bva := v038vesting.BaseVestingAccount{
|
|
BaseAccount: &ba,
|
|
OriginalVesting: acc.PeriodicVestingAccount.BaseVestingAccount.OriginalVesting,
|
|
DelegatedFree: acc.PeriodicVestingAccount.BaseVestingAccount.DelegatedFree,
|
|
DelegatedVesting: acc.PeriodicVestingAccount.BaseVestingAccount.DelegatedVesting,
|
|
EndTime: acc.PeriodicVestingAccount.BaseVestingAccount.EndTime,
|
|
}
|
|
var newPeriods v038vesting.Periods
|
|
for _, p := range acc.PeriodicVestingAccount.VestingPeriods {
|
|
newPeriods = append(newPeriods, v038vesting.Period(p))
|
|
}
|
|
pva := v038vesting.PeriodicVestingAccount{
|
|
BaseVestingAccount: &bva,
|
|
StartTime: acc.PeriodicVestingAccount.StartTime,
|
|
VestingPeriods: newPeriods,
|
|
}
|
|
var newVestingProgress []v0_8validator_vesting.VestingProgress
|
|
for _, p := range acc.VestingPeriodProgress {
|
|
newVestingProgress = append(newVestingProgress, v0_8validator_vesting.VestingProgress(p))
|
|
}
|
|
vva := v0_8validator_vesting.ValidatorVestingAccount{
|
|
PeriodicVestingAccount: &pva,
|
|
ValidatorAddress: acc.ValidatorAddress,
|
|
ReturnAddress: acc.ReturnAddress,
|
|
SigningThreshold: acc.SigningThreshold,
|
|
CurrentPeriodProgress: v0_8validator_vesting.CurrentPeriodProgress(acc.CurrentPeriodProgress),
|
|
VestingPeriodProgress: newVestingProgress,
|
|
DebtAfterFailedVesting: acc.DebtAfterFailedVesting,
|
|
}
|
|
newAccounts = append(newAccounts, v038authexported.GenesisAccount(&vva))
|
|
|
|
default:
|
|
panic(fmt.Sprintf("unrecognized account type: %T", acc))
|
|
}
|
|
}
|
|
gs := v038auth.GenesisState{
|
|
Params: v038auth.Params(oldGenState.Params),
|
|
Accounts: newAccounts,
|
|
}
|
|
return gs
|
|
}
|