cosmos-sdk/tests/integration/distribution/migration_v4_test.go

170 lines
5.6 KiB
Go

package distribution_test
import (
"context"
"testing"
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
"cosmossdk.io/core/comet"
coretesting "cosmossdk.io/core/testing"
"cosmossdk.io/log"
storetypes "cosmossdk.io/store/types"
"cosmossdk.io/x/bank"
bankkeeper "cosmossdk.io/x/bank/keeper"
banktypes "cosmossdk.io/x/bank/types"
"cosmossdk.io/x/distribution"
"cosmossdk.io/x/distribution/keeper"
v4 "cosmossdk.io/x/distribution/migrations/v4"
distrtestutil "cosmossdk.io/x/distribution/testutil"
disttypes "cosmossdk.io/x/distribution/types"
pooltypes "cosmossdk.io/x/protocolpool/types"
addresscodec "github.com/cosmos/cosmos-sdk/codec/address"
codectestutil "github.com/cosmos/cosmos-sdk/codec/testutil"
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
"github.com/cosmos/cosmos-sdk/runtime"
"github.com/cosmos/cosmos-sdk/testutil"
sdk "github.com/cosmos/cosmos-sdk/types"
moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
"github.com/cosmos/cosmos-sdk/x/auth"
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
authtestutil "github.com/cosmos/cosmos-sdk/x/auth/testutil"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
)
func TestMigration(t *testing.T) {
cdc := moduletestutil.MakeTestEncodingConfig(codectestutil.CodecOptions{}, distribution.AppModule{}).Codec
storeKey := storetypes.NewKVStoreKey("distribution")
storeService := runtime.NewKVStoreService(storeKey)
tKey := storetypes.NewTransientStoreKey("transient_test")
ctx := testutil.DefaultContext(storeKey, tKey)
env := runtime.NewEnvironment(storeService, coretesting.NewNopLogger())
addr1 := secp256k1.GenPrivKey().PubKey().Address()
consAddr1 := sdk.ConsAddress(addr1)
// Set and check the previous proposer
err := v4.SetPreviousProposerConsAddr(ctx, storeService, cdc, consAddr1)
require.NoError(t, err)
gotAddr, err := v4.GetPreviousProposerConsAddr(ctx, storeService, cdc)
require.NoError(t, err)
require.Equal(t, consAddr1, gotAddr)
err = v4.MigrateStore(ctx, env, cdc)
require.NoError(t, err)
// Check that the previous proposer has been removed
_, err = v4.GetPreviousProposerConsAddr(ctx, storeService, cdc)
require.ErrorContains(t, err, "previous proposer not set")
}
type emptyCometService struct{}
// CometInfo implements comet.Service.
func (e *emptyCometService) CometInfo(context.Context) comet.Info {
return comet.Info{}
}
func TestFundsMigration(t *testing.T) {
keys := storetypes.NewKVStoreKeys(
authtypes.StoreKey, banktypes.StoreKey, disttypes.StoreKey,
)
logger := log.NewTestLogger(t)
cms := moduletestutil.CreateMultiStore(keys, logger)
encCfg := moduletestutil.MakeTestEncodingConfig(codectestutil.CodecOptions{}, auth.AppModule{}, bank.AppModule{}, distribution.AppModule{})
ctx := sdk.NewContext(cms, true, logger)
addressCodec := addresscodec.NewBech32Codec(sdk.Bech32MainPrefix)
maccPerms := map[string][]string{
pooltypes.ModuleName: nil,
disttypes.ModuleName: {authtypes.Minter},
}
authority, err := addressCodec.BytesToString(authtypes.NewModuleAddress("gov"))
require.NoError(t, err)
// gomock initializations
ctrl := gomock.NewController(t)
acctsModKeeper := authtestutil.NewMockAccountsModKeeper(ctrl)
stakingKeeper := distrtestutil.NewMockStakingKeeper(ctrl)
accNum := uint64(0)
acctsModKeeper.EXPECT().NextAccountNumber(gomock.Any()).AnyTimes().DoAndReturn(func(ctx context.Context) (uint64, error) {
currNum := accNum
accNum++
return currNum, nil
})
// create account keeper
accountKeeper := authkeeper.NewAccountKeeper(
runtime.NewEnvironment(runtime.NewKVStoreService(keys[authtypes.StoreKey]), log.NewNopLogger()),
encCfg.Codec,
authtypes.ProtoBaseAccount,
acctsModKeeper,
maccPerms,
addressCodec,
sdk.Bech32MainPrefix,
authority,
)
// create bank keeper
bankKeeper := bankkeeper.NewBaseKeeper(
runtime.NewEnvironment(runtime.NewKVStoreService(keys[banktypes.StoreKey]), log.NewNopLogger()),
encCfg.Codec,
accountKeeper,
map[string]bool{},
authority,
)
// create distribution keeper
distrKeeper := keeper.NewKeeper(
encCfg.Codec,
runtime.NewEnvironment(runtime.NewKVStoreService(keys[disttypes.StoreKey]), log.NewNopLogger()),
accountKeeper,
bankKeeper,
stakingKeeper,
&emptyCometService{},
disttypes.ModuleName,
authority,
)
// Set feepool
poolAmount := sdk.NewInt64Coin("test", 100000)
feepool := disttypes.FeePool{
CommunityPool: sdk.NewDecCoinsFromCoins(poolAmount),
}
err = distrKeeper.FeePool.Set(ctx, feepool)
require.NoError(t, err)
distrAcc := authtypes.NewEmptyModuleAccount(disttypes.ModuleName)
// mint coins in distribution module account
distrModBal := sdk.NewCoins(sdk.NewInt64Coin("test", 10000000))
err = bankKeeper.MintCoins(ctx, distrAcc.GetName(), distrModBal)
require.NoError(t, err)
// Set pool module account
poolAcc := authtypes.NewEmptyModuleAccount(pooltypes.ModuleName)
// migrate feepool funds from distribution module account to pool module account
_, err = v4.MigrateFunds(ctx, bankKeeper, feepool, distrAcc, poolAcc)
require.NoError(t, err)
// set distribution feepool as empty (since migration)
err = distrKeeper.FeePool.Set(ctx, disttypes.FeePool{})
require.NoError(t, err)
// check pool module account balance equals pool amount
poolMAccBal := bankKeeper.GetAllBalances(ctx, poolAcc.GetAddress())
require.Equal(t, poolMAccBal, sdk.Coins{poolAmount})
distrAccBal := bankKeeper.GetAllBalances(ctx, distrAcc.GetAddress())
// check distribution module account balance is not same after migration
require.NotEqual(t, distrModBal, distrAccBal)
// check distribution module account balance is same as (current distrAccBal+poolAmount)
require.Equal(t, distrModBal, distrAccBal.Add(poolAmount))
}