diff --git a/x/opchild/keeper/deposit.go b/x/opchild/keeper/deposit.go index bb79e29..7aecb73 100644 --- a/x/opchild/keeper/deposit.go +++ b/x/opchild/keeper/deposit.go @@ -58,11 +58,14 @@ func (k Keeper) handleBridgeHook(ctx sdk.Context, data []byte, hookMaxGas uint64 return } - _, err = handler(cacheCtx, msg) + res, err := handler(cacheCtx, msg) if err != nil { reason = fmt.Sprintf("Failed to execute Msg: %s", err) return } + + // emit events + cacheCtx.EventManager().EmitEvents(res.GetEvents()) } commit() diff --git a/x/opchild/keeper/deposit_test.go b/x/opchild/keeper/deposit_test.go new file mode 100644 index 0000000..8946743 --- /dev/null +++ b/x/opchild/keeper/deposit_test.go @@ -0,0 +1,65 @@ +package keeper_test + +import ( + "encoding/hex" + "testing" + + "cosmossdk.io/math" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/initia-labs/OPinit/x/opchild/keeper" + "github.com/initia-labs/OPinit/x/opchild/types" + "github.com/stretchr/testify/require" + "golang.org/x/crypto/sha3" +) + +func Test_MsgServer_Deposit_HookEvents(t *testing.T) { + ctx, input := createDefaultTestInput(t) + ms := keeper.NewMsgServerImpl(&input.OPChildKeeper) + + bz := sha3.Sum256([]byte("test_token")) + denom := "l2/" + hex.EncodeToString(bz[:]) + + require.Equal(t, math.ZeroInt(), input.BankKeeper.GetBalance(ctx, addrs[1], denom).Amount) + + // empty deposit to create account + priv, _, addr := keyPubAddr() + msg := types.NewMsgFinalizeTokenDeposit(addrsStr[0], addrsStr[1], addr.String(), sdk.NewCoin(denom, math.ZeroInt()), 1, 1, "test_token", nil) + _, err := ms.FinalizeTokenDeposit(ctx, msg) + require.NoError(t, err) + + // create hook data + acc := input.AccountKeeper.GetAccount(ctx, addr) + require.NotNil(t, acc) + privs, accNums, accSeqs := []cryptotypes.PrivKey{priv}, []uint64{acc.GetAccountNumber()}, []uint64{0} + from, _ := input.AccountKeeper.AddressCodec().BytesToString(addr) + to, _ := input.AccountKeeper.AddressCodec().BytesToString(addrs[2]) + + signedTxBz, err := input.EncodingConfig.TxConfig.TxEncoder()(generateTestTx( + t, input, + []sdk.Msg{ + types.NewMsgInitiateTokenWithdrawal(from, to, sdk.NewCoin(denom, math.NewInt(50))), + }, + privs, accNums, accSeqs, sdk.UnwrapSDKContext(ctx).ChainID(), + )) + require.NoError(t, err) + + // valid deposit + ctx = sdk.UnwrapSDKContext(ctx).WithEventManager(sdk.NewEventManager()) + msg = types.NewMsgFinalizeTokenDeposit(addrsStr[0], addrsStr[1], addr.String(), sdk.NewCoin(denom, math.NewInt(100)), 2, 1, "test_token", signedTxBz) + _, err = ms.FinalizeTokenDeposit(ctx, msg) + require.NoError(t, err) + + withdrawalEventFound := false + for _, event := range sdk.UnwrapSDKContext(ctx).EventManager().Events() { + if event.Type == types.EventTypeInitiateTokenWithdrawal { + withdrawalEventFound = true + } else if event.Type == types.EventTypeFinalizeTokenDeposit { + require.Equal(t, event.Attributes[len(event.Attributes)-1].Key, types.AttributeKeySuccess) + require.Equal(t, event.Attributes[len(event.Attributes)-1].Value, "true") + } + } + + // but no event was emitted by hooks + require.True(t, withdrawalEventFound) +} diff --git a/x/ophost/types/error.go b/x/ophost/types/error.go index 6b6fbf9..117d6d3 100644 --- a/x/ophost/types/error.go +++ b/x/ophost/types/error.go @@ -22,4 +22,5 @@ var ( ErrInvalidChallengerUpdate = errorsmod.Register(ModuleName, 15, "invalid challenger update") ErrEmptyBatchBytes = errorsmod.Register(ModuleName, 16, "empty batch bytes") ErrBridgeNotFound = errorsmod.Register(ModuleName, 17, "bridge not found") + ErrInvalidData = errorsmod.Register(ModuleName, 18, "invalid data") ) diff --git a/x/ophost/types/tx.go b/x/ophost/types/tx.go index 92d0006..6fe82a8 100644 --- a/x/ophost/types/tx.go +++ b/x/ophost/types/tx.go @@ -22,6 +22,7 @@ var ( const ( MaxMetadataLength = 1024 * 5 + MaxDataLength = 1024 * 10 ) /* MsgRecordBatch */ @@ -195,6 +196,10 @@ func (msg MsgInitiateTokenDeposit) Validate(ac address.Codec) error { return ErrInvalidBridgeId } + if len(msg.Data) > MaxDataLength { + return ErrInvalidData.Wrapf("data length exceeds %d", MaxDataLength) + } + return nil }