cosmos-sdk/x/group/migrations/v2/gen_state.go

68 lines
1.7 KiB
Go

package v2
import (
"encoding/binary"
"cosmossdk.io/core/address"
sdk "github.com/cosmos/cosmos-sdk/types"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
)
// MigrateGenState accepts exported v0.46 x/auth genesis state and migrates it to
// v0.47 x/auth genesis state. The migration includes:
// - If the group module is enabled, replace group policy accounts from module accounts to base accounts.
func MigrateGenState(oldState *authtypes.GenesisState, addressCodec address.Codec) *authtypes.GenesisState {
newState := *oldState
accounts, err := authtypes.UnpackAccounts(newState.Accounts)
if err != nil {
panic(err)
}
groupPolicyAccountCounter := uint64(0)
for i, acc := range accounts {
modAcc, ok := acc.(sdk.ModuleAccountI)
if !ok {
continue
}
modAddr, err := addressCodec.BytesToString(modAcc.GetAddress())
if err != nil {
panic(err)
}
if modAcc.GetName() != modAddr {
continue
}
// Replace group policy accounts from module accounts to base accounts.
// These accounts were wrongly created and the address was equal to the module name.
derivationKey := make([]byte, 8)
binary.BigEndian.PutUint64(derivationKey, groupPolicyAccountCounter)
cred, err := authtypes.NewModuleCredential(ModuleName, []byte{GroupPolicyTablePrefix}, derivationKey)
if err != nil {
panic(err)
}
baseAccount, err := authtypes.NewBaseAccountWithPubKey(cred)
if err != nil {
panic(err)
}
if err := baseAccount.SetAccountNumber(modAcc.GetAccountNumber()); err != nil {
panic(err)
}
accounts[i] = baseAccount
groupPolicyAccountCounter++
}
packedAccounts, err := authtypes.PackAccounts(accounts)
if err != nil {
panic(err)
}
newState.Accounts = packedAccounts
return &newState
}