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  }