2018-11-28 22:19:22 +00:00
package types
import (
"math/big"
"testing"
2021-05-12 13:08:31 +00:00
"github.com/stretchr/testify/suite"
2020-04-23 15:49:25 +00:00
2021-05-12 13:08:31 +00:00
"github.com/cosmos/cosmos-sdk/crypto/keyring"
2020-04-23 15:49:25 +00:00
sdk "github.com/cosmos/cosmos-sdk/types"
2021-06-22 10:49:18 +00:00
"github.com/tharsis/ethermint/tests"
2021-04-17 10:00:07 +00:00
2021-07-05 16:39:08 +00:00
"github.com/ethereum/go-ethereum/common"
2021-06-11 13:38:51 +00:00
"github.com/ethereum/go-ethereum/core/types"
2018-11-28 22:19:22 +00:00
)
2021-06-29 15:08:07 +00:00
const invalidFromAddress = "0x0000"
2021-05-12 13:08:31 +00:00
type MsgsTestSuite struct {
suite . Suite
2020-04-23 15:49:25 +00:00
2021-05-12 13:08:31 +00:00
signer keyring . Signer
2021-09-03 18:06:36 +00:00
from common . Address
to common . Address
2021-05-12 13:08:31 +00:00
chainID * big . Int
}
func TestMsgsTestSuite ( t * testing . T ) {
suite . Run ( t , new ( MsgsTestSuite ) )
}
func ( suite * MsgsTestSuite ) SetupTest ( ) {
2021-09-07 17:29:24 +00:00
from , privFrom := tests . NewAddrKey ( )
2021-05-12 13:08:31 +00:00
suite . signer = tests . NewSigner ( privFrom )
2021-09-07 17:29:24 +00:00
suite . from = from
suite . to = tests . GenerateAddress ( )
2021-05-12 13:08:31 +00:00
suite . chainID = big . NewInt ( 1 )
}
func ( suite * MsgsTestSuite ) TestMsgEthereumTx_Constructor ( ) {
2021-10-05 15:38:20 +00:00
msg := NewTx ( nil , 0 , & suite . to , nil , 100000 , nil , nil , nil , [ ] byte ( "test" ) , nil )
2021-05-12 13:08:31 +00:00
2021-07-05 16:39:08 +00:00
// suite.Require().Equal(msg.Data.To, suite.to.Hex())
2021-05-12 13:08:31 +00:00
suite . Require ( ) . Equal ( msg . Route ( ) , RouterKey )
suite . Require ( ) . Equal ( msg . Type ( ) , TypeMsgEthereumTx )
2021-07-05 16:39:08 +00:00
// suite.Require().NotNil(msg.To())
2021-05-12 13:08:31 +00:00
suite . Require ( ) . Equal ( msg . GetMsgs ( ) , [ ] sdk . Msg { msg } )
suite . Require ( ) . Panics ( func ( ) { msg . GetSigners ( ) } )
suite . Require ( ) . Panics ( func ( ) { msg . GetSignBytes ( ) } )
2020-04-23 15:49:25 +00:00
2021-10-05 15:38:20 +00:00
msg = NewTxContract ( nil , 0 , nil , 100000 , nil , nil , nil , [ ] byte ( "test" ) , nil )
2021-05-12 13:08:31 +00:00
suite . Require ( ) . NotNil ( msg )
2021-07-05 16:39:08 +00:00
// suite.Require().Empty(msg.Data.To)
// suite.Require().Nil(msg.To())
2018-11-28 22:19:22 +00:00
}
2021-05-12 13:08:31 +00:00
func ( suite * MsgsTestSuite ) TestMsgEthereumTx_ValidateBasic ( ) {
2021-07-05 16:39:08 +00:00
hundredInt := sdk . NewInt ( 100 )
zeroInt := sdk . ZeroInt ( )
minusOneInt := sdk . NewInt ( - 1 )
2018-11-28 22:19:22 +00:00
testCases := [ ] struct {
2020-04-23 15:49:25 +00:00
msg string
2021-06-29 15:08:07 +00:00
to string
2021-07-05 16:39:08 +00:00
amount * sdk . Int
gasPrice * sdk . Int
2021-06-11 13:38:51 +00:00
from string
2021-09-03 18:06:36 +00:00
accessList * types . AccessList
2021-07-05 16:39:08 +00:00
chainID * sdk . Int
2018-11-28 22:19:22 +00:00
expectPass bool
} {
2021-07-05 16:39:08 +00:00
{ msg : "pass with recipient - Legacy Tx" , to : suite . to . Hex ( ) , amount : & hundredInt , gasPrice : & hundredInt , expectPass : true } ,
2021-09-03 18:06:36 +00:00
{ msg : "pass with recipient - AccessList Tx" , to : suite . to . Hex ( ) , amount : & hundredInt , gasPrice : & zeroInt , accessList : & types . AccessList { } , chainID : & hundredInt , expectPass : true } ,
2021-07-05 16:39:08 +00:00
{ msg : "pass contract - Legacy Tx" , to : "" , amount : & hundredInt , gasPrice : & hundredInt , expectPass : true } ,
// {msg: "invalid recipient", to: invalidFromAddress, amount: &minusOneInt, gasPrice: &hundredInt, expectPass: false},
{ msg : "nil amount - Legacy Tx" , to : suite . to . Hex ( ) , amount : nil , gasPrice : & hundredInt , expectPass : true } ,
{ msg : "negative amount - Legacy Tx" , to : suite . to . Hex ( ) , amount : & minusOneInt , gasPrice : & hundredInt , expectPass : false } ,
{ msg : "nil gas price - Legacy Tx" , to : suite . to . Hex ( ) , amount : & hundredInt , gasPrice : nil , expectPass : false } ,
{ msg : "negative gas price - Legacy Tx" , to : suite . to . Hex ( ) , amount : & hundredInt , gasPrice : & minusOneInt , expectPass : false } ,
{ msg : "zero gas price - Legacy Tx" , to : suite . to . Hex ( ) , amount : & hundredInt , gasPrice : & zeroInt , expectPass : true } ,
{ msg : "invalid from address - Legacy Tx" , to : suite . to . Hex ( ) , amount : & hundredInt , gasPrice : & zeroInt , from : invalidFromAddress , expectPass : false } ,
2021-09-03 18:06:36 +00:00
{ msg : "nil amount - AccessListTx" , to : suite . to . Hex ( ) , amount : nil , gasPrice : & hundredInt , accessList : & types . AccessList { } , chainID : & hundredInt , expectPass : true } ,
{ msg : "negative amount - AccessListTx" , to : suite . to . Hex ( ) , amount : & minusOneInt , gasPrice : & hundredInt , accessList : & types . AccessList { } , chainID : nil , expectPass : false } ,
{ msg : "nil gas price - AccessListTx" , to : suite . to . Hex ( ) , amount : & hundredInt , gasPrice : nil , accessList : & types . AccessList { } , chainID : & hundredInt , expectPass : false } ,
{ msg : "negative gas price - AccessListTx" , to : suite . to . Hex ( ) , amount : & hundredInt , gasPrice : & minusOneInt , accessList : & types . AccessList { } , chainID : nil , expectPass : false } ,
{ msg : "zero gas price - AccessListTx" , to : suite . to . Hex ( ) , amount : & hundredInt , gasPrice : & zeroInt , accessList : & types . AccessList { } , chainID : & hundredInt , expectPass : true } ,
{ msg : "invalid from address - AccessListTx" , to : suite . to . Hex ( ) , amount : & hundredInt , gasPrice : & zeroInt , from : invalidFromAddress , accessList : & types . AccessList { } , chainID : & hundredInt , expectPass : false } ,
{ msg : "chain ID not set on AccessListTx" , to : suite . to . Hex ( ) , amount : & hundredInt , gasPrice : & zeroInt , accessList : & types . AccessList { } , chainID : nil , expectPass : false } ,
2018-11-28 22:19:22 +00:00
}
for i , tc := range testCases {
2021-07-05 16:39:08 +00:00
to := common . HexToAddress ( tc . from )
2021-06-29 15:08:07 +00:00
2021-07-05 16:39:08 +00:00
var chainID , amount , gasPrice * big . Int
if tc . chainID != nil {
chainID = tc . chainID . BigInt ( )
2021-06-29 15:08:07 +00:00
}
2021-07-05 16:39:08 +00:00
if tc . amount != nil {
amount = tc . amount . BigInt ( )
2021-06-29 15:08:07 +00:00
}
2021-07-05 16:39:08 +00:00
if tc . gasPrice != nil {
gasPrice = tc . gasPrice . BigInt ( )
2021-06-29 15:08:07 +00:00
}
2021-10-05 15:38:20 +00:00
tx := NewTx ( chainID , 1 , & to , amount , 1000 , gasPrice , nil , nil , nil , tc . accessList )
2021-07-05 16:39:08 +00:00
tx . From = tc . from
2021-06-29 15:08:07 +00:00
2021-07-05 16:39:08 +00:00
err := tx . ValidateBasic ( )
2018-11-28 22:19:22 +00:00
if tc . expectPass {
2021-07-05 16:39:08 +00:00
suite . Require ( ) . NoError ( err , "valid test %d failed: %s, %v" , i , tc . msg )
2018-11-28 22:19:22 +00:00
} else {
2021-07-05 16:39:08 +00:00
suite . Require ( ) . Error ( err , "invalid test %d passed: %s, %v" , i , tc . msg )
2018-11-28 22:19:22 +00:00
}
}
}
2021-05-12 13:08:31 +00:00
func ( suite * MsgsTestSuite ) TestMsgEthereumTx_Sign ( ) {
testCases := [ ] struct {
msg string
2021-06-11 13:38:51 +00:00
tx * MsgEthereumTx
2021-09-03 18:06:36 +00:00
ethSigner types . Signer
2021-06-11 13:38:51 +00:00
malleate func ( tx * MsgEthereumTx )
2021-05-12 13:08:31 +00:00
expectPass bool
} {
{
2021-06-01 17:14:33 +00:00
"pass - EIP2930 signer" ,
2021-10-05 15:38:20 +00:00
NewTx ( suite . chainID , 0 , & suite . to , nil , 100000 , nil , nil , nil , [ ] byte ( "test" ) , & types . AccessList { } ) ,
2021-09-03 18:06:36 +00:00
types . NewEIP2930Signer ( suite . chainID ) ,
2021-06-11 13:38:51 +00:00
func ( tx * MsgEthereumTx ) { tx . From = suite . from . Hex ( ) } ,
2021-05-12 13:08:31 +00:00
true ,
} ,
2021-06-01 17:14:33 +00:00
{
2021-06-11 13:38:51 +00:00
"pass - EIP155 signer" ,
2021-10-05 15:38:20 +00:00
NewTx ( suite . chainID , 0 , & suite . to , nil , 100000 , nil , nil , nil , [ ] byte ( "test" ) , nil ) ,
2021-09-03 18:06:36 +00:00
types . NewEIP155Signer ( suite . chainID ) ,
2021-06-11 13:38:51 +00:00
func ( tx * MsgEthereumTx ) { tx . From = suite . from . Hex ( ) } ,
true ,
2021-06-01 17:14:33 +00:00
} ,
{
2021-06-11 13:38:51 +00:00
"pass - Homestead signer" ,
2021-10-05 15:38:20 +00:00
NewTx ( suite . chainID , 0 , & suite . to , nil , 100000 , nil , nil , nil , [ ] byte ( "test" ) , nil ) ,
2021-09-03 18:06:36 +00:00
types . HomesteadSigner { } ,
2021-06-11 13:38:51 +00:00
func ( tx * MsgEthereumTx ) { tx . From = suite . from . Hex ( ) } ,
true ,
2021-06-01 17:14:33 +00:00
} ,
{
2021-06-11 13:38:51 +00:00
"pass - Frontier signer" ,
2021-10-05 15:38:20 +00:00
NewTx ( suite . chainID , 0 , & suite . to , nil , 100000 , nil , nil , nil , [ ] byte ( "test" ) , nil ) ,
2021-09-03 18:06:36 +00:00
types . FrontierSigner { } ,
2021-06-11 13:38:51 +00:00
func ( tx * MsgEthereumTx ) { tx . From = suite . from . Hex ( ) } ,
true ,
2021-06-01 17:14:33 +00:00
} ,
2021-05-12 13:08:31 +00:00
{
"no from address " ,
2021-10-05 15:38:20 +00:00
NewTx ( suite . chainID , 0 , & suite . to , nil , 100000 , nil , nil , nil , [ ] byte ( "test" ) , & types . AccessList { } ) ,
2021-09-03 18:06:36 +00:00
types . NewEIP2930Signer ( suite . chainID ) ,
2021-06-11 13:38:51 +00:00
func ( tx * MsgEthereumTx ) { tx . From = "" } ,
2021-05-12 13:08:31 +00:00
false ,
} ,
{
"from address ≠ signer address" ,
2021-10-05 15:38:20 +00:00
NewTx ( suite . chainID , 0 , & suite . to , nil , 100000 , nil , nil , nil , [ ] byte ( "test" ) , & types . AccessList { } ) ,
2021-09-03 18:06:36 +00:00
types . NewEIP2930Signer ( suite . chainID ) ,
2021-06-11 13:38:51 +00:00
func ( tx * MsgEthereumTx ) { tx . From = suite . to . Hex ( ) } ,
2021-05-12 13:08:31 +00:00
false ,
} ,
}
for i , tc := range testCases {
2021-06-11 13:38:51 +00:00
tc . malleate ( tc . tx )
2021-06-01 17:14:33 +00:00
2021-06-11 13:38:51 +00:00
err := tc . tx . Sign ( tc . ethSigner , suite . signer )
2021-05-12 13:08:31 +00:00
if tc . expectPass {
suite . Require ( ) . NoError ( err , "valid test %d failed: %s" , i , tc . msg )
2021-07-02 09:34:15 +00:00
sender , err := tc . tx . GetSender ( suite . chainID )
2021-05-12 13:08:31 +00:00
suite . Require ( ) . NoError ( err , tc . msg )
2021-06-11 13:38:51 +00:00
suite . Require ( ) . Equal ( tc . tx . From , sender . Hex ( ) , tc . msg )
2021-05-12 13:08:31 +00:00
} else {
suite . Require ( ) . Error ( err , "invalid test %d passed: %s" , i , tc . msg )
}
}
}