From 30d5f7daf3581e0d55fe0af7edd3dc7eefbcc934 Mon Sep 17 00:00:00 2001 From: Alexander Bezobchuk Date: Tue, 4 Feb 2020 21:33:02 -0500 Subject: [PATCH] Merge PR #5615: Create Account on SendCoins --- x/bank/internal/keeper/keeper.go | 9 +++++++++ x/bank/internal/keeper/keeper_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/x/bank/internal/keeper/keeper.go b/x/bank/internal/keeper/keeper.go index 3805071786..3f8529ad79 100644 --- a/x/bank/internal/keeper/keeper.go +++ b/x/bank/internal/keeper/keeper.go @@ -236,6 +236,15 @@ func (k BaseSendKeeper) SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAd return err } + // Create account if recipient does not exist. + // + // NOTE: This should ultimately be removed in favor a more flexible approach + // such as delegated fee messages. + acc := k.ak.GetAccount(ctx, toAddr) + if acc == nil { + k.ak.SetAccount(ctx, k.ak.NewAccountWithAddress(ctx, toAddr)) + } + return nil } diff --git a/x/bank/internal/keeper/keeper_test.go b/x/bank/internal/keeper/keeper_test.go index 8f2eab8138..fbe41870f7 100644 --- a/x/bank/internal/keeper/keeper_test.go +++ b/x/bank/internal/keeper/keeper_test.go @@ -47,6 +47,31 @@ func (suite *IntegrationTestSuite) SetupTest() { suite.ctx = ctx } +func (suite *IntegrationTestSuite) TestSendCoinsNewAccount() { + app, ctx := suite.app, suite.ctx + balances := sdk.NewCoins(newFooCoin(100), newBarCoin(50)) + + addr1 := sdk.AccAddress([]byte("addr1")) + acc1 := app.AccountKeeper.NewAccountWithAddress(ctx, addr1) + app.AccountKeeper.SetAccount(ctx, acc1) + suite.Require().NoError(app.BankKeeper.SetBalances(ctx, addr1, balances)) + + acc1Balances := app.BankKeeper.GetAllBalances(ctx, addr1) + suite.Require().Equal(balances, acc1Balances) + + addr2 := sdk.AccAddress([]byte("addr2")) + + suite.Require().Nil(app.AccountKeeper.GetAccount(ctx, addr2)) + suite.Require().Empty(app.BankKeeper.GetAllBalances(ctx, addr2)) + + sendAmt := sdk.NewCoins(newFooCoin(50), newBarCoin(25)) + suite.Require().NoError(app.BankKeeper.SendCoins(ctx, addr1, addr2, sendAmt)) + + acc2Balances := app.BankKeeper.GetAllBalances(ctx, addr2) + suite.Require().Equal(sendAmt, acc2Balances) + suite.Require().NotNil(app.AccountKeeper.GetAccount(ctx, addr2)) +} + func (suite *IntegrationTestSuite) TestInputOutputCoins() { app, ctx := suite.app, suite.ctx balances := sdk.NewCoins(newFooCoin(90), newBarCoin(30))