diff --git a/app/ante/eth_test.go b/app/ante/eth_test.go index 1f591845..6d42310c 100644 --- a/app/ante/eth_test.go +++ b/app/ante/eth_test.go @@ -9,6 +9,7 @@ import ( "github.com/evmos/ethermint/app/ante" "github.com/evmos/ethermint/server/config" "github.com/evmos/ethermint/tests" + ethermint "github.com/evmos/ethermint/types" "github.com/evmos/ethermint/x/evm/statedb" evmtypes "github.com/evmos/ethermint/x/evm/types" @@ -180,6 +181,9 @@ func (suite AnteTestSuite) TestEthGasConsumeDecorator() { tx2.From = addr.Hex() tx2Priority := int64(1) + tx3GasLimit := ethermint.BlockGasLimit(suite.ctx) + uint64(1) + tx3 := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), tx3GasLimit, gasPrice, nil, nil, nil, ðtypes.AccessList{{Address: addr, StorageKeys: nil}}) + dynamicFeeTx := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), tx2GasLimit, nil, // gasPrice new(big.Int).Add(baseFee, big.NewInt(evmtypes.DefaultPriorityReduction.Int64()*2)), // gasFeeCap @@ -216,6 +220,14 @@ func (suite AnteTestSuite) TestEthGasConsumeDecorator() { false, false, 0, }, + { + "gas limit above block gas limit", + tx3, + math.MaxUint64, + func() {}, + false, false, + 0, + }, { "not enough balance for fees", tx2, diff --git a/gomod2nix.toml b/gomod2nix.toml index 650e3d13..f09b5bae 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -94,8 +94,8 @@ schema = 3 version = "v1.0.4" hash = "sha256-JvcBXBdjdmnaW/nyf/tw/uaOAGn1b78yxrtl2/Rs3kA=" [mod."github.com/cosmos/cosmos-proto"] - version = "v1.0.0-alpha8" - hash = "sha256-iXzXoS5Kfh5DBy+PhdFWraDWXda/3M4j7j4VECjv4CA=" + version = "v1.0.0-beta.1" + hash = "sha256-oATkuj+fM5eBn+ywO+w/tL0AFSIEkx0J3Yz+VhVe0QA=" [mod."github.com/cosmos/cosmos-sdk"] version = "v0.46.6" hash = "sha256-H1VZxZUWXhpXiY3A9smLp09MEGpXmh+XvX6YUiXPcpQ=" diff --git a/tests/integration_tests/test_gas.py b/tests/integration_tests/test_gas.py old mode 100755 new mode 100644 index 223f681d..e35ae96c --- a/tests/integration_tests/test_gas.py +++ b/tests/integration_tests/test_gas.py @@ -1,4 +1,13 @@ -from .utils import ADDRS, CONTRACTS, KEYS, deploy_contract, send_transaction +import pytest + +from .utils import ( + ADDRS, + CONTRACTS, + KEYS, + deploy_contract, + send_transaction, + w3_wait_for_new_blocks, +) def test_gas_eth_tx(geth, ethermint): @@ -21,12 +30,10 @@ def test_gas_eth_tx(geth, ethermint): def test_gas_deployment(geth, ethermint): # deploy an identical contract on geth and ethermint # ensure that the gasUsed is equivalent - _, geth_contract_receipt = deploy_contract( - geth.w3, - CONTRACTS["TestERC20A"]) + _, geth_contract_receipt = deploy_contract(geth.w3, CONTRACTS["TestERC20A"]) _, ethermint_contract_receipt = deploy_contract( - ethermint.w3, - CONTRACTS["TestERC20A"]) + ethermint.w3, CONTRACTS["TestERC20A"] + ) assert geth_contract_receipt.gasUsed == ethermint_contract_receipt.gasUsed @@ -35,28 +42,65 @@ def test_gas_call(geth, ethermint): # deploy an identical contract on geth and ethermint # ensure that the contract has a function which consumes non-trivial gas - geth_contract, _ = deploy_contract( - geth.w3, - CONTRACTS["BurnGas"]) - ethermint_contract, _ = deploy_contract( - ethermint.w3, - CONTRACTS["BurnGas"]) + geth_contract, _ = deploy_contract(geth.w3, CONTRACTS["BurnGas"]) + ethermint_contract, _ = deploy_contract(ethermint.w3, CONTRACTS["BurnGas"]) # call the contract and get tx receipt for geth geth_gas_price = geth.w3.eth.gas_price - geth_txhash = (geth_contract.functions - .burnGas(function_input) - .transact({'from': ADDRS["validator"], "gasPrice": geth_gas_price})) + geth_txhash = geth_contract.functions.burnGas(function_input).transact( + {"from": ADDRS["validator"], "gasPrice": geth_gas_price} + ) geth_call_receipt = geth.w3.eth.wait_for_transaction_receipt(geth_txhash) # repeat the above for ethermint ethermint_gas_price = ethermint.w3.eth.gas_price - ethermint_txhash = (ethermint_contract.functions - .burnGas(function_input) - .transact({'from': ADDRS["validator"], - "gasPrice": ethermint_gas_price})) - ethermint_call_receipt = (ethermint.w3. - eth.wait_for_transaction_receipt(ethermint_txhash)) + ethermint_txhash = ethermint_contract.functions.burnGas(function_input).transact( + {"from": ADDRS["validator"], "gasPrice": ethermint_gas_price} + ) + ethermint_call_receipt = ethermint.w3.eth.wait_for_transaction_receipt( + ethermint_txhash + ) # ensure that the gasUsed is equivalent assert geth_call_receipt.gasUsed == ethermint_call_receipt.gasUsed + + +def test_block_gas_limit(ethermint): + tx_value = 10 + + # get the block gas limit from the latest block + w3_wait_for_new_blocks(ethermint.w3, 5) + block = ethermint.w3.eth.get_block("latest") + exceeded_gas_limit = block.gasLimit + 100 + + # send a transaction exceeding the block gas limit + ethermint_gas_price = ethermint.w3.eth.gas_price + tx = { + "to": ADDRS["community"], + "value": tx_value, + "gas": exceeded_gas_limit, + "gasPrice": ethermint_gas_price, + } + + # expect an error due to the block gas limit + with pytest.raises(Exception): + send_transaction(ethermint.w3, tx, KEYS["validator"]) + + # deploy a contract on ethermint + ethermint_contract, _ = deploy_contract(ethermint.w3, CONTRACTS["BurnGas"]) + + # expect an error on contract call due to block gas limit + with pytest.raises(Exception): + ethermint_txhash = ethermint_contract.functions.burnGas( + exceeded_gas_limit + ).transact( + { + "from": ADDRS["validator"], + "gas": exceeded_gas_limit, + "gasPrice": ethermint_gas_price, + } + ) + (ethermint.w3.eth.wait_for_transaction_receipt(ethermint_txhash)) + + + return