Merge PR #4948: Emit send coin events before action

This commit is contained in:
Timothy Chen 2019-08-27 06:17:31 -07:00 committed by Alexander Bezobchuk
parent eeb847c845
commit e7b378d81d
2 changed files with 57 additions and 10 deletions

View File

@ -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
}

View File

@ -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)