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  }