Filter messages, fix new tests, break older ones

This commit is contained in:
Ethan Frey
2021-08-12 13:28:58 +02:00
parent 29d5e29dc0
commit f547bf6630
2 changed files with 23 additions and 4 deletions

View File

@@ -99,10 +99,11 @@ func (d MessageDispatcher) DispatchSubmessages(ctx sdk.Context, contractAddr sdk
}
// if it succeeds, commit state changes from submessage, and pass on events to Event Manager
var filteredEvents []sdk.Event
if err == nil {
commit()
ctx.EventManager().EmitEvents(em.Events())
ctx.EventManager().EmitEvents(events)
filteredEvents = filterEvents(em.Events(), events)
ctx.EventManager().EmitEvents(filteredEvents)
} // on failure, revert state from sandbox, and ignore events (just skip doing the above)
// we only callback if requested. Short-circuit here the cases we don't want to
@@ -124,7 +125,7 @@ func (d MessageDispatcher) DispatchSubmessages(ctx sdk.Context, contractAddr sdk
}
result = wasmvmtypes.SubcallResult{
Ok: &wasmvmtypes.SubcallResponse{
Events: sdkEventsToWasmVmEvents(events),
Events: sdkEventsToWasmVmEvents(filteredEvents),
Data: responseData,
},
}
@@ -153,6 +154,24 @@ func (d MessageDispatcher) DispatchSubmessages(ctx sdk.Context, contractAddr sdk
return rsp, nil
}
func filterEvents(events ...[]sdk.Event) []sdk.Event {
// pre-allocate space for efficiency
cap := 0
for _, evts := range events {
cap += len(evts)
}
res := make([]sdk.Event, 0, cap)
for _, evts := range events {
for _, ev := range evts {
if ev.Type != "message" {
res = append(res, ev)
}
}
}
return res
}
func sdkEventsToWasmVmEvents(events []sdk.Event) []wasmvmtypes.Event {
res := make([]wasmvmtypes.Event, len(events))
for i, ev := range events {

View File

@@ -308,7 +308,7 @@ func TestDispatchSubmessages(t *testing.T) {
if res.Events[0].Type != "execute" {
return nil, fmt.Errorf("event0: %#v", res.Events[0])
}
if res.Events[0].Type != "wasm" {
if res.Events[1].Type != "wasm" {
return nil, fmt.Errorf("event1: %#v", res.Events[1])
}