Sync from fork #74
@ -57,6 +57,25 @@ func (suite *TxDataTestSuite) TestAccessListTxGetGasFeeCap() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (suite *TxDataTestSuite) TestEmptyAccessList() {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
tx AccessListTx
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"empty access list tx",
|
||||||
|
AccessListTx{
|
||||||
|
Accesses: nil,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tc := range testCases {
|
||||||
|
actual := tc.tx.GetAccessList()
|
||||||
|
|
||||||
|
suite.Require().Nil(actual, tc.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (suite *TxDataTestSuite) TestAccessListTxCost() {
|
func (suite *TxDataTestSuite) TestAccessListTxCost() {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
@ -81,6 +100,28 @@ func (suite *TxDataTestSuite) TestAccessListTxCost() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (suite *TxDataTestSuite) TestAccessListEffectiveGasPrice() {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
tx AccessListTx
|
||||||
|
baseFee *big.Int
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"non-empty access list tx",
|
||||||
|
AccessListTx{
|
||||||
|
GasPrice: &suite.sdkInt,
|
||||||
|
},
|
||||||
|
(&suite.sdkInt).BigInt(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
actual := tc.tx.EffectiveGasPrice(tc.baseFee)
|
||||||
|
|
||||||
|
suite.Require().Equal(tc.tx.GetGasPrice(), actual, tc.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (suite *TxDataTestSuite) TestAccessListTxEffectiveCost() {
|
func (suite *TxDataTestSuite) TestAccessListTxEffectiveCost() {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
|
@ -235,6 +235,69 @@ func TestChainConfigValidate(t *testing.T) {
|
|||||||
},
|
},
|
||||||
true,
|
true,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"invalid ArrowGlacierBlock",
|
||||||
|
ChainConfig{
|
||||||
|
HomesteadBlock: newIntPtr(0),
|
||||||
|
DAOForkBlock: newIntPtr(0),
|
||||||
|
EIP150Block: newIntPtr(0),
|
||||||
|
EIP150Hash: defaultEIP150Hash,
|
||||||
|
EIP155Block: newIntPtr(0),
|
||||||
|
EIP158Block: newIntPtr(0),
|
||||||
|
ByzantiumBlock: newIntPtr(0),
|
||||||
|
ConstantinopleBlock: newIntPtr(0),
|
||||||
|
PetersburgBlock: newIntPtr(0),
|
||||||
|
IstanbulBlock: newIntPtr(0),
|
||||||
|
MuirGlacierBlock: newIntPtr(0),
|
||||||
|
BerlinBlock: newIntPtr(0),
|
||||||
|
LondonBlock: newIntPtr(0),
|
||||||
|
ArrowGlacierBlock: newIntPtr(-1),
|
||||||
|
},
|
||||||
|
true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"invalid GrayGlacierBlock",
|
||||||
|
ChainConfig{
|
||||||
|
HomesteadBlock: newIntPtr(0),
|
||||||
|
DAOForkBlock: newIntPtr(0),
|
||||||
|
EIP150Block: newIntPtr(0),
|
||||||
|
EIP150Hash: defaultEIP150Hash,
|
||||||
|
EIP155Block: newIntPtr(0),
|
||||||
|
EIP158Block: newIntPtr(0),
|
||||||
|
ByzantiumBlock: newIntPtr(0),
|
||||||
|
ConstantinopleBlock: newIntPtr(0),
|
||||||
|
PetersburgBlock: newIntPtr(0),
|
||||||
|
IstanbulBlock: newIntPtr(0),
|
||||||
|
MuirGlacierBlock: newIntPtr(0),
|
||||||
|
BerlinBlock: newIntPtr(0),
|
||||||
|
LondonBlock: newIntPtr(0),
|
||||||
|
ArrowGlacierBlock: newIntPtr(0),
|
||||||
|
GrayGlacierBlock: newIntPtr(-1),
|
||||||
|
},
|
||||||
|
true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"invalid MergeNetsplitBlock",
|
||||||
|
ChainConfig{
|
||||||
|
HomesteadBlock: newIntPtr(0),
|
||||||
|
DAOForkBlock: newIntPtr(0),
|
||||||
|
EIP150Block: newIntPtr(0),
|
||||||
|
EIP150Hash: defaultEIP150Hash,
|
||||||
|
EIP155Block: newIntPtr(0),
|
||||||
|
EIP158Block: newIntPtr(0),
|
||||||
|
ByzantiumBlock: newIntPtr(0),
|
||||||
|
ConstantinopleBlock: newIntPtr(0),
|
||||||
|
PetersburgBlock: newIntPtr(0),
|
||||||
|
IstanbulBlock: newIntPtr(0),
|
||||||
|
MuirGlacierBlock: newIntPtr(0),
|
||||||
|
BerlinBlock: newIntPtr(0),
|
||||||
|
LondonBlock: newIntPtr(0),
|
||||||
|
ArrowGlacierBlock: newIntPtr(0),
|
||||||
|
GrayGlacierBlock: newIntPtr(0),
|
||||||
|
MergeNetsplitBlock: newIntPtr(-1),
|
||||||
|
},
|
||||||
|
true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"invalid fork order - skip HomesteadBlock",
|
"invalid fork order - skip HomesteadBlock",
|
||||||
ChainConfig{
|
ChainConfig{
|
||||||
|
@ -8,6 +8,7 @@ import (
|
|||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
ethtypes "github.com/ethereum/go-ethereum/core/types"
|
ethtypes "github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/evmos/ethermint/tests"
|
"github.com/evmos/ethermint/tests"
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
@ -18,25 +19,33 @@ type TxDataTestSuite struct {
|
|||||||
|
|
||||||
sdkInt sdkmath.Int
|
sdkInt sdkmath.Int
|
||||||
uint64 uint64
|
uint64 uint64
|
||||||
|
hexUint64 hexutil.Uint64
|
||||||
bigInt *big.Int
|
bigInt *big.Int
|
||||||
|
hexBigInt hexutil.Big
|
||||||
overflowBigInt *big.Int
|
overflowBigInt *big.Int
|
||||||
sdkZeroInt sdkmath.Int
|
sdkZeroInt sdkmath.Int
|
||||||
sdkMinusOneInt sdkmath.Int
|
sdkMinusOneInt sdkmath.Int
|
||||||
invalidAddr string
|
invalidAddr string
|
||||||
addr common.Address
|
addr common.Address
|
||||||
hexAddr string
|
hexAddr string
|
||||||
|
hexDataBytes hexutil.Bytes
|
||||||
|
hexInputBytes hexutil.Bytes
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *TxDataTestSuite) SetupTest() {
|
func (suite *TxDataTestSuite) SetupTest() {
|
||||||
suite.sdkInt = sdkmath.NewInt(100)
|
suite.sdkInt = sdkmath.NewInt(100)
|
||||||
suite.uint64 = suite.sdkInt.Uint64()
|
suite.uint64 = suite.sdkInt.Uint64()
|
||||||
|
suite.hexUint64 = hexutil.Uint64(100)
|
||||||
suite.bigInt = big.NewInt(1)
|
suite.bigInt = big.NewInt(1)
|
||||||
|
suite.hexBigInt = hexutil.Big(*big.NewInt(1))
|
||||||
suite.overflowBigInt = big.NewInt(0).Exp(big.NewInt(10), big.NewInt(256), nil)
|
suite.overflowBigInt = big.NewInt(0).Exp(big.NewInt(10), big.NewInt(256), nil)
|
||||||
suite.sdkZeroInt = sdk.ZeroInt()
|
suite.sdkZeroInt = sdk.ZeroInt()
|
||||||
suite.sdkMinusOneInt = sdkmath.NewInt(-1)
|
suite.sdkMinusOneInt = sdkmath.NewInt(-1)
|
||||||
suite.invalidAddr = "123456"
|
suite.invalidAddr = "123456"
|
||||||
suite.addr = tests.GenerateAddress()
|
suite.addr = tests.GenerateAddress()
|
||||||
suite.hexAddr = suite.addr.Hex()
|
suite.hexAddr = suite.addr.Hex()
|
||||||
|
suite.hexDataBytes = hexutil.Bytes([]byte("data"))
|
||||||
|
suite.hexInputBytes = hexutil.Bytes([]byte("input"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTxDataTestSuite(t *testing.T) {
|
func TestTxDataTestSuite(t *testing.T) {
|
||||||
@ -581,6 +590,84 @@ func (suite *TxDataTestSuite) TestDynamicFeeTxValidate() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (suite *TxDataTestSuite) TestDynamicFeeTxEffectiveGasPrice() {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
tx DynamicFeeTx
|
||||||
|
baseFee *big.Int
|
||||||
|
exp *big.Int
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"non-empty dynamic fee tx",
|
||||||
|
DynamicFeeTx{
|
||||||
|
GasTipCap: &suite.sdkInt,
|
||||||
|
GasFeeCap: &suite.sdkInt,
|
||||||
|
},
|
||||||
|
(&suite.sdkInt).BigInt(),
|
||||||
|
(&suite.sdkInt).BigInt(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
actual := tc.tx.EffectiveGasPrice(tc.baseFee)
|
||||||
|
|
||||||
|
suite.Require().Equal(tc.exp, actual, tc.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *TxDataTestSuite) TestDynamicFeeTxEffectiveFee() {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
tx DynamicFeeTx
|
||||||
|
baseFee *big.Int
|
||||||
|
exp *big.Int
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"non-empty dynamic fee tx",
|
||||||
|
DynamicFeeTx{
|
||||||
|
GasTipCap: &suite.sdkInt,
|
||||||
|
GasFeeCap: &suite.sdkInt,
|
||||||
|
GasLimit: uint64(1),
|
||||||
|
},
|
||||||
|
(&suite.sdkInt).BigInt(),
|
||||||
|
(&suite.sdkInt).BigInt(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
actual := tc.tx.EffectiveFee(tc.baseFee)
|
||||||
|
|
||||||
|
suite.Require().Equal(tc.exp, actual, tc.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *TxDataTestSuite) TestDynamicFeeTxEffectiveCost() {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
tx DynamicFeeTx
|
||||||
|
baseFee *big.Int
|
||||||
|
exp *big.Int
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"non-empty dynamic fee tx",
|
||||||
|
DynamicFeeTx{
|
||||||
|
GasTipCap: &suite.sdkInt,
|
||||||
|
GasFeeCap: &suite.sdkInt,
|
||||||
|
GasLimit: uint64(1),
|
||||||
|
Amount: &suite.sdkZeroInt,
|
||||||
|
},
|
||||||
|
(&suite.sdkInt).BigInt(),
|
||||||
|
(&suite.sdkInt).BigInt(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
actual := tc.tx.EffectiveCost(tc.baseFee)
|
||||||
|
|
||||||
|
suite.Require().Equal(tc.exp, actual, tc.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (suite *TxDataTestSuite) TestDynamicFeeTxFeeCost() {
|
func (suite *TxDataTestSuite) TestDynamicFeeTxFeeCost() {
|
||||||
tx := &DynamicFeeTx{}
|
tx := &DynamicFeeTx{}
|
||||||
suite.Require().Panics(func() { tx.Fee() }, "should panic")
|
suite.Require().Panics(func() { tx.Fee() }, "should panic")
|
||||||
|
@ -115,6 +115,11 @@ func (suite *GenesisTestSuite) TestValidateGenesis() {
|
|||||||
genState: &GenesisState{},
|
genState: &GenesisState{},
|
||||||
expPass: false,
|
expPass: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "copied genesis",
|
||||||
|
genState: NewGenesisState(DefaultGenesisState().Params, DefaultGenesisState().Accounts),
|
||||||
|
expPass: true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "invalid genesis",
|
name: "invalid genesis",
|
||||||
genState: &GenesisState{
|
genState: &GenesisState{
|
||||||
|
@ -349,9 +349,84 @@ func (suite *TxDataTestSuite) TestLegacyTxValidate() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (suite *TxDataTestSuite) TestLegacyTxEffectiveGasPrice() {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
tx LegacyTx
|
||||||
|
baseFee *big.Int
|
||||||
|
exp *big.Int
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"non-empty legacy tx",
|
||||||
|
LegacyTx{
|
||||||
|
GasPrice: &suite.sdkInt,
|
||||||
|
},
|
||||||
|
(&suite.sdkInt).BigInt(),
|
||||||
|
(&suite.sdkInt).BigInt(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
actual := tc.tx.EffectiveGasPrice(tc.baseFee)
|
||||||
|
|
||||||
|
suite.Require().Equal(tc.exp, actual, tc.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *TxDataTestSuite) TestLegacyTxEffectiveFee() {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
tx LegacyTx
|
||||||
|
baseFee *big.Int
|
||||||
|
exp *big.Int
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"non-empty legacy tx",
|
||||||
|
LegacyTx{
|
||||||
|
GasPrice: &suite.sdkInt,
|
||||||
|
GasLimit: uint64(1),
|
||||||
|
},
|
||||||
|
(&suite.sdkInt).BigInt(),
|
||||||
|
(&suite.sdkInt).BigInt(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
actual := tc.tx.EffectiveFee(tc.baseFee)
|
||||||
|
|
||||||
|
suite.Require().Equal(tc.exp, actual, tc.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *TxDataTestSuite) TestLegacyTxEffectiveCost() {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
tx LegacyTx
|
||||||
|
baseFee *big.Int
|
||||||
|
exp *big.Int
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"non-empty legacy tx",
|
||||||
|
LegacyTx{
|
||||||
|
GasPrice: &suite.sdkInt,
|
||||||
|
GasLimit: uint64(1),
|
||||||
|
Amount: &suite.sdkZeroInt,
|
||||||
|
},
|
||||||
|
(&suite.sdkInt).BigInt(),
|
||||||
|
(&suite.sdkInt).BigInt(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
actual := tc.tx.EffectiveCost(tc.baseFee)
|
||||||
|
|
||||||
|
suite.Require().Equal(tc.exp, actual, tc.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (suite *TxDataTestSuite) TestLegacyTxFeeCost() {
|
func (suite *TxDataTestSuite) TestLegacyTxFeeCost() {
|
||||||
tx := &LegacyTx{}
|
tx := &LegacyTx{}
|
||||||
|
|
||||||
suite.Require().Panics(func() { tx.Fee() }, "should panice")
|
suite.Require().Panics(func() { tx.Fee() }, "should panic")
|
||||||
suite.Require().Panics(func() { tx.Cost() }, "should panice")
|
suite.Require().Panics(func() { tx.Cost() }, "should panic")
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,14 @@ func TestTransactionLogsValidate(t *testing.T) {
|
|||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"nil log",
|
||||||
|
TransactionLogs{
|
||||||
|
Hash: common.BytesToHash([]byte("tx_hash")).String(),
|
||||||
|
Logs: []*Log{nil},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"invalid log",
|
"invalid log",
|
||||||
TransactionLogs{
|
TransactionLogs{
|
||||||
@ -158,3 +166,36 @@ func TestValidateLog(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestConversionFunctions(t *testing.T) {
|
||||||
|
addr := tests.GenerateAddress().String()
|
||||||
|
|
||||||
|
txLogs := TransactionLogs{
|
||||||
|
Hash: common.BytesToHash([]byte("tx_hash")).String(),
|
||||||
|
Logs: []*Log{
|
||||||
|
{
|
||||||
|
Address: addr,
|
||||||
|
Topics: []string{common.BytesToHash([]byte("topic")).String()},
|
||||||
|
Data: []byte("data"),
|
||||||
|
BlockNumber: 1,
|
||||||
|
TxHash: common.BytesToHash([]byte("tx_hash")).String(),
|
||||||
|
TxIndex: 1,
|
||||||
|
BlockHash: common.BytesToHash([]byte("block_hash")).String(),
|
||||||
|
Index: 1,
|
||||||
|
Removed: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert valid log to eth logs and back (and validate)
|
||||||
|
conversionLogs := NewTransactionLogsFromEth(common.BytesToHash([]byte("tx_hash")), txLogs.EthLogs())
|
||||||
|
conversionErr := conversionLogs.Validate()
|
||||||
|
|
||||||
|
// create new transaction logs as copy of old valid one (and validate)
|
||||||
|
copyLogs := NewTransactionLogs(common.BytesToHash([]byte("tx_hash")), txLogs.Logs)
|
||||||
|
copyErr := copyLogs.Validate()
|
||||||
|
|
||||||
|
require.Nil(t, conversionErr)
|
||||||
|
require.Nil(t, copyErr)
|
||||||
|
}
|
||||||
|
|
||||||
|
288
x/evm/types/tx_args_test.go
Normal file
288
x/evm/types/tx_args_test.go
Normal file
@ -0,0 +1,288 @@
|
|||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math/big"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
//"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
|
ethtypes "github.com/ethereum/go-ethereum/core/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (suite *TxDataTestSuite) TestTxArgsString() {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
txArgs TransactionArgs
|
||||||
|
expectedString string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"empty tx args",
|
||||||
|
TransactionArgs{},
|
||||||
|
"TransactionArgs{From:<nil>, To:<nil>, Gas:<nil>, Nonce:<nil>, Data:<nil>, Input:<nil>, AccessList:<nil>}",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tx args with fields",
|
||||||
|
TransactionArgs{
|
||||||
|
From: &suite.addr,
|
||||||
|
To: &suite.addr,
|
||||||
|
Gas: &suite.hexUint64,
|
||||||
|
Nonce: &suite.hexUint64,
|
||||||
|
Input: &suite.hexInputBytes,
|
||||||
|
Data: &suite.hexDataBytes,
|
||||||
|
AccessList: ðtypes.AccessList{},
|
||||||
|
},
|
||||||
|
fmt.Sprintf("TransactionArgs{From:%v, To:%v, Gas:%v, Nonce:%v, Data:%v, Input:%v, AccessList:%v}",
|
||||||
|
&suite.addr,
|
||||||
|
&suite.addr,
|
||||||
|
&suite.hexUint64,
|
||||||
|
&suite.hexUint64,
|
||||||
|
&suite.hexDataBytes,
|
||||||
|
&suite.hexInputBytes,
|
||||||
|
ðtypes.AccessList{}),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tc := range testCases {
|
||||||
|
outputString := tc.txArgs.String()
|
||||||
|
suite.Require().Equal(outputString, tc.expectedString)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *TxDataTestSuite) TestConvertTxArgsEthTx() {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
txArgs TransactionArgs
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"empty tx args",
|
||||||
|
TransactionArgs{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"no nil args",
|
||||||
|
TransactionArgs{
|
||||||
|
From: &suite.addr,
|
||||||
|
To: &suite.addr,
|
||||||
|
Gas: &suite.hexUint64,
|
||||||
|
GasPrice: &suite.hexBigInt,
|
||||||
|
MaxFeePerGas: &suite.hexBigInt,
|
||||||
|
MaxPriorityFeePerGas: &suite.hexBigInt,
|
||||||
|
Value: &suite.hexBigInt,
|
||||||
|
Nonce: &suite.hexUint64,
|
||||||
|
Data: &suite.hexDataBytes,
|
||||||
|
Input: &suite.hexInputBytes,
|
||||||
|
AccessList: ðtypes.AccessList{{Address: suite.addr, StorageKeys: []common.Hash{{0}}}},
|
||||||
|
ChainID: &suite.hexBigInt,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"max fee per gas nil, but access list not nil",
|
||||||
|
TransactionArgs{
|
||||||
|
From: &suite.addr,
|
||||||
|
To: &suite.addr,
|
||||||
|
Gas: &suite.hexUint64,
|
||||||
|
GasPrice: &suite.hexBigInt,
|
||||||
|
MaxFeePerGas: nil,
|
||||||
|
MaxPriorityFeePerGas: &suite.hexBigInt,
|
||||||
|
Value: &suite.hexBigInt,
|
||||||
|
Nonce: &suite.hexUint64,
|
||||||
|
Data: &suite.hexDataBytes,
|
||||||
|
Input: &suite.hexInputBytes,
|
||||||
|
AccessList: ðtypes.AccessList{{Address: suite.addr, StorageKeys: []common.Hash{{0}}}},
|
||||||
|
ChainID: &suite.hexBigInt,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tc := range testCases {
|
||||||
|
res := tc.txArgs.ToTransaction()
|
||||||
|
suite.Require().NotNil(res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *TxDataTestSuite) TestToMessageEVM() {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
txArgs TransactionArgs
|
||||||
|
globalGasCap uint64
|
||||||
|
baseFee *big.Int
|
||||||
|
expError bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"empty tx args",
|
||||||
|
TransactionArgs{},
|
||||||
|
uint64(0),
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"specify gasPrice and (maxFeePerGas or maxPriorityFeePerGas)",
|
||||||
|
TransactionArgs{
|
||||||
|
From: &suite.addr,
|
||||||
|
To: &suite.addr,
|
||||||
|
Gas: &suite.hexUint64,
|
||||||
|
GasPrice: &suite.hexBigInt,
|
||||||
|
MaxFeePerGas: &suite.hexBigInt,
|
||||||
|
MaxPriorityFeePerGas: &suite.hexBigInt,
|
||||||
|
Value: &suite.hexBigInt,
|
||||||
|
Nonce: &suite.hexUint64,
|
||||||
|
Data: &suite.hexDataBytes,
|
||||||
|
Input: &suite.hexInputBytes,
|
||||||
|
AccessList: ðtypes.AccessList{{Address: suite.addr, StorageKeys: []common.Hash{{0}}}},
|
||||||
|
ChainID: &suite.hexBigInt,
|
||||||
|
},
|
||||||
|
uint64(0),
|
||||||
|
nil,
|
||||||
|
true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"non-1559 execution, zero gas cap",
|
||||||
|
TransactionArgs{
|
||||||
|
From: &suite.addr,
|
||||||
|
To: &suite.addr,
|
||||||
|
Gas: &suite.hexUint64,
|
||||||
|
GasPrice: &suite.hexBigInt,
|
||||||
|
MaxFeePerGas: nil,
|
||||||
|
MaxPriorityFeePerGas: nil,
|
||||||
|
Value: &suite.hexBigInt,
|
||||||
|
Nonce: &suite.hexUint64,
|
||||||
|
Data: &suite.hexDataBytes,
|
||||||
|
Input: &suite.hexInputBytes,
|
||||||
|
AccessList: ðtypes.AccessList{{Address: suite.addr, StorageKeys: []common.Hash{{0}}}},
|
||||||
|
ChainID: &suite.hexBigInt,
|
||||||
|
},
|
||||||
|
uint64(0),
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"non-1559 execution, nonzero gas cap",
|
||||||
|
TransactionArgs{
|
||||||
|
From: &suite.addr,
|
||||||
|
To: &suite.addr,
|
||||||
|
Gas: &suite.hexUint64,
|
||||||
|
GasPrice: &suite.hexBigInt,
|
||||||
|
MaxFeePerGas: nil,
|
||||||
|
MaxPriorityFeePerGas: nil,
|
||||||
|
Value: &suite.hexBigInt,
|
||||||
|
Nonce: &suite.hexUint64,
|
||||||
|
Data: &suite.hexDataBytes,
|
||||||
|
Input: &suite.hexInputBytes,
|
||||||
|
AccessList: ðtypes.AccessList{{Address: suite.addr, StorageKeys: []common.Hash{{0}}}},
|
||||||
|
ChainID: &suite.hexBigInt,
|
||||||
|
},
|
||||||
|
uint64(1),
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"1559-type execution, nil gas price",
|
||||||
|
TransactionArgs{
|
||||||
|
From: &suite.addr,
|
||||||
|
To: &suite.addr,
|
||||||
|
Gas: &suite.hexUint64,
|
||||||
|
GasPrice: nil,
|
||||||
|
MaxFeePerGas: &suite.hexBigInt,
|
||||||
|
MaxPriorityFeePerGas: &suite.hexBigInt,
|
||||||
|
Value: &suite.hexBigInt,
|
||||||
|
Nonce: &suite.hexUint64,
|
||||||
|
Data: &suite.hexDataBytes,
|
||||||
|
Input: &suite.hexInputBytes,
|
||||||
|
AccessList: ðtypes.AccessList{{Address: suite.addr, StorageKeys: []common.Hash{{0}}}},
|
||||||
|
ChainID: &suite.hexBigInt,
|
||||||
|
},
|
||||||
|
uint64(1),
|
||||||
|
suite.bigInt,
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"1559-type execution, non-nil gas price",
|
||||||
|
TransactionArgs{
|
||||||
|
From: &suite.addr,
|
||||||
|
To: &suite.addr,
|
||||||
|
Gas: &suite.hexUint64,
|
||||||
|
GasPrice: &suite.hexBigInt,
|
||||||
|
MaxFeePerGas: nil,
|
||||||
|
MaxPriorityFeePerGas: nil,
|
||||||
|
Value: &suite.hexBigInt,
|
||||||
|
Nonce: &suite.hexUint64,
|
||||||
|
Data: &suite.hexDataBytes,
|
||||||
|
Input: &suite.hexInputBytes,
|
||||||
|
AccessList: ðtypes.AccessList{{Address: suite.addr, StorageKeys: []common.Hash{{0}}}},
|
||||||
|
ChainID: &suite.hexBigInt,
|
||||||
|
},
|
||||||
|
uint64(1),
|
||||||
|
suite.bigInt,
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tc := range testCases {
|
||||||
|
res, err := tc.txArgs.ToMessage(tc.globalGasCap, tc.baseFee)
|
||||||
|
|
||||||
|
if tc.expError {
|
||||||
|
suite.Require().NotNil(err)
|
||||||
|
} else {
|
||||||
|
suite.Require().Nil(err)
|
||||||
|
suite.Require().NotNil(res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *TxDataTestSuite) TestGetFrom() {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
txArgs TransactionArgs
|
||||||
|
expAddress common.Address
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"empty from field",
|
||||||
|
TransactionArgs{},
|
||||||
|
common.Address{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"non-empty from field",
|
||||||
|
TransactionArgs{
|
||||||
|
From: &suite.addr,
|
||||||
|
},
|
||||||
|
suite.addr,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tc := range testCases {
|
||||||
|
retrievedAddress := tc.txArgs.GetFrom()
|
||||||
|
suite.Require().Equal(retrievedAddress, tc.expAddress)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *TxDataTestSuite) TestGetData() {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
txArgs TransactionArgs
|
||||||
|
expectedOutput []byte
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"empty input and data fields",
|
||||||
|
TransactionArgs{
|
||||||
|
Data: nil,
|
||||||
|
Input: nil,
|
||||||
|
},
|
||||||
|
nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"empty input field, non-empty data field",
|
||||||
|
TransactionArgs{
|
||||||
|
Data: &suite.hexDataBytes,
|
||||||
|
Input: nil,
|
||||||
|
},
|
||||||
|
[]byte("data"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"non-empty input and data fields",
|
||||||
|
TransactionArgs{
|
||||||
|
Data: &suite.hexDataBytes,
|
||||||
|
Input: &suite.hexInputBytes,
|
||||||
|
},
|
||||||
|
[]byte("input"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tc := range testCases {
|
||||||
|
retrievedData := tc.txArgs.GetData()
|
||||||
|
suite.Require().Equal(retrievedData, tc.expectedOutput)
|
||||||
|
}
|
||||||
|
}
|
@ -14,6 +14,8 @@ import (
|
|||||||
evmtypes "github.com/evmos/ethermint/x/evm/types"
|
evmtypes "github.com/evmos/ethermint/x/evm/types"
|
||||||
proto "github.com/gogo/protobuf/proto"
|
proto "github.com/gogo/protobuf/proto"
|
||||||
|
|
||||||
|
"github.com/evmos/ethermint/tests"
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
@ -84,3 +86,31 @@ func TestBinSearch(t *testing.T) {
|
|||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
require.Equal(t, gas, uint64(0))
|
require.Equal(t, gas, uint64(0))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestTransactionLogsEncodeDecode(t *testing.T) {
|
||||||
|
addr := tests.GenerateAddress().String()
|
||||||
|
|
||||||
|
txLogs := evmtypes.TransactionLogs{
|
||||||
|
Hash: common.BytesToHash([]byte("tx_hash")).String(),
|
||||||
|
Logs: []*evmtypes.Log{
|
||||||
|
{
|
||||||
|
Address: addr,
|
||||||
|
Topics: []string{common.BytesToHash([]byte("topic")).String()},
|
||||||
|
Data: []byte("data"),
|
||||||
|
BlockNumber: 1,
|
||||||
|
TxHash: common.BytesToHash([]byte("tx_hash")).String(),
|
||||||
|
TxIndex: 1,
|
||||||
|
BlockHash: common.BytesToHash([]byte("block_hash")).String(),
|
||||||
|
Index: 1,
|
||||||
|
Removed: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
txLogsEncoded, encodeErr := evmtypes.EncodeTransactionLogs(&txLogs)
|
||||||
|
require.Nil(t, encodeErr)
|
||||||
|
|
||||||
|
txLogsEncodedDecoded, decodeErr := evmtypes.DecodeTransactionLogs(txLogsEncoded)
|
||||||
|
require.Nil(t, decodeErr)
|
||||||
|
require.Equal(t, txLogs, txLogsEncodedDecoded)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user