From d14d1bc553a9d1d6698418743e5afabca496a997 Mon Sep 17 00:00:00 2001 From: beer-1 <147697694+beer-1@users.noreply.github.com> Date: Wed, 16 Oct 2024 16:39:09 +0900 Subject: [PATCH] fix: allow to be failed with invalid message without error (#283) * allow to failed with invalid message * set reason --- x/move/keeper/handler.go | 12 ++++++------ x/move/keeper/handler_test.go | 25 +++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/x/move/keeper/handler.go b/x/move/keeper/handler.go index 61bcde79..3f124ed8 100644 --- a/x/move/keeper/handler.go +++ b/x/move/keeper/handler.go @@ -449,7 +449,7 @@ func (k Keeper) dispatchMessage(parentCtx sdk.Context, message vmtypes.CosmosMes } // emit failed reason event if failed and allowed to fail - event.AppendAttributes(sdk.NewAttribute(types.AttributeKeyReason, err.Error())) + event = event.AppendAttributes(sdk.NewAttribute(types.AttributeKeyReason, err.Error())) } else { // commit if success commit() @@ -480,16 +480,16 @@ func (k Keeper) dispatchMessage(parentCtx sdk.Context, message vmtypes.CosmosMes var msg proto.Message if stargateMsg, ok := message.(*vmtypes.CosmosMessage__Stargate); ok { + // callback only exists in stargate message + allowFailure = stargateMsg.Value.AllowFailure + callback = stargateMsg.Value.Callback + callbackSender = stargateMsg.Value.Sender + // validate basic & signer check is done in HandleVMStargateMsg msg, err = k.HandleVMStargateMsg(ctx, &stargateMsg.Value) if err != nil { return } - - // callback only exists in stargate message - allowFailure = stargateMsg.Value.AllowFailure - callback = stargateMsg.Value.Callback - callbackSender = stargateMsg.Value.Sender } else { // signer check had been done in moveVM msg, err = types.ConvertToSDKMessage(ctx, NewMoveBankKeeper(&k), NewNftKeeper(&k), message, k.ac, k.vc) diff --git a/x/move/keeper/handler_test.go b/x/move/keeper/handler_test.go index 3a023cfd..d507c5f4 100644 --- a/x/move/keeper/handler_test.go +++ b/x/move/keeper/handler_test.go @@ -604,13 +604,13 @@ func TestSubmsgCallback(t *testing.T) { msgData, err := input.EncodingConfig.Codec.MarshalInterfaceJSON(msg) require.NoError(t, err) - // 1. callback without signer + // 0. invalid message should not failed err = input.MoveKeeper.ExecuteEntryFunctionJSON(ctx, senderAddr, vmtypes.TestAddress, "submsg", "stargate", []vmtypes.TypeTag{}, []string{ - fmt.Sprintf("\"%s\"", hex.EncodeToString(msgData)), + "\"abcd\"", "true", "\"123\"", fmt.Sprintf("\"%s::submsg::callback_without_signer\"", vmtypes.TestAddress), @@ -625,6 +625,27 @@ func TestSubmsgCallback(t *testing.T) { sdk.NewAttribute("data", "{\"id\":\"123\",\"success\":false}"), ), event) + // 1. callback without signer + err = input.MoveKeeper.ExecuteEntryFunctionJSON(ctx, senderAddr, vmtypes.TestAddress, + "submsg", + "stargate", + []vmtypes.TypeTag{}, + []string{ + fmt.Sprintf("\"%s\"", hex.EncodeToString(msgData)), + "true", + "\"123\"", + fmt.Sprintf("\"%s::submsg::callback_without_signer\"", vmtypes.TestAddress), + }) + require.NoError(t, err) + + events = ctx.EventManager().Events() + event = events[len(events)-1] + + require.Equal(t, sdk.NewEvent("move", + sdk.NewAttribute("type_tag", "0x2::submsg::ResultEvent"), + sdk.NewAttribute("data", "{\"id\":\"123\",\"success\":false}"), + ), event) + // events should not be committed for _, e := range events { require.NotEqual(t, e.Type, "move_execute_with_json")