github.com/Finschia/finschia-sdk@v0.48.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 var oldSupply v040bank.SupplyI 30 oldSupply = &types.Supply{Total: sdk.Coins{oldFooCoin, oldBarCoin, oldFooBarCoin}} 31 oldSupplyBz, err := encCfg.Marshaler.MarshalInterface(oldSupply) 32 require.NoError(t, err) 33 store.Set(v040bank.SupplyKey, oldSupplyBz) 34 35 // Run migration. 36 err = v043bank.MigrateStore(ctx, bankKey, encCfg.Marshaler) 37 require.NoError(t, err) 38 39 // New supply is indexed by denom. 40 supplyStore := prefix.NewStore(store, types.SupplyKey) 41 bz := supplyStore.Get([]byte("foo")) 42 var amount sdk.Int 43 err = amount.Unmarshal(bz) 44 require.NoError(t, err) 45 46 newFooCoin := sdk.Coin{ 47 Denom: "foo", 48 Amount: amount, 49 } 50 require.Equal(t, oldFooCoin, newFooCoin) 51 52 bz = supplyStore.Get([]byte("bar")) 53 err = amount.Unmarshal(bz) 54 require.NoError(t, err) 55 56 newBarCoin := sdk.Coin{ 57 Denom: "bar", 58 Amount: amount, 59 } 60 require.Equal(t, oldBarCoin, newBarCoin) 61 62 // foobar shouldn't be existed in the store. 63 bz = supplyStore.Get([]byte("foobar")) 64 require.Nil(t, bz) 65 } 66 67 func TestBalanceKeysMigration(t *testing.T) { 68 encCfg := simapp.MakeTestEncodingConfig() 69 bankKey := sdk.NewKVStoreKey("bank") 70 ctx := testutil.DefaultContext(bankKey, sdk.NewTransientStoreKey("transient_test")) 71 store := ctx.KVStore(bankKey) 72 73 _, _, addr := testdata.KeyTestPubAddr() 74 75 // set 10 foo coin 76 fooCoin := sdk.NewCoin("foo", sdk.NewInt(10)) 77 oldFooKey := append(append(v040bank.BalancesPrefix, addr...), []byte(fooCoin.Denom)...) 78 fooBz, err := encCfg.Marshaler.Marshal(&fooCoin) 79 require.NoError(t, err) 80 store.Set(oldFooKey, fooBz) 81 82 // set 0 foobar coin 83 fooBarCoin := sdk.NewCoin("foobar", sdk.NewInt(0)) 84 oldKeyFooBar := append(append(v040bank.BalancesPrefix, addr...), []byte(fooBarCoin.Denom)...) 85 fooBarBz, err := encCfg.Marshaler.Marshal(&fooBarCoin) 86 require.NoError(t, err) 87 store.Set(oldKeyFooBar, fooBarBz) 88 require.NotNil(t, store.Get(oldKeyFooBar)) // before store migation zero values can also exist in store. 89 90 err = v043bank.MigrateStore(ctx, bankKey, encCfg.Marshaler) 91 require.NoError(t, err) 92 93 newKey := types.CreatePrefixedAccountStoreKey(addr, []byte(fooCoin.Denom)) 94 // -7 because we replaced "balances" with 0x02, 95 // +1 because we added length-prefix to address. 96 require.Equal(t, len(oldFooKey)-7+1, len(newKey)) 97 require.Nil(t, store.Get(oldFooKey)) 98 require.Equal(t, fooBz, store.Get(newKey)) 99 100 newKeyFooBar := types.CreatePrefixedAccountStoreKey(addr, []byte(fooBarCoin.Denom)) 101 require.Nil(t, store.Get(newKeyFooBar)) // after migration zero balances pruned from store. 102 }