github.com/cosmos/cosmos-sdk@v0.50.10/x/bank/migrations/v3/store_test.go (about) 1 package v3_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 sdk "github.com/cosmos/cosmos-sdk/types" 15 "github.com/cosmos/cosmos-sdk/types/address" 16 moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" 17 v2 "github.com/cosmos/cosmos-sdk/x/bank/migrations/v2" 18 v3 "github.com/cosmos/cosmos-sdk/x/bank/migrations/v3" 19 "github.com/cosmos/cosmos-sdk/x/bank/types" 20 ) 21 22 func TestMigrateStore(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 addr := sdk.AccAddress([]byte("addr________________")) 30 prefixAccStore := prefix.NewStore(store, v2.CreateAccountBalancesPrefix(addr)) 31 32 balances := sdk.NewCoins( 33 sdk.NewCoin("foo", math.NewInt(10000)), 34 sdk.NewCoin("bar", math.NewInt(20000)), 35 ) 36 37 for _, b := range balances { 38 bz, err := encCfg.Codec.Marshal(&b) //nolint:gosec // G601: Implicit memory aliasing in for loop. 39 require.NoError(t, err) 40 41 prefixAccStore.Set([]byte(b.Denom), bz) 42 } 43 44 require.NoError(t, v3.MigrateStore(ctx, storeService, encCfg.Codec)) 45 46 for _, b := range balances { 47 addrPrefixStore := prefix.NewStore(store, v3.CreateAccountBalancesPrefix(addr)) 48 bz := addrPrefixStore.Get([]byte(b.Denom)) 49 var expected math.Int 50 require.NoError(t, expected.Unmarshal(bz)) 51 require.Equal(t, expected, b.Amount) 52 } 53 54 for _, b := range balances { 55 denomPrefixStore := prefix.NewStore(store, v3.CreateDenomAddressPrefix(b.Denom)) 56 bz := denomPrefixStore.Get(address.MustLengthPrefix(addr)) 57 require.NotNil(t, bz) 58 } 59 } 60 61 func TestMigrateDenomMetaData(t *testing.T) { 62 encCfg := moduletestutil.MakeTestEncodingConfig() 63 bankKey := storetypes.NewKVStoreKey("bank") 64 storeService := runtime.NewKVStoreService(bankKey) 65 ctx := testutil.DefaultContext(bankKey, storetypes.NewTransientStoreKey("transient_test")) 66 store := runtime.KVStoreAdapter(storeService.OpenKVStore(ctx)) 67 metaData := []types.Metadata{ 68 { 69 Name: "Cosmos Hub Atom", 70 Symbol: "ATOM", 71 Description: "The native staking token of the Cosmos Hub.", 72 DenomUnits: []*types.DenomUnit{ 73 {Denom: "uatom", Exponent: uint32(0), Aliases: []string{"microatom"}}, 74 {Denom: "matom", Exponent: uint32(3), Aliases: []string{"milliatom"}}, 75 {Denom: "atom", Exponent: uint32(6), Aliases: nil}, 76 }, 77 Base: "uatom", 78 Display: "atom", 79 }, 80 { 81 Name: "Token", 82 Symbol: "TOKEN", 83 Description: "The native staking token of the Token Hub.", 84 DenomUnits: []*types.DenomUnit{ 85 {Denom: "1token", Exponent: uint32(5), Aliases: []string{"decitoken"}}, 86 {Denom: "2token", Exponent: uint32(4), Aliases: []string{"centitoken"}}, 87 {Denom: "3token", Exponent: uint32(7), Aliases: []string{"dekatoken"}}, 88 }, 89 Base: "utoken", 90 Display: "token", 91 }, 92 } 93 denomMetadataStore := prefix.NewStore(store, v2.DenomMetadataPrefix) 94 95 for i := range []int{0, 1} { 96 // keys before 0.45 had denom two times in the key 97 key := append([]byte{}, []byte(metaData[i].Base)...) 98 key = append(key, []byte(metaData[i].Base)...) 99 bz, err := encCfg.Codec.Marshal(&metaData[i]) 100 require.NoError(t, err) 101 denomMetadataStore.Set(key, bz) 102 } 103 104 require.NoError(t, v3.MigrateStore(ctx, storeService, encCfg.Codec)) 105 106 denomMetadataStore = prefix.NewStore(store, v2.DenomMetadataPrefix) 107 denomMetadataIter := denomMetadataStore.Iterator(nil, nil) 108 defer denomMetadataIter.Close() 109 for i := 0; denomMetadataIter.Valid(); denomMetadataIter.Next() { 110 var result types.Metadata 111 newKey := denomMetadataIter.Key() 112 113 // make sure old entry is deleted 114 oldKey := append(newKey, newKey[0:]...) 115 bz := denomMetadataStore.Get(oldKey) 116 require.Nil(t, bz) 117 118 require.Equal(t, string(newKey), metaData[i].Base, "idx: %d", i) 119 bz = denomMetadataStore.Get(denomMetadataIter.Key()) 120 require.NotNil(t, bz) 121 err := encCfg.Codec.Unmarshal(bz, &result) 122 require.NoError(t, err) 123 assertMetaDataEqual(t, metaData[i], result) 124 i++ 125 } 126 } 127 128 func assertMetaDataEqual(t *testing.T, expected, actual types.Metadata) { 129 require.Equal(t, expected.GetBase(), actual.GetBase()) 130 require.Equal(t, expected.GetDisplay(), actual.GetDisplay()) 131 require.Equal(t, expected.GetDescription(), actual.GetDescription()) 132 require.Equal(t, expected.GetDenomUnits()[1].GetDenom(), actual.GetDenomUnits()[1].GetDenom()) 133 require.Equal(t, expected.GetDenomUnits()[1].GetExponent(), actual.GetDenomUnits()[1].GetExponent()) 134 require.Equal(t, expected.GetDenomUnits()[1].GetAliases(), actual.GetDenomUnits()[1].GetAliases()) 135 }