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  }