github.com/cosmos/cosmos-sdk@v0.50.10/x/bank/migrations/v2/store_test.go (about) 1 package v2_test 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/require" 7 8 "cosmossdk.io/math" 9 "cosmossdk.io/store/prefix" 10 storetypes "cosmossdk.io/store/types" 11 12 "github.com/cosmos/cosmos-sdk/runtime" 13 "github.com/cosmos/cosmos-sdk/testutil" 14 "github.com/cosmos/cosmos-sdk/testutil/testdata" 15 sdk "github.com/cosmos/cosmos-sdk/types" 16 moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" 17 v1bank "github.com/cosmos/cosmos-sdk/x/bank/migrations/v1" 18 v2bank "github.com/cosmos/cosmos-sdk/x/bank/migrations/v2" 19 "github.com/cosmos/cosmos-sdk/x/bank/types" 20 ) 21 22 func TestSupplyMigration(t *testing.T) { 23 encCfg := moduletestutil.MakeTestEncodingConfig() 24 bankKey := storetypes.NewKVStoreKey("bank") 25 storeService := runtime.NewKVStoreService(bankKey) 26 ctx := testutil.DefaultContext(bankKey, storetypes.NewTransientStoreKey("transient_test")) 27 store := runtime.KVStoreAdapter(storeService.OpenKVStore(ctx)) 28 29 v1bank.RegisterInterfaces(encCfg.InterfaceRegistry) 30 31 oldFooCoin := sdk.NewCoin("foo", math.NewInt(100)) 32 oldBarCoin := sdk.NewCoin("bar", math.NewInt(200)) 33 oldFooBarCoin := sdk.NewCoin("foobar", math.NewInt(0)) // to ensure the zero denom coins pruned. 34 35 // Old supply was stored as a single blob under the `SupplyKey`. 36 oldSupply := &types.Supply{Total: sdk.Coins{oldFooCoin, oldBarCoin, oldFooBarCoin}} 37 oldSupplyBz, err := encCfg.Codec.MarshalInterface(oldSupply) 38 require.NoError(t, err) 39 store.Set(v1bank.SupplyKey, oldSupplyBz) 40 41 // Run migration. 42 err = v2bank.MigrateStore(ctx, storeService, encCfg.Codec) 43 require.NoError(t, err) 44 45 // New supply is indexed by denom. 46 supplyStore := prefix.NewStore(store, types.SupplyKey) 47 bz := supplyStore.Get([]byte("foo")) 48 var amount math.Int 49 err = amount.Unmarshal(bz) 50 require.NoError(t, err) 51 52 newFooCoin := sdk.Coin{ 53 Denom: "foo", 54 Amount: amount, 55 } 56 require.Equal(t, oldFooCoin, newFooCoin) 57 58 bz = supplyStore.Get([]byte("bar")) 59 err = amount.Unmarshal(bz) 60 require.NoError(t, err) 61 62 newBarCoin := sdk.Coin{ 63 Denom: "bar", 64 Amount: amount, 65 } 66 require.Equal(t, oldBarCoin, newBarCoin) 67 68 // foobar shouldn't be existed in the store. 69 bz = supplyStore.Get([]byte("foobar")) 70 require.Nil(t, bz) 71 } 72 73 func TestBalanceKeysMigration(t *testing.T) { 74 encCfg := moduletestutil.MakeTestEncodingConfig() 75 bankKey := storetypes.NewKVStoreKey("bank") 76 storeService := runtime.NewKVStoreService(bankKey) 77 ctx := testutil.DefaultContext(bankKey, storetypes.NewTransientStoreKey("transient_test")) 78 store := runtime.KVStoreAdapter(storeService.OpenKVStore(ctx)) 79 80 _, _, addr := testdata.KeyTestPubAddr() 81 82 // set 10 foo coin 83 fooCoin := sdk.NewCoin("foo", math.NewInt(10)) 84 oldFooKey := append(append(v1bank.BalancesPrefix, addr...), []byte(fooCoin.Denom)...) 85 fooBz, err := encCfg.Codec.Marshal(&fooCoin) 86 require.NoError(t, err) 87 store.Set(oldFooKey, fooBz) 88 89 // set 0 foobar coin 90 fooBarCoin := sdk.NewCoin("foobar", math.NewInt(0)) 91 oldKeyFooBar := append(append(v1bank.BalancesPrefix, addr...), []byte(fooBarCoin.Denom)...) 92 fooBarBz, err := encCfg.Codec.Marshal(&fooBarCoin) 93 require.NoError(t, err) 94 store.Set(oldKeyFooBar, fooBarBz) 95 require.NotNil(t, store.Get(oldKeyFooBar)) // before store migation zero values can also exist in store. 96 97 err = v2bank.MigrateStore(ctx, storeService, encCfg.Codec) 98 require.NoError(t, err) 99 100 newKey := v2bank.CreatePrefixedAccountStoreKey(addr, []byte(fooCoin.Denom)) 101 // -7 because we replaced "balances" with 0x02, 102 // +1 because we added length-prefix to address. 103 require.Equal(t, len(oldFooKey)-7+1, len(newKey)) 104 require.Nil(t, store.Get(oldFooKey)) 105 require.Equal(t, fooBz, store.Get(newKey)) 106 107 newKeyFooBar := v2bank.CreatePrefixedAccountStoreKey(addr, []byte(fooBarCoin.Denom)) 108 require.Nil(t, store.Get(newKeyFooBar)) // after migration zero balances pruned from store. 109 }