Remove the "message" events from other modules inside x/wasm

This commit is contained in:
Ethan Frey
2020-02-27 20:11:32 +01:00
parent 3b995f9638
commit 8dfde7e77f
2 changed files with 47 additions and 45 deletions

View File

@@ -41,6 +41,19 @@ func NewHandler(k Keeper) sdk.Handler {
}
}
// filterMessageEvents returns the same events with all of type == EventTypeMessage removed.
// this is so only our top-level message event comes through
func filterMessageEvents(manager *sdk.EventManager) sdk.Events {
events := manager.Events()
res := make([]sdk.Event, 0, len(events)+1)
for _, e := range events {
if e.Type != sdk.EventTypeMessage {
res = append(res, e)
}
}
return res
}
func handleStoreCode(ctx sdk.Context, k Keeper, msg *MsgStoreCode) (*sdk.Result, error) {
err := msg.ValidateBasic()
if err != nil {
@@ -52,20 +65,17 @@ func handleStoreCode(ctx sdk.Context, k Keeper, msg *MsgStoreCode) (*sdk.Result,
return nil, err
}
// de-duplicate events sent in other parts of the sdk
// https://github.com/confio/cosm-js/pull/40#discussion_r374811810
ctx.EventManager().EmitEvent(
sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, ModuleName),
sdk.NewAttribute(AttributeSigner, msg.Sender.String()),
sdk.NewAttribute(AttributeKeyCodeID, fmt.Sprintf("%d", codeID)),
),
events := filterMessageEvents(ctx.EventManager())
ourEvent := sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, ModuleName),
sdk.NewAttribute(AttributeSigner, msg.Sender.String()),
sdk.NewAttribute(AttributeKeyCodeID, fmt.Sprintf("%d", codeID)),
)
return &sdk.Result{
Data: []byte(fmt.Sprintf("%d", codeID)),
Events: ctx.EventManager().Events(),
Events: append(events, ourEvent),
}, nil
}
@@ -75,19 +85,18 @@ func handleInstantiate(ctx sdk.Context, k Keeper, msg *MsgInstantiateContract) (
return nil, err
}
ctx.EventManager().EmitEvent(
sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, ModuleName),
sdk.NewAttribute(AttributeSigner, msg.Sender.String()),
sdk.NewAttribute(AttributeKeyCodeID, fmt.Sprintf("%d", msg.Code)),
sdk.NewAttribute(AttributeKeyContract, contractAddr.String()),
),
events := filterMessageEvents(ctx.EventManager())
ourEvent := sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, ModuleName),
sdk.NewAttribute(AttributeSigner, msg.Sender.String()),
sdk.NewAttribute(AttributeKeyCodeID, fmt.Sprintf("%d", msg.Code)),
sdk.NewAttribute(AttributeKeyContract, contractAddr.String()),
)
return &sdk.Result{
Data: contractAddr,
Events: ctx.EventManager().Events(),
Events: append(events, ourEvent),
}, nil
}
@@ -97,15 +106,14 @@ func handleExecute(ctx sdk.Context, k Keeper, msg *MsgExecuteContract) (*sdk.Res
return nil, err
}
ctx.EventManager().EmitEvent(
sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, ModuleName),
sdk.NewAttribute(AttributeSigner, msg.Sender.String()),
sdk.NewAttribute(AttributeKeyContract, msg.Contract.String()),
),
events := filterMessageEvents(ctx.EventManager())
ourEvent := sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, ModuleName),
sdk.NewAttribute(AttributeSigner, msg.Sender.String()),
sdk.NewAttribute(AttributeKeyContract, msg.Contract.String()),
)
res.Events = ctx.EventManager().Events()
res.Events = append(events, ourEvent)
return &res, nil
}

View File

@@ -226,13 +226,10 @@ func TestHandleExecute(t *testing.T) {
contractAddr := sdk.AccAddress(res.Data)
require.Equal(t, "cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5", contractAddr.String())
// this should be standard x/wasm init event, plus a bank send event (2), with no custom contract events
require.Equal(t, 3, len(res.Events), prettyEvents(res.Events))
require.Equal(t, 2, len(res.Events), prettyEvents(res.Events))
assert.Equal(t, "transfer", res.Events[0].Type)
// second part of bank transfer event... FIXME
assert.Equal(t, "message", res.Events[1].Type)
assertAttribute(t, "sender", creator.String(), res.Events[1].Attributes[0])
assert.Equal(t, "message", res.Events[2].Type)
assertAttribute(t, "module", "wasm", res.Events[2].Attributes[0])
assertAttribute(t, "module", "wasm", res.Events[1].Attributes[0])
// ensure bob doesn't exist
bobAcct := data.acctKeeper.GetAccount(data.ctx, bob)
@@ -258,26 +255,23 @@ func TestHandleExecute(t *testing.T) {
res, err = h(data.ctx, execCmd)
require.NoError(t, err)
// this should be standard x/wasm init event, plus 2 bank send event, plus a special event from the contract
require.Equal(t, 5, len(res.Events), prettyEvents(res.Events))
require.Equal(t, 4, len(res.Events), prettyEvents(res.Events))
assert.Equal(t, "transfer", res.Events[0].Type)
assertAttribute(t, "recipient", contractAddr.String(), res.Events[0].Attributes[0])
assertAttribute(t, "sender", fred.String(), res.Events[0].Attributes[1])
assertAttribute(t, "amount", "5000denom", res.Events[0].Attributes[2])
// second part of bank transfer event... FIXME
assert.Equal(t, "message", res.Events[1].Type)
assertAttribute(t, "sender", fred.String(), res.Events[1].Attributes[0])
// custom contract event
assert.Equal(t, "wasm", res.Events[2].Type)
assertAttribute(t, "contract_address", contractAddr.String(), res.Events[2].Attributes[0])
assertAttribute(t, "action", "release", res.Events[2].Attributes[1])
assert.Equal(t, "wasm", res.Events[1].Type)
assertAttribute(t, "contract_address", contractAddr.String(), res.Events[1].Attributes[0])
assertAttribute(t, "action", "release", res.Events[1].Attributes[1])
// second transfer (this without conflicting message)
assert.Equal(t, "transfer", res.Events[3].Type)
assertAttribute(t, "recipient", bob.String(), res.Events[3].Attributes[0])
assertAttribute(t, "sender", contractAddr.String(), res.Events[3].Attributes[1])
assertAttribute(t, "amount", "105000denom", res.Events[3].Attributes[2])
assert.Equal(t, "transfer", res.Events[2].Type)
assertAttribute(t, "recipient", bob.String(), res.Events[2].Attributes[0])
assertAttribute(t, "sender", contractAddr.String(), res.Events[2].Attributes[1])
assertAttribute(t, "amount", "105000denom", res.Events[2].Attributes[2])
// finally, standard x/wasm tag
assert.Equal(t, "message", res.Events[4].Type)
assertAttribute(t, "module", "wasm", res.Events[4].Attributes[0])
assert.Equal(t, "message", res.Events[3].Type)
assertAttribute(t, "module", "wasm", res.Events[3].Attributes[0])
// ensure bob now exists and got both payments released
bobAcct = data.acctKeeper.GetAccount(data.ctx, bob)