From 2ed6c5485bf33caaff1a0c8563a7b61c9ba60ba7 Mon Sep 17 00:00:00 2001 From: testinginprod <98415576+testinginprod@users.noreply.github.com> Date: Wed, 3 May 2023 15:11:55 +0200 Subject: [PATCH] fix(x/group): v2 migration (#16017) Co-authored-by: unknown unknown --- CHANGELOG.md | 1 + x/group/migrations/v2/migrate.go | 6 ++++ x/group/migrations/v2/migrate_test.go | 48 ++++++++++++++------------- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3d49a8a086d6..2269e37866941 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -201,6 +201,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Bug Fixes +* (x/group) [#16017](https://github.com/cosmos/cosmos-sdk/pull/16017) Correctly apply account number in group v2 migration. * (types) [#15691](https://github.com/cosmos/cosmos-sdk/pull/15691) Make Coin.Validate() check that .Amount is not nil * (x/auth) [#15059](https://github.com/cosmos/cosmos-sdk/pull/15059) `ante.CountSubKeys` returns 0 when passing a nil `Pubkey`. * (x/capability) [#15030](https://github.com/cosmos/cosmos-sdk/pull/15030) Prevent `x/capability` from consuming `GasMeter` gas during `InitMemStore` diff --git a/x/group/migrations/v2/migrate.go b/x/group/migrations/v2/migrate.go index cba629c0dbc7b..a1fc4fcc1e273 100644 --- a/x/group/migrations/v2/migrate.go +++ b/x/group/migrations/v2/migrate.go @@ -69,6 +69,12 @@ func Migrate( return fmt.Errorf("failed to create new group policy account: %w", err) } + // set account number + err = baseAccount.SetAccountNumber(oldAcc.GetAccountNumber()) + if err != nil { + return err + } + // NOTE: we do not call NewAccount because we do not want to bump the account number // set new account diff --git a/x/group/migrations/v2/migrate_test.go b/x/group/migrations/v2/migrate_test.go index be7243eaa24af..169665ce9f126 100644 --- a/x/group/migrations/v2/migrate_test.go +++ b/x/group/migrations/v2/migrate_test.go @@ -23,11 +23,11 @@ import ( ) var ( - policies = []sdk.AccAddress{policyAddr1, policyAddr2, policyAddr3} - policyAddr1 = sdk.MustAccAddressFromBech32("cosmos1q32tjg5qm3n9fj8wjgpd7gl98prefntrckjkyvh8tntp7q33zj0s5tkjrk") - policyAddr2 = sdk.MustAccAddressFromBech32("cosmos1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfwkgpd") - policyAddr3 = sdk.MustAccAddressFromBech32("cosmos1dlszg2sst9r69my4f84l3mj66zxcf3umcgujys30t84srg95dgvsmn3jeu") - accountAddr = sdk.AccAddress("addr2_______________") + policies = []sdk.AccAddress{policyAddr1, policyAddr2, policyAddr3} + policyAddr1 = sdk.MustAccAddressFromBech32("cosmos1q32tjg5qm3n9fj8wjgpd7gl98prefntrckjkyvh8tntp7q33zj0s5tkjrk") + policyAddr2 = sdk.MustAccAddressFromBech32("cosmos1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfwkgpd") + policyAddr3 = sdk.MustAccAddressFromBech32("cosmos1dlszg2sst9r69my4f84l3mj66zxcf3umcgujys30t84srg95dgvsmn3jeu") + authorityAddr = sdk.AccAddress("authority") ) func TestMigrate(t *testing.T) { @@ -36,24 +36,23 @@ func TestMigrate(t *testing.T) { tKey := storetypes.NewTransientStoreKey("transient_test") ctx := testutil.DefaultContext(storeKey, tKey) - accountKeeper := createOldPolicyAccount(ctx, storeKey, cdc) - groupPolicyTable, groupPolicySeq, err := createGroupPolicies(ctx, storeKey, cdc) + oldAccs, accountKeeper := createOldPolicyAccount(ctx, storeKey, cdc, policies) + groupPolicyTable, groupPolicySeq, err := createGroupPolicies(ctx, storeKey, cdc, policies) require.NoError(t, err) - oldAcc := accountKeeper.GetAccount(ctx, policyAddr1) - require.NoError(t, v2.Migrate(ctx, storeKey, accountKeeper, groupPolicySeq, groupPolicyTable)) - newAcc := accountKeeper.GetAccount(ctx, policyAddr1) - - require.NotEqual(t, oldAcc, newAcc) - require.True(t, func() bool { _, ok := oldAcc.(*authtypes.ModuleAccount); return ok }()) - require.True(t, func() bool { _, ok := newAcc.(*authtypes.BaseAccount); return ok }()) - require.Equal(t, oldAcc.GetAddress(), newAcc.GetAddress()) - require.Equal(t, oldAcc.GetAccountNumber(), newAcc.GetAccountNumber()) - require.Equal(t, newAcc.GetPubKey().Address().Bytes(), newAcc.GetAddress().Bytes()) + for i, policyAddr := range policies { + oldAcc := oldAccs[i] + newAcc := accountKeeper.GetAccount(ctx, policyAddr) + require.NotEqual(t, oldAcc, newAcc) + require.True(t, func() bool { _, ok := newAcc.(*authtypes.BaseAccount); return ok }()) + require.Equal(t, oldAcc.GetAddress(), newAcc.GetAddress()) + require.Equal(t, int(oldAcc.GetAccountNumber()), int(newAcc.GetAccountNumber())) + require.Equal(t, newAcc.GetPubKey().Address().Bytes(), newAcc.GetAddress().Bytes()) + } } -func createGroupPolicies(ctx sdk.Context, storeKey storetypes.StoreKey, cdc codec.Codec) (orm.PrimaryKeyTable, orm.Sequence, error) { +func createGroupPolicies(ctx sdk.Context, storeKey storetypes.StoreKey, cdc codec.Codec, policies []sdk.AccAddress) (orm.PrimaryKeyTable, orm.Sequence, error) { groupPolicyTable, err := orm.NewPrimaryKeyTable([2]byte{groupkeeper.GroupPolicyTablePrefix}, &group.GroupPolicyInfo{}, cdc) if err != nil { panic(err.Error()) @@ -62,7 +61,7 @@ func createGroupPolicies(ctx sdk.Context, storeKey storetypes.StoreKey, cdc code groupPolicySeq := orm.NewSequence(v2.GroupPolicyTableSeqPrefix) for _, policyAddr := range policies { - groupPolicyInfo, err := group.NewGroupPolicyInfo(policyAddr, 1, accountAddr, "", 1, group.NewPercentageDecisionPolicy("1", 1, 1), ctx.BlockTime()) + groupPolicyInfo, err := group.NewGroupPolicyInfo(policyAddr, 1, authorityAddr, "", 1, group.NewPercentageDecisionPolicy("1", 1, 1), ctx.BlockTime()) if err != nil { return orm.PrimaryKeyTable{}, orm.Sequence{}, err } @@ -78,9 +77,11 @@ func createGroupPolicies(ctx sdk.Context, storeKey storetypes.StoreKey, cdc code } // createOldPolicyAccount re-creates the group policy account using a module account -func createOldPolicyAccount(ctx sdk.Context, storeKey storetypes.StoreKey, cdc codec.Codec) group.AccountKeeper { - accountKeeper := authkeeper.NewAccountKeeper(cdc, runtime.NewKVStoreService(storeKey.(*storetypes.KVStoreKey)), authtypes.ProtoBaseAccount, nil, sdk.Bech32MainPrefix, accountAddr.String()) - for _, policyAddr := range policies { +func createOldPolicyAccount(ctx sdk.Context, storeKey storetypes.StoreKey, cdc codec.Codec, policies []sdk.AccAddress) ([]*authtypes.ModuleAccount, group.AccountKeeper) { + accountKeeper := authkeeper.NewAccountKeeper(cdc, runtime.NewKVStoreService(storeKey.(*storetypes.KVStoreKey)), authtypes.ProtoBaseAccount, nil, sdk.Bech32MainPrefix, authorityAddr.String()) + + oldPolicyAccounts := make([]*authtypes.ModuleAccount, len(policies)) + for i, policyAddr := range policies { acc := accountKeeper.NewAccount(ctx, &authtypes.ModuleAccount{ BaseAccount: &authtypes.BaseAccount{ Address: policyAddr.String(), @@ -88,7 +89,8 @@ func createOldPolicyAccount(ctx sdk.Context, storeKey storetypes.StoreKey, cdc c Name: policyAddr.String(), }) accountKeeper.SetAccount(ctx, acc) + oldPolicyAccounts[i] = acc.(*authtypes.ModuleAccount) } - return accountKeeper + return oldPolicyAccounts, accountKeeper }