diff --git a/types/validation.go b/types/validation.go index c9229b0b..9f895655 100644 --- a/types/validation.go +++ b/types/validation.go @@ -19,7 +19,6 @@ func IsZeroAddress(address string) bool { } // ValidateAddress returns an error if the provided string is either not a hex formatted string address -// the it matches the zero address 0x00000000000000000000. func ValidateAddress(address string) error { if !ethcmn.IsHexAddress(address) { return sdkerrors.Wrapf( @@ -27,10 +26,5 @@ func ValidateAddress(address string) error { address, ) } - - if IsZeroAddress(address) { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "provided address cannot be the zero address") - } - return nil } diff --git a/x/evm/keeper/grpc_query_test.go b/x/evm/keeper/grpc_query_test.go index a61c5f89..1be358c4 100644 --- a/x/evm/keeper/grpc_query_test.go +++ b/x/evm/keeper/grpc_query_test.go @@ -18,6 +18,9 @@ import ( grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" ) +//Not valid Ethereum address +const invalidAddress = "0x0000" + func (suite *KeeperTestSuite) TestQueryAccount() { var ( req *types.QueryAccountRequest @@ -29,7 +32,7 @@ func (suite *KeeperTestSuite) TestQueryAccount() { malleate func() expPass bool }{ - {"zero address", + {"invalid address", func() { suite.app.BankKeeper.SetBalance(suite.ctx, suite.address.Bytes(), ethermint.NewPhotonCoinInt64(0)) expAccount = &types.QueryAccountResponse{ @@ -38,7 +41,7 @@ func (suite *KeeperTestSuite) TestQueryAccount() { Nonce: 0, } req = &types.QueryAccountRequest{ - Address: ethcmn.Address{}.String(), + Address: invalidAddress, } }, false, @@ -91,14 +94,14 @@ func (suite *KeeperTestSuite) TestQueryCosmosAccount() { malleate func() expPass bool }{ - {"zero address", + {"invalid address", func() { suite.app.BankKeeper.SetBalance(suite.ctx, suite.address.Bytes(), ethermint.NewPhotonCoinInt64(0)) expAccount = &types.QueryCosmosAccountResponse{ CosmosAddress: sdk.AccAddress(ethcmn.Address{}.Bytes()).String(), } req = &types.QueryCosmosAccountRequest{ - Address: ethcmn.Address{}.String(), + Address: invalidAddress, } }, false, @@ -169,12 +172,12 @@ func (suite *KeeperTestSuite) TestQueryBalance() { malleate func() expPass bool }{ - {"zero address", + {"invalid address", func() { suite.app.BankKeeper.SetBalance(suite.ctx, suite.address.Bytes(), ethermint.NewPhotonCoinInt64(0)) expBalance = "0" req = &types.QueryBalanceRequest{ - Address: ethcmn.Address{}.String(), + Address: invalidAddress, } }, false, @@ -223,10 +226,10 @@ func (suite *KeeperTestSuite) TestQueryStorage() { malleate func() expPass bool }{ - {"zero address", + {"invalid address", func() { req = &types.QueryStorageRequest{ - Address: ethcmn.Address{}.String(), + Address: invalidAddress, } }, false, @@ -287,10 +290,10 @@ func (suite *KeeperTestSuite) TestQueryCode() { malleate func() expPass bool }{ - {"zero address", + {"invalid address", func() { req = &types.QueryCodeRequest{ - Address: ethcmn.Address{}.String(), + Address: invalidAddress, } exp := &types.QueryCodeResponse{} expCode = exp.Code @@ -597,7 +600,7 @@ func (suite *KeeperTestSuite) TestQueryValidatorAccount() { malleate func() expPass bool }{ - {"zero address", + {"invalid address", func() { suite.app.BankKeeper.SetBalance(suite.ctx, suite.address.Bytes(), ethermint.NewPhotonCoinInt64(0)) expAccount = &types.QueryValidatorAccountResponse{ diff --git a/x/evm/types/msg_test.go b/x/evm/types/msg_test.go index 7d3a6cc5..7a719be1 100644 --- a/x/evm/types/msg_test.go +++ b/x/evm/types/msg_test.go @@ -17,6 +17,8 @@ import ( "github.com/ethereum/go-ethereum/crypto" ) +const invalidFromAddress = "0x0000" + type MsgsTestSuite struct { suite.Suite @@ -63,7 +65,7 @@ func (suite *MsgsTestSuite) TestMsgEthereumTx_Constructor() { func (suite *MsgsTestSuite) TestMsgEthereumTx_ValidateBasic() { testCases := []struct { msg string - to *ethcmn.Address + to string amount *big.Int gasPrice *big.Int from string @@ -71,21 +73,46 @@ func (suite *MsgsTestSuite) TestMsgEthereumTx_ValidateBasic() { chainID *big.Int expectPass bool }{ - {msg: "pass with recipient - Legacy Tx", to: &suite.to, amount: big.NewInt(100), gasPrice: big.NewInt(100000), expectPass: true}, - {msg: "pass with recipient - AccessList Tx", to: &suite.to, amount: big.NewInt(100), gasPrice: big.NewInt(0), accessList: ðtypes.AccessList{}, chainID: big.NewInt(1), expectPass: true}, - {msg: "pass contract - Legacy Tx", to: nil, amount: big.NewInt(100), gasPrice: big.NewInt(100000), expectPass: true}, - {msg: "invalid recipient", to: ðcmn.Address{}, amount: big.NewInt(-1), gasPrice: big.NewInt(1000), expectPass: false}, - {msg: "nil amount", to: &suite.to, amount: nil, gasPrice: big.NewInt(1000), expectPass: true}, - {msg: "negative amount", to: &suite.to, amount: big.NewInt(-1), gasPrice: big.NewInt(1000), expectPass: true}, - {msg: "nil gas price", to: &suite.to, amount: big.NewInt(100), gasPrice: nil, expectPass: false}, - {msg: "negative gas price", to: &suite.to, amount: big.NewInt(100), gasPrice: big.NewInt(-1), expectPass: true}, - {msg: "zero gas price", to: &suite.to, amount: big.NewInt(100), gasPrice: big.NewInt(0), expectPass: true}, - {msg: "invalid from address", to: &suite.to, amount: big.NewInt(100), gasPrice: big.NewInt(0), from: ethcmn.Address{}.Hex(), expectPass: false}, - {msg: "chain ID not set on AccessListTx", to: &suite.to, amount: big.NewInt(100), gasPrice: big.NewInt(0), accessList: ðtypes.AccessList{}, chainID: nil, expectPass: false}, + {msg: "pass with recipient - Legacy Tx", to: suite.to.Hex(), amount: big.NewInt(100), gasPrice: big.NewInt(100000), expectPass: true}, + {msg: "pass with recipient - AccessList Tx", to: suite.to.Hex(), amount: big.NewInt(100), gasPrice: big.NewInt(0), accessList: ðtypes.AccessList{}, chainID: big.NewInt(1), expectPass: true}, + {msg: "pass contract - Legacy Tx", to: "", amount: big.NewInt(100), gasPrice: big.NewInt(100000), expectPass: true}, + {msg: "invalid recipient", to: invalidFromAddress, amount: big.NewInt(-1), gasPrice: big.NewInt(1000), expectPass: false}, + {msg: "nil amount", to: suite.to.Hex(), amount: nil, gasPrice: big.NewInt(1000), expectPass: true}, + {msg: "negative amount", to: suite.to.Hex(), amount: big.NewInt(-1), gasPrice: big.NewInt(1000), expectPass: true}, + {msg: "nil gas price", to: suite.to.Hex(), amount: big.NewInt(100), gasPrice: nil, expectPass: false}, + {msg: "negative gas price", to: suite.to.Hex(), amount: big.NewInt(100), gasPrice: big.NewInt(-1), expectPass: true}, + {msg: "zero gas price", to: suite.to.Hex(), amount: big.NewInt(100), gasPrice: big.NewInt(0), expectPass: true}, + {msg: "invalid from address", to: suite.to.Hex(), amount: big.NewInt(100), gasPrice: big.NewInt(0), from: invalidFromAddress, expectPass: false}, + {msg: "chain ID not set on AccessListTx", to: suite.to.Hex(), amount: big.NewInt(100), gasPrice: big.NewInt(0), accessList: ðtypes.AccessList{}, chainID: nil, expectPass: false}, } for i, tc := range testCases { - msg := NewMsgEthereumTx(tc.chainID, 0, tc.to, tc.amount, 0, tc.gasPrice, nil, tc.accessList) + // recreate txData + txData := TxData{ + Nonce: 0, + GasLimit: 0, + To: tc.to, + } + + if tc.accessList != nil { + txData.Accesses = NewAccessList(tc.accessList) + if tc.chainID != nil { + txData.ChainID = tc.chainID.Bytes() + } + } + + if tc.amount != nil { + txData.Amount = tc.amount.Bytes() + } + + if tc.gasPrice != nil { + txData.GasPrice = tc.gasPrice.Bytes() + } + + msg := MsgEthereumTx{ + Data: &txData, + } + msg.From = tc.from err := msg.ValidateBasic()