Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 2 additions & 30 deletions packages/testing/src/execution_testing/execution/base.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
"""Ethereum test execution base types."""

from abc import abstractmethod
from typing import Annotated, Any, ClassVar, Dict, List, Type
from typing import Annotated, Any, ClassVar, Dict, Type

from pydantic import PlainSerializer, PlainValidator
from pytest import FixtureRequest

from execution_testing.base_types import Address, CamelModel
from execution_testing.forks import Fork
from execution_testing.rpc import EngineRPC, EthRPC
from execution_testing.test_types import Environment, Transaction
from execution_testing.test_types import Environment


class ExecuteResult(CamelModel):
Expand Down Expand Up @@ -43,34 +43,6 @@ def __pydantic_init_subclass__(cls, **kwargs: Any) -> None:
# Register the new execute format
BaseExecute.formats[cls.format_name] = cls

@staticmethod
def calculate_max_transaction_gas_limit(
txs: List[Transaction], env: Environment, fork: Fork
) -> int:
"""
Calculate the maximum gas limit that can be set in a transaction
given a list of transactions with and without gas-limits set
and a maximum available environment gas.
"""
available_gas = int(env.gas_limit)
unset_gas_limit_tx_count = 0
for tx in txs:
if tx.gas_limit is None:
unset_gas_limit_tx_count += 1
else:
available_gas -= int(tx.gas_limit)

if unset_gas_limit_tx_count == 0 or available_gas <= 0:
return 0

max_gas_limit = available_gas // unset_gas_limit_tx_count
tx_gas_limit_cap = fork.transaction_gas_limit_cap()
if fork.state_gas_reservoir_enabled():
tx_gas_limit_cap = None
if tx_gas_limit_cap:
max_gas_limit = min(max_gas_limit, tx_gas_limit_cap)
return max_gas_limit

def prepare_transactions(
self,
*,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
Environment,
NetworkWrappedTransaction,
Transaction,
calculate_max_transaction_gas_limit,
)
from execution_testing.test_types.transaction_types import (
TransactionTestMetadata,
Expand Down Expand Up @@ -167,8 +168,8 @@ def prepare_transactions(
txs.append(tx.tx)
else:
txs.append(tx)
max_tx_gas_limit = self.calculate_max_transaction_gas_limit(
txs, env, fork
max_tx_gas_limit = calculate_max_transaction_gas_limit(
txs, env_gas_limit=int(env.gas_limit), fork=fork
)
for tx in txs:
tx.set_gas_limit(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
TestPhase,
Transaction,
TransactionTestMetadata,
calculate_max_transaction_gas_limit,
)

from .base import BaseExecute, ExecuteResult
Expand Down Expand Up @@ -52,8 +53,8 @@ def prepare_transactions(
) -> None:
"""Prepare transactions by setting their final gas properties."""
for block in self.blocks:
max_tx_gas_limit = self.calculate_max_transaction_gas_limit(
block, env, fork
max_tx_gas_limit = calculate_max_transaction_gas_limit(
block, env_gas_limit=int(env.gas_limit), fork=fork
)
for tx in block:
tx.set_gas_limit(
Expand Down
38 changes: 3 additions & 35 deletions packages/testing/src/execution_testing/specs/blockchain.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@
TestPhase,
Transaction,
Withdrawal,
calculate_max_transaction_gas_limit,
)
from execution_testing.test_types.block_access_list import (
BlockAccessList,
Expand Down Expand Up @@ -803,34 +804,6 @@ def make_genesis(
).with_rlp(txs=[]),
)

@staticmethod
def calculate_max_transaction_gas_limit(
txs: List[Transaction], env: Environment, fork: Fork
) -> int:
"""
Calculate the maximum gas limit that can be set in a transaction
given a list of transactions with and without gas-limits set
and a maximum available environment gas.
"""
available_gas = int(env.gas_limit)
unset_gas_limit_tx_count = 0
for tx in txs:
if tx.gas_limit is None:
unset_gas_limit_tx_count += 1
else:
available_gas -= int(tx.gas_limit)

if unset_gas_limit_tx_count == 0 or available_gas <= 0:
return 0

max_tx_gas_limit = available_gas // unset_gas_limit_tx_count
tx_gas_limit_cap = fork.transaction_gas_limit_cap()
if fork.state_gas_reservoir_enabled():
tx_gas_limit_cap = None
if tx_gas_limit_cap:
max_tx_gas_limit = min(max_tx_gas_limit, tx_gas_limit_cap)
return max_tx_gas_limit

def generate_block_data(
self,
t8n: FillerBackend,
Expand All @@ -853,14 +826,9 @@ def generate_block_data(
env = env.set_fork_requirements(fork)
txs = block.txs[:]
if any(tx.gas_limit is None for tx in block.txs):
max_tx_gas_limit = self.calculate_max_transaction_gas_limit(
txs, env, fork
max_tx_gas_limit = calculate_max_transaction_gas_limit(
txs, env_gas_limit=int(env.gas_limit), fork=fork
)
if max_tx_gas_limit == 0:
raise Exception(
"test correctness: unable to automatically calculate gas "
"limit for transactions (No remaining gas)."
)
for tx in txs:
tx.set_gas_limit(
max_gas_limit=max_tx_gas_limit,
Expand Down
2 changes: 2 additions & 0 deletions packages/testing/src/execution_testing/test_types/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
TransactionDefaults,
TransactionTestMetadata,
TransactionType,
calculate_max_transaction_gas_limit,
)
from .utils import Removable, keccak256

Expand Down Expand Up @@ -88,6 +89,7 @@
"Withdrawal",
"WithdrawalRequest",
"add_kzg_version",
"calculate_max_transaction_gas_limit",
"ceiling_division",
"compute_create_address",
"compute_create2_address",
Expand Down
Loading
Loading