diff --git a/CHANGELOG.md b/CHANGELOG.md index 512c4e14a6..f5e5f675f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (eth) [#1346](https://github.com/evmos/ethermint/pull/1346) Added support for `sdk.Dec` and `ed25519` type on eip712. * (eth) [#1430](https://github.com/evmos/ethermint/pull/1430) Added support for array of type `Any` on eip712.  * (ante) [1460](https://github.com/evmos/ethermint/pull/1460) Add KV Gas config on ethereum Txs. +* (eth) [#1459](https://github.com/evmos/ethermint/pull/1459) Added support for messages with optional types omitted on eip712. * (geth) [#1413](https://github.com/evmos/ethermint/pull/1413) Update geth version to v1.10.25. ### API Breaking diff --git a/app/ante/ante_test.go b/app/ante/ante_test.go index 34be0e0c9b..6baf11a3b9 100644 --- a/app/ante/ante_test.go +++ b/app/ante/ante_test.go @@ -349,6 +349,17 @@ func (suite AnteTestSuite) TestAnteHandler() { return txBuilder.GetTx() }, false, false, true, }, + { + "success- DeliverTx EIP712 create validator (with blank fields)", + func() sdk.Tx { + from := acc.GetAddress() + coinAmount := sdk.NewCoin(evmtypes.DefaultEVMDenom, sdk.NewInt(20)) + amount := sdk.NewCoins(coinAmount) + gas := uint64(200000) + txBuilder := suite.CreateTestEIP712MsgCreateValidator2(from, privKey, "ethermint_9000-1", gas, amount) + return txBuilder.GetTx() + }, false, false, true, + }, { "success- DeliverTx EIP712 MsgSubmitProposal", func() sdk.Tx { @@ -435,6 +446,17 @@ func (suite AnteTestSuite) TestAnteHandler() { return txBuilder.GetTx() }, false, false, true, }, + { + "success- DeliverTx EIP712 MsgVoteV1", + func() sdk.Tx { + from := acc.GetAddress() + coinAmount := sdk.NewCoin(evmtypes.DefaultEVMDenom, sdk.NewInt(20)) + amount := sdk.NewCoins(coinAmount) + gas := uint64(200000) + txBuilder := suite.CreateTestEIP712MsgVoteV1(from, privKey, "ethermint_9000-1", gas, amount) + return txBuilder.GetTx() + }, false, false, true, + }, { "fails - DeliverTx EIP712 signed Cosmos Tx with wrong Chain ID", func() sdk.Tx { diff --git a/app/ante/utils_test.go b/app/ante/utils_test.go index ff9c49bdac..5da28a3af3 100644 --- a/app/ante/utils_test.go +++ b/app/ante/utils_test.go @@ -291,7 +291,6 @@ func (suite *AnteTestSuite) CreateTestEIP712MsgCreateValidator(from sdk.AccAddre valAddr, privEd.PubKey(), sdk.NewCoin(evmtypes.DefaultEVMDenom, sdk.NewInt(20)), - // TODO: can this values be empty strings? types3.NewDescription("moniker", "indentity", "website", "security_contract", "details"), types3.NewCommissionRates(sdk.OneDec(), sdk.OneDec(), sdk.OneDec()), sdk.OneInt(), @@ -300,6 +299,23 @@ func (suite *AnteTestSuite) CreateTestEIP712MsgCreateValidator(from sdk.AccAddre return suite.CreateTestEIP712CosmosTxBuilder(from, priv, chainId, gas, gasAmount, msgCreate) } +func (suite *AnteTestSuite) CreateTestEIP712MsgCreateValidator2(from sdk.AccAddress, priv cryptotypes.PrivKey, chainId string, gas uint64, gasAmount sdk.Coins) client.TxBuilder { + // Build MsgCreateValidator + valAddr := sdk.ValAddress(from.Bytes()) + privEd := ed25519.GenPrivKey() + msgCreate, err := types3.NewMsgCreateValidator( + valAddr, + privEd.PubKey(), + sdk.NewCoin(evmtypes.DefaultEVMDenom, sdk.NewInt(20)), + // Ensure optional fields can be left blank + types3.NewDescription("moniker", "indentity", "", "", ""), + types3.NewCommissionRates(sdk.OneDec(), sdk.OneDec(), sdk.OneDec()), + sdk.OneInt(), + ) + suite.Require().NoError(err) + return suite.CreateTestEIP712CosmosTxBuilder(from, priv, chainId, gas, gasAmount, msgCreate) +} + func (suite *AnteTestSuite) CreateTestEIP712SubmitProposal(from sdk.AccAddress, priv cryptotypes.PrivKey, chainId string, gas uint64, gasAmount sdk.Coins, deposit sdk.Coins) client.TxBuilder { proposal, ok := types5.ContentFromProposalType("My proposal", "My description", types5.ProposalTypeText) suite.Require().True(ok) @@ -346,6 +362,11 @@ func (suite *AnteTestSuite) CreateTestEIP712MsgSubmitEvidence(from sdk.AccAddres return suite.CreateTestEIP712CosmosTxBuilder(from, priv, chainId, gas, gasAmount, msgEvidence) } +func (suite *AnteTestSuite) CreateTestEIP712MsgVoteV1(from sdk.AccAddress, priv cryptotypes.PrivKey, chainId string, gas uint64, gasAmount sdk.Coins) client.TxBuilder { + msgVote := govtypes.NewMsgVote(from, 1, govtypes.VoteOption_VOTE_OPTION_YES, "") + return suite.CreateTestEIP712CosmosTxBuilder(from, priv, chainId, gas, gasAmount, msgVote) +} + func (suite *AnteTestSuite) CreateTestEIP712SubmitProposalV1(from sdk.AccAddress, priv cryptotypes.PrivKey, chainId string, gas uint64, gasAmount sdk.Coins) client.TxBuilder { // Build V1 proposal messages. Must all be same-type, since EIP-712 // does not support arrays of variable type. diff --git a/ethereum/eip712/eip712.go b/ethereum/eip712/eip712.go index 2a5145c636..001225a414 100644 --- a/ethereum/eip712/eip712.go +++ b/ethereum/eip712/eip712.go @@ -207,8 +207,8 @@ func traverseFields( } } - // If its a nil pointer, do not include in types - if fieldType.Kind() == reflect.Ptr && field.IsNil() { + // If field is an empty value, do not include in types, since it will not be present in the object + if field.IsZero() { continue }