From 008d10da40f91eb9b0b92dfec67b013184b8d67d Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 6 Jun 2022 22:27:23 +0200 Subject: [PATCH] fix: add base account getter (backport #12154) (#12161) * fix: add base account getter (#12154) (cherry picked from commit a39be7b78fa59422bfdd3d8ce398356152914a40) # Conflicts: # CHANGELOG.md * fix conflict Co-authored-by: mmsqe Co-authored-by: Julien Robert --- CHANGELOG.md | 1 + x/auth/vesting/msg_server.go | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64a99d482eb4..a1264cada19a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * [\#10947](https://github.com/cosmos/cosmos-sdk/pull/10947) Add `AllowancesByGranter` query to the feegrant module * [\#9639](https://github.com/cosmos/cosmos-sdk/pull/9639) Check store keys length before accessing them by making sure that `key` is of length `m+1` (for `key[n:m]`) * [\#11983](https://github.com/cosmos/cosmos-sdk/pull/11983) (x/feegrant, x/authz) rename grants query commands to `grants-by-grantee`, `grants-by-granter` cmds. +* (types) [#12154](https://github.com/cosmos/cosmos-sdk/pull/12154) Add `baseAccountGetter` to avoid invalid account error when create vesting account. ## Improvements diff --git a/x/auth/vesting/msg_server.go b/x/auth/vesting/msg_server.go index 795fc2c60581..21d4dba9725b 100644 --- a/x/auth/vesting/msg_server.go +++ b/x/auth/vesting/msg_server.go @@ -19,6 +19,10 @@ type msgServer struct { types.BankKeeper } +type baseAccountGetter interface { + GetBaseAccount() *authtypes.BaseAccount +} + // NewMsgServerImpl returns an implementation of the vesting MsgServer interface, // wrapping the corresponding AccountKeeper and BankKeeper. func NewMsgServerImpl(k keeper.AccountKeeper, bk types.BankKeeper) types.MsgServer { @@ -53,12 +57,18 @@ func (s msgServer) CreateVestingAccount(goCtx context.Context, msg *types.MsgCre return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "account %s already exists", msg.ToAddress) } - baseAccount := ak.NewAccountWithAddress(ctx, to) - if _, ok := baseAccount.(*authtypes.BaseAccount); !ok { + account := ak.NewAccountWithAddress(ctx, to) + baseAccount, ok := account.(*authtypes.BaseAccount) + if !ok { + if getter, ok := account.(baseAccountGetter); ok { + baseAccount = getter.GetBaseAccount() + } + } + if baseAccount == nil { return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "invalid account type; expected: BaseAccount, got: %T", baseAccount) } - baseVestingAccount := types.NewBaseVestingAccount(baseAccount.(*authtypes.BaseAccount), msg.Amount.Sort(), msg.EndTime) + baseVestingAccount := types.NewBaseVestingAccount(baseAccount, msg.Amount.Sort(), msg.EndTime) var acc authtypes.AccountI