github.com/cosmos/cosmos-sdk@v0.50.10/x/bank/keeper/collections_test.go (about) 1 package keeper_test 2 3 import ( 4 "testing" 5 6 cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" 7 cmttime "github.com/cometbft/cometbft/types/time" 8 "github.com/golang/mock/gomock" 9 "github.com/stretchr/testify/require" 10 11 "cosmossdk.io/collections" 12 "cosmossdk.io/log" 13 "cosmossdk.io/math" 14 storetypes "cosmossdk.io/store/types" 15 16 "github.com/cosmos/cosmos-sdk/codec/address" 17 "github.com/cosmos/cosmos-sdk/runtime" 18 "github.com/cosmos/cosmos-sdk/testutil" 19 sdk "github.com/cosmos/cosmos-sdk/types" 20 moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" 21 authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" 22 "github.com/cosmos/cosmos-sdk/x/bank/keeper" 23 banktestutil "github.com/cosmos/cosmos-sdk/x/bank/testutil" 24 banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" 25 ) 26 27 func TestBankStateCompatibility(t *testing.T) { 28 key := storetypes.NewKVStoreKey(banktypes.StoreKey) 29 testCtx := testutil.DefaultContextWithDB(t, key, storetypes.NewTransientStoreKey("transient_test")) 30 ctx := testCtx.Ctx.WithBlockHeader(cmtproto.Header{Time: cmttime.Now()}) 31 encCfg := moduletestutil.MakeTestEncodingConfig() 32 33 storeService := runtime.NewKVStoreService(key) 34 35 // gomock initializations 36 ctrl := gomock.NewController(t) 37 authKeeper := banktestutil.NewMockAccountKeeper(ctrl) 38 authKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec("cosmos")).AnyTimes() 39 40 k := keeper.NewBaseKeeper( 41 encCfg.Codec, 42 storeService, 43 authKeeper, 44 map[string]bool{accAddrs[4].String(): true}, 45 authtypes.NewModuleAddress("gov").String(), 46 log.NewNopLogger(), 47 ) 48 49 // test we can decode balances without problems 50 // using the old value format of the denom to address index 51 bankDenomAddressLegacyIndexValue := []byte{0} // taken from: https://github.com/cosmos/cosmos-sdk/blob/v0.47.3/x/bank/keeper/send.go#L361 52 rawKey, err := collections.EncodeKeyWithPrefix( 53 banktypes.DenomAddressPrefix, 54 k.Balances.Indexes.Denom.KeyCodec(), 55 collections.Join("atom", sdk.AccAddress("test")), 56 ) 57 require.NoError(t, err) 58 // we set the index key to the old value. 59 require.NoError(t, storeService.OpenKVStore(ctx).Set(rawKey, bankDenomAddressLegacyIndexValue)) 60 61 // test walking is ok 62 err = k.Balances.Indexes.Denom.Walk(ctx, nil, func(indexingKey string, indexedKey sdk.AccAddress) (stop bool, err error) { 63 require.Equal(t, indexedKey, sdk.AccAddress("test")) 64 require.Equal(t, indexingKey, "atom") 65 return true, nil 66 }) 67 require.NoError(t, err) 68 69 // test matching is also ok 70 iter, err := k.Balances.Indexes.Denom.MatchExact(ctx, "atom") 71 require.NoError(t, err) 72 defer iter.Close() 73 pks, err := iter.PrimaryKeys() 74 require.NoError(t, err) 75 require.Len(t, pks, 1) 76 require.Equal(t, pks[0], collections.Join(sdk.AccAddress("test"), "atom")) 77 78 // assert the index value will be updated to the new format 79 err = k.Balances.Indexes.Denom.Reference(ctx, collections.Join(sdk.AccAddress("test"), "atom"), math.ZeroInt(), nil) 80 require.NoError(t, err) 81 82 newRawValue, err := storeService.OpenKVStore(ctx).Get(rawKey) 83 require.NoError(t, err) 84 require.Equal(t, []byte{}, newRawValue) 85 }