Repository: desmos-labs/desmos
Pull request #785 (2022-03-21 12:48:11)

feat: add profiles hooks
## Description
This PR adds the hooks to the `x/profiles` keeper, allowing other keepers to react to events such as profiles saving, deletion and others. 

Depends-On: #784

<!-- Add a description of the changes that this PR introduces and the files that
are the most critical to review. -->

---

### Author Checklist

*All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.*

I have...

- [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] added `!` to the type prefix if API or client breaking change
- [ ] targeted the correct branch (see [PR Targeting](https://github.com/desmos-labs/desmos/blob/master/CONTRIBUTING.md#pr-targeting))
- [ ] provided a link to the relevant issue or specification
- [ ] followed the guidelines for [building modules](https://docs.cosmos.network/v0.44/building-modules/intro.html)
- [ ] included the necessary unit and integration [tests](https://github.com/desmos-labs/desmos/blob/master/CONTRIBUTING.md#testing)
- [ ] added a changelog entry to `CHANGELOG.md`
- [ ] included comments for [documenting Go code](https://blog.golang.org/godoc)
- [ ] updated the relevant documentation or specification
- [ ] reviewed "Files changed" and left comments if necessary
- [ ] confirmed all CI checks have passed

### Reviewers Checklist

*All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.*

I have...

- [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] confirmed `!` in the type prefix if API or client breaking change
- [ ] confirmed all author checklist items have been addressed
- [ ] reviewed state machine logic
- [ ] reviewed API design and naming
- [ ] reviewed documentation is accurate
- [ ] reviewed tests and test coverage
- [ ] manually tested (if applicable)

codecov[bot]: # [Codecov](https://codecov.io/gh/desmos-labs/desmos/pull/785?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs) Report
> Merging [#785](https://codecov.io/gh/desmos-labs/desmos/pull/785?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs) (517bf0a) into [master](https://codecov.io/gh/desmos-labs/desmos/commit/8140a5c2460dca25a6908d6f10ad85c5becda054?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs) (8140a5c) will **decrease** coverage by `0.28%`.
> The diff coverage is `82.43%`.

```diff
@@            Coverage Diff             @@
##           master     #785      +/-   ##
==========================================
- Coverage   81.30%   81.02%   -0.29%     
==========================================
  Files          76       76              
  Lines        6495     6494       -1     
==========================================
- Hits         5281     5262      -19     
- Misses        970      990      +20     
+ Partials      244      242       -2     
```


| [Impacted Files](https://codecov.io/gh/desmos-labs/desmos/pull/785?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs) | Coverage Δ | |
|---|---|---|
| [x/profiles/keeper/msg\_server\_app\_link.go](https://codecov.io/gh/desmos-labs/desmos/pull/785/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs#diff-eC9wcm9maWxlcy9rZWVwZXIvbXNnX3NlcnZlcl9hcHBfbGluay5nbw==) | `0.00% <0.00%> (ø)` | |
| [x/profiles/keeper/keeper.go](https://codecov.io/gh/desmos-labs/desmos/pull/785/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs#diff-eC9wcm9maWxlcy9rZWVwZXIva2VlcGVyLmdv) | `91.60% <50.00%> (-3.56%)` | :arrow_down: |
| [x/profiles/keeper/keeper\_app\_links.go](https://codecov.io/gh/desmos-labs/desmos/pull/785/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs#diff-eC9wcm9maWxlcy9rZWVwZXIva2VlcGVyX2FwcF9saW5rcy5nbw==) | `82.19% <90.90%> (+5.94%)` | :arrow_up: |
| [x/profiles/keeper/genesis.go](https://codecov.io/gh/desmos-labs/desmos/pull/785/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs#diff-eC9wcm9maWxlcy9rZWVwZXIvZ2VuZXNpcy5nbw==) | `80.95% <100.00%> (ø)` | |
| [x/profiles/keeper/keeper\_chain\_links.go](https://codecov.io/gh/desmos-labs/desmos/pull/785/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs#diff-eC9wcm9maWxlcy9rZWVwZXIva2VlcGVyX2NoYWluX2xpbmtzLmdv) | `84.21% <100.00%> (-0.54%)` | :arrow_down: |
| [x/profiles/keeper/keeper\_dtag\_transfers.go](https://codecov.io/gh/desmos-labs/desmos/pull/785/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs#diff-eC9wcm9maWxlcy9rZWVwZXIva2VlcGVyX2R0YWdfdHJhbnNmZXJzLmdv) | `89.47% <100.00%> (+0.38%)` | :arrow_up: |
| [x/profiles/keeper/msg\_server\_chain\_link.go](https://codecov.io/gh/desmos-labs/desmos/pull/785/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs#diff-eC9wcm9maWxlcy9rZWVwZXIvbXNnX3NlcnZlcl9jaGFpbl9saW5rLmdv) | `100.00% <100.00%> (ø)` | |
| [x/profiles/keeper/msg\_server\_dtag\_transfers.go](https://codecov.io/gh/desmos-labs/desmos/pull/785/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs#diff-eC9wcm9maWxlcy9rZWVwZXIvbXNnX3NlcnZlcl9kdGFnX3RyYW5zZmVycy5nbw==) | `76.74% <100.00%> (+0.55%)` | :arrow_up: |
| [x/profiles/keeper/msgs\_server\_profile.go](https://codecov.io/gh/desmos-labs/desmos/pull/785/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs#diff-eC9wcm9maWxlcy9rZWVwZXIvbXNnc19zZXJ2ZXJfcHJvZmlsZS5nbw==) | `82.85% <100.00%> (ø)` | |
| [x/profiles/legacy/v1beta1/store.go](https://codecov.io/gh/desmos-labs/desmos/pull/785/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs#diff-eC9wcm9maWxlcy9sZWdhY3kvdjFiZXRhMS9zdG9yZS5nbw==) | `83.53% <100.00%> (-1.38%)` | :arrow_down: |
| ... and [2 more](https://codecov.io/gh/desmos-labs/desmos/pull/785/diff?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs) | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/desmos-labs/desmos/pull/785?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/desmos-labs/desmos/pull/785?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs). Last update [8140a5c...517bf0a](https://codecov.io/gh/desmos-labs/desmos/pull/785?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=desmos-labs).


Patch:
diff --git a/.changeset/entries/1cd6ee38302b45c8b8b5cad9dbafb91c7ae94f7ae8cae567cce5caaa52d8de79.yaml b/.changeset/entries/1cd6ee38302b45c8b8b5cad9dbafb91c7ae94f7ae8cae567cce5caaa52d8de79.yaml
new file mode 100644
index 00000000..e0935f1a
--- /dev/null
+++ b/.changeset/entries/1cd6ee38302b45c8b8b5cad9dbafb91c7ae94f7ae8cae567cce5caaa52d8de79.yaml
@@ -0,0 +1,6 @@
+type: feat
+module: x/profiles
+pull_request: 785
+description: Added keeper hooks
+backward_compatible: true
+date: 2022-03-21T12:49:02.772351804Z
diff --git a/Makefile b/Makefile
index 57dda1a8..af6a4ed4 100644
--- a/Makefile
+++ b/Makefile
@@ -329,12 +329,12 @@ proto-lint:
 proto-check-breaking:
 	@$(DOCKER_BUF) breaking --against $(HTTPS_GIT)#branch=master
 
-TM_URL           = https://raw.githubusercontent.com/tendermint/tendermint/v0.34.15/proto/tendermint
+TM_URL           = https://raw.githubusercontent.com/tendermint/tendermint/v0.34.16/proto/tendermint
 GOGO_PROTO_URL   = https://raw.githubusercontent.com/regen-network/protobuf/cosmos
 COSMOS_URL 		 = https://raw.githubusercontent.com/cosmos/cosmos-sdk/v0.45.1/proto/cosmos
 COSMOS_PROTO_URL = https://raw.githubusercontent.com/regen-network/cosmos-proto/master
 CONFIO_URL 		 = https://raw.githubusercontent.com/confio/ics23/v0.6.3
-IBC_URL 		 = https://raw.githubusercontent.com/cosmos/ibc-go/v2.0.2/proto/ibc
+IBC_URL 		 = https://raw.githubusercontent.com/cosmos/ibc-go/v2.2.0/proto/ibc
 
 TM_CRYPTO_TYPES     = third_party/proto/tendermint/crypto
 TM_ABCI_TYPES       = third_party/proto/tendermint/abci
diff --git a/x/profiles/keeper/genesis.go b/x/profiles/keeper/genesis.go
index b56e6b0b..1900a5fe 100644
--- a/x/profiles/keeper/genesis.go
+++ b/x/profiles/keeper/genesis.go
@@ -27,7 +27,7 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) []abci.Val
 	// Initialize the Profiles
 	k.ak.IterateAccounts(ctx, func(account authtypes.AccountI) (stop bool) {
 		if profile, ok := (account).(*types.Profile); ok {
-			err := k.StoreProfile(ctx, profile)
+			err := k.SaveProfile(ctx, profile)
 			if err != nil {
 				panic(err)
 			}
diff --git a/x/profiles/keeper/hooks.go b/x/profiles/keeper/hooks.go
new file mode 100644
index 00000000..d9f9827b
--- /dev/null
+++ b/x/profiles/keeper/hooks.go
@@ -0,0 +1,75 @@
+package keeper
+
+// DONTCOVER
+
+import (
+	sdk "github.com/cosmos/cosmos-sdk/types"
+
+	"github.com/desmos-labs/desmos/v3/x/profiles/types"
+)
+
+// Implements ProfilesHooks interface
+var _ types.ProfilesHooks = Keeper{}
+
+// AfterProfileSaved - call if hook is registered
+func (k Keeper) AfterProfileSaved(ctx sdk.Context, profile *types.Profile) {
+	if k.hooks != nil {
+		k.hooks.AfterProfileSaved(ctx, profile)
+	}
+}
+
+// AfterProfileDeleted - call if hook is registered
+func (k Keeper) AfterProfileDeleted(ctx sdk.Context, profile *types.Profile) {
+	if k.hooks != nil {
+		k.hooks.AfterProfileDeleted(ctx, profile)
+	}
+}
+
+// AfterDTagTransferRequestCreated - call if hook is registered
+func (k Keeper) AfterDTagTransferRequestCreated(ctx sdk.Context, request types.DTagTransferRequest) {
+	if k.hooks != nil {
+		k.hooks.AfterDTagTransferRequestCreated(ctx, request)
+	}
+}
+
+// AfterDTagTransferRequestAccepted - call if hook is registered
+func (k Keeper) AfterDTagTransferRequestAccepted(ctx sdk.Context, request types.DTagTransferRequest, newDTag string) {
+	if k.hooks != nil {
+		k.hooks.AfterDTagTransferRequestAccepted(ctx, request, newDTag)
+	}
+}
+
+// AfterDTagTransferRequestDeleted - call if hook is registered
+func (k Keeper) AfterDTagTransferRequestDeleted(ctx sdk.Context, sender, recipient string) {
+	if k.hooks != nil {
+		k.hooks.AfterDTagTransferRequestDeleted(ctx, sender, recipient)
+	}
+}
+
+// AfterChainLinkSaved - call if hook is registered
+func (k Keeper) AfterChainLinkSaved(ctx sdk.Context, link types.ChainLink) {
+	if k.hooks != nil {
+		k.hooks.AfterChainLinkSaved(ctx, link)
+	}
+}
+
+// AfterChainLinkDeleted - call if hook is registered
+func (k Keeper) AfterChainLinkDeleted(ctx sdk.Context, link types.ChainLink) {
+	if k.hooks != nil {
+		k.hooks.AfterChainLinkDeleted(ctx, link)
+	}
+}
+
+// AfterApplicationLinkSaved - call if hook is registered
+func (k Keeper) AfterApplicationLinkSaved(ctx sdk.Context, link types.ApplicationLink) {
+	if k.hooks != nil {
+		k.hooks.AfterApplicationLinkSaved(ctx, link)
+	}
+}
+
+// AfterUserPermissionDeleted - call if hook is registered
+func (k Keeper) AfterApplicationLinkDeleted(ctx sdk.Context, link types.ApplicationLink) {
+	if k.hooks != nil {
+		k.hooks.AfterApplicationLinkDeleted(ctx, link)
+	}
+}
diff --git a/x/profiles/keeper/keeper.go b/x/profiles/keeper/keeper.go
index 1c08b101..a388863a 100644
--- a/x/profiles/keeper/keeper.go
+++ b/x/profiles/keeper/keeper.go
@@ -22,6 +22,7 @@ type Keeper struct {
 	storeKey      sdk.StoreKey
 	cdc           codec.BinaryCodec
 	paramSubspace paramstypes.Subspace
+	hooks         types.ProfilesHooks
 
 	ak authkeeper.AccountKeeper
 	rk types.RelationshipsKeeper
@@ -68,6 +69,16 @@ func (k Keeper) Logger(ctx sdk.Context) log.Logger {
 	return ctx.Logger().With("module", "x/"+types.ModuleName)
 }
 
+// SetHooks allows to set the profiles hooks
+func (k *Keeper) SetHooks(ph types.ProfilesHooks) *Keeper {
+	if k.hooks != nil {
+		panic("cannot set profiles hooks twice")
+	}
+
+	k.hooks = ph
+	return k
+}
+
 // IsUserBlocked returns true if the provided blocker has blocked the given user for the given subspace.
 // If the provided subspace is empty, all subspaces will be checked
 func (k Keeper) IsUserBlocked(ctx sdk.Context, user, blocker string) bool {
@@ -98,14 +109,17 @@ func (k Keeper) storeProfileWithoutDTagCheck(ctx sdk.Context, profile *types.Pro
 	// Store the account inside the auth keeper
 	k.ak.SetAccount(ctx, profile)
 
-	k.Logger(ctx).Info("stored profile", "DTag", profile.DTag, "from", profile.GetAddress())
+	k.Logger(ctx).Info("saved profile", "DTag", profile.DTag, "from", profile.GetAddress())
+
+	k.AfterProfileSaved(ctx, profile)
+
 	return nil
 }
 
-// StoreProfile stores the given profile inside the current context.
+// SaveProfile stores the given profile inside the current context.
 // It assumes that the given profile has already been validated.
 // It returns an error if a profile with the same DTag from a different creator already exists
-func (k Keeper) StoreProfile(ctx sdk.Context, profile *types.Profile) error {
+func (k Keeper) SaveProfile(ctx sdk.Context, profile *types.Profile) error {
 	addr := k.GetAddressFromDTag(ctx, profile.DTag)
 	if addr != "" && addr != profile.GetAddress().String() {
 		return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest,
@@ -158,8 +172,6 @@ func (k Keeper) RemoveProfile(ctx sdk.Context, address string) error {
 	store := ctx.KVStore(k.storeKey)
 	store.Delete(types.DTagStoreKey(profile.DTag))
 
-	// TODO: Add here OnProfileDeleted to delete all the user blocks and relationships
-
 	// Delete all DTag transfer requests made towards this account
 	k.DeleteAllUserIncomingDTagTransferRequests(ctx, address)
 
@@ -172,6 +184,8 @@ func (k Keeper) RemoveProfile(ctx sdk.Context, address string) error {
 	// Delete the profile data by replacing the stored account
 	k.ak.SetAccount(ctx, profile.GetAccount())
 
+	k.AfterProfileDeleted(ctx, profile)
+
 	return nil
 }
 
diff --git a/x/profiles/keeper/keeper_app_links.go b/x/profiles/keeper/keeper_app_links.go
index 3c808618..97a56b3c 100644
--- a/x/profiles/keeper/keeper_app_links.go
+++ b/x/profiles/keeper/keeper_app_links.go
@@ -37,6 +37,8 @@ func (k Keeper) SaveApplicationLink(ctx sdk.Context, link types.ApplicationLink)
 		),
 	)
 
+	k.AfterApplicationLinkSaved(ctx, link)
+
 	return nil
 }
 
@@ -96,6 +98,8 @@ func (k Keeper) DeleteApplicationLink(ctx sdk.Context, appLink types.Application
 	store := ctx.KVStore(k.storeKey)
 	store.Delete(types.UserApplicationLinkKey(appLink.User, appLink.Data.Application, appLink.Data.Username))
 	store.Delete(types.ApplicationLinkClientIDKey(appLink.OracleRequest.ClientID))
+
+	k.AfterApplicationLinkDeleted(ctx, appLink)
 }
 
 // DeleteAllUserApplicationLinks delete all the applications links associated with the given user
diff --git a/x/profiles/keeper/keeper_chain_links.go b/x/profiles/keeper/keeper_chain_links.go
index 5040abe3..3f7bcd94 100644
--- a/x/profiles/keeper/keeper_chain_links.go
+++ b/x/profiles/keeper/keeper_chain_links.go
@@ -46,6 +46,9 @@ func (k Keeper) SaveChainLink(ctx sdk.Context, link types.ChainLink) error {
 	store := ctx.KVStore(k.storeKey)
 	key := types.ChainLinksStoreKey(link.User, link.ChainConfig.Name, target)
 	store.Set(key, types.MustMarshalChainLink(k.cdc, link))
+
+	k.AfterChainLinkSaved(ctx, link)
+
 	return nil
 }
 
@@ -72,6 +75,8 @@ func (k Keeper) GetChainLink(ctx sdk.Context, owner, chainName, target string) (
 func (k Keeper) DeleteChainLink(ctx sdk.Context, link types.ChainLink) {
 	store := ctx.KVStore(k.storeKey)
 	store.Delete(types.ChainLinksStoreKey(link.User, link.ChainConfig.Name, link.GetAddressData().GetValue()))
+
+	k.AfterChainLinkDeleted(ctx, link)
 }
 
 // DeleteAllUserChainLinks deletes all the chain links associated with the given user
diff --git a/x/profiles/keeper/keeper_dtag_transfers.go b/x/profiles/keeper/keeper_dtag_transfers.go
index fec5e863..83d94fac 100644
--- a/x/profiles/keeper/keeper_dtag_transfers.go
+++ b/x/profiles/keeper/keeper_dtag_transfers.go
@@ -26,6 +26,9 @@ func (k Keeper) SaveDTagTransferRequest(ctx sdk.Context, request types.DTagTrans
 
 	store.Set(key, k.cdc.MustMarshal(&request))
 	k.Logger(ctx).Info("DTag transfer request", "sender", request.Sender, "receiver", request.Receiver)
+
+	k.AfterDTagTransferRequestCreated(ctx, request)
+
 	return nil
 }
 
@@ -71,6 +74,8 @@ func (k Keeper) GetDTagTransferRequests(ctx sdk.Context) (requests []types.DTagT
 func (k Keeper) DeleteDTagTransferRequest(ctx sdk.Context, sender, recipient string) {
 	store := ctx.KVStore(k.storeKey)
 	store.Delete(types.DTagTransferRequestStoreKey(sender, recipient))
+
+	k.AfterDTagTransferRequestDeleted(ctx, sender, recipient)
 }
 
 // DeleteAllUserIncomingDTagTransferRequests deletes all the requests made to the given user
diff --git a/x/profiles/keeper/msg_server_dtag_transfers.go b/x/profiles/keeper/msg_server_dtag_transfers.go
index 29466956..63b5b8f9 100644
--- a/x/profiles/keeper/msg_server_dtag_transfers.go
+++ b/x/profiles/keeper/msg_server_dtag_transfers.go
@@ -134,7 +134,7 @@ func (k msgServer) AcceptDTagTransferRequest(goCtx context.Context, msg *types.M
 			return nil, err
 		}
 	} else {
-		err = k.StoreProfile(ctx, currentOwnerProfile)
+		err = k.Keeper.SaveProfile(ctx, currentOwnerProfile)
 		if err != nil {
 			return nil, err
 		}
@@ -166,7 +166,7 @@ func (k msgServer) AcceptDTagTransferRequest(goCtx context.Context, msg *types.M
 	}
 
 	// Save the receiver profile
-	err = k.StoreProfile(ctx, receiverProfile)
+	err = k.Keeper.SaveProfile(ctx, receiverProfile)
 	if err != nil {
 		return nil, err
 	}
diff --git a/x/profiles/keeper/msgs_server_profile.go b/x/profiles/keeper/msgs_server_profile.go
index 69a99c52..cd02d541 100644
--- a/x/profiles/keeper/msgs_server_profile.go
+++ b/x/profiles/keeper/msgs_server_profile.go
@@ -61,7 +61,7 @@ func (k msgServer) SaveProfile(goCtx context.Context, msg *types.MsgSaveProfile)
 	}
 
 	// Save the profile
-	err = k.StoreProfile(ctx, updated)
+	err = k.Keeper.SaveProfile(ctx, updated)
 	if err != nil {
 		return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, err.Error())
 	}
diff --git a/x/profiles/types/hooks.go b/x/profiles/types/hooks.go
new file mode 100644
index 00000000..7ce4bc63
--- /dev/null
+++ b/x/profiles/types/hooks.go
@@ -0,0 +1,101 @@
+package types
+
+// DONTCOVER
+
+import (
+	sdk "github.com/cosmos/cosmos-sdk/types"
+)
+
+// Event Hooks
+// These can be utilized to communicate between a profiles keeper and another
+// keeper which must take particular actions when profiles/DTag transfer requests/app links/chain links change
+// state. The second keeper must implement this interface, which then the
+// profiles keeper can call.
+
+// ProfilesHooks event hooks for profiles objects (noalias)
+type ProfilesHooks interface {
+	AfterProfileSaved(ctx sdk.Context, profile *Profile)   // Must be called when a profile is saved
+	AfterProfileDeleted(ctx sdk.Context, profile *Profile) // Must be called when a profile is deleted
+
+	AfterDTagTransferRequestCreated(ctx sdk.Context, request DTagTransferRequest)                  // Must be called then a DTag transfer request is created
+	AfterDTagTransferRequestAccepted(ctx sdk.Context, request DTagTransferRequest, newDTag string) // Must be called when a DTag transfer request is accepted
+	AfterDTagTransferRequestDeleted(ctx sdk.Context, sender, recipient string)                     // Must be called when a DTag transfer request is deleted
+
+	AfterChainLinkSaved(ctx sdk.Context, link ChainLink)   // Must be called when a chain link is saved
+	AfterChainLinkDeleted(ctx sdk.Context, link ChainLink) // Must be called when a chain link is deleted
+
+	AfterApplicationLinkSaved(ctx sdk.Context, link ApplicationLink)   // Must be called when an application link is saved
+	AfterApplicationLinkDeleted(ctx sdk.Context, link ApplicationLink) // Must be called when an application link is deleted
+}
+
+// --------------------------------------------------------------------------------------------------------------------
+
+// MultiProfilesHooks combines multiple profiles hooks, all hook functions are run in array sequence
+type MultiProfilesHooks []ProfilesHooks
+
+func NewMultiProfilesHooks(hooks ...ProfilesHooks) MultiProfilesHooks {
+	return hooks
+}
+
+// AfterProfileSaved implements ProfilesHooks
+func (h MultiProfilesHooks) AfterProfileSaved(ctx sdk.Context, profile *Profile) {
+	for _, hook := range h {
+		hook.AfterProfileSaved(ctx, profile)
+	}
+}
+
+// AfterProfileDeleted implements ProfilesHooks
+func (h MultiProfilesHooks) AfterProfileDeleted(ctx sdk.Context, profile *Profile) {
+	for _, hook := range h {
+		hook.AfterProfileDeleted(ctx, profile)
+	}
+}
+
+// AfterDTagTransferRequestCreated implements ProfilesHooks
+func (h MultiProfilesHooks) AfterDTagTransferRequestCreated(ctx sdk.Context, request DTagTransferRequest) {
+	for _, hook := range h {
+		hook.AfterDTagTransferRequestCreated(ctx, request)
+	}
+}
+
+// AfterDTagTransferRequestAccepted implements ProfilesHooks
+func (h MultiProfilesHooks) AfterDTagTransferRequestAccepted(ctx sdk.Context, request DTagTransferRequest, newDTag string) {
+	for _, hook := range h {
+		hook.AfterDTagTransferRequestAccepted(ctx, request, newDTag)
+	}
+}
+
+// AfterDTagTransferRequestDeleted implements ProfilesHooks
+func (h MultiProfilesHooks) AfterDTagTransferRequestDeleted(ctx sdk.Context, sender, recipient string) {
+	for _, hook := range h {
+		hook.AfterDTagTransferRequestDeleted(ctx, sender, recipient)
+	}
+}
+
+// AfterChainLinkSaved implements ProfilesHooks
+func (h MultiProfilesHooks) AfterChainLinkSaved(ctx sdk.Context, link ChainLink) {
+	for _, hook := range h {
+		hook.AfterChainLinkSaved(ctx, link)
+	}
+}
+
+// AfterChainLinkDeleted implements ProfilesHooks
+func (h MultiProfilesHooks) AfterChainLinkDeleted(ctx sdk.Context, link ChainLink) {
+	for _, hook := range h {
+		hook.AfterChainLinkDeleted(ctx, link)
+	}
+}
+
+// AfterApplicationLinkSaved implements ProfilesHooks
+func (h MultiProfilesHooks) AfterApplicationLinkSaved(ctx sdk.Context, link ApplicationLink) {
+	for _, hook := range h {
+		hook.AfterApplicationLinkSaved(ctx, link)
+	}
+}
+
+// AfterUserPermissionDeleted implements ProfilesHooks
+func (h MultiProfilesHooks) AfterApplicationLinkDeleted(ctx sdk.Context, link ApplicationLink) {
+	for _, hook := range h {
+		hook.AfterApplicationLinkDeleted(ctx, link)
+	}
+}


Test patch:
diff --git a/x/profiles/keeper/alias_functions_test.go b/x/profiles/keeper/alias_functions_test.go
index 8c469ea5..1f76b726 100644
--- a/x/profiles/keeper/alias_functions_test.go
+++ b/x/profiles/keeper/alias_functions_test.go
@@ -51,7 +51,7 @@ func (suite *KeeperTestSuite) TestKeeper_IterateProfile() {
 	}
 
 	for _, profile := range profiles {
-		err := suite.k.StoreProfile(suite.ctx, profile)
+		err := suite.k.SaveProfile(suite.ctx, profile)
 		suite.Require().NoError(err)
 	}
 
@@ -80,7 +80,7 @@ func (suite *KeeperTestSuite) TestKeeper_GetProfiles() {
 			name: "non empty profiles list is returned properly",
 			store: func(ctx sdk.Context) {
 				profile := testutil.ProfileFromAddr("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773")
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile))
 			},
 			expProfiles: []*types.Profile{
 				testutil.ProfileFromAddr("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773"),
@@ -130,7 +130,7 @@ func (suite *KeeperTestSuite) TestKeeper_IterateUserIncomingDTagTransferRequests
 
 	for _, request := range requests {
 		profile := testutil.ProfileFromAddr(address)
-		err := suite.k.StoreProfile(suite.ctx, profile)
+		err := suite.k.SaveProfile(suite.ctx, profile)
 		suite.Require().NoError(err)
 
 		err = suite.k.SaveDTagTransferRequest(suite.ctx, request)
diff --git a/x/profiles/keeper/genesis_test.go b/x/profiles/keeper/genesis_test.go
index eefefeb9..6fb458aa 100644
--- a/x/profiles/keeper/genesis_test.go
+++ b/x/profiles/keeper/genesis_test.go
@@ -38,10 +38,10 @@ func (suite *KeeperTestSuite) Test_ExportGenesis() {
 				profile := testutil.ProfileFromAddr("cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47")
 				otherProfile := testutil.ProfileFromAddr("cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns")
 
-				err := suite.k.StoreProfile(suite.ctx, profile)
+				err := suite.k.SaveProfile(suite.ctx, profile)
 				suite.Require().NoError(err)
 
-				err = suite.k.StoreProfile(suite.ctx, otherProfile)
+				err = suite.k.SaveProfile(suite.ctx, otherProfile)
 				suite.Require().NoError(err)
 
 				dTagRequests := []types.DTagTransferRequest{
@@ -232,10 +232,10 @@ func (suite *KeeperTestSuite) Test_InitGenesis() {
 				profile2 := testutil.ProfileFromAddr("cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns")
 				suite.ak.SetAccount(ctx, profile2)
 
-				err := suite.k.StoreProfile(suite.ctx, profile1)
+				err := suite.k.SaveProfile(suite.ctx, profile1)
 				suite.Require().NoError(err)
 
-				err = suite.k.StoreProfile(suite.ctx, profile2)
+				err = suite.k.SaveProfile(suite.ctx, profile2)
 				suite.Require().NoError(err)
 
 				addr3, err := sdk.AccAddressFromBech32("cosmos1s3nh6tafl4amaxkke9kdejhp09lk93g9ev39r4")
diff --git a/x/profiles/keeper/grpc_query_test.go b/x/profiles/keeper/grpc_query_test.go
index a4f1acd5..aee28a8c 100644
--- a/x/profiles/keeper/grpc_query_test.go
+++ b/x/profiles/keeper/grpc_query_test.go
@@ -39,7 +39,7 @@ func (suite *KeeperTestSuite) TestQueryServer_Profile() {
 			name: "found profile using DTag",
 			store: func(ctx sdk.Context) {
 				profile := testutil.ProfileFromAddr("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x")
-				err := suite.k.StoreProfile(ctx, profile)
+				err := suite.k.SaveProfile(ctx, profile)
 				suite.Require().NoError(err)
 			},
 			req:       types.NewQueryProfileRequest("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x-dtag"),
@@ -52,7 +52,7 @@ func (suite *KeeperTestSuite) TestQueryServer_Profile() {
 			name: "found profile using address",
 			store: func(ctx sdk.Context) {
 				profile := testutil.ProfileFromAddr("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x")
-				err := suite.k.StoreProfile(ctx, profile)
+				err := suite.k.SaveProfile(ctx, profile)
 				suite.Require().NoError(err)
 			},
 			req:       types.NewQueryProfileRequest("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x"),
@@ -104,7 +104,7 @@ func (suite *KeeperTestSuite) TestQueryServer_IncomingDTagTransferRequests() {
 					"cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773",
 					"cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x",
 				)
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 
 				request = types.NewDTagTransferRequest(
@@ -112,7 +112,7 @@ func (suite *KeeperTestSuite) TestQueryServer_IncomingDTagTransferRequests() {
 					"cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x",
 					"cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773",
 				)
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 			},
 			req: types.NewQueryIncomingDTagTransferRequestsRequest(
@@ -132,7 +132,7 @@ func (suite *KeeperTestSuite) TestQueryServer_IncomingDTagTransferRequests() {
 			name: "valid request with pagination",
 			store: func(ctx sdk.Context) {
 				receiver := "cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x"
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(receiver)))
 
 				request := types.NewDTagTransferRequest(
 					"dtag",
@@ -165,10 +165,10 @@ func (suite *KeeperTestSuite) TestQueryServer_IncomingDTagTransferRequests() {
 			name: "valid request without user",
 			store: func(ctx sdk.Context) {
 				receiver1 := "cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x"
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(receiver1)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(receiver1)))
 
 				receiver2 := "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773"
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(receiver2)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(receiver2)))
 
 				request := types.NewDTagTransferRequest(
 					"dtag",
diff --git a/x/profiles/keeper/invariants_test.go b/x/profiles/keeper/invariants_test.go
index e8bf46bb..569cb9ee 100644
--- a/x/profiles/keeper/invariants_test.go
+++ b/x/profiles/keeper/invariants_test.go
@@ -36,7 +36,7 @@ func (suite *KeeperTestSuite) TestInvariants() {
 					time.Now(),
 				)
 				suite.Require().NoError(err)
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile))
 			},
 			expResponse: sdk.FormatInvariant(types.ModuleName, "invalid profiles",
 				fmt.Sprintf("%s%s",
diff --git a/x/profiles/keeper/keeper_app_links_test.go b/x/profiles/keeper/keeper_app_links_test.go
index f4563ad4..934503e2 100644
--- a/x/profiles/keeper/keeper_app_links_test.go
+++ b/x/profiles/keeper/keeper_app_links_test.go
@@ -38,7 +38,7 @@ func (suite *KeeperTestSuite) Test_SaveApplicationLink() {
 			name: "correct requests returns no error",
 			store: func(ctx sdk.Context) {
 				profile := testutil.ProfileFromAddr("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773")
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile))
 			},
 			link: types.NewApplicationLink(
 				"cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773",
@@ -107,7 +107,7 @@ func (suite *KeeperTestSuite) Test_GetApplicationLink() {
 					time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC),
 				)
 
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(address)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(address)))
 				err := suite.k.SaveApplicationLink(ctx, link)
 				suite.Require().NoError(err)
 			},
@@ -134,7 +134,7 @@ func (suite *KeeperTestSuite) Test_GetApplicationLink() {
 					time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC),
 				)
 
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(address)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(address)))
 				err := suite.k.SaveApplicationLink(ctx, link)
 				suite.Require().NoError(err)
 			},
@@ -161,7 +161,7 @@ func (suite *KeeperTestSuite) Test_GetApplicationLink() {
 					time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC),
 				)
 
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(address)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(address)))
 				err := suite.k.SaveApplicationLink(ctx, link)
 				suite.Require().NoError(err)
 			},
@@ -188,7 +188,7 @@ func (suite *KeeperTestSuite) Test_GetApplicationLink() {
 					time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC),
 				)
 
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(address)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(address)))
 				err := suite.k.SaveApplicationLink(ctx, link)
 				suite.Require().NoError(err)
 			},
@@ -264,7 +264,7 @@ func (suite *KeeperTestSuite) Test_GetApplicationLinkByClientID() {
 					time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC),
 				)
 
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(address)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(address)))
 
 				err := suite.k.SaveApplicationLink(ctx, link)
 				suite.Require().NoError(err)
@@ -335,7 +335,7 @@ func (suite *KeeperTestSuite) Test_DeleteApplicationLink() {
 					time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC),
 				)
 
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(address)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(address)))
 				err := suite.k.SaveApplicationLink(ctx, link)
 				suite.Require().NoError(err)
 			},
@@ -378,7 +378,7 @@ func (suite *KeeperTestSuite) Test_DeleteApplicationLink() {
 					time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC),
 				)
 
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(address)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(address)))
 				err := suite.k.SaveApplicationLink(ctx, link)
 				suite.Require().NoError(err)
 			},
@@ -421,7 +421,7 @@ func (suite *KeeperTestSuite) Test_DeleteApplicationLink() {
 					time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC),
 				)
 
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(address)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(address)))
 				err := suite.k.SaveApplicationLink(ctx, link)
 				suite.Require().NoError(err)
 			},
@@ -464,7 +464,7 @@ func (suite *KeeperTestSuite) Test_DeleteApplicationLink() {
 					time.Date(2020, 1, 1, 00, 00, 00, 000, time.UTC),
 				)
 
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(address)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(address)))
 				err := suite.k.SaveApplicationLink(ctx, link)
 				suite.Require().NoError(err)
 			},
diff --git a/x/profiles/keeper/keeper_chain_links_test.go b/x/profiles/keeper/keeper_chain_links_test.go
index efcb2ef0..89e589e1 100644
--- a/x/profiles/keeper/keeper_chain_links_test.go
+++ b/x/profiles/keeper/keeper_chain_links_test.go
@@ -122,7 +122,7 @@ func (suite *KeeperTestSuite) TestKeeper_StoreChainLink() {
 			name: "valid conditions return no error",
 			store: func(ctx sdk.Context) {
 				profile := testutil.ProfileFromAddr("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x")
-				err := suite.k.StoreProfile(ctx, profile)
+				err := suite.k.SaveProfile(ctx, profile)
 				suite.Require().NoError(err)
 			},
 			link: types.NewChainLink(
@@ -248,7 +248,7 @@ func (suite *KeeperTestSuite) TestKeeper_DeleteChainLink() {
 		{
 			name: "different user does not delete link",
 			store: func(ctx sdk.Context) {
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x")))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x")))
 				err = suite.k.SaveChainLink(ctx, types.NewChainLink(
 					"cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x",
 					types.NewBech32Address(ext.GetAddress().String(), "cosmos"),
@@ -276,7 +276,7 @@ func (suite *KeeperTestSuite) TestKeeper_DeleteChainLink() {
 		{
 			name: "different chain name does not delete link",
 			store: func(ctx sdk.Context) {
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x")))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x")))
 				err = suite.k.SaveChainLink(ctx, types.NewChainLink(
 					"cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x",
 					types.NewBech32Address(ext.GetAddress().String(), "cosmos"),
@@ -304,7 +304,7 @@ func (suite *KeeperTestSuite) TestKeeper_DeleteChainLink() {
 		{
 			name: "different external address does not delete the link",
 			store: func(ctx sdk.Context) {
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x")))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x")))
 				err = suite.k.SaveChainLink(ctx, types.NewChainLink(
 					"cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x",
 					types.NewBech32Address(ext.GetAddress().String(), "cosmos"),
@@ -332,7 +332,7 @@ func (suite *KeeperTestSuite) TestKeeper_DeleteChainLink() {
 		{
 			name: "proper data delete the link",
 			store: func(ctx sdk.Context) {
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x")))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x")))
 				err = suite.k.SaveChainLink(ctx, types.NewChainLink(
 					"cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x",
 					types.NewBech32Address(ext.GetAddress().String(), "cosmos"),
diff --git a/x/profiles/keeper/keeper_dtag_transfers_test.go b/x/profiles/keeper/keeper_dtag_transfers_test.go
index d87b39ae..db299970 100644
--- a/x/profiles/keeper/keeper_dtag_transfers_test.go
+++ b/x/profiles/keeper/keeper_dtag_transfers_test.go
@@ -24,7 +24,7 @@ func (suite *KeeperTestSuite) TestKeeper_SaveDTagTransferRequest() {
 					"cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47",
 					"cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns",
 				)
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 			},
 			transferReq: types.NewDTagTransferRequest(
@@ -42,7 +42,7 @@ func (suite *KeeperTestSuite) TestKeeper_SaveDTagTransferRequest() {
 					"cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47",
 					"cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns",
 				)
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 			},
 			transferReq: types.NewDTagTransferRequest(
@@ -60,10 +60,10 @@ func (suite *KeeperTestSuite) TestKeeper_SaveDTagTransferRequest() {
 					"cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47",
 					"cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns",
 				)
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr("cosmos1xcy3els9ua75kdm783c3qu0rfa2eplesldfevn")))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr("cosmos1xcy3els9ua75kdm783c3qu0rfa2eplesldfevn")))
 			},
 			transferReq: types.NewDTagTransferRequest(
 				"dtag",
@@ -95,10 +95,10 @@ func (suite *KeeperTestSuite) TestKeeper_SaveDTagTransferRequest() {
 					"cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47",
 					"cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns",
 				)
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr("cosmos1xcy3els9ua75kdm783c3qu0rfa2eplesldfevn")))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr("cosmos1xcy3els9ua75kdm783c3qu0rfa2eplesldfevn")))
 			},
 			transferReq: types.NewDTagTransferRequest(
 				"dtag",
@@ -126,7 +126,7 @@ func (suite *KeeperTestSuite) TestKeeper_SaveDTagTransferRequest() {
 			name: "not already present request is saved correctly",
 			store: func(ctx sdk.Context) {
 				receiver := "cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns"
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(receiver)))
 			},
 			transferReq: types.NewDTagTransferRequest(
 				"dtag",
@@ -186,7 +186,7 @@ func (suite *KeeperTestSuite) TestKeeper_GetDTagTransferRequest() {
 					"cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47",
 					"cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns",
 				)
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 			},
 			sender:   "cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47",
@@ -238,7 +238,7 @@ func (suite *KeeperTestSuite) TestKeeper_GetDTagTransferRequests() {
 					"cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47",
 					"cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns",
 				)
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 			},
 			expReqs: []types.DTagTransferRequest{
@@ -284,7 +284,7 @@ func (suite *KeeperTestSuite) TestKeeper_DeleteDTagTransferRequest() {
 					"cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47",
 					"cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x",
 				)
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 			},
 			sender:   "cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47",
@@ -298,7 +298,7 @@ func (suite *KeeperTestSuite) TestKeeper_DeleteDTagTransferRequest() {
 					"cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47",
 					"cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x",
 				)
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 			},
 			sender:   "cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47",
@@ -336,10 +336,10 @@ func (suite *KeeperTestSuite) TestKeeper_DeleteAllUserIncomingDTagTransferReques
 			name: "DTag requests are deleted properly",
 			store: func(ctx sdk.Context) {
 				profile1 := testutil.ProfileFromAddr("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773")
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile1))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile1))
 
 				profile2 := testutil.ProfileFromAddr("cosmos19xz3mrvzvp9ymgmudhpukucg6668l5haakh04x")
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile2))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile2))
 
 				request := types.NewDTagTransferRequest(
 					profile1.DTag,
diff --git a/x/profiles/keeper/keeper_test.go b/x/profiles/keeper/keeper_test.go
index 0ab7e728..09e7cfed 100644
--- a/x/profiles/keeper/keeper_test.go
+++ b/x/profiles/keeper/keeper_test.go
@@ -24,7 +24,7 @@ func (suite *KeeperTestSuite) TestKeeper_StoreProfile() {
 			store: func(ctx sdk.Context) {
 				profile := testutil.ProfileFromAddr("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773")
 				profile.DTag = "DTag"
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile))
 			},
 			profile: suite.CheckProfileNoError(types.NewProfile(
 				"DTag",
@@ -41,7 +41,7 @@ func (suite *KeeperTestSuite) TestKeeper_StoreProfile() {
 			store: func(ctx sdk.Context) {
 				profile := testutil.ProfileFromAddr("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773")
 				profile.DTag = "Old DTag"
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile))
 
 				// Save a DTag transfer request
 				request := types.NewDTagTransferRequest(
@@ -73,7 +73,7 @@ func (suite *KeeperTestSuite) TestKeeper_StoreProfile() {
 				tc.store(ctx)
 			}
 
-			err := suite.k.StoreProfile(ctx, tc.profile)
+			err := suite.k.SaveProfile(ctx, tc.profile)
 			if tc.shouldErr {
 				suite.Require().Error(err)
 			} else {
@@ -105,7 +105,7 @@ func (suite *KeeperTestSuite) TestKeeper_GetProfile() {
 			name: "found profile is returned properly",
 			store: func(ctx sdk.Context) {
 				profile := testutil.ProfileFromAddr("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773")
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile))
 			},
 			address:    "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773",
 			shouldErr:  false,
@@ -155,7 +155,7 @@ func (suite *KeeperTestSuite) TestKeeper_GetAddressFromDTag() {
 			store: func(ctx sdk.Context) {
 				profile := testutil.ProfileFromAddr("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773")
 				profile.DTag = "DTag"
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile))
 			},
 			DTag:    "dtag",
 			expAddr: "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773",
@@ -198,7 +198,7 @@ func (suite *KeeperTestSuite) TestKeeper_RemoveProfile() {
 			name: "found profile is deleted properly",
 			store: func(ctx sdk.Context) {
 				profile := testutil.ProfileFromAddr("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773")
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile))
 			},
 			address:   "cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773",
 			shouldErr: false,
diff --git a/x/profiles/keeper/msg_server_chain_link_test.go b/x/profiles/keeper/msg_server_chain_link_test.go
index 21d74289..67795f94 100644
--- a/x/profiles/keeper/msg_server_chain_link_test.go
+++ b/x/profiles/keeper/msg_server_chain_link_test.go
@@ -97,7 +97,7 @@ func (suite *KeeperTestSuite) TestMsgServer_LinkChainAccount() {
 					destBaseAcc,
 				)
 				suite.Require().NoError(err)
-				suite.Require().NoError(suite.k.StoreProfile(suite.ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(suite.ctx, profile))
 			},
 			msg: types.NewMsgLinkChainAccount(
 				types.NewBech32Address(srcAddr, "cosmos"),
diff --git a/x/profiles/keeper/msg_server_dtag_transfers_test.go b/x/profiles/keeper/msg_server_dtag_transfers_test.go
index ae707e26..cde8890d 100644
--- a/x/profiles/keeper/msg_server_dtag_transfers_test.go
+++ b/x/profiles/keeper/msg_server_dtag_transfers_test.go
@@ -24,9 +24,9 @@ func (suite *KeeperTestSuite) TestMsgServer_RequestDTagTransfer() {
 		{
 			name: "blocked receiver making request returns error",
 			store: func(ctx sdk.Context) {
-				suite.Require().NoError(suite.k.StoreProfile(ctx,
+				suite.Require().NoError(suite.k.SaveProfile(ctx,
 					testutil.ProfileFromAddr("cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns")))
-				suite.Require().NoError(suite.k.StoreProfile(ctx,
+				suite.Require().NoError(suite.k.SaveProfile(ctx,
 					testutil.ProfileFromAddr("cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47")))
 				suite.rk.SaveUserBlock(ctx, relationshipstypes.NewUserBlock(
 					"cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns",
@@ -57,7 +57,7 @@ func (suite *KeeperTestSuite) TestMsgServer_RequestDTagTransfer() {
 					"cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47",
 					"cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns",
 				)
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 			},
 			msg: types.NewMsgRequestDTagTransfer(
@@ -69,7 +69,7 @@ func (suite *KeeperTestSuite) TestMsgServer_RequestDTagTransfer() {
 		{
 			name: "not already present request is saved correctly",
 			store: func(ctx sdk.Context) {
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr("cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns")))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr("cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns")))
 			},
 			msg: types.NewMsgRequestDTagTransfer(
 				"cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47",
@@ -136,7 +136,7 @@ func (suite *KeeperTestSuite) TestMsgServer_CancelDTagTransfer() {
 					"cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns",
 				)
 
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 			},
 			msg: types.NewMsgCancelDTagTransferRequest(
@@ -227,13 +227,13 @@ func (suite *KeeperTestSuite) TestMsgServer_AcceptDTagTransfer() {
 					"cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47",
 					"cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns",
 				)
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Sender)))
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Sender)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 
 				profile := testutil.ProfileFromAddr("cosmos1xcy3els9ua75kdm783c3qu0rfa2eplesldfevn")
 				profile.DTag = "NewDTag"
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile))
 			},
 			msg: types.NewMsgAcceptDTagTransferRequest(
 				"newDtag",
@@ -250,13 +250,13 @@ func (suite *KeeperTestSuite) TestMsgServer_AcceptDTagTransfer() {
 					"cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47",
 					"cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns",
 				)
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Sender)))
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Sender)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 
 				profile := testutil.ProfileFromAddr("cosmos1xcy3els9ua75kdm783c3qu0rfa2eplesldfevn")
 				profile.DTag = "dtag"
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile))
 			},
 			msg: types.NewMsgAcceptDTagTransferRequest(
 				"NewDTag",
@@ -277,7 +277,7 @@ func (suite *KeeperTestSuite) TestMsgServer_AcceptDTagTransfer() {
 
 				receiverProfile := testutil.ProfileFromAddr(request.Receiver)
 				receiverProfile.DTag = "DTag"
-				suite.Require().NoError(suite.k.StoreProfile(ctx, receiverProfile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, receiverProfile))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 			},
 			msg: types.NewMsgAcceptDTagTransferRequest(
@@ -311,8 +311,8 @@ func (suite *KeeperTestSuite) TestMsgServer_AcceptDTagTransfer() {
 				)
 				receiverProfile := testutil.ProfileFromAddr(request.Receiver)
 				receiverProfile.DTag = "DTag"
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Sender)))
-				suite.Require().NoError(suite.k.StoreProfile(ctx, receiverProfile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Sender)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, receiverProfile))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 			},
 			msg: types.NewMsgAcceptDTagTransferRequest(
@@ -347,8 +347,8 @@ func (suite *KeeperTestSuite) TestMsgServer_AcceptDTagTransfer() {
 				receiverProfile.DTag = "receiverDTag"
 				senderProfile := testutil.ProfileFromAddr(request.Sender)
 				senderProfile.DTag = "senderDTag"
-				suite.Require().NoError(suite.k.StoreProfile(ctx, senderProfile))
-				suite.Require().NoError(suite.k.StoreProfile(ctx, receiverProfile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, senderProfile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, receiverProfile))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 			},
 			msg: types.NewMsgAcceptDTagTransferRequest(
@@ -429,7 +429,7 @@ func (suite *KeeperTestSuite) TestMsgServer_RefuseDTagTransfer() {
 					"cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47",
 					"cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns",
 				)
-				suite.Require().NoError(suite.k.StoreProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, testutil.ProfileFromAddr(request.Receiver)))
 				suite.Require().NoError(suite.k.SaveDTagTransferRequest(ctx, request))
 			},
 			msg: types.NewMsgRefuseDTagTransferRequest(
diff --git a/x/profiles/keeper/msgs_server_profile_test.go b/x/profiles/keeper/msgs_server_profile_test.go
index 301afd81..6fbdfc89 100644
--- a/x/profiles/keeper/msgs_server_profile_test.go
+++ b/x/profiles/keeper/msgs_server_profile_test.go
@@ -69,7 +69,7 @@ func (suite *KeeperTestSuite) TestMsgServer_SaveProfile() {
 					blockTime,
 					testutil.AccountFromAddr(address),
 				))
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile))
 			},
 			msg: types.NewMsgSaveProfile(
 				"other_dtag",
@@ -114,7 +114,7 @@ func (suite *KeeperTestSuite) TestMsgServer_SaveProfile() {
 					blockTime,
 					testutil.ProfileFromAddr("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773"),
 				))
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile))
 			},
 			msg: types.NewMsgSaveProfile(
 				"Test",
@@ -159,7 +159,7 @@ func (suite *KeeperTestSuite) TestMsgServer_SaveProfile() {
 					blockTime,
 					testutil.AccountFromAddr("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773"),
 				))
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile))
 			},
 			msg: types.NewMsgSaveProfile(
 				"Test",
@@ -197,7 +197,7 @@ func (suite *KeeperTestSuite) TestMsgServer_SaveProfile() {
 					blockTime,
 					testutil.AccountFromAddr("cosmos1cjf97gpzwmaf30pzvaargfgr884mpp5ak8f7ns"),
 				))
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile))
 			},
 			msg: types.NewMsgSaveProfile(
 				types.DoNotModify,
@@ -239,7 +239,7 @@ func (suite *KeeperTestSuite) TestMsgServer_SaveProfile() {
 					blockTime,
 					testutil.AccountFromAddr("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773"),
 				))
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile))
 			},
 			msg: types.NewMsgSaveProfile(
 				"custom_dtag",
@@ -299,7 +299,7 @@ func (suite *KeeperTestSuite) TestMsgServer_DeleteProfile() {
 			name: "existent profile is deleted successfully",
 			store: func(ctx sdk.Context) {
 				profile := testutil.ProfileFromAddr("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773")
-				suite.Require().NoError(suite.k.StoreProfile(ctx, profile))
+				suite.Require().NoError(suite.k.SaveProfile(ctx, profile))
 			},
 			msg:       types.NewMsgDeleteProfile("cosmos10nsdxxdvy9qka3zv0lzw8z9cnu6kanld8jh773"),
 			shouldErr: false,
diff --git a/x/profiles/keeper/relay_chain_links_test.go b/x/profiles/keeper/relay_chain_links_test.go
index 347ef9c9..b5847c4d 100644
--- a/x/profiles/keeper/relay_chain_links_test.go
+++ b/x/profiles/keeper/relay_chain_links_test.go
@@ -147,7 +147,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() {
 					baseAcc,
 				)
 				suite.Require().NoError(err)
-				err = suite.chainB.App.ProfileKeeper.StoreProfile(suite.chainB.GetContext(), profile)
+				err = suite.chainB.App.ProfileKeeper.SaveProfile(suite.chainB.GetContext(), profile)
 				suite.Require().NoError(err)
 			},
 			expPass: false,
@@ -190,7 +190,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() {
 					baseAcc,
 				)
 				suite.Require().NoError(err)
-				err = suite.chainB.App.ProfileKeeper.StoreProfile(suite.chainB.GetContext(), profile)
+				err = suite.chainB.App.ProfileKeeper.SaveProfile(suite.chainB.GetContext(), profile)
 				suite.Require().NoError(err)
 			},
 			expPass: false,
@@ -233,7 +233,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() {
 					baseAcc,
 				)
 				suite.Require().NoError(err)
-				err = suite.chainB.App.ProfileKeeper.StoreProfile(suite.chainB.GetContext(), profile)
+				err = suite.chainB.App.ProfileKeeper.SaveProfile(suite.chainB.GetContext(), profile)
 				suite.Require().NoError(err)
 
 				// Store link
@@ -288,7 +288,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() {
 					baseAcc,
 				)
 				suite.Require().NoError(err)
-				err = suite.chainB.App.ProfileKeeper.StoreProfile(suite.chainB.GetContext(), profile)
+				err = suite.chainB.App.ProfileKeeper.SaveProfile(suite.chainB.GetContext(), profile)
 				suite.Require().NoError(err)
 			},
 			expPass: true,