diff --git a/x/bank/internal/keeper/keeper.go b/x/bank/internal/keeper/keeper.go index 9ce1045d12..5a1b74d20c 100644 --- a/x/bank/internal/keeper/keeper.go +++ b/x/bank/internal/keeper/keeper.go @@ -216,16 +216,6 @@ func (keeper BaseSendKeeper) InputOutputCoins(ctx sdk.Context, inputs []types.In // SendCoins moves coins from one account to another func (keeper BaseSendKeeper) SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) sdk.Error { - _, err := keeper.SubtractCoins(ctx, fromAddr, amt) - if err != nil { - return err - } - - _, err = keeper.AddCoins(ctx, toAddr, amt) - if err != nil { - return err - } - ctx.EventManager().EmitEvents(sdk.Events{ sdk.NewEvent( types.EventTypeTransfer, @@ -238,6 +228,16 @@ func (keeper BaseSendKeeper) SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, ), }) + _, err := keeper.SubtractCoins(ctx, fromAddr, amt) + if err != nil { + return err + } + + _, err = keeper.AddCoins(ctx, toAddr, amt) + if err != nil { + return err + } + return nil } diff --git a/x/bank/internal/keeper/keeper_test.go b/x/bank/internal/keeper/keeper_test.go index e2f1265fbc..1ed1d48099 100644 --- a/x/bank/internal/keeper/keeper_test.go +++ b/x/bank/internal/keeper/keeper_test.go @@ -4,6 +4,8 @@ import ( "testing" "time" + "github.com/tendermint/tendermint/libs/common" + "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" @@ -148,6 +150,51 @@ func TestSendKeeper(t *testing.T) { require.Error(t, err) } +func TestMsgSendEvents(t *testing.T) { + app, ctx := createTestApp(false) + + app.BankKeeper.SetSendEnabled(ctx, true) + + addr := sdk.AccAddress([]byte("addr1")) + addr2 := sdk.AccAddress([]byte("addr2")) + acc := app.AccountKeeper.NewAccountWithAddress(ctx, addr) + + app.AccountKeeper.SetAccount(ctx, acc) + newCoins := sdk.NewCoins(sdk.NewInt64Coin("foocoin", 50)) + err := app.BankKeeper.SendCoins(ctx, addr, addr2, newCoins) + require.Error(t, err) + events := ctx.EventManager().Events() + require.Equal(t, 2, len(events)) + event1 := sdk.Event{ + Type: types.EventTypeTransfer, + Attributes: []common.KVPair{}, + } + event1.Attributes = append( + event1.Attributes, + common.KVPair{Key: []byte(types.AttributeKeyRecipient), Value: []byte(addr2.String())}) + event1.Attributes = append( + event1.Attributes, + common.KVPair{Key: []byte(sdk.AttributeKeyAmount), Value: []byte(newCoins.String())}) + event2 := sdk.Event{ + Type: sdk.EventTypeMessage, + Attributes: []common.KVPair{}, + } + event2.Attributes = append( + event2.Attributes, + common.KVPair{Key: []byte(types.AttributeKeySender), Value: []byte(addr.String())}) + require.Equal(t, event1, events[0]) + require.Equal(t, event2, events[1]) + + app.BankKeeper.SetCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 50))) + newCoins = sdk.NewCoins(sdk.NewInt64Coin("foocoin", 50)) + err = app.BankKeeper.SendCoins(ctx, addr, addr2, newCoins) + require.NoError(t, err) + events = ctx.EventManager().Events() + require.Equal(t, 4, len(events)) + require.Equal(t, event1, events[2]) + require.Equal(t, event2, events[3]) +} + func TestViewKeeper(t *testing.T) { app, ctx := createTestApp(false)