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