cosmos-sdk/x/bank/keeper/collections_test.go

91 lines
3.1 KiB
Go

package keeper_test
import (
"testing"
"time"
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
"cosmossdk.io/collections"
"cosmossdk.io/core/header"
coretesting "cosmossdk.io/core/testing"
"cosmossdk.io/math"
storetypes "cosmossdk.io/store/types"
"cosmossdk.io/x/bank/keeper"
banktestutil "cosmossdk.io/x/bank/testutil"
banktypes "cosmossdk.io/x/bank/types"
codectestutil "github.com/cosmos/cosmos-sdk/codec/testutil"
"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"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
)
func TestBankStateCompatibility(t *testing.T) {
key := storetypes.NewKVStoreKey(banktypes.StoreKey)
testCtx := testutil.DefaultContextWithDB(t, key, storetypes.NewTransientStoreKey("transient_test"))
ctx := testCtx.Ctx.WithHeaderInfo(header.Info{Time: time.Now()})
encCfg := moduletestutil.MakeTestEncodingConfig(codectestutil.CodecOptions{})
env := runtime.NewEnvironment(runtime.NewKVStoreService(key), coretesting.NewNopLogger())
ac := codectestutil.CodecOptions{}.GetAddressCodec()
// gomock initializations
ctrl := gomock.NewController(t)
authKeeper := banktestutil.NewMockAccountKeeper(ctrl)
authKeeper.EXPECT().AddressCodec().Return(ac).AnyTimes()
addr, err := ac.BytesToString(accAddrs[4])
require.NoError(t, err)
authority, err := ac.BytesToString(authtypes.NewModuleAddress(banktypes.GovModuleName))
require.NoError(t, err)
k := keeper.NewBaseKeeper(
env,
encCfg.Codec,
authKeeper,
map[string]bool{addr: true},
authority,
)
// test we can decode balances without problems
// using the old value format of the denom to address index
bankDenomAddressLegacyIndexValue := []byte{0} // taken from: https://github.com/cosmos/cosmos-sdk/blob/v0.47.3/x/bank/keeper/send.go#L361
rawKey, err := collections.EncodeKeyWithPrefix(
banktypes.DenomAddressPrefix,
k.Balances.Indexes.Denom.KeyCodec(),
collections.Join("atom", sdk.AccAddress("test")),
)
require.NoError(t, err)
// we set the index key to the old value.
require.NoError(t, env.KVStoreService.OpenKVStore(ctx).Set(rawKey, bankDenomAddressLegacyIndexValue))
// test walking is ok
err = k.Balances.Indexes.Denom.Walk(ctx, nil, func(indexingKey string, indexedKey sdk.AccAddress) (stop bool, err error) {
require.Equal(t, indexedKey, sdk.AccAddress("test"))
require.Equal(t, indexingKey, "atom")
return true, nil
})
require.NoError(t, err)
// test matching is also ok
iter, err := k.Balances.Indexes.Denom.MatchExact(ctx, "atom")
require.NoError(t, err)
defer iter.Close()
pks, err := iter.PrimaryKeys()
require.NoError(t, err)
require.Len(t, pks, 1)
require.Equal(t, pks[0], collections.Join(sdk.AccAddress("test"), "atom"))
// assert the index value will be updated to the new format
err = k.Balances.Indexes.Denom.Reference(ctx, collections.Join(sdk.AccAddress("test"), "atom"), math.ZeroInt(), nil)
require.NoError(t, err)
newRawValue, err := env.KVStoreService.OpenKVStore(ctx).Get(rawKey)
require.NoError(t, err)
require.Equal(t, []byte{}, newRawValue)
}