From 6c6b398193c44ed5a60539d230154c489aed66c2 Mon Sep 17 00:00:00 2001 From: Hoon <48665813+sh-cha@users.noreply.github.com> Date: Mon, 1 Jul 2024 12:15:10 +0900 Subject: [PATCH] add block height arg to NewMsgFinalizeTokenDeposit (#88) * add block height arg to NewMsgFinalizeTokenDeposit * fix error message --- x/opchild/client/cli/tx.go | 22 ++++++++++++++-------- x/opchild/client/cli/tx_test.go | 8 ++++++++ x/opchild/keeper/msg_server_test.go | 12 ++++++------ x/opchild/types/errors.go | 23 ++++++++++++----------- x/opchild/types/tx.go | 6 ++++++ 5 files changed, 46 insertions(+), 25 deletions(-) diff --git a/x/opchild/client/cli/tx.go b/x/opchild/client/cli/tx.go index 723e02b0..48fb96da 100644 --- a/x/opchild/client/cli/tx.go +++ b/x/opchild/client/cli/tx.go @@ -47,8 +47,8 @@ func GetTxCmd(ac address.Codec) *cobra.Command { // NewDepositCmd returns a CLI command handler for the transaction sending a deposit to an user account. func NewDepositCmd(ac address.Codec) *cobra.Command { cmd := &cobra.Command{ - Use: "deposit [sequence] [from_l1] [to_l2] [amount] [base_denom]", - Args: cobra.ExactArgs(5), + Use: "deposit [sequence] [height] [from_l1] [to_l2] [amount] [base_denom]", + Args: cobra.ExactArgs(6), Short: "send a deposit to an user account", RunE: func(cmd *cobra.Command, args []string) error { clientCtx, err := client.GetClientTxContext(cmd) @@ -66,21 +66,26 @@ func NewDepositCmd(ac address.Codec) *cobra.Command { return err } - from, err := ac.StringToBytes(args[1]) + height, err := strconv.ParseUint(args[1], 10, 64) if err != nil { return err } - to, err := ac.StringToBytes(args[2]) + + from, err := ac.StringToBytes(args[2]) + if err != nil { + return err + } + to, err := ac.StringToBytes(args[3]) if err != nil { return err } - amount, err := sdk.ParseCoinNormalized(args[3]) + amount, err := sdk.ParseCoinNormalized(args[4]) if err != nil { return err } - baseDenom := args[4] + baseDenom := args[5] hookMsg, err := cmd.Flags().GetString(FlagHookMsg) if err != nil { @@ -88,7 +93,7 @@ func NewDepositCmd(ac address.Codec) *cobra.Command { } txf, msg, err := newBuildDepositMsg( - clientCtx, ac, txf, sequence, + clientCtx, ac, txf, sequence, height, from, to, amount, baseDenom, []byte(hookMsg), ) @@ -381,6 +386,7 @@ func newBuildDepositMsg( ac address.Codec, txf tx.Factory, sequence uint64, + height uint64, from, to sdk.AccAddress, amount sdk.Coin, baseDenom string, @@ -402,7 +408,7 @@ func newBuildDepositMsg( return txf, nil, err } - msg := types.NewMsgFinalizeTokenDeposit(senderAddr, fromAddr, toAddr, amount, sequence, baseDenom, hookMsg) + msg := types.NewMsgFinalizeTokenDeposit(senderAddr, fromAddr, toAddr, amount, sequence, height, baseDenom, hookMsg) if err := msg.Validate(ac); err != nil { return txf, nil, err } diff --git a/x/opchild/client/cli/tx_test.go b/x/opchild/client/cli/tx_test.go index 15e56afb..fc827df2 100644 --- a/x/opchild/client/cli/tx_test.go +++ b/x/opchild/client/cli/tx_test.go @@ -169,6 +169,7 @@ func (s *CLITestSuite) TestNewDepositCmd() { { "invalid transaction (invalid from_l1)", []string{ + "1", "1", "_invalid_acc_", s.addrs[0].String(), @@ -185,6 +186,7 @@ func (s *CLITestSuite) TestNewDepositCmd() { "invalid transaction (invalid to_l2)", []string{ s.addrs[0].String(), + "1", "_invalid_acc_", "1", "100umin", @@ -200,6 +202,7 @@ func (s *CLITestSuite) TestNewDepositCmd() { "invalid transaction (invalid sequence)", []string{ "-1", + "1", s.addrs[0].String(), s.addrs[1].String(), "100umin", @@ -214,6 +217,7 @@ func (s *CLITestSuite) TestNewDepositCmd() { { "invalid transaction (invalid amount)", []string{ + "1", "1", s.addrs[0].String(), s.addrs[1].String(), @@ -229,6 +233,7 @@ func (s *CLITestSuite) TestNewDepositCmd() { { "invalid transaction (invalid base_denom)", []string{ + "1", "1", s.addrs[0].String(), s.addrs[1].String(), @@ -244,6 +249,7 @@ func (s *CLITestSuite) TestNewDepositCmd() { { "valid transaction without hook msg", []string{ + "1", "1", s.addrs[0].String(), s.addrs[1].String(), @@ -259,6 +265,7 @@ func (s *CLITestSuite) TestNewDepositCmd() { { "valid transaction with valid hook msg", []string{ + "1", "1", s.addrs[0].String(), s.addrs[1].String(), @@ -275,6 +282,7 @@ func (s *CLITestSuite) TestNewDepositCmd() { { "valid transaction with invalid hook msg", []string{ + "1", "1", s.addrs[0].String(), s.addrs[1].String(), diff --git a/x/opchild/keeper/msg_server_test.go b/x/opchild/keeper/msg_server_test.go index d880ee2d..d298fe3f 100644 --- a/x/opchild/keeper/msg_server_test.go +++ b/x/opchild/keeper/msg_server_test.go @@ -299,7 +299,7 @@ func Test_MsgServer_Withdraw(t *testing.T) { baseDenom := "test_token" denom := ophosttypes.L2Denom(1, baseDenom) - _, err = ms.FinalizeTokenDeposit(ctx, types.NewMsgFinalizeTokenDeposit(addrsStr[0], addrsStr[1], addrsStr[1], sdk.NewCoin(denom, math.NewInt(100)), 1, "test_token", nil)) + _, err = ms.FinalizeTokenDeposit(ctx, types.NewMsgFinalizeTokenDeposit(addrsStr[0], addrsStr[1], addrsStr[1], sdk.NewCoin(denom, math.NewInt(100)), 1, 1, "test_token", nil)) require.NoError(t, err) coins := sdk.NewCoins(sdk.NewCoin("foo", math.NewInt(1_000_000_000)), sdk.NewCoin(denom, math.NewInt(1_000_000_000))) @@ -402,7 +402,7 @@ func Test_MsgServer_Deposit_ToModuleAccount(t *testing.T) { require.Equal(t, math.ZeroInt(), beforeModuleBalance.Amount) // valid deposit - msg := types.NewMsgFinalizeTokenDeposit(addrsStr[0], addrsStr[1], opchildModuleAddress.String(), sdk.NewCoin(denom, math.NewInt(100)), 1, "test_token", nil) + msg := types.NewMsgFinalizeTokenDeposit(addrsStr[0], addrsStr[1], opchildModuleAddress.String(), sdk.NewCoin(denom, math.NewInt(100)), 1, 1, "test_token", nil) _, err := ms.FinalizeTokenDeposit(ctx, msg) require.NoError(t, err) @@ -421,7 +421,7 @@ func Test_MsgServer_Deposit_NoHook(t *testing.T) { denom := "l2/" + hex.EncodeToString(bz[:]) // unauthorized deposit - msg := types.NewMsgFinalizeTokenDeposit(addrsStr[1], addrsStr[1], addrsStr[1], sdk.NewCoin(denom, math.NewInt(100)), 1, "test_token", nil) + msg := types.NewMsgFinalizeTokenDeposit(addrsStr[1], addrsStr[1], addrsStr[1], sdk.NewCoin(denom, math.NewInt(100)), 1, 1, "test_token", nil) _, err := ms.FinalizeTokenDeposit(ctx, msg) require.Error(t, err) @@ -429,7 +429,7 @@ func Test_MsgServer_Deposit_NoHook(t *testing.T) { require.Equal(t, math.ZeroInt(), beforeBalance.Amount) // valid deposit - msg = types.NewMsgFinalizeTokenDeposit(addrsStr[0], addrsStr[1], addrsStr[1], sdk.NewCoin(denom, math.NewInt(100)), 1, "test_token", nil) + msg = types.NewMsgFinalizeTokenDeposit(addrsStr[0], addrsStr[1], addrsStr[1], sdk.NewCoin(denom, math.NewInt(100)), 1, 1, "test_token", nil) _, err = ms.FinalizeTokenDeposit(ctx, msg) require.NoError(t, err) @@ -453,7 +453,7 @@ func Test_MsgServer_Deposit_HookSuccess(t *testing.T) { input.BridgeHook.err = nil // valid deposit - msg := types.NewMsgFinalizeTokenDeposit(addrsStr[0], addrsStr[1], addrsStr[1], sdk.NewCoin(denom, math.NewInt(100)), 1, "test_token", hookMsgBytes) + msg := types.NewMsgFinalizeTokenDeposit(addrsStr[0], addrsStr[1], addrsStr[1], sdk.NewCoin(denom, math.NewInt(100)), 1, 1, "test_token", hookMsgBytes) _, err = ms.FinalizeTokenDeposit(ctx, msg) require.NoError(t, err) require.Equal(t, hookMsgBytes, input.BridgeHook.msgBytes) @@ -479,7 +479,7 @@ func Test_MsgServer_Deposit_HookFail(t *testing.T) { input.BridgeHook.err = errors.New("should be failed") // valid deposit - msg := types.NewMsgFinalizeTokenDeposit(addrsStr[0], addrsStr[1], addrsStr[1], sdk.NewCoin(denom, math.NewInt(100)), 1, "test_token", []byte("invalid_message")) + msg := types.NewMsgFinalizeTokenDeposit(addrsStr[0], addrsStr[1], addrsStr[1], sdk.NewCoin(denom, math.NewInt(100)), 1, 1, "test_token", []byte("invalid_message")) _, err := ms.FinalizeTokenDeposit(ctx, msg) require.NoError(t, err) require.Empty(t, input.BridgeHook.msgBytes) diff --git a/x/opchild/types/errors.go b/x/opchild/types/errors.go index bc2aa4e3..06c294ec 100644 --- a/x/opchild/types/errors.go +++ b/x/opchild/types/errors.go @@ -16,15 +16,16 @@ var ( ErrDepositAlreadyFinalized = errorsmod.Register(ModuleName, 9, "deposit already finalized") ErrInvalidAmount = errorsmod.Register(ModuleName, 10, "invalid amount") ErrInvalidSequence = errorsmod.Register(ModuleName, 11, "invalid sequence") - ErrZeroMaxValidators = errorsmod.Register(ModuleName, 12, "max validators must be non-zero") - ErrInvalidExecuteMsg = errorsmod.Register(ModuleName, 13, "invalid execute message") - ErrUnroutableExecuteMsg = errorsmod.Register(ModuleName, 14, "unroutable execute message") - ErrInvalidExecutorChangePlan = errorsmod.Register(ModuleName, 15, "invalid executor chane plan") - ErrAlreadyRegisteredHeight = errorsmod.Register(ModuleName, 16, "executor change plan already exists at the height") - ErrInvalidBridgeInfo = errorsmod.Register(ModuleName, 17, "invalid bridge info") - ErrInvalidHeight = errorsmod.Register(ModuleName, 18, "invalid oracle height") - ErrInvalidPrices = errorsmod.Register(ModuleName, 19, "invalid oracle prices") - ErrMaxValidatorsExceeded = errorsmod.Register(ModuleName, 20, "max validators exceeded") - ErrMaxValidatorsLowerThanCurrent = errorsmod.Register(ModuleName, 21, "max validators cannot be lower than current number of validators") - ErrNonL1Token = errorsmod.Register(ModuleName, 22, "token is not from L1") + ErrInvalidBlockHeight = errorsmod.Register(ModuleName, 12, "invalid block height") + ErrZeroMaxValidators = errorsmod.Register(ModuleName, 13, "max validators must be non-zero") + ErrInvalidExecuteMsg = errorsmod.Register(ModuleName, 14, "invalid execute message") + ErrUnroutableExecuteMsg = errorsmod.Register(ModuleName, 15, "unroutable execute message") + ErrInvalidExecutorChangePlan = errorsmod.Register(ModuleName, 16, "invalid executor chane plan") + ErrAlreadyRegisteredHeight = errorsmod.Register(ModuleName, 17, "executor change plan already exists at the height") + ErrInvalidBridgeInfo = errorsmod.Register(ModuleName, 18, "invalid bridge info") + ErrInvalidHeight = errorsmod.Register(ModuleName, 19, "invalid oracle height") + ErrInvalidPrices = errorsmod.Register(ModuleName, 20, "invalid oracle prices") + ErrMaxValidatorsExceeded = errorsmod.Register(ModuleName, 21, "max validators exceeded") + ErrMaxValidatorsLowerThanCurrent = errorsmod.Register(ModuleName, 22, "max validators cannot be lower than current number of validators") + ErrNonL1Token = errorsmod.Register(ModuleName, 23, "token is not from L1") ) diff --git a/x/opchild/types/tx.go b/x/opchild/types/tx.go index da95834a..b9b0c7d7 100644 --- a/x/opchild/types/tx.go +++ b/x/opchild/types/tx.go @@ -224,6 +224,7 @@ func NewMsgFinalizeTokenDeposit( sender, from, to string, amount sdk.Coin, sequence uint64, + height uint64, baseDenom string, data []byte, ) *MsgFinalizeTokenDeposit { @@ -233,6 +234,7 @@ func NewMsgFinalizeTokenDeposit( To: to, Amount: amount, Sequence: sequence, + Height: height, BaseDenom: baseDenom, Data: data, } @@ -264,6 +266,10 @@ func (msg MsgFinalizeTokenDeposit) Validate(ac address.Codec) error { return ErrInvalidSequence } + if msg.Height == 0 { + return ErrInvalidBlockHeight + } + return nil }