From 45ed1674aaed666accffb2b40496476cae2a8f83 Mon Sep 17 00:00:00 2001 From: Riccardo Montagnin Date: Mon, 21 Mar 2022 12:01:25 +0000 Subject: [PATCH 1/7] fix: fixed how chain links and app links are deleted --- x/profiles/keeper/keeper_app_links.go | 32 ++-- x/profiles/keeper/keeper_app_links_test.go | 124 ++++++++++---- x/profiles/keeper/keeper_chain_links.go | 22 +-- x/profiles/keeper/keeper_chain_links_test.go | 167 ++++++++++++++----- x/profiles/keeper/msg_server_app_link.go | 10 +- x/profiles/keeper/msg_server_chain_link.go | 11 +- x/profiles/legacy/v1beta1/store.go | 28 +--- x/profiles/legacy/v1beta1/store_test.go | 32 +++- 8 files changed, 277 insertions(+), 149 deletions(-) diff --git a/x/profiles/keeper/keeper_app_links.go b/x/profiles/keeper/keeper_app_links.go index c490df33fb..3c80861803 100644 --- a/x/profiles/keeper/keeper_app_links.go +++ b/x/profiles/keeper/keeper_app_links.go @@ -40,6 +40,12 @@ func (k Keeper) SaveApplicationLink(ctx sdk.Context, link types.ApplicationLink) return nil } +// HasApplicationLink tells whether the given application link exists +func (k Keeper) HasApplicationLink(ctx sdk.Context, user, application, username string) bool { + store := ctx.KVStore(k.storeKey) + return store.Has(types.UserApplicationLinkKey(user, application, username)) +} + // GetApplicationLink returns the link for the given application and username. // If the link is not found returns an error instead. func (k Keeper) GetApplicationLink(ctx sdk.Context, user, application, username string) (types.ApplicationLink, bool, error) { @@ -86,27 +92,10 @@ func (k Keeper) GetApplicationLinkByClientID(ctx sdk.Context, clientID string) ( // DeleteApplicationLink removes the application link associated to the given user, // for the given application and username -func (k Keeper) DeleteApplicationLink(ctx sdk.Context, user string, application, username string) error { - // Get the link to obtain the client id - link, found, err := k.GetApplicationLink(ctx, user, application, username) - if err != nil { - return err - } - - if !found { - return sdkerrors.Wrap(sdkerrors.ErrNotFound, "application link not found") - } - - if link.User != user { - return sdkerrors.Wrap(sdkerrors.ErrorInvalidSigner, "cannot delete the application link of another user") - } - - // Delete the data +func (k Keeper) DeleteApplicationLink(ctx sdk.Context, appLink types.ApplicationLink) { store := ctx.KVStore(k.storeKey) - store.Delete(types.UserApplicationLinkKey(user, application, username)) - store.Delete(types.ApplicationLinkClientIDKey(link.OracleRequest.ClientID)) - - return nil + store.Delete(types.UserApplicationLinkKey(appLink.User, appLink.Data.Application, appLink.Data.Username)) + store.Delete(types.ApplicationLinkClientIDKey(appLink.OracleRequest.ClientID)) } // DeleteAllUserApplicationLinks delete all the applications links associated with the given user @@ -117,8 +106,7 @@ func (k Keeper) DeleteAllUserApplicationLinks(ctx sdk.Context, user string) { return false }) - store := ctx.KVStore(k.storeKey) for _, link := range links { - store.Delete(types.UserApplicationLinkKey(link.User, link.Data.Application, link.Data.Username)) + k.DeleteApplicationLink(ctx, link) } } diff --git a/x/profiles/keeper/keeper_app_links_test.go b/x/profiles/keeper/keeper_app_links_test.go index 6f3e4615b7..f4563ad4c5 100644 --- a/x/profiles/keeper/keeper_app_links_test.go +++ b/x/profiles/keeper/keeper_app_links_test.go @@ -312,15 +312,13 @@ func (suite *KeeperTestSuite) Test_GetApplicationLinkByClientID() { func (suite *KeeperTestSuite) Test_DeleteApplicationLink() { testCases := []struct { - name string - store func(store sdk.Context) - user string - application string - username string - shouldErr bool + name string + store func(ctx sdk.Context) + link types.ApplicationLink + check func(ctx sdk.Context) }{ { - name: "wrong user returns error", + name: "different user does not delete link", store: func(ctx sdk.Context) { address := "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773" link := types.NewApplicationLink( @@ -341,13 +339,29 @@ func (suite *KeeperTestSuite) Test_DeleteApplicationLink() { err := suite.k.SaveApplicationLink(ctx, link) suite.Require().NoError(err) }, - user: "user", - application: "twitter", - username: "twitteruser", - shouldErr: true, + link: types.NewApplicationLink( + "cosmos1xvvggrlgjkhu4rva9j500rc52za2smxhluvftc", + types.NewData("twitter", "twitteruser"), + types.ApplicationLinkStateInitialized, + types.NewOracleRequest( + 0, + 1, + types.NewOracleRequestCallData("twitter", "calldata"), + "client_id", + ), + nil, + time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC), + ), + check: func(ctx sdk.Context) { + suite.Require().True(suite.k.HasApplicationLink(ctx, + "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", + "twitter", + "twitteruser", + )) + }, }, { - name: "wrong application returns error", + name: "different application does not delete the link", store: func(ctx sdk.Context) { address := "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773" link := types.NewApplicationLink( @@ -368,13 +382,29 @@ func (suite *KeeperTestSuite) Test_DeleteApplicationLink() { err := suite.k.SaveApplicationLink(ctx, link) suite.Require().NoError(err) }, - user: "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", - application: "github", - username: "twitteruser", - shouldErr: true, + link: types.NewApplicationLink( + "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", + types.NewData("github", "twitteruser"), + types.ApplicationLinkStateInitialized, + types.NewOracleRequest( + 0, + 1, + types.NewOracleRequestCallData("twitter", "calldata"), + "client_id", + ), + nil, + time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC), + ), + check: func(ctx sdk.Context) { + suite.Require().True(suite.k.HasApplicationLink(ctx, + "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", + "twitter", + "twitteruser", + )) + }, }, { - name: "wrong username returns error", + name: "different username does not delete the link", store: func(ctx sdk.Context) { address := "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773" link := types.NewApplicationLink( @@ -395,10 +425,26 @@ func (suite *KeeperTestSuite) Test_DeleteApplicationLink() { err := suite.k.SaveApplicationLink(ctx, link) suite.Require().NoError(err) }, - user: "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", - application: "twitter", - username: "twitter-user", - shouldErr: true, + link: types.NewApplicationLink( + "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", + types.NewData("twitter", "another-user"), + types.ApplicationLinkStateInitialized, + types.NewOracleRequest( + 0, + 1, + types.NewOracleRequestCallData("twitter", "calldata"), + "client_id", + ), + nil, + time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC), + ), + check: func(ctx sdk.Context) { + suite.Require().True(suite.k.HasApplicationLink(ctx, + "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", + "twitter", + "twitteruser", + )) + }, }, { name: "valid request deletes link", @@ -422,10 +468,26 @@ func (suite *KeeperTestSuite) Test_DeleteApplicationLink() { err := suite.k.SaveApplicationLink(ctx, link) suite.Require().NoError(err) }, - user: "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", - application: "twitter", - username: "twitteruser", - shouldErr: false, + link: types.NewApplicationLink( + "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", + types.NewData("twitter", "twitteruser"), + types.ApplicationLinkStateInitialized, + types.NewOracleRequest( + 0, + 1, + types.NewOracleRequestCallData("twitter", "calldata"), + "client_id", + ), + nil, + time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC), + ), + check: func(ctx sdk.Context) { + suite.Require().False(suite.k.HasApplicationLink(ctx, + "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", + "twitter", + "twitteruser", + )) + }, }, } @@ -437,15 +499,9 @@ func (suite *KeeperTestSuite) Test_DeleteApplicationLink() { tc.store(ctx) } - err := suite.k.DeleteApplicationLink(ctx, tc.user, tc.application, tc.username) - if tc.shouldErr { - suite.Require().Error(err) - } else { - suite.Require().NoError(err) - - _, found, err := suite.k.GetApplicationLink(ctx, tc.user, tc.application, tc.username) - suite.Require().NoError(err) - suite.Require().False(found) + suite.k.DeleteApplicationLink(ctx, tc.link) + if tc.check != nil { + tc.check(ctx) } }) } diff --git a/x/profiles/keeper/keeper_chain_links.go b/x/profiles/keeper/keeper_chain_links.go index 898cda3f35..5040abe376 100644 --- a/x/profiles/keeper/keeper_chain_links.go +++ b/x/profiles/keeper/keeper_chain_links.go @@ -49,6 +49,12 @@ func (k Keeper) SaveChainLink(ctx sdk.Context, link types.ChainLink) error { return nil } +// HasChainLink tells whether the given chain link exists or not +func (k Keeper) HasChainLink(ctx sdk.Context, owner, chainName, target string) bool { + store := ctx.KVStore(k.storeKey) + return store.Has(types.ChainLinksStoreKey(owner, chainName, target)) +} + // GetChainLink returns the chain link for the given owner, chain name and target. // If such link does not exist, returns false instead. func (k Keeper) GetChainLink(ctx sdk.Context, owner, chainName, target string) (types.ChainLink, bool) { @@ -63,17 +69,9 @@ func (k Keeper) GetChainLink(ctx sdk.Context, owner, chainName, target string) ( } // DeleteChainLink deletes the link associated with the given address and chain name -func (k Keeper) DeleteChainLink(ctx sdk.Context, owner, chainName, target string) error { +func (k Keeper) DeleteChainLink(ctx sdk.Context, link types.ChainLink) { store := ctx.KVStore(k.storeKey) - key := types.ChainLinksStoreKey(owner, chainName, target) - if !store.Has(key) { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, - "chain link between %s and %s for chain name %s not found", - owner, target, chainName, - ) - } - store.Delete(types.ChainLinksStoreKey(owner, chainName, target)) - return nil + store.Delete(types.ChainLinksStoreKey(link.User, link.ChainConfig.Name, link.GetAddressData().GetValue())) } // DeleteAllUserChainLinks deletes all the chain links associated with the given user @@ -84,9 +82,7 @@ func (k Keeper) DeleteAllUserChainLinks(ctx sdk.Context, user string) { return false }) - store := ctx.KVStore(k.storeKey) for _, link := range links { - address := link.Address.GetCachedValue().(types.AddressData) - store.Delete(types.ChainLinksStoreKey(link.User, link.ChainConfig.Name, address.GetValue())) + k.DeleteChainLink(ctx, link) } } diff --git a/x/profiles/keeper/keeper_chain_links_test.go b/x/profiles/keeper/keeper_chain_links_test.go index 8547e4b5f1..efcb2ef00e 100644 --- a/x/profiles/keeper/keeper_chain_links_test.go +++ b/x/profiles/keeper/keeper_chain_links_test.go @@ -224,56 +224,138 @@ func (suite *KeeperTestSuite) TestKeeper_GetChainLink() { } func (suite *KeeperTestSuite) TestKeeper_DeleteChainLink() { + pubKey := `{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A6jN4EPjj8mHf722yjEaKaGdJpxnTR40pDvXlX1mni9C"}` + + var any codectypes.Any + err := suite.cdc.UnmarshalJSON([]byte(pubKey), &any) + suite.Require().NoError(err) + + var key cryptotypes.PubKey + err = suite.cdc.UnpackAny(&any, &key) + suite.Require().NoError(err) + + // Generate source and destination key + ext := suite.GetRandomProfile() + sig := hex.EncodeToString(ext.Sign([]byte(ext.GetAddress().String()))) + plainText := hex.EncodeToString([]byte(ext.GetAddress().String())) + testCases := []struct { - name string - store func(ctx sdk.Context) - owner string - chainName string - address string - shouldErr bool + name string + store func(ctx sdk.Context) + link types.ChainLink + check func(ctx sdk.Context) }{ { - name: "invalid owner address returns error", - owner: "", - chainName: "cosmos", - address: "cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns", - shouldErr: true, + name: "different user does not delete link", + store: func(ctx sdk.Context) { + suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x"))) + err = suite.k.SaveChainLink(ctx, types.NewChainLink( + "cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x", + types.NewBech32Address(ext.GetAddress().String(), "cosmos"), + types.NewProof(ext.GetPubKey(), testutil.SingleSignatureProtoFromHex(sig), plainText), + types.NewChainConfig("cosmos"), + time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), + )) + suite.Require().NoError(err) + }, + link: types.NewChainLink( + "cosmos1xvvggrlgjkhu4rva9j500rc52za2smxhluvftc", + types.NewBech32Address(ext.GetAddress().String(), "cosmos"), + types.NewProof(ext.GetPubKey(), testutil.SingleSignatureProtoFromHex(sig), plainText), + types.NewChainConfig("cosmos"), + time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), + ), + check: func(ctx sdk.Context) { + suite.Require().True(suite.k.HasChainLink(ctx, + "cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x", + "cosmos", + ext.GetAddress().String(), + )) + }, }, { - name: "owner without profile returns error", - owner: "cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns", - chainName: "cosmos", - address: "cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns", - shouldErr: true, + name: "different chain name does not delete link", + store: func(ctx sdk.Context) { + suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x"))) + err = suite.k.SaveChainLink(ctx, types.NewChainLink( + "cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x", + types.NewBech32Address(ext.GetAddress().String(), "cosmos"), + types.NewProof(ext.GetPubKey(), testutil.SingleSignatureProtoFromHex(sig), plainText), + types.NewChainConfig("cosmos"), + time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), + )) + suite.Require().NoError(err) + }, + link: types.NewChainLink( + "cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x", + types.NewBech32Address(ext.GetAddress().String(), "cosmos"), + types.NewProof(ext.GetPubKey(), testutil.SingleSignatureProtoFromHex(sig), plainText), + types.NewChainConfig("likecoin"), + time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), + ), + check: func(ctx sdk.Context) { + suite.Require().True(suite.k.HasChainLink(ctx, + "cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x", + "cosmos", + ext.GetAddress().String(), + )) + }, }, { - name: "target address not linked to the profile returns error", + name: "different external address does not delete the link", store: func(ctx sdk.Context) { - user := "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773" - suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(user))) + suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x"))) + err = suite.k.SaveChainLink(ctx, types.NewChainLink( + "cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x", + types.NewBech32Address(ext.GetAddress().String(), "cosmos"), + types.NewProof(ext.GetPubKey(), testutil.SingleSignatureProtoFromHex(sig), plainText), + types.NewChainConfig("cosmos"), + time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), + )) + suite.Require().NoError(err) + }, + link: types.NewChainLink( + "cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x", + types.NewBech32Address("cosmos1xvvggrlgjkhu4rva9j500rc52za2smxhluvftc", "cosmos"), + types.NewProof(ext.GetPubKey(), testutil.SingleSignatureProtoFromHex(sig), plainText), + types.NewChainConfig("cosmos"), + time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), + ), + check: func(ctx sdk.Context) { + suite.Require().True(suite.k.HasChainLink(ctx, + "cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x", + "cosmos", + ext.GetAddress().String(), + )) }, - owner: "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", - chainName: "cosmos", - address: "cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns", - shouldErr: true, }, { - name: "valid request returns no error", + name: "proper data delete the link", store: func(ctx sdk.Context) { - // Store profile - user := "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773" - profile := testutil.ProfileFromAddr(user) - suite.Require().NoError(suite.k.StoreProfile(ctx, profile)) - - // Store link - store := ctx.KVStore(suite.storeKey) - key := types.ChainLinksStoreKey(user, "cosmos", "cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns") - store.Set(key, profile.GetAddress()) + suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x"))) + err = suite.k.SaveChainLink(ctx, types.NewChainLink( + "cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x", + types.NewBech32Address(ext.GetAddress().String(), "cosmos"), + types.NewProof(ext.GetPubKey(), testutil.SingleSignatureProtoFromHex(sig), plainText), + types.NewChainConfig("cosmos"), + time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), + )) + suite.Require().NoError(err) + }, + link: types.NewChainLink( + "cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x", + types.NewBech32Address(ext.GetAddress().String(), "cosmos"), + types.NewProof(ext.GetPubKey(), testutil.SingleSignatureProtoFromHex(sig), plainText), + types.NewChainConfig("cosmos"), + time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), + ), + check: func(ctx sdk.Context) { + suite.Require().False(suite.k.HasChainLink(ctx, + "cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x", + "cosmos", + ext.GetAddress().String(), + )) }, - owner: "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", - chainName: "cosmos", - address: "cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns", - shouldErr: false, }, } @@ -285,14 +367,9 @@ func (suite *KeeperTestSuite) TestKeeper_DeleteChainLink() { tc.store(ctx) } - err := suite.k.DeleteChainLink(ctx, tc.owner, tc.chainName, tc.address) - if tc.shouldErr { - suite.Require().Error(err) - } else { - suite.Require().NoError(err) - - _, found := suite.k.GetChainLink(ctx, tc.owner, tc.chainName, tc.address) - suite.Require().False(found) + suite.k.DeleteChainLink(ctx, tc.link) + if tc.check != nil { + tc.check(ctx) } }) } diff --git a/x/profiles/keeper/msg_server_app_link.go b/x/profiles/keeper/msg_server_app_link.go index d3097e1c33..d842b421d6 100644 --- a/x/profiles/keeper/msg_server_app_link.go +++ b/x/profiles/keeper/msg_server_app_link.go @@ -69,11 +69,19 @@ func (k msgServer) UnlinkApplication( ) (*types.MsgUnlinkApplicationResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - err := k.DeleteApplicationLink(ctx, msg.Signer, msg.Application, msg.Username) + // Get the link + link, found, err := k.GetApplicationLink(ctx, msg.Signer, msg.Application, msg.Username) if err != nil { return nil, err } + if !found { + return nil, sdkerrors.Wrap(sdkerrors.ErrNotFound, "application link not found") + } + + // Delete the link + k.DeleteApplicationLink(ctx, link) + k.Logger(ctx).Info("Application link removed", "application", msg.Application, "username", msg.Username, diff --git a/x/profiles/keeper/msg_server_chain_link.go b/x/profiles/keeper/msg_server_chain_link.go index 0035c5c125..1b976a2fce 100644 --- a/x/profiles/keeper/msg_server_chain_link.go +++ b/x/profiles/keeper/msg_server_chain_link.go @@ -4,6 +4,8 @@ import ( "context" "time" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/desmos-labs/desmos/v3/x/profiles/types" @@ -37,10 +39,15 @@ func (k msgServer) LinkChainAccount(goCtx context.Context, msg *types.MsgLinkCha func (k msgServer) UnlinkChainAccount(goCtx context.Context, msg *types.MsgUnlinkChainAccount) (*types.MsgUnlinkChainAccountResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - if err := k.DeleteChainLink(ctx, msg.Owner, msg.ChainName, msg.Target); err != nil { - return &types.MsgUnlinkChainAccountResponse{}, err + // Get the chain link + link, found := k.GetChainLink(ctx, msg.Owner, msg.ChainName, msg.Target) + if !found { + return nil, sdkerrors.Wrap(sdkerrors.ErrNotFound, "chain link not found") } + // Delete the link + k.DeleteChainLink(ctx, link) + ctx.EventManager().EmitEvent(sdk.NewEvent( types.EventTypeUnlinkChainAccount, sdk.NewAttribute(types.AttributeKeyChainLinkSourceAddress, msg.Target), diff --git a/x/profiles/legacy/v1beta1/store.go b/x/profiles/legacy/v1beta1/store.go index 8bd46bc7da..9f3f9452dc 100644 --- a/x/profiles/legacy/v1beta1/store.go +++ b/x/profiles/legacy/v1beta1/store.go @@ -38,7 +38,6 @@ func MigrateStore(ctx sdk.Context, ak authkeeper.AccountKeeper, storeKey sdk.Sto migrateDTags(ctx, legacyKeeper, storeKey) migrateDTagTransferRequests(ctx, legacyKeeper, storeKey, cdc) migrateApplicationLinks(ctx, legacyKeeper, storeKey, cdc) - migrateApplicationLinksClientIDs(ctx, legacyKeeper, storeKey) // Migrate the chain links err = migrateChainLinks(ctx, legacyKeeper, storeKey, amino, cdc) @@ -127,31 +126,14 @@ func migrateApplicationLinks(ctx sdk.Context, k Keeper, storeKey sdk.StoreKey, c store := ctx.KVStore(storeKey) for i, link := range applicationLinks { - // Delete the old key + // Delete the old keys store.Delete(UserApplicationLinkKey(link.User, link.Data.Application, link.Data.Username)) + store.Delete(ApplicationLinkClientIDKey(link.OracleRequest.ClientID)) // Store the link with the new key - store.Set( - types.UserApplicationLinkKey(link.User, link.Data.Application, link.Data.Username), - cdc.MustMarshal(&applicationLinks[i]), - ) - } -} - -func migrateApplicationLinksClientIDs(ctx sdk.Context, k Keeper, storeKey sdk.StoreKey) { - clientIDs := map[string][]byte{} - k.IterateApplicationLinkClientIDs(ctx, func(index int64, dTag string, value []byte) (stop bool) { - clientIDs[dTag] = value - return false - }) - - store := ctx.KVStore(storeKey) - for clientID, value := range clientIDs { - // Delete the old key - store.Delete(ApplicationLinkClientIDKey(clientID)) - - // Store the client id using the new key - store.Set(types.ApplicationLinkClientIDKey(clientID), value) + linkKey := types.UserApplicationLinkKey(link.User, link.Data.Application, link.Data.Username) + store.Set(linkKey, cdc.MustMarshal(&applicationLinks[i])) + store.Set(types.ApplicationLinkClientIDKey(link.OracleRequest.ClientID), linkKey) } } diff --git a/x/profiles/legacy/v1beta1/store_test.go b/x/profiles/legacy/v1beta1/store_test.go index 77553861ed..10e7fd30aa 100644 --- a/x/profiles/legacy/v1beta1/store_test.go +++ b/x/profiles/legacy/v1beta1/store_test.go @@ -180,8 +180,9 @@ func TestMigrateStore(t *testing.T) { kvStore := ctx.KVStore(keys[types.StoreKey]) // Store an application link + linkKey := v1beta1.UserApplicationLinkKey("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", "twitter", "twitteruser") kvStore.Set( - v1beta1.UserApplicationLinkKey("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", "twitter", "twitteruser"), + linkKey, cdc.MustMarshal(&profilestypes.ApplicationLink{ User: "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", Data: profilestypes.NewData("twitter", "twitteruser"), @@ -198,21 +199,20 @@ func TestMigrateStore(t *testing.T) { ) // Store an application link client id - kvStore.Set( - v1beta1.ApplicationLinkClientIDKey("client_id"), - []byte("client_id_value"), - ) + kvStore.Set(v1beta1.ApplicationLinkClientIDKey("client_id"), linkKey) }, check: func(ctx sdk.Context) { kvStore := ctx.KVStore(keys[types.StoreKey]) // Check the application links - var stored profilestypes.ApplicationLink - cdc.MustUnmarshal(kvStore.Get(profilestypes.UserApplicationLinkKey( + linkKey := profilestypes.UserApplicationLinkKey( "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", "twitter", "twitteruser", - )), &stored) + ) + + var stored profilestypes.ApplicationLink + cdc.MustUnmarshal(kvStore.Get(linkKey), &stored) require.Equal(t, profilestypes.NewApplicationLink( "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", profilestypes.NewData("twitter", "twitteruser"), @@ -228,7 +228,21 @@ func TestMigrateStore(t *testing.T) { ), stored) // Check the application link client id - require.Equal(t, []byte("client_id_value"), kvStore.Get(profilestypes.ApplicationLinkClientIDKey("client_id"))) + require.Equal(t, linkKey, kvStore.Get(profilestypes.ApplicationLinkClientIDKey("client_id"))) + }, + }, + { + name: "leftover application client id keys are deleted properly", + store: func(ctx sdk.Context) { + kvStore := ctx.KVStore(keys[types.StoreKey]) + kvStore.Set( + v1beta1.ApplicationLinkClientIDKey("client_id"), + []byte("client_id_value"), + ) + }, + check: func(ctx sdk.Context) { + kvStore := ctx.KVStore(keys[types.StoreKey]) + require.False(t, kvStore.Has(profilestypes.ApplicationLinkClientIDKey("client_id"))) }, }, { From 9cdd3b02890d06aa04726a84a8cb5a71a876950d Mon Sep 17 00:00:00 2001 From: Riccardo Montagnin Date: Mon, 21 Mar 2022 12:10:30 +0000 Subject: [PATCH 2/7] chore: added changeset entry --- ...075ed73848811f459c72643ab119e8928a1f464b3cb8bec009d.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/entries/7f7c55e22eee3075ed73848811f459c72643ab119e8928a1f464b3cb8bec009d.yaml diff --git a/.changeset/entries/7f7c55e22eee3075ed73848811f459c72643ab119e8928a1f464b3cb8bec009d.yaml b/.changeset/entries/7f7c55e22eee3075ed73848811f459c72643ab119e8928a1f464b3cb8bec009d.yaml new file mode 100644 index 0000000000..138ef421b1 --- /dev/null +++ b/.changeset/entries/7f7c55e22eee3075ed73848811f459c72643ab119e8928a1f464b3cb8bec009d.yaml @@ -0,0 +1,6 @@ +type: fix +module: x/profiles +pull_request: 784 +description: Fixed how the application links and chain links are deleted +backward_compatible: true +date: 2022-03-21T12:10:14.687869312Z From ff758d76ef7c7fec011b692bff354cbac9b56612 Mon Sep 17 00:00:00 2001 From: Riccardo Montagnin Date: Mon, 21 Mar 2022 12:45:43 +0000 Subject: [PATCH 3/7] updated how DTag transfer requests are deleted --- ...459c72643ab119e8928a1f464b3cb8bec009d.yaml | 2 +- x/profiles/keeper/keeper_dtag_transfers.go | 19 ++++++------ .../keeper/keeper_dtag_transfers_test.go | 30 +++++++------------ .../keeper/msg_server_dtag_transfers.go | 18 +++++++---- 4 files changed, 33 insertions(+), 36 deletions(-) diff --git a/.changeset/entries/7f7c55e22eee3075ed73848811f459c72643ab119e8928a1f464b3cb8bec009d.yaml b/.changeset/entries/7f7c55e22eee3075ed73848811f459c72643ab119e8928a1f464b3cb8bec009d.yaml index 138ef421b1..c6f83f8b62 100644 --- a/.changeset/entries/7f7c55e22eee3075ed73848811f459c72643ab119e8928a1f464b3cb8bec009d.yaml +++ b/.changeset/entries/7f7c55e22eee3075ed73848811f459c72643ab119e8928a1f464b3cb8bec009d.yaml @@ -1,6 +1,6 @@ type: fix module: x/profiles pull_request: 784 -description: Fixed how the application links and chain links are deleted +description: Fixed how the profiles data are deleted (DTag transfer requests, chain link and application links) backward_compatible: true date: 2022-03-21T12:10:14.687869312Z diff --git a/x/profiles/keeper/keeper_dtag_transfers.go b/x/profiles/keeper/keeper_dtag_transfers.go index 0a1b79b91d..fec5e863b6 100644 --- a/x/profiles/keeper/keeper_dtag_transfers.go +++ b/x/profiles/keeper/keeper_dtag_transfers.go @@ -29,6 +29,12 @@ func (k Keeper) SaveDTagTransferRequest(ctx sdk.Context, request types.DTagTrans return nil } +// HasDTagTransferRequest tells whether a DTag transfer request between the sender and recipient exists or not +func (k Keeper) HasDTagTransferRequest(ctx sdk.Context, sender, recipient string) bool { + store := ctx.KVStore(k.storeKey) + return store.Has(types.DTagTransferRequestStoreKey(sender, recipient)) +} + // GetDTagTransferRequest retries the DTag transfer request made from the specified sender to the given receiver. // If the request was not found, returns false instead. func (k Keeper) GetDTagTransferRequest(ctx sdk.Context, sender, receiver string) (types.DTagTransferRequest, bool, error) { @@ -62,15 +68,9 @@ func (k Keeper) GetDTagTransferRequests(ctx sdk.Context) (requests []types.DTagT } // DeleteDTagTransferRequest deletes the transfer request made from the sender towards the recipient -func (k Keeper) DeleteDTagTransferRequest(ctx sdk.Context, sender, recipient string) error { +func (k Keeper) DeleteDTagTransferRequest(ctx sdk.Context, sender, recipient string) { store := ctx.KVStore(k.storeKey) - key := types.DTagTransferRequestStoreKey(sender, recipient) - if !store.Has(key) { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "request from %s to %s not found", sender, recipient) - } - - store.Delete(key) - return nil + store.Delete(types.DTagTransferRequestStoreKey(sender, recipient)) } // DeleteAllUserIncomingDTagTransferRequests deletes all the requests made to the given user @@ -81,8 +81,7 @@ func (k Keeper) DeleteAllUserIncomingDTagTransferRequests(ctx sdk.Context, recei return false }) - store := ctx.KVStore(k.storeKey) for _, request := range requests { - store.Delete(types.DTagTransferRequestStoreKey(request.Sender, request.Receiver)) + k.DeleteDTagTransferRequest(ctx, request.Sender, request.Receiver) } } diff --git a/x/profiles/keeper/keeper_dtag_transfers_test.go b/x/profiles/keeper/keeper_dtag_transfers_test.go index 925a954c31..d87b39aef4 100644 --- a/x/profiles/keeper/keeper_dtag_transfers_test.go +++ b/x/profiles/keeper/keeper_dtag_transfers_test.go @@ -270,15 +270,14 @@ func (suite *KeeperTestSuite) TestKeeper_GetDTagTransferRequests() { func (suite *KeeperTestSuite) TestKeeper_DeleteDTagTransferRequest() { testCases := []struct { - name string - store func(ctx sdk.Context) - sender string - receiver string - shouldErr bool - check func(ctx sdk.Context) + name string + store func(ctx sdk.Context) + sender string + receiver string + check func(ctx sdk.Context) }{ { - name: "deleting non existent request returns an error", + name: "deleting non existent request works properly", store: func(ctx sdk.Context) { request := types.NewDTagTransferRequest( "dtag", @@ -288,9 +287,8 @@ func (suite *KeeperTestSuite) TestKeeper_DeleteDTagTransferRequest() { suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Receiver))) suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request)) }, - sender: "cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47", - receiver: "cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns", - shouldErr: true, + sender: "cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47", + receiver: "cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns", }, { name: "existing request is removed properly", @@ -319,15 +317,9 @@ func (suite *KeeperTestSuite) TestKeeper_DeleteDTagTransferRequest() { tc.store(ctx) } - err := suite.k.DeleteDTagTransferRequest(ctx, tc.sender, tc.receiver) - - if tc.shouldErr { - suite.Require().Error(err) - } else { - suite.Require().NoError(err) - if tc.check != nil { - tc.check(ctx) - } + suite.k.DeleteDTagTransferRequest(ctx, tc.sender, tc.receiver) + if tc.check != nil { + tc.check(ctx) } }) } diff --git a/x/profiles/keeper/msg_server_dtag_transfers.go b/x/profiles/keeper/msg_server_dtag_transfers.go index c811a39522..29466956e3 100644 --- a/x/profiles/keeper/msg_server_dtag_transfers.go +++ b/x/profiles/keeper/msg_server_dtag_transfers.go @@ -62,11 +62,14 @@ func (k msgServer) RequestDTagTransfer(goCtx context.Context, msg *types.MsgRequ func (k msgServer) CancelDTagTransferRequest(goCtx context.Context, msg *types.MsgCancelDTagTransferRequest) (*types.MsgCancelDTagTransferRequestResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - err := k.DeleteDTagTransferRequest(ctx, msg.Sender, msg.Receiver) - if err != nil { - return nil, err + // Check if the request exists + if !k.HasDTagTransferRequest(ctx, msg.Sender, msg.Receiver) { + return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "request from %s to %s not found", msg.Sender, msg.Receiver) } + // Delete the request + k.DeleteDTagTransferRequest(ctx, msg.Sender, msg.Receiver) + ctx.EventManager().EmitEvents(sdk.Events{ sdk.NewEvent( sdk.EventTypeMessage, @@ -192,11 +195,14 @@ func (k msgServer) AcceptDTagTransferRequest(goCtx context.Context, msg *types.M func (k msgServer) RefuseDTagTransferRequest(goCtx context.Context, msg *types.MsgRefuseDTagTransferRequest) (*types.MsgRefuseDTagTransferRequestResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - err := k.DeleteDTagTransferRequest(ctx, msg.Sender, msg.Receiver) - if err != nil { - return nil, err + // Check if the request exists + if !k.HasDTagTransferRequest(ctx, msg.Sender, msg.Receiver) { + return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "request from %s to %s not found", msg.Sender, msg.Receiver) } + // Delete the request + k.DeleteDTagTransferRequest(ctx, msg.Sender, msg.Receiver) + ctx.EventManager().EmitEvents(sdk.Events{ sdk.NewEvent( sdk.EventTypeMessage, From f65bcfaacaf05e3f43480a6011ed65b42f259e95 Mon Sep 17 00:00:00 2001 From: Riccardo Montagnin Date: Mon, 21 Mar 2022 12:57:17 +0000 Subject: [PATCH 4/7] removed now unused method --- x/profiles/legacy/v1beta1/keeper.go | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/x/profiles/legacy/v1beta1/keeper.go b/x/profiles/legacy/v1beta1/keeper.go index 98eb736565..4c940dbf32 100644 --- a/x/profiles/legacy/v1beta1/keeper.go +++ b/x/profiles/legacy/v1beta1/keeper.go @@ -179,18 +179,3 @@ func (k Keeper) IterateApplicationLinks(ctx sdk.Context, fn func(index int64, ap index++ } } - -func (k Keeper) IterateApplicationLinkClientIDs(ctx sdk.Context, fn func(index int64, clientID string, value []byte) (stop bool)) { - store := ctx.KVStore(k.storeKey) - - clientIDsStore := prefix.NewStore(store, ApplicationLinkClientIDPrefix) - iterator := clientIDsStore.Iterator(nil, nil) - defer iterator.Close() - - var stop = false - var index = int64(0) - for ; iterator.Valid() && !stop; iterator.Next() { - stop = fn(index, string(iterator.Key()), iterator.Value()) - index++ - } -} From 90549f77d3dbe9228605305578a617d4f2f31bf1 Mon Sep 17 00:00:00 2001 From: Riccardo Montagnin Date: Mon, 21 Mar 2022 15:54:36 +0000 Subject: [PATCH 5/7] chore: renamed the v1beta1 store package to v5 --- app/app.go | 6 +- x/profiles/keeper/migrations.go | 4 +- x/profiles/legacy/{v1beta1 => v4}/codec.go | 2 +- x/profiles/legacy/{v1beta1 => v4}/keeper.go | 2 +- x/profiles/legacy/{v1beta1 => v4}/keys.go | 2 +- .../{v1beta1 => v4}/models_chain_links.go | 2 +- .../{v1beta1 => v4}/models_chain_links.pb.go | 2 +- .../legacy/{v1beta1 => v4}/models_profile.go | 2 +- .../{v1beta1 => v4}/models_profile.pb.go | 2 +- .../models_relationships.pb.go | 2 +- x/profiles/legacy/{v1beta1 => v4}/store.go | 2 +- .../legacy/{v1beta1 => v4}/store_test.go | 62 +++++++++---------- x/profiles/module.go | 4 +- x/relationships/keeper/migrations.go | 6 +- x/relationships/legacy/v1/store.go | 8 +-- x/relationships/legacy/v1/store_test.go | 16 ++--- x/relationships/module.go | 6 +- 17 files changed, 65 insertions(+), 65 deletions(-) rename x/profiles/legacy/{v1beta1 => v4}/codec.go (97%) rename x/profiles/legacy/{v1beta1 => v4}/keeper.go (99%) rename x/profiles/legacy/{v1beta1 => v4}/keys.go (99%) rename x/profiles/legacy/{v1beta1 => v4}/models_chain_links.go (99%) rename x/profiles/legacy/{v1beta1 => v4}/models_chain_links.pb.go (99%) rename x/profiles/legacy/{v1beta1 => v4}/models_profile.go (99%) rename x/profiles/legacy/{v1beta1 => v4}/models_profile.pb.go (99%) rename x/profiles/legacy/{v1beta1 => v4}/models_relationships.pb.go (99%) rename x/profiles/legacy/{v1beta1 => v4}/store.go (99%) rename x/profiles/legacy/{v1beta1 => v4}/store_test.go (86%) diff --git a/app/app.go b/app/app.go index a08751ee27..f4c11db408 100644 --- a/app/app.go +++ b/app/app.go @@ -8,7 +8,7 @@ import ( "path/filepath" "strings" - profilesv1beta1 "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v1beta1" + profilesv4 "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v4" "github.com/desmos-labs/desmos/v3/x/relationships" relationshipstypes "github.com/desmos-labs/desmos/v3/x/relationships/types" @@ -553,7 +553,7 @@ func NewDesmosApp( // Custom modules subspaces.NewAppModule(appCodec, app.SubspacesKeeper, app.AccountKeeper, app.BankKeeper), profilesModule, - relationships.NewAppModule(appCodec, app.RelationshipsKeeper, app.SubspacesKeeper, profilesv1beta1.NewKeeper(keys[profilestypes.StoreKey], appCodec), app.AccountKeeper, app.BankKeeper), + relationships.NewAppModule(appCodec, app.RelationshipsKeeper, app.SubspacesKeeper, profilesv4.NewKeeper(keys[profilestypes.StoreKey], appCodec), app.AccountKeeper, app.BankKeeper), ) // During begin block slashing happens after distr.BeginBlocker so that @@ -709,7 +709,7 @@ func NewDesmosApp( // Custom modules subspaces.NewAppModule(appCodec, app.SubspacesKeeper, app.AccountKeeper, app.BankKeeper), profilesModule, - relationships.NewAppModule(appCodec, app.RelationshipsKeeper, app.SubspacesKeeper, profilesv1beta1.NewKeeper(keys[profilestypes.StoreKey], appCodec), app.AccountKeeper, app.BankKeeper), + relationships.NewAppModule(appCodec, app.RelationshipsKeeper, app.SubspacesKeeper, profilesv4.NewKeeper(keys[profilestypes.StoreKey], appCodec), app.AccountKeeper, app.BankKeeper), ) app.sm.RegisterStoreDecoders() diff --git a/x/profiles/keeper/migrations.go b/x/profiles/keeper/migrations.go index a71cda6acf..6ebacc6d9b 100644 --- a/x/profiles/keeper/migrations.go +++ b/x/profiles/keeper/migrations.go @@ -6,7 +6,7 @@ import ( authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" "github.com/gogo/protobuf/grpc" - "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v1beta1" + "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v4" ) // DONTCOVER @@ -31,5 +31,5 @@ func NewMigrator(ak authkeeper.AccountKeeper, keeper Keeper, amino *codec.Legacy // Migrate4to5 migrates from version 4 to 5. func (m Migrator) Migrate4to5(ctx sdk.Context) error { - return v1beta1.MigrateStore(ctx, m.ak, m.keeper.storeKey, m.amino, m.keeper.cdc) + return v4.MigrateStore(ctx, m.ak, m.keeper.storeKey, m.amino, m.keeper.cdc) } diff --git a/x/profiles/legacy/v1beta1/codec.go b/x/profiles/legacy/v4/codec.go similarity index 97% rename from x/profiles/legacy/v1beta1/codec.go rename to x/profiles/legacy/v4/codec.go index e01a6ae24f..cf7252a9d5 100644 --- a/x/profiles/legacy/v1beta1/codec.go +++ b/x/profiles/legacy/v4/codec.go @@ -1,4 +1,4 @@ -package v1beta1 +package v4 // DONTCOVER diff --git a/x/profiles/legacy/v1beta1/keeper.go b/x/profiles/legacy/v4/keeper.go similarity index 99% rename from x/profiles/legacy/v1beta1/keeper.go rename to x/profiles/legacy/v4/keeper.go index 98eb736565..71b6b2c0ef 100644 --- a/x/profiles/legacy/v1beta1/keeper.go +++ b/x/profiles/legacy/v4/keeper.go @@ -1,4 +1,4 @@ -package v1beta1 +package v4 import ( "github.com/cosmos/cosmos-sdk/codec" diff --git a/x/profiles/legacy/v1beta1/keys.go b/x/profiles/legacy/v4/keys.go similarity index 99% rename from x/profiles/legacy/v1beta1/keys.go rename to x/profiles/legacy/v4/keys.go index 6e12d84adb..fd58504abb 100644 --- a/x/profiles/legacy/v1beta1/keys.go +++ b/x/profiles/legacy/v4/keys.go @@ -1,4 +1,4 @@ -package v1beta1 +package v4 // DONTCOVER diff --git a/x/profiles/legacy/v1beta1/models_chain_links.go b/x/profiles/legacy/v4/models_chain_links.go similarity index 99% rename from x/profiles/legacy/v1beta1/models_chain_links.go rename to x/profiles/legacy/v4/models_chain_links.go index 1ac7fabe03..55eccfb5dc 100644 --- a/x/profiles/legacy/v1beta1/models_chain_links.go +++ b/x/profiles/legacy/v4/models_chain_links.go @@ -1,4 +1,4 @@ -package v1beta1 +package v4 // DONTCOVER diff --git a/x/profiles/legacy/v1beta1/models_chain_links.pb.go b/x/profiles/legacy/v4/models_chain_links.pb.go similarity index 99% rename from x/profiles/legacy/v1beta1/models_chain_links.pb.go rename to x/profiles/legacy/v4/models_chain_links.pb.go index 97e4d7daef..94a4e74b88 100644 --- a/x/profiles/legacy/v1beta1/models_chain_links.pb.go +++ b/x/profiles/legacy/v4/models_chain_links.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. // source: desmos/profiles/v1beta1/models_chain_links.proto -package v1beta1 +package v4 import ( fmt "fmt" diff --git a/x/profiles/legacy/v1beta1/models_profile.go b/x/profiles/legacy/v4/models_profile.go similarity index 99% rename from x/profiles/legacy/v1beta1/models_profile.go rename to x/profiles/legacy/v4/models_profile.go index b3d4f79660..5c43aa854a 100644 --- a/x/profiles/legacy/v1beta1/models_profile.go +++ b/x/profiles/legacy/v4/models_profile.go @@ -1,4 +1,4 @@ -package v1beta1 +package v4 // DONTCOVER diff --git a/x/profiles/legacy/v1beta1/models_profile.pb.go b/x/profiles/legacy/v4/models_profile.pb.go similarity index 99% rename from x/profiles/legacy/v1beta1/models_profile.pb.go rename to x/profiles/legacy/v4/models_profile.pb.go index de55cbbebb..f41ee48f51 100644 --- a/x/profiles/legacy/v1beta1/models_profile.pb.go +++ b/x/profiles/legacy/v4/models_profile.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. // source: desmos/profiles/v1beta1/models_profile.proto -package v1beta1 +package v4 import ( fmt "fmt" diff --git a/x/profiles/legacy/v1beta1/models_relationships.pb.go b/x/profiles/legacy/v4/models_relationships.pb.go similarity index 99% rename from x/profiles/legacy/v1beta1/models_relationships.pb.go rename to x/profiles/legacy/v4/models_relationships.pb.go index 4418f90925..8a242dd7b9 100644 --- a/x/profiles/legacy/v1beta1/models_relationships.pb.go +++ b/x/profiles/legacy/v4/models_relationships.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. // source: desmos/profiles/v1beta1/models_relationships.proto -package v1beta1 +package v4 import ( fmt "fmt" diff --git a/x/profiles/legacy/v1beta1/store.go b/x/profiles/legacy/v4/store.go similarity index 99% rename from x/profiles/legacy/v1beta1/store.go rename to x/profiles/legacy/v4/store.go index 8bd46bc7da..0b9bd8270a 100644 --- a/x/profiles/legacy/v1beta1/store.go +++ b/x/profiles/legacy/v4/store.go @@ -1,4 +1,4 @@ -package v1beta1 +package v4 import ( "encoding/hex" diff --git a/x/profiles/legacy/v1beta1/store_test.go b/x/profiles/legacy/v4/store_test.go similarity index 86% rename from x/profiles/legacy/v1beta1/store_test.go rename to x/profiles/legacy/v4/store_test.go index 77553861ed..ea6aa0d6f5 100644 --- a/x/profiles/legacy/v1beta1/store_test.go +++ b/x/profiles/legacy/v4/store_test.go @@ -1,4 +1,4 @@ -package v1beta1_test +package v4_test import ( "encoding/hex" @@ -27,7 +27,7 @@ import ( "github.com/stretchr/testify/require" "github.com/desmos-labs/desmos/v3/app" - "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v1beta1" + "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v4" "github.com/desmos-labs/desmos/v3/x/relationships/types" ) @@ -81,7 +81,7 @@ func TestMigrateStore(t *testing.T) { pubKey := testutil.PubKeyFromBech32("cosmospub1addwnpepqvryxhhqhw52c4ny5twtfzf3fsrjqhx0x5cuya0fylw0wu0eqptykeqhr4d") pubKeyAny := testutil.NewAny(pubKey) - addressAny := testutil.NewAny(&v1beta1.Bech32Address{ + addressAny := testutil.NewAny(&v4.Bech32Address{ Value: "cosmos10clxpupsmddtj7wu7g0wdysajqwp890mva046f", Prefix: "cosmos", }) @@ -98,11 +98,11 @@ func TestMigrateStore(t *testing.T) { kvStore := ctx.KVStore(keys[types.StoreKey]) // Store a profile - profile, err := v1beta1.NewProfile( + profile, err := v4.NewProfile( "john_doe", "John Doe", "My name if John Doe", - v1beta1.Pictures{ + v4.Pictures{ Profile: "", Cover: "", }, @@ -113,7 +113,7 @@ func TestMigrateStore(t *testing.T) { authKeeper.SetAccount(ctx, profile) // Store a DTag reference - kvStore.Set(v1beta1.DTagStoreKey("john_doe"), []byte("cosmos1nejmx335u222dj6lg7qjqrufchkpazu8e0semf")) + kvStore.Set(v4.DTagStoreKey("john_doe"), []byte("cosmos1nejmx335u222dj6lg7qjqrufchkpazu8e0semf")) }, check: func(ctx sdk.Context) { kvStore := ctx.KVStore(keys[types.StoreKey]) @@ -149,7 +149,7 @@ func TestMigrateStore(t *testing.T) { // Store a DTag transfer request kvStore.Set( - v1beta1.DTagTransferRequestStoreKey("cosmos13vsgmgs9tjktnnc6pkln7pm4jswxmeajrqc4xd", "cosmos1nejmx335u222dj6lg7qjqrufchkpazu8e0semf"), + v4.DTagTransferRequestStoreKey("cosmos13vsgmgs9tjktnnc6pkln7pm4jswxmeajrqc4xd", "cosmos1nejmx335u222dj6lg7qjqrufchkpazu8e0semf"), cdc.MustMarshal(&profilestypes.DTagTransferRequest{ DTagToTrade: "john_doe", Sender: "cosmos13vsgmgs9tjktnnc6pkln7pm4jswxmeajrqc4xd", @@ -181,7 +181,7 @@ func TestMigrateStore(t *testing.T) { // Store an application link kvStore.Set( - v1beta1.UserApplicationLinkKey("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", "twitter", "twitteruser"), + v4.UserApplicationLinkKey("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", "twitter", "twitteruser"), cdc.MustMarshal(&profilestypes.ApplicationLink{ User: "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773", Data: profilestypes.NewData("twitter", "twitteruser"), @@ -199,7 +199,7 @@ func TestMigrateStore(t *testing.T) { // Store an application link client id kvStore.Set( - v1beta1.ApplicationLinkClientIDKey("client_id"), + v4.ApplicationLinkClientIDKey("client_id"), []byte("client_id_value"), ) }, @@ -238,16 +238,16 @@ func TestMigrateStore(t *testing.T) { // Store the chain link kvStore.Set( - v1beta1.ChainLinksStoreKey("cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47", "cosmos", "cosmos10clxpupsmddtj7wu7g0wdysajqwp890mva046f"), - cdc.MustMarshal(&v1beta1.ChainLink{ + v4.ChainLinksStoreKey("cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47", "cosmos", "cosmos10clxpupsmddtj7wu7g0wdysajqwp890mva046f"), + cdc.MustMarshal(&v4.ChainLink{ User: "cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47", Address: addressAny, - Proof: v1beta1.Proof{ + Proof: v4.Proof{ PubKey: pubKeyAny, Signature: "7369676E6174757265", PlainText: "74657874", }, - ChainConfig: v1beta1.ChainConfig{Name: "cosmos"}, + ChainConfig: v4.ChainConfig{Name: "cosmos"}, CreationTime: time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), }), ) @@ -299,16 +299,16 @@ func TestMigrateStore(t *testing.T) { // Store the chain link kvStore.Set( - v1beta1.ChainLinksStoreKey("cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47", "cosmos", "cosmos10clxpupsmddtj7wu7g0wdysajqwp890mva046f"), - cdc.MustMarshal(&v1beta1.ChainLink{ + v4.ChainLinksStoreKey("cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47", "cosmos", "cosmos10clxpupsmddtj7wu7g0wdysajqwp890mva046f"), + cdc.MustMarshal(&v4.ChainLink{ User: "cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47", Address: addressAny, - Proof: v1beta1.Proof{ + Proof: v4.Proof{ PubKey: pubKeyAny, Signature: "7369676E6174757265", PlainText: plainTextValue, }, - ChainConfig: v1beta1.ChainConfig{Name: "cosmos"}, + ChainConfig: v4.ChainConfig{Name: "cosmos"}, CreationTime: time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), }), ) @@ -372,16 +372,16 @@ func TestMigrateStore(t *testing.T) { // Store the chain link kvStore.Set( - v1beta1.ChainLinksStoreKey("cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47", "cosmos", "cosmos10clxpupsmddtj7wu7g0wdysajqwp890mva046f"), - cdc.MustMarshal(&v1beta1.ChainLink{ + v4.ChainLinksStoreKey("cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47", "cosmos", "cosmos10clxpupsmddtj7wu7g0wdysajqwp890mva046f"), + cdc.MustMarshal(&v4.ChainLink{ User: "cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47", Address: addressAny, - Proof: v1beta1.Proof{ + Proof: v4.Proof{ PubKey: pubKeyAny, Signature: "7369676E6174757265", PlainText: plainTextValue, }, - ChainConfig: v1beta1.ChainConfig{Name: "cosmos"}, + ChainConfig: v4.ChainConfig{Name: "cosmos"}, CreationTime: time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), }), ) @@ -436,8 +436,8 @@ func TestMigrateStore(t *testing.T) { // Store a user block kvStore.Set( - v1beta1.UserBlockStoreKey("blocker", "", "blocked"), - cdc.MustMarshal(&v1beta1.UserBlock{ + v4.UserBlockStoreKey("blocker", "", "blocked"), + cdc.MustMarshal(&v4.UserBlock{ Blocker: "blocker", Blocked: "blocked", Reason: "reason", @@ -447,16 +447,16 @@ func TestMigrateStore(t *testing.T) { // Store some relationships kvStore.Set( - v1beta1.RelationshipsStoreKey("user", "1", "recipient"), - cdc.MustMarshal(&v1beta1.Relationship{ + v4.RelationshipsStoreKey("user", "1", "recipient"), + cdc.MustMarshal(&v4.Relationship{ Creator: "user", Recipient: "recipient", SubspaceID: "1", }), ) kvStore.Set( - v1beta1.RelationshipsStoreKey("user", "2", "recipient"), - cdc.MustMarshal(&v1beta1.Relationship{ + v4.RelationshipsStoreKey("user", "2", "recipient"), + cdc.MustMarshal(&v4.Relationship{ Creator: "user", Recipient: "recipient", SubspaceID: "2", @@ -468,11 +468,11 @@ func TestMigrateStore(t *testing.T) { kvStore := ctx.KVStore(keys[types.StoreKey]) // Make sure all blocks are deleted - require.False(t, kvStore.Has(v1beta1.UserBlockStoreKey("blocker", "", "blocked"))) + require.False(t, kvStore.Has(v4.UserBlockStoreKey("blocker", "", "blocked"))) // Make sure all relationships are deleted - require.False(t, kvStore.Has(v1beta1.RelationshipsStoreKey("user", "1", "recipient"))) - require.False(t, kvStore.Has(v1beta1.RelationshipsStoreKey("user", "1", "recipient"))) + require.False(t, kvStore.Has(v4.RelationshipsStoreKey("user", "1", "recipient"))) + require.False(t, kvStore.Has(v4.RelationshipsStoreKey("user", "1", "recipient"))) }, }, } @@ -485,7 +485,7 @@ func TestMigrateStore(t *testing.T) { tc.store(ctx) } - err := v1beta1.MigrateStore(ctx, authKeeper, keys[types.StoreKey], legacyAmino, cdc) + err := v4.MigrateStore(ctx, authKeeper, keys[types.StoreKey], legacyAmino, cdc) if tc.shouldErr { require.Error(t, err) } else { diff --git a/x/profiles/module.go b/x/profiles/module.go index a5316f31b3..55bfb7afa4 100644 --- a/x/profiles/module.go +++ b/x/profiles/module.go @@ -22,7 +22,7 @@ import ( "github.com/desmos-labs/desmos/v3/x/profiles/client/cli" "github.com/desmos-labs/desmos/v3/x/profiles/keeper" - "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v1beta1" + "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v4" "github.com/desmos-labs/desmos/v3/x/profiles/simulation" "github.com/desmos-labs/desmos/v3/x/profiles/types" ) @@ -88,7 +88,7 @@ func (AppModuleBasic) GetQueryCmd() *cobra.Command { // RegisterInterfaces registers interfaces and implementations of the profiles module. func (AppModuleBasic) RegisterInterfaces(registry codectypes.InterfaceRegistry) { - v1beta1.RegisterInterfaces(registry) + v4.RegisterInterfaces(registry) types.RegisterInterfaces(registry) } diff --git a/x/relationships/keeper/migrations.go b/x/relationships/keeper/migrations.go index 0ee57e8656..1b406fd3a3 100644 --- a/x/relationships/keeper/migrations.go +++ b/x/relationships/keeper/migrations.go @@ -3,7 +3,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - profilesv1beta1 "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v1beta1" + profilesv4 "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v4" v1 "github.com/desmos-labs/desmos/v3/x/relationships/legacy/v1" ) @@ -13,11 +13,11 @@ import ( // Migrator is a struct for handling in-place store migrations. type Migrator struct { keeper Keeper - pk profilesv1beta1.Keeper + pk profilesv4.Keeper } // NewMigrator returns a new Migrator -func NewMigrator(keeper Keeper, pk profilesv1beta1.Keeper) Migrator { +func NewMigrator(keeper Keeper, pk profilesv4.Keeper) Migrator { return Migrator{ keeper: keeper, pk: pk, diff --git a/x/relationships/legacy/v1/store.go b/x/relationships/legacy/v1/store.go index ce984ca36c..e68c4e09d5 100644 --- a/x/relationships/legacy/v1/store.go +++ b/x/relationships/legacy/v1/store.go @@ -6,7 +6,7 @@ import ( subspacestypes "github.com/desmos-labs/desmos/v3/x/subspaces/types" - profilesv1beta1 "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v1beta1" + profilesv4 "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v4" "github.com/desmos-labs/desmos/v3/x/relationships/types" ) @@ -18,7 +18,7 @@ import ( // // NOTE: This method must be called BEFORE the migration from v4 to v5 of the profiles module. // If this order is not preserved, all relationships and blocks WILL BE DELETED. -func MigrateStore(ctx sdk.Context, pk profilesv1beta1.Keeper, relationshipsStoreKey sdk.StoreKey, cdc codec.BinaryCodec) error { +func MigrateStore(ctx sdk.Context, pk profilesv4.Keeper, relationshipsStoreKey sdk.StoreKey, cdc codec.BinaryCodec) error { store := ctx.KVStore(relationshipsStoreKey) err := migrateUserBlocks(ctx, pk, store, cdc) @@ -35,7 +35,7 @@ func MigrateStore(ctx sdk.Context, pk profilesv1beta1.Keeper, relationshipsStore } // migrateUserBlocks migrates the user blocks stored to the new type, converting the subspace from string to uint64 -func migrateUserBlocks(ctx sdk.Context, pk profilesv1beta1.Keeper, store sdk.KVStore, cdc codec.BinaryCodec) error { +func migrateUserBlocks(ctx sdk.Context, pk profilesv4.Keeper, store sdk.KVStore, cdc codec.BinaryCodec) error { for _, v230Block := range pk.GetBlocks(ctx) { // Get the subspace id subspaceID, err := subspacestypes.ParseSubspaceID(v230Block.SubspaceID) @@ -58,7 +58,7 @@ func migrateUserBlocks(ctx sdk.Context, pk profilesv1beta1.Keeper, store sdk.KVS } // migrateRelationships migrates the relationships stored to the new type, converting the subspace from string to uint64 -func migrateRelationships(ctx sdk.Context, pk profilesv1beta1.Keeper, store sdk.KVStore, cdc codec.BinaryCodec) error { +func migrateRelationships(ctx sdk.Context, pk profilesv4.Keeper, store sdk.KVStore, cdc codec.BinaryCodec) error { for _, v230Relationship := range pk.GetRelationships(ctx) { // Get the subspace id subspaceID, err := subspacestypes.ParseSubspaceID(v230Relationship.SubspaceID) diff --git a/x/relationships/legacy/v1/store_test.go b/x/relationships/legacy/v1/store_test.go index cca1f48de4..e979db8cbe 100644 --- a/x/relationships/legacy/v1/store_test.go +++ b/x/relationships/legacy/v1/store_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/require" "github.com/desmos-labs/desmos/v3/app" - profilesv1beta1 "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v1beta1" + profilesv4 "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v4" v1 "github.com/desmos-labs/desmos/v3/x/relationships/legacy/v1" "github.com/desmos-labs/desmos/v3/x/relationships/types" ) @@ -27,27 +27,27 @@ func TestMigrateStore(t *testing.T) { store: func(ctx sdk.Context) { store := ctx.KVStore(storeKey) - blockBz := cdc.MustMarshal(&profilesv1beta1.UserBlock{ + blockBz := cdc.MustMarshal(&profilesv4.UserBlock{ Blocker: "blocker", Blocked: "blocked", Reason: "reason", SubspaceID: "", }) - store.Set(profilesv1beta1.UserBlockStoreKey("blocker", "", "blocked"), blockBz) + store.Set(profilesv4.UserBlockStoreKey("blocker", "", "blocked"), blockBz) - relBz := cdc.MustMarshal(&profilesv1beta1.Relationship{ + relBz := cdc.MustMarshal(&profilesv4.Relationship{ Creator: "user", Recipient: "recipient", SubspaceID: "", }) - store.Set(profilesv1beta1.RelationshipsStoreKey("user", "", "recipient"), relBz) + store.Set(profilesv4.RelationshipsStoreKey("user", "", "recipient"), relBz) - relBz = cdc.MustMarshal(&profilesv1beta1.Relationship{ + relBz = cdc.MustMarshal(&profilesv4.Relationship{ Creator: "user", Recipient: "recipient", SubspaceID: "2", }) - store.Set(profilesv1beta1.RelationshipsStoreKey("user", "2", "recipient"), relBz) + store.Set(profilesv4.RelationshipsStoreKey("user", "2", "recipient"), relBz) }, shouldErr: false, check: func(ctx sdk.Context) { @@ -86,7 +86,7 @@ func TestMigrateStore(t *testing.T) { tc.store(ctx) } - pk := profilesv1beta1.NewKeeper(storeKey, cdc) + pk := profilesv4.NewKeeper(storeKey, cdc) err := v1.MigrateStore(ctx, pk, storeKey, cdc) if tc.shouldErr { require.Error(t, err) diff --git a/x/relationships/module.go b/x/relationships/module.go index 5184bddb65..5289210595 100644 --- a/x/relationships/module.go +++ b/x/relationships/module.go @@ -6,7 +6,7 @@ import ( "fmt" "math/rand" - profilesv1beta1 "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v1beta1" + profilesv4 "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v4" subspaceskeeper "github.com/desmos-labs/desmos/v3/x/subspaces/keeper" @@ -99,7 +99,7 @@ func (AppModuleBasic) RegisterInterfaces(registry codectypes.InterfaceRegistry) type AppModule struct { AppModuleBasic keeper keeper.Keeper - pk profilesv1beta1.Keeper + pk profilesv4.Keeper sk subspaceskeeper.Keeper ak authkeeper.AccountKeeper bk bankkeeper.Keeper @@ -120,7 +120,7 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { // NewAppModule creates a new AppModule Object func NewAppModule( cdc codec.Codec, - k keeper.Keeper, sk subspaceskeeper.Keeper, pk profilesv1beta1.Keeper, + k keeper.Keeper, sk subspaceskeeper.Keeper, pk profilesv4.Keeper, ak authkeeper.AccountKeeper, bk bankkeeper.Keeper, ) AppModule { return AppModule{ From 6ae12924a991b001a45c6adcfeede9a91875b09d Mon Sep 17 00:00:00 2001 From: Riccardo Montagnin Date: Mon, 21 Mar 2022 16:11:37 +0000 Subject: [PATCH 6/7] updated the package name --- x/profiles/keeper/migrations.go | 2 +- x/profiles/legacy/v4/store_test.go | 7 ++----- x/profiles/module.go | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/x/profiles/keeper/migrations.go b/x/profiles/keeper/migrations.go index 6ebacc6d9b..d59ce21d73 100644 --- a/x/profiles/keeper/migrations.go +++ b/x/profiles/keeper/migrations.go @@ -6,7 +6,7 @@ import ( authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" "github.com/gogo/protobuf/grpc" - "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v4" + v4 "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v4" ) // DONTCOVER diff --git a/x/profiles/legacy/v4/store_test.go b/x/profiles/legacy/v4/store_test.go index bc20c8093c..be1b22b5ba 100644 --- a/x/profiles/legacy/v4/store_test.go +++ b/x/profiles/legacy/v4/store_test.go @@ -27,7 +27,7 @@ import ( "github.com/stretchr/testify/require" "github.com/desmos-labs/desmos/v3/app" - "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v4" + v4 "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v4" "github.com/desmos-labs/desmos/v3/x/relationships/types" ) @@ -235,10 +235,7 @@ func TestMigrateStore(t *testing.T) { name: "leftover application client id keys are deleted properly", store: func(ctx sdk.Context) { kvStore := ctx.KVStore(keys[types.StoreKey]) - kvStore.Set( - v1beta1.ApplicationLinkClientIDKey("client_id"), - []byte("client_id_value"), - ) + kvStore.Set(v4.ApplicationLinkClientIDKey("client_id"), []byte("client_id_value")) }, check: func(ctx sdk.Context) { kvStore := ctx.KVStore(keys[types.StoreKey]) diff --git a/x/profiles/module.go b/x/profiles/module.go index 55bfb7afa4..332f58e5b1 100644 --- a/x/profiles/module.go +++ b/x/profiles/module.go @@ -22,7 +22,7 @@ import ( "github.com/desmos-labs/desmos/v3/x/profiles/client/cli" "github.com/desmos-labs/desmos/v3/x/profiles/keeper" - "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v4" + v4 "github.com/desmos-labs/desmos/v3/x/profiles/legacy/v4" "github.com/desmos-labs/desmos/v3/x/profiles/simulation" "github.com/desmos-labs/desmos/v3/x/profiles/types" ) From 6a6e9235cf9ed455140d1b0d88ff9aa017f31bf1 Mon Sep 17 00:00:00 2001 From: Riccardo Montagnin Date: Tue, 22 Mar 2022 09:50:26 +0000 Subject: [PATCH 7/7] fix: fixed the client id migration to deleting leftover keys --- x/profiles/legacy/v4/keeper.go | 15 +++++++++++++++ x/profiles/legacy/v4/store.go | 16 ++++++++++++++-- x/profiles/legacy/v4/store_test.go | 1 + 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/x/profiles/legacy/v4/keeper.go b/x/profiles/legacy/v4/keeper.go index 061fdba6f0..3e9ec69e58 100644 --- a/x/profiles/legacy/v4/keeper.go +++ b/x/profiles/legacy/v4/keeper.go @@ -179,3 +179,18 @@ func (k Keeper) IterateApplicationLinks(ctx sdk.Context, fn func(index int64, ap index++ } } + +func (k Keeper) IterateApplicationLinkClientIDKeys(ctx sdk.Context, fn func(index int64, key []byte, value []byte) (stop bool)) { + store := ctx.KVStore(k.storeKey) + + clientIDsStore := prefix.NewStore(store, ApplicationLinkClientIDPrefix) + iterator := clientIDsStore.Iterator(nil, nil) + defer iterator.Close() + + var stop = false + var index = int64(0) + for ; iterator.Valid() && !stop; iterator.Next() { + stop = fn(index, append(ApplicationLinkClientIDPrefix, iterator.Key()...), iterator.Value()) + index++ + } +} diff --git a/x/profiles/legacy/v4/store.go b/x/profiles/legacy/v4/store.go index b920465a61..424a67a9a2 100644 --- a/x/profiles/legacy/v4/store.go +++ b/x/profiles/legacy/v4/store.go @@ -118,17 +118,29 @@ func migrateDTagTransferRequests(ctx sdk.Context, k Keeper, storeKey sdk.StoreKe } func migrateApplicationLinks(ctx sdk.Context, k Keeper, storeKey sdk.StoreKey, cdc codec.BinaryCodec) { + store := ctx.KVStore(storeKey) + var applicationLinks []types.ApplicationLink k.IterateApplicationLinks(ctx, func(index int64, applicationLink types.ApplicationLink) (stop bool) { applicationLinks = append(applicationLinks, applicationLink) return false }) - store := ctx.KVStore(storeKey) + var clientIDKeys [][]byte + k.IterateApplicationLinkClientIDKeys(ctx, func(index int64, key []byte, value []byte) (stop bool) { + clientIDKeys = append(clientIDKeys, key) + return false + }) + + // Delete all the client ID keys to make sure we remove leftover ones + // The new client ID keys will be set when storing the application links anyway later + for _, key := range clientIDKeys { + store.Delete(key) + } + for i, link := range applicationLinks { // Delete the old keys store.Delete(UserApplicationLinkKey(link.User, link.Data.Application, link.Data.Username)) - store.Delete(ApplicationLinkClientIDKey(link.OracleRequest.ClientID)) // Store the link with the new key linkKey := types.UserApplicationLinkKey(link.User, link.Data.Application, link.Data.Username) diff --git a/x/profiles/legacy/v4/store_test.go b/x/profiles/legacy/v4/store_test.go index be1b22b5ba..37469ba57b 100644 --- a/x/profiles/legacy/v4/store_test.go +++ b/x/profiles/legacy/v4/store_test.go @@ -239,6 +239,7 @@ func TestMigrateStore(t *testing.T) { }, check: func(ctx sdk.Context) { kvStore := ctx.KVStore(keys[types.StoreKey]) + require.False(t, kvStore.Has(v4.ApplicationLinkClientIDKey("client_id"))) require.False(t, kvStore.Has(profilestypes.ApplicationLinkClientIDKey("client_id"))) }, },