From 575e970df289783eb4edcc5f237fd53d894b08fa Mon Sep 17 00:00:00 2001 From: spencer-tb Date: Tue, 29 Apr 2025 16:30:10 +0100 Subject: [PATCH 1/3] chore(all): move eof from osaka to speculative. --- .github/actions/build-fixtures/action.yaml | 2 +- .github/configs/feature.yaml | 2 +- .github/workflows/coverage.yaml | 4 +- docs/CHANGELOG.md | 9 + src/cli/eofwrap.py | 4 +- src/ethereum_test_forks/__init__.py | 2 + src/ethereum_test_forks/forks/forks.py | 21 +- .../filler/gen_test_doc/gen_test_doc.py | 6 +- tests/osaka/eip7692_eof_v1/eof_tracker.md | 502 ------------------ .../test_set_code_txs_2.py | 2 +- tests/speculative/__init__.py | 1 + .../eip7692_eof_v1/__init__.py | 2 +- .../eip7692_eof_v1/eip3540_eof_v1/__init__.py | 0 .../eip7692_eof_v1/eip3540_eof_v1/opcodes.py | 0 .../eip7692_eof_v1/eip3540_eof_v1/spec.py | 0 .../test_all_opcodes_in_container.py | 0 .../eip3540_eof_v1/test_container_size.py | 0 .../test_container_validation.py | 0 .../eip3540_eof_v1/test_eof_example.py | 0 .../eip3540_eof_v1/test_execution.py | 0 .../eip3540_eof_v1/test_execution_function.py | 0 .../eip3540_eof_v1/test_extcode.py | 0 .../test_migrated_valid_invalid.py | 0 .../eip3540_eof_v1/test_opcodes_in_legacy.py | 0 .../test_section_header_body_mismatch.py | 0 .../eip3540_eof_v1/test_section_order.py | 0 .../eip3540_eof_v1/test_section_size.py | 0 .../eip4200_relative_jumps/__init__.py | 0 .../eip4200_relative_jumps/helpers.py | 0 .../eip4200_relative_jumps/test_rjump.py | 0 .../eip4200_relative_jumps/test_rjumpi.py | 0 .../eip4200_relative_jumps/test_rjumpv.py | 0 .../eip4750_functions/__init__.py | 0 .../eip4750_functions/helpers.py | 0 .../eip4750_functions/test_callf_execution.py | 0 .../eip4750_functions/test_code_validation.py | 0 .../eip7692_eof_v1/eip5450_stack/__init__.py | 0 .../eip5450_stack/test_code_validation.py | 0 .../eip5450_stack/test_execution.py | 0 .../eip7692_eof_v1/eip6206_jumpf/__init__.py | 0 .../eip7692_eof_v1/eip6206_jumpf/helpers.py | 0 .../eip7692_eof_v1/eip6206_jumpf/spec.py | 0 .../eip6206_jumpf/test_jumpf_execution.py | 0 .../eip6206_jumpf/test_jumpf_stack.py | 0 .../eip6206_jumpf/test_jumpf_target.py | 0 .../eip6206_jumpf/test_jumpf_validation.py | 0 .../test_nonreturning_validation.py | 0 .../eip663_dupn_swapn_exchange/__init__.py | 0 .../eip663_dupn_swapn_exchange/test_dupn.py | 0 .../test_exchange.py | 0 .../eip663_dupn_swapn_exchange/test_swapn.py | 0 .../eip7069_extcall/__init__.py | 0 .../eip7692_eof_v1/eip7069_extcall/helpers.py | 0 .../eip7692_eof_v1/eip7069_extcall/spec.py | 0 .../test_address_space_extension.py | 0 .../eip7069_extcall/test_calldata.py | 0 .../eip7069_extcall/test_calls.py | 3 +- .../eip7069_extcall/test_gas.py | 0 .../test_returndatacopy_memory_expansion.py | 0 .../eip7069_extcall/test_returndataload.py | 0 .../eip7480_data_section/__init__.py | 0 .../eip7480_data_section/spec.py | 0 .../test_code_validation.py | 0 .../eip7480_data_section/test_data_opcodes.py | 0 .../test_datacopy_memory_expansion.py | 0 .../eip7620_eof_create/__init__.py | 2 +- .../eip7620_eof_create/helpers.py | 0 .../eip7692_eof_v1/eip7620_eof_create/spec.py | 0 .../eip7620_eof_create/test_eofcreate.py | 0 .../test_eofcreate_failures.py | 4 +- .../eip7620_eof_create/test_gas.py | 0 .../test_legacy_eof_creates.py | 0 .../eip7620_eof_create/test_memory.py | 0 .../eip7620_eof_create/test_returncode.py | 0 .../test_subcontainer_validation.py | 0 .../eip7873_tx_create/__init__.py | 0 .../eip7692_eof_v1/eip7873_tx_create/spec.py | 0 .../eip7873_tx_create/test_creation_tx.py | 0 .../eip7873_tx_create/test_txcreate.py | 0 .../test_txcreate_failures.py | 4 +- .../test_txcreate_validates.py | 0 .../speculative/eip7692_eof_v1/eof_tracker.md | 502 ++++++++++++++++++ .../eip7692_eof_v1/gas_test.py | 2 +- tox.ini | 6 +- whitelist.txt | 1 + 85 files changed, 556 insertions(+), 525 deletions(-) delete mode 100644 tests/osaka/eip7692_eof_v1/eof_tracker.md create mode 100644 tests/speculative/__init__.py rename tests/{osaka => speculative}/eip7692_eof_v1/__init__.py (98%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip3540_eof_v1/__init__.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip3540_eof_v1/opcodes.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip3540_eof_v1/spec.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip3540_eof_v1/test_container_size.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip3540_eof_v1/test_eof_example.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip3540_eof_v1/test_execution.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip3540_eof_v1/test_execution_function.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip3540_eof_v1/test_extcode.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip3540_eof_v1/test_migrated_valid_invalid.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip3540_eof_v1/test_opcodes_in_legacy.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip3540_eof_v1/test_section_header_body_mismatch.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip3540_eof_v1/test_section_size.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip4200_relative_jumps/__init__.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip4200_relative_jumps/helpers.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip4750_functions/__init__.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip4750_functions/helpers.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip4750_functions/test_callf_execution.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip4750_functions/test_code_validation.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip5450_stack/__init__.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip5450_stack/test_code_validation.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip5450_stack/test_execution.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip6206_jumpf/__init__.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip6206_jumpf/helpers.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip6206_jumpf/spec.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip6206_jumpf/test_jumpf_execution.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip6206_jumpf/test_jumpf_target.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip663_dupn_swapn_exchange/__init__.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_dupn.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_exchange.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_swapn.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7069_extcall/__init__.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7069_extcall/helpers.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7069_extcall/spec.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7069_extcall/test_address_space_extension.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7069_extcall/test_calldata.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7069_extcall/test_calls.py (99%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7069_extcall/test_gas.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7069_extcall/test_returndatacopy_memory_expansion.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7069_extcall/test_returndataload.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7480_data_section/__init__.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7480_data_section/spec.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7480_data_section/test_code_validation.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7480_data_section/test_data_opcodes.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7480_data_section/test_datacopy_memory_expansion.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7620_eof_create/__init__.py (90%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7620_eof_create/helpers.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7620_eof_create/spec.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7620_eof_create/test_eofcreate.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7620_eof_create/test_eofcreate_failures.py (99%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7620_eof_create/test_gas.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7620_eof_create/test_legacy_eof_creates.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7620_eof_create/test_memory.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7620_eof_create/test_returncode.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7620_eof_create/test_subcontainer_validation.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7873_tx_create/__init__.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7873_tx_create/spec.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7873_tx_create/test_creation_tx.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7873_tx_create/test_txcreate.py (100%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7873_tx_create/test_txcreate_failures.py (99%) rename tests/{osaka => speculative}/eip7692_eof_v1/eip7873_tx_create/test_txcreate_validates.py (100%) create mode 100644 tests/speculative/eip7692_eof_v1/eof_tracker.md rename tests/{osaka => speculative}/eip7692_eof_v1/gas_test.py (98%) diff --git a/.github/actions/build-fixtures/action.yaml b/.github/actions/build-fixtures/action.yaml index ed88aa32b3f..098a700bfc8 100644 --- a/.github/actions/build-fixtures/action.yaml +++ b/.github/actions/build-fixtures/action.yaml @@ -43,7 +43,7 @@ runs: env: tests_url: https://github.com/ethereum/tests/archive/refs/tags/v tests_version: 14.1 - output_path: blockchain_tests/osaka/eofwrap + output_path: blockchain_tests/speculative/eofwrap - name: Generate fixtures using fill shell: bash run: | diff --git a/.github/configs/feature.yaml b/.github/configs/feature.yaml index c0d0f42b40d..8cb53e65194 100644 --- a/.github/configs/feature.yaml +++ b/.github/configs/feature.yaml @@ -17,6 +17,6 @@ zkevm: solc: 0.8.21 eip7692: evm-type: eip7692 - fill-params: --fork=Osaka ./tests/osaka + fill-params: --fork=EOFv1 ./tests/speculative solc: 0.8.21 eofwrap: true diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index aeaf2691fb5..9b281687d01 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -5,7 +5,7 @@ on: paths: - "tests/**" # This triggers the workflow for any changes in the tests folder - "!tests/prague/**" # exclude changes in 'tests/prague' - - "!tests/osaka/**" # exclude changes in 'tests/osaka' + - "!tests/speculative/**" # exclude changes in 'tests/speculative' jobs: evmone-coverage-diff: @@ -35,7 +35,7 @@ jobs: tests: - tests/**/test_*.py - '!tests/prague/**' - - '!tests/osaka/**' + - '!tests/speculative/**' converted_tests: - converted-ethereum-tests.txt diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 2d8aa5aafac..e5c28c95771 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -8,6 +8,14 @@ Test fixtures for use by clients are available for each release on the [Github r ### 💥 Breaking Change +#### EOF removed from Osaka + +Following ["Interop Testing Call 34"](https://github.com/ethereum/pm/issues/1499) and the procedural EIPs [PR](https://github.com/ethereum/EIPs/pull/9703) the unfortunate decision to remove EOF from Osaka was made. + +To accommodate EOF testing for the interim within EEST, its tests have migrated to a new `tests/speculative` folder. This folder will now contain tests for features that are not yet CFI'd in any fork. When EOF is CFI'd for a fork in the future, all tests will be moved from speculative to the respective future fork folder. + +A new fork `EOFv1` has additionally been created to fill and consume EOF related fixtures. Client tests fillers such as `evmone` (and client consumers) will now need to use this fork name. + ### 🛠️ Framework - ✨ Add an empty account function for usage within fill and execute ([#1482](https://github.com/ethereum/execution-spec-tests/pull/1482)). @@ -20,6 +28,7 @@ Test fixtures for use by clients are available for each release on the [Github r - ✨ Engine API updates for Osaka, add `get_blobs` rpc method ([#1510](https://github.com/ethereum/execution-spec-tests/pull/1510)). - ✨ The EIP Version checker has been moved from `fill` and `execute` to it's own command-line tool `check_eip_versions` that gets ran daily as a Github Action ([#1537](https://github.com/ethereum/execution-spec-tests/pull/1537)). +🔀 Add new `tests/speculative` folder, move EOF from Osaka to speculative, add `EOFv1` fork name for EOF tests ([#1507](https://github.com/ethereum/execution-spec-tests/pull/1507)). ### 🧪 Test Cases diff --git a/src/cli/eofwrap.py b/src/cli/eofwrap.py index 246ac303fb0..ce648e5257a 100644 --- a/src/cli/eofwrap.py +++ b/src/cli/eofwrap.py @@ -26,7 +26,7 @@ from ethereum_test_base_types.conversions import to_hex from ethereum_test_fixtures.blockchain import FixtureBlock, InvalidFixtureBlock from ethereum_test_fixtures.file import Fixtures -from ethereum_test_forks.forks.forks import Osaka +from ethereum_test_forks.forks.forks import EOFv1 from ethereum_test_specs.blockchain import Block, BlockchainFixture, BlockchainTest from ethereum_test_specs.debugging import print_traces from ethereum_test_specs.eof import EOFParse @@ -309,7 +309,7 @@ def _wrap_fixture(self, fixture: BlockchainFixture, traces: bool): result = test.generate( t8n=t8n, - fork=Osaka, + fork=EOFv1, fixture_format=BlockchainFixture, ) result.info["fixture-format"] = "blockchain_test" diff --git a/src/ethereum_test_forks/__init__.py b/src/ethereum_test_forks/__init__.py index 30196f24fdb..495e0edff1f 100644 --- a/src/ethereum_test_forks/__init__.py +++ b/src/ethereum_test_forks/__init__.py @@ -8,6 +8,7 @@ Cancun, Constantinople, ConstantinopleFix, + EOFv1, Frontier, GrayGlacier, Homestead, @@ -59,6 +60,7 @@ "Byzantium", "Constantinople", "ConstantinopleFix", + "EOFv1", "ForkRangeDescriptor", "Frontier", "GrayGlacier", diff --git a/src/ethereum_test_forks/forks/forks.py b/src/ethereum_test_forks/forks/forks.py index be7deeaeb82..1126a93602a 100644 --- a/src/ethereum_test_forks/forks/forks.py +++ b/src/ethereum_test_forks/forks/forks.py @@ -1291,10 +1291,27 @@ def engine_get_payload_version( """From Osaka, get payload calls must use version 5.""" return 5 + @classmethod + def is_deployed(cls) -> bool: + """ + Flag that the fork has not been deployed to mainnet; it is under active + development. + """ + return False + + @classmethod + def solc_min_version(cls) -> Version: + """Return minimum version of solc that supports this fork.""" + return Version.parse("1.0.0") # set a high version; currently unknown + + +class EOFv1(Prague, solc_name="cancun"): + """EOF fork.""" + @classmethod def evm_code_types(cls, block_number: int = 0, timestamp: int = 0) -> List[EVMCodeType]: """EOF V1 is supported starting from Osaka.""" - return super(Osaka, cls).evm_code_types( + return super(EOFv1, cls).evm_code_types( block_number, timestamp, ) + [EVMCodeType.EOF_V1] @@ -1308,7 +1325,7 @@ def call_opcodes( (Opcodes.EXTCALL, EVMCodeType.EOF_V1), (Opcodes.EXTSTATICCALL, EVMCodeType.EOF_V1), (Opcodes.EXTDELEGATECALL, EVMCodeType.EOF_V1), - ] + super(Osaka, cls).call_opcodes(block_number, timestamp) + ] + super(EOFv1, cls).call_opcodes(block_number, timestamp) @classmethod def is_deployed(cls) -> bool: diff --git a/src/pytest_plugins/filler/gen_test_doc/gen_test_doc.py b/src/pytest_plugins/filler/gen_test_doc/gen_test_doc.py index 412698c5d53..9db4ed37440 100644 --- a/src/pytest_plugins/filler/gen_test_doc/gen_test_doc.py +++ b/src/pytest_plugins/filler/gen_test_doc/gen_test_doc.py @@ -491,7 +491,7 @@ def add_directory_page_props(self) -> None: pytest_node_id=str(directory), source_code_url=generate_github_url(directory, branch_or_commit_or_tag=self.ref), # TODO: This won't work in all cases; should be from the development fork - # Currently breaks for `tests/osaka/eip7692_eof_v1/index.md` # noqa: SC100 + # Currently breaks for `tests/speculative/eip7692_eof_v1/index.md` # noqa: SC100 target_or_valid_fork=fork.capitalize(), package_name=get_import_path(directory), # init.py will be used for docstrings ) @@ -552,8 +552,8 @@ def sort_by_fork_deployment_and_path(x: PageProps) -> Tuple[Any, ...]: - ("Test Case Reference",) -> tests/index.md - ("Test Case Reference", "Berlin") -> tests/berlin/index.md - - ("Test Case Reference", "Osaka", "EIP-7692 EOF V1", tracker.md") - tests/osaka/eip7692_eof_v1/tracker.md + - ("Test Case Reference", "EIP-7692 EOF V1", tracker.md") + tests/speculative/eip7692_eof_v1/tracker.md - ("Test Case Reference", "Shanghai", "EIP-3855 PUSH0", "Spec") -> tests/shanghai/eip3855_push0/spec.py diff --git a/tests/osaka/eip7692_eof_v1/eof_tracker.md b/tests/osaka/eip7692_eof_v1/eof_tracker.md deleted file mode 100644 index eebd68a13f1..00000000000 --- a/tests/osaka/eip7692_eof_v1/eof_tracker.md +++ /dev/null @@ -1,502 +0,0 @@ -# EOF Testing Coverage Tracker - -- [ ] Example Test Case 1 -- [x] Example Test Case 2 ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_eof_example.py`](./eip3540_eof_v1/test_eof_example/index.md)) - -## EIP-3540: EOF - EVM Object Format v1 - -### Validation - -- [x] Empty code is not a valid EOF ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k empty_container`) -- [x] Valid container without data section ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k single_code_section_no_data_section`) -- [x] Valid container with data section ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_valid_containers`](./eip3540_eof_v1/test_container_validation/test_valid_containers.md) `-k single_code_section_with_data_section`) -- [x] Valid container with truncated data section ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k data_section_contents_incomplete`, [`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_migrated_valid_invalid.py::test_migrated_valid_invalid`](./eip3540_eof_v1/test_migrated_valid_invalid/test_migrated_valid_invalid.md) `-k data_section_contents_incomplete`) -- [x] Valid container with data section truncated to empty ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k no_data_section_contents`, [`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_migrated_valid_invalid.py::test_migrated_valid_invalid`](./eip3540_eof_v1/test_migrated_valid_invalid/test_migrated_valid_invalid.md) `-k no_data_section_contents`) -- [x] Valid containers with multiple code sections ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_valid_containers`](./eip3540_eof_v1/test_container_validation/test_valid_containers.md) `-k multiple_code_sections`) -- [x] Valid containers with max number of code sections ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_max_code_sections`](./eip3540_eof_v1/test_container_validation/test_max_code_sections.md)) -- [x] Too many code sections ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k too_many_code_sections`) -- [x] Truncated magic ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k incomplete_magic`) -- [x] Valid container except magic ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_magic_validation`](./eip3540_eof_v1/test_container_validation/test_magic_validation.md)) -- [x] Truncated before version ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k no_version`) -- [x] Valid container except version ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_version_validation`](./eip3540_eof_v1/test_container_validation/test_version_validation.md)) -- [x] Truncated before type section header ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k no_type_header`) -- [x] Truncated before type section size ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k no_type_section_size`) -- [x] Truncated type section size ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k incomplete_type_section_size`) -- [x] No type section header ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py::test_section_order`](./eip3540_eof_v1/test_section_order/index.md) `-k test_position_CasePosition.HEADER-section_test_SectionTest.MISSING-section_kind_TYPE`) -- [x] Truncated before code section header ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k no_code_header`) -- [x] Truncated before code section number ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k code_section_count_missing`) -- [x] Truncated code section number ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k code_section_count_incomplete`) -- [x] Truncated before code section size ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k code_section_size_missing`) -- [x] Truncated code section size ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k code_section_size_incomplete`) -- [x] No code section header ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py::test_section_order`](./eip3540_eof_v1/test_section_order/index.md) `-k test_position_CasePosition.HEADER-section_test_SectionTest.MISSING-section_kind_CODE`) -- [x] Zero code section number ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k zero_code_sections_header`) -- [x] Zero code section size ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k empty_code_section`) -- [x] Zero code section size with non-empty data section ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k empty_code_section_with_non_empty_data`) -- [x] No container sections, truncated before data section header ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k truncated_header_data_section`) -- [x] Container sections present, truncated before data section header ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k truncated_header_data_section_with_container_section`) -- [x] Truncated before data section size ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k no_data_section_size`) -- [x] Truncated data section size ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k data_section_size_incomplete`) -- [x] Truncated before header terminator ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k terminator_incomplete`) -- [x] Truncated before type section ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k truncated_before_type_section`) -- [x] Type section truncated before outputs ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k truncated_type_section_before_outputs`) -- [x] Type section truncated before max_stack_height ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k truncated_type_section_before_max_stack_height`) -- [x] Type section truncated max_stack_height ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k truncated_type_section_truncated_max_stack_height`) -- [x] Truncated before code sections ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k no_code_section_contents`) -- [x] Truncated code section ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k incomplete_code_section_contents`) -- [x] Data section empty, trailing bytes ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k no_data_section_contents`) -- [x] Data section non-empty, trailing bytes ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k trailing_bytes_after_data_section`) -- [x] Wrong order of sections ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py`](./eip3540_eof_v1/index.md)) -- [x] No data section header ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py::test_section_order`](./eip3540_eof_v1/test_section_order/index.md) `-k test_position_CasePosition.HEADER-section_test_SectionTest.MISSING-section_kind_DATA`) -- [x] Multiple data sections ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k multiple_data_sections`, [`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k multiple_code_and_data_sections`) -- [x] Unknown section id ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k unknown_section_1`, [`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k unknown_section_2`) -- [x] Type section size != 4 * code section number ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k type_section_too`) -- [x] Code section with max max_stack_height ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_valid_containers`](./eip3540_eof_v1/test_container_validation/test_valid_containers.md) `-k single_code_section_max_stack_size`) -- [x] Code section with max_stack_height above limit ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k single_code_section_max_stack_size_too_large`) -- [x] Valid code sections with inputs/outputs ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k code_section_with_inputs_outputs`) -- [x] Valid code section with max inputs ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k code_section_input_maximum`) -- [x] Valid code section with max outputs ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k code_section_output_maximum`) -- [x] Code sections with invalid number of inputs/outputs ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k code_section_input_too_large`, [`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k code_section_output_too_large`) -- [x] First section with inputs/outputs ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k invalid_first_code_section`) -- [x] Multiple type section headers ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k too_many_type_sections`) -- [x] Multiple code section headers ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k multiple_code_headers`) -- [x] Multiple data section headers ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k multiple_data_sections`) -- [x] Container without type section ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py::test_section_order`](./eip3540_eof_v1/test_section_order/index.md) `-k 'SectionTest.MISSING-section_kind_TYPE'`) -- [x] Container without code sections ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py::test_section_order`](./eip3540_eof_v1/test_section_order/index.md) `-k 'SectionTest.MISSING-section_kind_CODE'`) -- [x] Container without data section ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py::test_section_order`](./eip3540_eof_v1/test_section_order/index.md) `-k 'SectionTest.MISSING-section_kind_DATA'`) -- [x] Valid containers without data section and with subcontainers ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_valid_containers`](./eip3540_eof_v1/test_container_validation/test_valid_containers.md)`[fork_Osaka-eof_test-single_subcontainer_without_data]`) -- [x] Valid containers with data section and with subcontainers ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_valid_containers`](./eip3540_eof_v1/test_container_validation/test_valid_containers.md)`[fork_Osaka-eof_test-single_subcontainer_with_data]`) -- [x] Valid container with maximum number of subcontainers ([`tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_subcontainer_validation.py::test_wide_container`](./eip7620_eof_create/test_subcontainer_validation/test_wide_container.md)`[fork_Osaka-eof_test-256]`) -- [x] Container with number of subcontainers above the limit ([`tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_subcontainer_validation.py::test_wide_container`](./eip7620_eof_create/test_subcontainer_validation/test_wide_container.md)`[fork_Osaka-eof_test-257]`) -- [x] Subcontainer section header truncated before subcontainer number ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k no_container_section_count`) -- [x] Subcontainer section header truncated before subcontainer size ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k incomplete_container_section_count`) -- [x] Truncated subcontainer size ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k no_container_section_size`, [`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k incomplete_container_section_size`) -- [x] Zero container section number ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k zero_container_section_count`) -- [x] Zero container section size ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k zero_size_container_section`) -- [x] Truncated container section body ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k no_container_section_contents`) -- [x] Multiple container section headers ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k multiple_container_headers`) -- [x] Invalid subcontainer ([`tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_subcontainer_validation.py`](./eip7620_eof_create/test_subcontainer_validation/index.md)`-k invalid`) -- [x] Invalid subcontainer on a deep nesting level ([`tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_subcontainer_validation.py::test_deep_container`](./eip7620_eof_create/test_subcontainer_validation/test_deep_container.md)) -- [x] Max number of inputs/outputs in a section ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_valid_containers`](./eip3540_eof_v1/test_container_validation/test_valid_containers.md)`[fork_Osaka-eof_test-code_section_input_maximum]`, [`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_valid_containers`](./eip3540_eof_v1/test_container_validation/test_valid_containers.md)`[fork_Osaka-eof_test-code_section_output_maximum]`) -- [x] Number of inputs/outputs in a section above the limit ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k code_section_input_too_large`, [`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k code_section_output_too_large`) - -### Execution - -- [x] Execution of EOF contracts ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_execution.py::test_eof_execution`](./eip3540_eof_v1/test_execution/test_eof_execution.md)) -- [x] Legacy executing EXTCODESIZE of EOF contract ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_extcode.py::test_legacy_calls_eof_sstore`](./eip3540_eof_v1/test_extcode/test_legacy_calls_eof_sstore.md)) -- [x] Legacy executing EXTCODEHASH of EOF contract ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_extcode.py::test_legacy_calls_eof_sstore`](./eip3540_eof_v1/test_extcode/test_legacy_calls_eof_sstore.md)) -- [x] Legacy executing EXTCODECOPY of EOF contract ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_extcode.py::test_legacy_calls_eof_sstore`](./eip3540_eof_v1/test_extcode/test_legacy_calls_eof_sstore.md)) - -## EIP-3670: EOF - Code Validation - -### Validation - -- [x] Code section with invalid opcodes is rejected ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py::test_all_opcodes_in_container`](./eip3540_eof_v1/test_all_opcodes_in_container/test_all_opcodes_in_container.md)) -- [x] INVALID opcode is valid ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py::test_all_opcodes_in_container`](./eip3540_eof_v1/test_all_opcodes_in_container/test_all_opcodes_in_container.md)) -- [x] Truncated PUSH data ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py::test_truncated_data_portion_opcodes`](./eip3540_eof_v1/test_all_opcodes_in_container/test_truncated_data_portion_opcodes.md)) -- [x] Opcodes deprecated in EOF are rejected ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py::test_all_opcodes_in_container`](./eip3540_eof_v1/test_all_opcodes_in_container/test_all_opcodes_in_container.md)) -- [x] Codes with each valid opcodes ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py::test_all_opcodes_in_container`](./eip3540_eof_v1/test_all_opcodes_in_container/test_all_opcodes_in_container.md)) -- [x] Undefined instruction after terminating instruction ([`tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py::test_invalid_opcodes_after_stop`](./eip3540_eof_v1/test_all_opcodes_in_container/test_invalid_opcodes_after_stop.md)) - -## EIP-4200: EOF - Static relative jumps - -### Validation - -- [x] Valid RJUMP with various offsets ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_positive_negative`](./eip4200_relative_jumps/test_rjump/test_rjump_positive_negative.md)) -- [x] Valid RJUMP with maximum offset ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_maxes`](./eip4200_relative_jumps/test_rjump/test_rjump_maxes.md)) -- [x] Valid RJUMP with minimum offset ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_maxes`](./eip4200_relative_jumps/test_rjump/test_rjump_maxes.md)) -- [x] Valid RJUMPI with various offsets ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_forwards`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_forwards.md)) -- [x] Valid RJUMPI with maximum offset ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_max_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_max_forward.md)) -- [x] Valid RJUMPI with minimum offset ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_max_backward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_max_backward.md)) -- [x] Valid RJUMPV with various number of offsets and various offsets ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_forwards`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_forwards.md)) -- [x] Valid RJUMPV with table size 256 ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_full_table`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_full_table.md)) -- [x] Valid RJUMPV containing maximum offset ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_max_forwards`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_max_forwards.md)) -- [ ] Valid RJUMPV containing minimum offset -- [x] Truncated before RJUMP immediate ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_truncated_rjump`](./eip4200_relative_jumps/test_rjump/test_rjump_truncated_rjump.md)) -- [x] Truncated RJUMP immediate ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_truncated_rjump_2`](./eip4200_relative_jumps/test_rjump/test_rjump_truncated_rjump_2.md)) -- [x] RJUMP out of container bounds ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_after_container`](./eip4200_relative_jumps/test_rjump/test_rjump_after_container.md)) -- [x] RJUMP out of section bounds ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_into_data`](./eip4200_relative_jumps/test_rjump/test_rjump_into_data.md)) -- [x] RJUMP into immediate ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_into_push_1`](./eip4200_relative_jumps/test_rjump/test_rjump_into_push_1.md)) -- [x] Truncated before RJUMPI immediate ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_truncated`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_truncated.md)) -- [x] Truncated RJUMPI immediate ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_truncated_2`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_truncated_2.md)) -- [x] RJUMPI out of container bounds ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_after_container`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_after_container.md)) -- [x] RJUMPI out of section bounds ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_into_data`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_into_data.md)) -- [x] RJUMPI into immediate ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_into_push_1`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_into_push_1.md)) -- [x] Truncated before RJUMPV immediate ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_truncated_empty`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_truncated_empty.md)) -- [x] Truncated RJUMPV immediate ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_truncated`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_truncated.md)) -- [x] RJUMPV out of container bounds ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_after_container`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_after_container.md)) -- [x] RJUMPV out of section bounds ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_into_data`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_into_data.md)) -- [x] RJUMPV into immediate ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_into_push_1`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_into_push_1.md)) - -### Execution - -- [x] RJUMP forwards ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_positive_negative`](./eip4200_relative_jumps/test_rjump/test_rjump_positive_negative.md)) -- [x] RJUMP backwards ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_positive_negative`](./eip4200_relative_jumps/test_rjump/test_rjump_positive_negative.md)) -- [x] RJUMP with 0 offset ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_zero`](./eip4200_relative_jumps/test_rjump/test_rjump_zero.md)) -- [x] RJUMPI forwards with condition true/false ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_condition_forwards`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_condition_forwards.md)) -- [x] RJUMPI backwards with condition true/false ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_condition_backwards`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_condition_backwards.md)) -- [x] RJUMPI with 0 offset with condition true/false ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_condition_zero`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_condition_zero.md)) -- [x] RJUMPV with different case values ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_condition`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_condition.md)) -- [x] RJUMPV with case value out of table bounds ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_condition`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_condition.md)) -- [x] RJUMPV with max cases number ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_condition`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_condition.md), [`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py`](./eip4200_relative_jumps/test_rjumpv/index.md)`-k test_rjumpv_full_table`) - -## EIP-4750: EOF - Functions - -### Validation - -- [x] Valid CALLFs ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_callf_execution.py::test_callf`](./eip4750_functions/test_callf_execution/test_callf.md)) -- [x] CALLFs to non-existing sections ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_invalid_code_section_index`](./eip4750_functions/test_code_validation/test_invalid_code_section_index.md)) -- [x] Truncated CALLF immediate ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_truncated_immediate`](./eip4750_functions/test_code_validation/test_callf_truncated_immediate.md)) -- [x] Unreachable code sections ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_unreachable_code_sections`](./eip4750_functions/test_code_validation/test_unreachable_code_sections.md)) -- [x] Sections reachable from other sections, but not reachable from section 0 ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_unreachable_code_sections`](./eip4750_functions/test_code_validation/test_unreachable_code_sections.md)) -- [x] Unreachable code section that calls itself with JUMPF ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_unreachable_code_sections`](./eip4750_functions/test_code_validation/test_unreachable_code_sections.md)) -- [x] Unreachable code section that calls itself with CALLF ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_unreachable_code_sections`](./eip4750_functions/test_code_validation/test_unreachable_code_sections.md)) -- [ ] RETF with maximum number of outputs (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) - -### Execution - -- [ ] CALLF/RETF execution (ethereum/tests: src/EIPTestsFiller/StateTests/stEOF/stEIP4200/CALLF_RETF_ExecutionFiller.yml) -- [ ] Dispatch to CALLF to different functions based on calldata (ethereum/tests: src/EIPTestsFiller/StateTests/stEOF/stEIP4200/CALLF_RETF_ExecutionFiller.yml) -- [ ] Maximum number of code sections, calling each section with CALLF (ethereum/tests: src/EIPTestsFiller/StateTests/stEOF/stEIP4200/CALLF_RETF_ExecutionFiller.yml) - -## EIP-5450: EOF - Stack Validation - -### Validation - -#### Terminating instructions - -- [ ] Check all terminating opcodes (ethereum/tests: ./src/EOFTestsFiller/efExample/validInvalidFiller.yml src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) -- [ ] Code section not terminating (executing beyond section end) (ethereum/tests: ./src/EOFTestsFiller/efExample/validInvalidFiller.yml src/EOFTestsFiller/EIP5450/validInvalidFiller.yml src/EOFTestsFiller/efStack/no_terminating_instruction_Copier.json) -- [ ] Code section ending with NOP (not terminating) (src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) -- [ ] Check that unreachable code is invalid after all terminating instructions (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) - -#### Jumps - -##### RJUMP - -- [x] Valid RJUMP backwards in a constant stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_valid_backward`](./eip4200_relative_jumps/test_rjump/test_rjump_valid_backward.md) -- [x] Invalid RJUMP backwards with mismatching stack in a constant stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_backward_invalid_max_stack_height`](./eip4200_relative_jumps/test_rjump/test_rjump_backward_invalid_max_stack_height.md) -- [x] Valid RJUMP backwards in a variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_valid_backward`](./eip4200_relative_jumps/test_rjump/test_rjump_valid_backward.md) -- [x] Invalid RJUMP backwards with mismatching stack in a variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_backward_invalid_max_stack_height`](./eip4200_relative_jumps/test_rjump/test_rjump_backward_invalid_max_stack_height.md) -- [x] Valid RJUMP forwards ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_valid_forward`](./eip4200_relative_jumps/test_rjump/test_rjump_valid_forward.md) -- [x] Valid RJUMP forwards from different stack ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_valid_forward`](./eip4200_relative_jumps/test_rjump/test_rjump_valid_forward.md) -- [x] Valid RJUMP forwards in variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_valid_forward`](./eip4200_relative_jumps/test_rjump/test_rjump_valid_forward.md) -- [x] Valid RJUMP forwards from different stack in variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_valid_forward`](./eip4200_relative_jumps/test_rjump/test_rjump_valid_forward.md) -- [ ] Valid empty infinite loop with RJUMP (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) -- [ ] Valid balanced infinite loop (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) -- [x] RJUMP to self (including variadic stack height) ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_into_self`](./eip4200_relative_jumps/test_rjump/test_rjump_into_self.md)) - -##### RJUMPI - -- [x] Valid RJUMPI backwards in a constant stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_backward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_backward.md) -- [x] Invalid RJUMPI backwards with mismatching stack in a constant stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_backward_invalid_max_stack_height`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_backward_invalid_max_stack_height.md) -- [x] Valid RJUMPI backwards in a variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_backward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_backward.md) -- [x] Invalid RJUMPI backwards with mismatching stack in a variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_backward_invalid_max_stack_height`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_backward_invalid_max_stack_height.md) -- [x] RJUMPI forward with branches of equal stack height ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) -- [x] RJUMPI forward with branches of equal stack height in a variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) -- [x] RJUMPI forward with branches of different stack height ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) -- [x] RJUMPI forward with branches of different stack height in a variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) -- [x] Valid loop using RJUMPI ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) -- [x] Valid loop with a break using RJUMPI - equal stack after break and normal loop end ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) -- [x] Valid loop with a break using RJUMPI - equal stack after break and normal loop end, variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) -- [x] Valid loop with a break using RJUMPI - different stack after break and normal loop end ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) -- [x] Valid loop with a break using RJUMPI - different stack after break and normal loop end, variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) -- [x] If-then-else with equal stack height in branches ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) -- [x] If-then-else with equal stack height in branches, variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) -- [x] If-then-else with different stack height in branches ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) -- [x] If-then-else with different stack height in branches, variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) -- [x] RJUMPI to self (including variadic stack height) ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_into_self`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_into_self.md)) - -##### RJUMPV - -- [x] Valid RJUMPV backwards in a constant stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_backward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_backward.md) -- [x] Invalid RJUMPV backwards with mismatching stack in a constant stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_backward_invalid_max_stack_height`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_backward_invalid_max_stack_height.md) -- [x] Valid RJUMPV backwards in a variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_backward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_backward.md) -- [x] Invalid RJUMPV backwards with mismatching stack in a variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_backward_invalid_max_stack_height`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_backward_invalid_max_stack_height.md) -- [x] RJUMPV forward with branches of equal stack height ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_forward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_forward.md) -- [x] RJUMPV forward with branches of equal stack height in a variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_forward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_forward.md) -- [x] RJUMPV forward with branches of different stack height ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_forward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_forward.md) -- [x] RJUMPV forward with branches of different stack height in a variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_forward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_forward.md) -- [ ] Valid infinite loop using RJUMPV (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) -- [x] Switch with equal stack height in branches ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_forward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_forward.md) -- [x] Switch with equal stack height in branches, variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_forward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_forward.md) -- [x] Switch with different stack height in branches ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_forward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_forward.md) -- [x] Switch with different stack height in branches, variable stack segment ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_forward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_forward.md) -- [x] RJUMPV to self (including variadic stack height) ([`tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_into_self`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_into_self.md)) - -##### Combinations - -- [ ] RJUMP and RJUMPI with the same target and equal stack height (ethereum/tests: src/EOFTestsFiller/efStack/forwards_rjumpi_Copier.json) -- [ ] RJUMP and RJUMPI with the same target and equal stack height in a variable stack segment (ethereum/tests: src/EOFTestsFiller/efStack/forwards_rjumpi_variable_stack_Copier.json) -- [ ] RJUMP and RJUMPI with the same target and different stack height (ethereum/tests: src/EOFTestsFiller/efStack/forwards_rjumpi_Copier.json) -- [ ] RJUMP and RJUMPI with the same target and different stack height in a variable stack segment (ethereum/tests: src/EOFTestsFiller/efStack/forwards_rjumpi_variable_stack_Copier.json) -- [ ] RJUMP and RJUMPV with the same target and equal stack height (ethereum/tests: src/EOFTestsFiller/efStack/forwards_rjumpv_Copier.json) -- [ ] RJUMP and RJUMPV with the same target and equal stack height in a variable stack segment (ethereum/tests: src/EOFTestsFiller/efStack/forwards_rjumpv_variable_stack_Copier.json) -- [ ] RJUMP and RJUMPV with the same target and different stack height (ethereum/tests: src/EOFTestsFiller/efStack/forwards_rjumpv_Copier.json) -- [ ] RJUMP and RJUMPV with the same target and different stack height in a variable stack segment (ethereum/tests: src/EOFTestsFiller/efStack/forwards_rjumpv_variable_stack_Copier.json) -- [ ] RJUMPI and RJUMPV with the same target - -#### Stack underflow - -- [x] Stack underflows ([`tests/osaka/eip7692_eof_v1/eip5450_stack/test_code_validation.py::test_all_opcodes_stack_underflow`](./eip5450_stack/test_code_validation/test_all_opcodes_stack_underflow.md)) -- [x] Stack underflow with enough items available in caller stack - can't dig into caller frame ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_eof_validity`](./eip4750_functions/test_code_validation/test_eof_validity.md)) -- [x] Stack underflow in variable stack segment, only min underflow ([`tests/osaka/eip7692_eof_v1/eip5450_stack/test_code_validation.py::test_all_opcodes_stack_underflow`](./eip5450_stack/test_code_validation/test_all_opcodes_stack_underflow.md)) -- [x] Stack underflow in variable stack segment, both min and max underflow ([`tests/osaka/eip7692_eof_v1/eip5450_stack/test_code_validation.py::test_all_opcodes_stack_underflow`](./eip5450_stack/test_code_validation/test_all_opcodes_stack_underflow.md)) - -#### CALLF - -- [x] Valid CALLFs to functions with inputs ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_eof_validity`](./eip4750_functions/test_code_validation/test_eof_validity.md)) -- [ ] CALLF stack underflows ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_eof_validity`](./eip4750_functions/test_code_validation/test_eof_validity.md)) - - [ ] ./src/EOFTestsFiller/efExample/validInvalidFiller.yml - - [ ] src/EOFTestsFiller/EIP5450/validInvalidFiller.yml -- [x] CALLF stack underflow in variable stack segment, only min underflow ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_stack_underflow_examples`](./eip4750_functions/test_code_validation/test_callf_stack_underflow_examples.md)) -- [x] CALLF stack underflow in variable stack segment, both min and max underflow ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_stack_underflow_examples`](./eip4750_functions/test_code_validation/test_callf_stack_underflow_examples.md)) -- [ ] Branching to CALLFs with the same number of outputs (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) -- [ ] Check that CALLF stack inputs/outputs equal to target section type definition - -#### RETF - -- [ ] Valid RETF with correct number of items on stack ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_eof_validity`](./eip4750_functions/test_code_validation/test_eof_validity.md)) - - [ ] src/EOFTestsFiller/EIP5450/validInvalidFiller.yml -- [ ] Invalid RETF with extra items on stack ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_eof_validity`](./eip4750_functions/test_code_validation/test_eof_validity.md)) - - [ ] ./src/EOFTestsFiller/efExample/validInvalidFiller.yml -- [x] RETF stack underflow ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_eof_validity`](./eip4750_functions/test_code_validation/test_eof_validity.md)) -- [x] RETF reached via different paths ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_eof_validity`](./eip4750_functions/test_code_validation/test_eof_validity.md)) -- [x] RETF in variable stack segment is not allowed ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_eof_validity`](./eip4750_functions/test_code_validation/test_eof_validity.md)) -- [ ] Extra items on stack allowed for terminating instructions other than RETF (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) -- [x] Invalid RETF in a non-returning function ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_first_section_returning`](./eip6206_jumpf/test_nonreturning_validation/test_first_section_returning.md)) - -#### JUMPF - -- [x] Extra items on stack are allowed for JUMPF to non-returning function ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_non_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_non_returning.md) [`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_non_returning_variable_stack`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_non_returning_variable_stack.md)) -- [x] JUMPF stack underflows ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_non_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_non_returning.md) [`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning.md)) -- [x] JUMPF stack underflow in a variable stack segment - only min underflow ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_non_returning_variable_stack`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_non_returning_variable_stack.md)) -- [x] JUMPF stack underflow in a variable stack segment - both min and max underflow ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_non_returning_variable_stack`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_non_returning_variable_stack.md)) -- [x] JUMPF into function with the same number of outputs ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning.md)) -- [x] JUMPF into function with fewer outputs than current one ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning.md)) -- [x] Extra items on stack are allowed for JUMPF to returning function ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning.md)) -- [x] JUMPF to returning in a variable stack segment is not allowed ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning_variable_stack_1`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning_variable_stack_1.md) [`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning_variable_stack_2`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning_variable_stack_2.md) [`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning_variable_stack_3`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning_variable_stack_3.md)) -- (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_to_returning_variable_stack_Copier.json) -- [x] Invalid JUMPF in a non-returning function ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_retf_in_nonreturning`](./eip6206_jumpf/test_nonreturning_validation/test_retf_in_nonreturning.md)) -- [ ] Truncated JUMPF immediate - -#### Stack overflow - -##### CALLF - -- [x] Max allowed stack height reached in CALLF-ed function ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_stack_overflow`](./eip4750_functions/test_code_validation/test_callf_stack_overflow.md)) -- [x] CALLF validation time stack overflow ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_stack_overflow_after_callf`](./eip4750_functions/test_code_validation/test_callf_stack_overflow_after_callf.md)) -- [x] Max allowed stack height reached in CALLF-ed function with inputs ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_with_inputs_stack_overflow`](./eip4750_functions/test_code_validation/test_callf_with_inputs_stack_overflow.md)) -- [x] CALLF validation time stack overflow in function with inputs ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_with_inputs_stack_overflow`](./eip4750_functions/test_code_validation/test_callf_with_inputs_stack_overflow.md)) -- [x] Max allowed stack height reached in CALLF-ed function. CALLF in variable stack segment. ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_stack_overflow_variable_stack`](./eip4750_functions/test_code_validation/test_callf_stack_overflow_variable_stack.md) [`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_stack_overflow_variable_stack_2`](./eip4750_functions/test_code_validation/test_callf_stack_overflow_variable_stack_2.md))) -- [x] CALLF validation time stack overflow in variable stack segment. ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_stack_overflow_variable_stack_3`](./eip4750_functions/test_code_validation/test_callf_stack_overflow_variable_stack_3.md) [`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_stack_overflow_variable_stack_4`](./eip4750_functions/test_code_validation/test_callf_stack_overflow_variable_stack_4.md))) -- [x] Max allowed stack height reached in CALLF-ed function with inputs. CALLF in variable stack segment. ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_with_inputs_stack_overflow_variable_stack`](./eip4750_functions/test_code_validation/test_callf_with_inputs_stack_overflow_variable_stack.md)) -- [x] CALLF validation time stack overflow in function with inputs in variable stack segment. ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_with_inputs_stack_overflow_variable_stack`](./eip4750_functions/test_code_validation/test_callf_with_inputs_stack_overflow_variable_stack.md)) -- [ ] Function inputs are accessible and accounted for (no stack underflow if they are popped) (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) - -##### JUMPF - -- [x] Max allowed stack height reached in JUMPF-ed function ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_other_stack_overflow`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_other_stack_overflow.md)) -- [x] JUMPF validation time stack overflow ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_other_stack_overflow`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_other_stack_overflow.md)) -- [x] Max allowed stack height reached in JUMPF-ed function with inputs ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow.md)) -- [x] JUMPF validation time stack overflow in function with inputs ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow.md)) -- [x] JUMPF validation time stack overflow in function with inputs, variable stack segment, only max overflow ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow_variable_stack`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow_variable_stack.md)) -- [x] JUMPF validation time stack overflow in function with inputs, variable stack segment, both max and min overflow ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow_variable_stack`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow_variable_stack.md)) -- [x] Max allowed stack height reached in JUMPF-ed function. JUMPF in variable stack segment. ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_variadic_stack_overflow`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_variadic_stack_overflow.md)) -- [x] JUMPF validation time stack overflow in variable stack segment - only max overflow. ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_variadic_stack_overflow`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_variadic_stack_overflow.md)) -- [x] JUMPF validation time stack overflow in variable stack segment - both min and max overflow. ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_variadic_stack_overflow`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_variadic_stack_overflow.md)) -- [x] Max allowed stack height reached in JUMPF-ed function with inputs. JUMPF in variable stack segment. ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow_variable_stack`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow_variable_stack.md)) -- [x] JUMPF validation time stack overflow in function with inputs in variable stack segment. ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow_variable_stack`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow_variable_stack.md)) - -#### SWAPN/DUPN/EXCHANGE - -- [ ] Valid DUPN with enough items on stack (ethereum/tests: src/EOFTestsFiller/efStack/dupn_stack_validation_Copier.json) -- [ ] DUPN stack underflow (ethereum/tests: src/EOFTestsFiller/efStack/dupn_stack_validation_Copier.json) -- [ ] Valid SWAPN with enough items on stack (ethereum/tests: src/EOFTestsFiller/efStack/swapn_stack_validation_Copier.json) -- [ ] SWAPN stack underflow (ethereum/tests: src/EOFTestsFiller/efStack/swapn_stack_validation_Copier.json) -- [ ] Valid EXCHANGE with enough items on stack (ethereum/tests: src/EOFTestsFiller/efStack/exchange_deep_stack_validation_Copier.json src/EOFTestsFiller/efStack/exchange_stack_validation_Copier.json) -- [ ] EXCHANGE stack underflow (ethereum/tests: src/EOFTestsFiller/efStack/exchange_stack_validation_Copier.json src/EOFTestsFiller/efStack/exchange_empty_stack_validation_Copier.json) - -#### Other - -- [ ] Wrong max_stack_height (ethereum/tests: ./src/EOFTestsFiller/efExample/validInvalidFiller.yml src/EOFTestsFiller/efValidation/max_stack_height_Copier.json) -- [ ] All opcodes correctly account for stack inputs/outputs (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) -- [ ] Code reachable only via backwards jump is invalid -- [x] Maximally broad [0, 1023] stack range ([`tests/osaka/eip7692_eof_v1/eip_5450_stack/test_code_validation.py::test_stack_range_maximally_broad`](./eip5450_stack/test_code_validation/test_stack_range_maximally_broad.md)) - -### Execution - -- [x] Max stack size (1024) in CALLF-ed function ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_callf_execution.py::test_callf_operand_stack_size_max`](./eip4750_functions/test_callf_execution/test_callf_operand_stack_size_max.md) - - -## EIP-6206: EOF - JUMPF and non-returning functions - -### Validation - -- [x] Zero section returning ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_first_section_returning`](./eip6206_jumpf/test_nonreturning_validation/test_first_section_returning.md), ethereum/tests: ./src/EOFTestsFiller/efExample/validInvalidFiller.yml src/EOFTestsFiller/EIP4750/validInvalidFiller.yml) -- [x] Zero section declared non-returning but ends with RETF ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_retf_in_nonreturning`](./eip6206_jumpf/test_nonreturning_validation/test_retf_in_nonreturning.md), ethereum/tests: src/EOFTestsFiller/EIP4750/validInvalidFiller.yml) -- [x] CALLF into non-returning function ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_callf_to_nonreturning`](./eip6206_jumpf/test_nonreturning_validation/test_callf_to_nonreturning.md)) -- [x] Valid JUMPF into sections with equal number of outputs ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_execution.py::test_jumpf_to_retf`](./eip6206_jumpf/test_jumpf_execution/test_jumpf_to_retf.md)) -- [x] Valid JUMPF into sections with different but compatible number of outputs ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_execution.py::test_jumpf_to_retf`](./eip6206_jumpf/test_jumpf_execution/test_jumpf_to_retf.md)) -- [x] JUMPF into sections with incompatible outputs ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_incompatible_outputs`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_incompatible_outputs.md)) -- [x] Non-returning section without JUMPF ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_execution.py::test_jumpf_forward`](./eip6206_jumpf/test_jumpf_execution/test_jumpf_forward.md)) -- [x] Non-returning section with JUMPF ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_jumpf_in_nonreturning`](./eip6206_jumpf/test_nonreturning_validation/test_jumpf_in_nonreturning.md)) -- [x] Returning section with RETF ([`tests/osaka/eip7692_eof_v1/eip4750_functions/test_callf_execution.py::test_callf`](./eip4750_functions/test_callf_execution/test_callf.md)) -- [x] Returning section with JUMPF ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_returning_jumpf`](./eip6206_jumpf/test_jumpf_validation/test_returning_jumpf.md)) -- [x] Returning section with JUMPF to returning and RETF ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_execution.py::test_jumpf_to_retf`](./eip6206_jumpf/test_jumpf_execution/test_jumpf_to_retf.md)) -- [x] Returning section with JUMPF to non-returning and RETF ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_returning_jumpf`](./eip6206_jumpf/test_jumpf_validation/test_returning_jumpf.md)) -- [x] Returning section without JUMPF nor RETF ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_returning_section_not_returning`](./eip6206_jumpf/test_nonreturning_validation/test_returning_section_not_returning.md)) -- [x] Invalid non-returning flag ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_returning_section_not_returning`](./eip6206_jumpf/test_nonreturning_validation/test_returning_section_not_returning.md)) -- [x] Circular JUMPF between two sections ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_execution.py::test_jumpf_infinite_loop`](./eip6206_jumpf/test_jumpf_execution/test_jumpf_infinite_loop.md)) -- [x] JUMPF into non-existing section ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_invalid_code_section_index`](./eip6206_jumpf/test_jumpf_validation/test_invalid_code_section_index.md)) - -## EIP-7480: EOF - Data section access instructions - -### Validation - -- [x] Valid DATALOADN with various offsets ([`tests/osaka/eip7692_eof_v1/eip7480_data_section/test_data_opcodes.py::test_dataloadn`](./eip7480_data_section/test_data_opcodes/test_dataloadn.md) -- [x] Truncated DATALOADN immediate ([`tests/osaka/eip7692_eof_v1/eip7480_data_section/test_code_validation.py::test_dataloadn_truncated_immediate`](./eip7480_data_section/test_code_validation/test_dataloadn_truncated_immediate.md) -- [x] DATALOADN offset out of bounds ([`tests/osaka/eip7692_eof_v1/eip7480_data_section/test_code_validation.py::test_invalid_containers_with_data_section`](./eip7480_data_section/test_code_validation/test_invalid_containers_with_data_section.md) -- [x] DATALOADN accessing not full word ([`tests/osaka/eip7692_eof_v1/eip7480_data_section/test_code_validation.py::test_invalid_containers_with_data_section`](./eip7480_data_section/test_code_validation/test_invalid_containers_with_data_section.md) - -## EIP-663: SWAPN, DUPN and EXCHANGE instructions - -### Validation - -- [ ] A DUPN instruction causes stack overflow -- [ ] A DUPN instruction causes stack underflow -- [ ] A DUPN instruction causes max stack height mismatch -- [ ] A SWAPN instruction causes stack underflow - -### Execution - -- [x] Positive tests for DUPN instructions ([`./tests/osaka/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_dupn.py::test_dupn_all_valid_immediates`](./eip663_dupn_swapn_exchange/test_dupn/test_dupn_all_valid_immediates.md)) -- [x] Positive tests for SWAPN instructions ([`./tests/osaka/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_swapn.py::test_swapn_all_valid_immediates`](./eip663_dupn_swapn_exchange/test_swapn/test_swapn_all_valid_immediates.md)) -- [x] Positive tests for EXCHANGE instruction ([`./tests/osaka/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_exchange.py::test_exchange_all_valid_immediates`](./eip663_dupn_swapn_exchange/test_exchange/test_exchange_all_valid_immediates.md)) - -## EIP-7069: Revamped CALL instructions - -### Execution - -- [x] EXTDELEGATECALL from EOF to EOF ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_eof_sstore`](./eip7069_extcall/test_calls/test_eof_calls_eof_sstore.md)) -- [x] EXTDELEGATECALL from EOF to legacy fails ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_legacy_sstore`](./eip7069_extcall/test_calls/test_eof_calls_legacy_sstore.md)) -- [ ] EXTDELEGATECALL forwards static mode (evmone-tests: state_tests/state_transition/eof_calls/extdelegatecall_static.json) -- [x] EXTCALL with value success ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_with_value`](./eip7069_extcall/test_calls/test_eof_calls_with_value.md)) -- [x] EXTCALL with value from EXTSTATICCALL ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_static_flag_with_value`](./eip7069_extcall/test_calls/test_eof_calls_static_flag_with_value.md)) -- [x] EXTCALL with value, not enough balance ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_with_value`](./eip7069_extcall/test_calls/test_eof_calls_with_value.md)) -- [x] EXTCALL with value, check additional charge for value ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_gas.py::test_ext_calls_gas`](./eip7069_extcall/test_gas/test_ext_calls_gas.md)) -- [x] EXTCALL with gas not enough for callee to get 5000 gas ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_min_callee_gas`](./eip7069_extcall/test_calls/test_eof_calls_min_callee_gas.md)) -- [x] RETURNDATA* after EXTCALL ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_returndataload.py`](./eip7069_extcall/test_returndataload/index.md)) -- [x] RETURNDATA* after EXTDELEGATECALL ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_returndataload.py`](./eip7069_extcall/test_returndataload/index.md)) -- [x] RETURNDATA* after EXTSTATICCALL ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_returndataload.py`](./eip7069_extcall/test_returndataload/index.md)) -- [x] RETURNDATA* after aborted EXT*CALL ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_clear_return_buffer`](./eip7069_extcall/test_calls/test_eof_calls_clear_return_buffer.md)) -- [x] Failed EXTCALL clears returndata from previous EXTCALL ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_clear_return_buffer`](./eip7069_extcall/test_calls/test_eof_calls_clear_return_buffer.md)) -- [x] EXTCALL not enough gas for input memory charge ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_gas.py::test_ext_calls_gas`](./eip7069_extcall/test_gas/test_ext_calls_gas.md)) -- [x] EXTDELEGATECALL not enough gas for input memory charge ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_gas.py::test_ext_calls_gas`](./eip7069_extcall/test_gas/test_ext_calls_gas.md)) -- [x] EXTSTATICCALL not enough gas for input memory charge ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_gas.py::test_ext_calls_gas`](./eip7069_extcall/test_gas/test_ext_calls_gas.md)) -- [x] EXTCALL exception due to target address overflow (bits set in high 12 bytes) ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_address_space_extension.py`](./eip7069_extcall/test_address_space_extension/index.md)) -- [x] EXTDELEGATECALL exception due to target address overflow (bits set in high 12 bytes) ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_address_space_extension.py`](./eip7069_extcall/test_address_space_extension/index.md)) -- [x] EXTSTATICCALL exception due to target address overflow (bits set in high 12 bytes) ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_address_space_extension.py`](./eip7069_extcall/test_address_space_extension/index.md)) -- [x] EXTCALL not enough gas for warming up target address ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_gas.py::test_ext_calls_gas`](./eip7069_extcall/test_gas/test_ext_calls_gas.md)) -- [x] EXTDELEGATECALL not enough gas for warming up target address ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_gas.py::test_ext_calls_gas`](./eip7069_extcall/test_gas/test_ext_calls_gas.md)) -- [x] EXTSTATICCALL not enough gas for warming up target address ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_gas.py::test_ext_calls_gas`](./eip7069_extcall/test_gas/test_ext_calls_gas.md)) -- [x] EXTCALL not enough gas for account creation cost (transfer value to non-existing account) ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_gas.py::test_ext_calls_gas`](./eip7069_extcall/test_gas/test_ext_calls_gas.md)) -- [x] OOG after EXTCALL ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_eof_then_fails`](./eip7069_extcall/test_calls/test_eof_calls_eof_then_fails.md)) -- [x] OOG after EXTDELEGATECALL ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_eof_then_fails`](./eip7069_extcall/test_calls/test_eof_calls_eof_then_fails.md)) -- [x] OOG after EXTSTATICCALL ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_eof_then_fails`](./eip7069_extcall/test_calls/test_eof_calls_eof_then_fails.md)) -- [x] REVERT inside EXTCALL ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_callee_fails`](./eip7069_extcall/test_calls/test_callee_fails.md)) -- [x] REVERT inside EXTDELEGATECALL ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_callee_fails`](./eip7069_extcall/test_calls/test_callee_fails.md)) -- [x] REVERT inside EXTSTATICCALL ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_callee_fails`](./eip7069_extcall/test_calls/test_callee_fails.md)) -- [x] EXTCALL with input (`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calldata.py`) -- [x] EXTDELEGATECALL with input (`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calldata.py`) -- [x] EXTSTATICCALL with input (`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calldata.py`) -- [x] EXTCALL with just enough gas for MIN_RETAINED_GAS and MIN_CALLEE_GAS ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_min_callee_gas`](./eip7069_extcall/test_calls/test_eof_calls_min_callee_gas.md)) -- [x] EXTCALL with not enough gas for MIN_CALLEE_GAS ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_min_callee_gas`](./eip7069_extcall/test_calls/test_eof_calls_min_callee_gas.md)) -- [x] ADDRESS and CALLER inside EXTCALL ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_callee_context`](./eip7069_extcall/test_calls/test_callee_context.md)) -- [x] ADDRESS and CALLER inside EXTDELEGATECALL ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_callee_context`](./eip7069_extcall/test_calls/test_callee_context.md)) -- [x] ADDRESS and CALLER inside EXTSTATICCALL ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_callee_context`](./eip7069_extcall/test_calls/test_callee_context.md)) -- [ ] Refund inside EXTCALL is applied after the transaction (evmone-tests: state_tests/state_transition/eof_calls/extcall_gas_refund_propagation.json) -- [ ] Refund inside EXTDELEGATECALL is applied after the transaction (evmone-tests: state_tests/state_transition/eof_calls/extdelegatecall_gas_refund_propagation.json) -- [x] EXTSTATICCALL from EOF to non-pure legacy contract failing ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_legacy_sstore`](./eip7069_extcall/test_calls/test_eof_calls_legacy_sstore.md)) -- [x] EXTSTATICCALL from EOF to pure EOF contract ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_legacy_mstore`](./eip7069_extcall/test_calls/test_eof_calls_legacy_mstore.md)) -- [x] EXTSTATICCALL from EOF to non-pure EOF contract failing ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_eof_sstore`](./eip7069_extcall/test_calls/test_eof_calls_eof_sstore.md)) -- [x] `*CALLs` from legacy contracts to EOF contracts (ethereum/tests: ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_legacy_calls_eof_sstore`](./eip7069_extcall/test_calls/test_eof_calls_eof_sstore.md)) -- [x] `EXT*CALLs` from EOF to legacy contracts ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_legacy_sstore`](./eip7069_extcall/test_calls/test_eof_calls_eof_sstore.md)) -- [x] EXTDELEGATECALL from EOF to EOF contract ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_eof_sstore`](./eip7069_extcall/test_calls/test_eof_calls_eof_sstore.md)) -- [x] EXTDELEGATECALL from EOF to legacy contract failing ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_extdelegate_call_targets`](./eip7069_extcall/test_calls/test_extdelegate_call_targets.md)) -- [x] EXTDELEGATECALL from EOF to EOA failing ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_extdelegate_call_targets`](./eip7069_extcall/test_calls/test_extdelegate_call_targets.md)) -- [x] EXTDELEGATECALL from EOF to empty account failing ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_extdelegate_call_targets`](./eip7069_extcall/test_calls/test_extdelegate_call_targets.md)) -- [x] EXTDELEGATECALL to EIP-7702 delegate ([`./tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_extdelegate_call_targets`](./eip7069_extcall/test_calls/test_extdelegate_call_targets.md)) - - -## EIP-7620: EOF Contract Creation - -### Validation - -- [ ] Valid EOFCREATEs referring to various container numbers (ethereum/tests: ./src/EOFTestsFiller/efValidation/EOF1_eofcreate_valid_Copier.json) -- [x] Truncated before EOFCREATE immediate ([`tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_eofcreate.py`](./eip7620_eof_create/test_eofcreate/index.md)`-k test_eofcreate_invalid_truncated_immediate`) -- [ ] EOFCREATE is not a valid terminating instruction -- [x] EOFCREATE immediate referring to non-existing container ([`tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_eofcreate.py`](./eip7620_eof_create/test_eofcreate/index.md)`-k test_eofcreate_invalid_index`) -- [x] EOFCREATE immediate referring to container with truncated data ([`tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_eofcreate.py`](./eip7620_eof_create/test_eofcreate/index.md)`-k test_eofcreate_truncated_container`) -- [x] Valid RETURNCODEs referring to various container numbers ([`tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_returncode.py`](./eip7620_eof_create/test_returncode/index.md)`-k test_returncode_valid_index`) -- [x] Truncated before RETURNCODE immediate ([`tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_returncode.py::test_returncode_invalid_truncated_immediate`](./eip7620_eof_create/test_returncode/test_returncode_invalid_truncated_immediate.md)) -- [x] RETURNCODE immediate referring to non-existing container ([`tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_returncode.py`](./eip7620_eof_create/test_returncode/index.md)`-k test_returncode_invalid_index`) -- [x] Unreachable code after RETURNCODE, check that RETURNCODE is terminating ([`tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_returncode.py::test_returncode_terminating`](./eip7620_eof_create/test_returncode/test_returncode_terminating.md)) - -### Execution - -- [ ] CREATE with EOF initcode fails in Prague (evmone-tests: state_tests/state_transition/eof_create/create_with_eof_initcode.json) -- [ ] CREATE with EOF initcode fails in Cancun (evmone-tests: state_tests/state_transition/eof_create/create_with_eof_initcode_cancun.json) -- [ ] CREATE2 with EOF initcode fails in Prague (evmone-tests: state_tests/state_transition/eof_create/create2_with_eof_initcode.json) -- [ ] CREATE2 with EOF initcode fails in Cancun (evmone-tests: state_tests/state_transition/eof_create/create2_with_eof_initcode_cancun.json) -- [ ] CREATE with legacy initcode and EOF deploy code fails (evmone-tests: state_tests/state_transition/eof_create/create_deploying_eof.json) -- [ ] CREATE2 with legacy initcode and EOF deploy code fails (evmone-tests: state_tests/state_transition/eof_create/create2_deploying_eof.json) -- [ ] EOFCREATE success with empty aux data (evmone-tests: state_tests/state_transition/eof_create/eofcreate_empty_auxdata.json) -- [ ] EOFCREATE success with aux data length equal to declared in deploy container (evmone-tests: state_tests/state_transition/eof_create/eofcreate_auxdata_equal_to_declared.json) -- [ ] EOFCREATE success with aux data longer than size declared in deploy container (evmone-tests: state_tests/state_transition/eof_create/eofcreate_auxdata_longer_than_declared.json) -- [ ] EOFCREATE with aux data shorter than size declared in deploy container fails (evmone-tests: state_tests/state_transition/eof_create/eofcreate_auxdata_shorter_than_declared.json) -- [ ] EOFCREATE success deploying DATALOADN referring to aux data portion of deploy container data (evmone-tests: state_tests/state_transition/eof_create/eofcreate_dataloadn_referring_to_auxdata.json) -- [ ] EOFCREATE success with deploy container having aux data and subcontainer (evmone-tests: state_tests/state_transition/eof_create/eofcreate_with_auxdata_and_subcontainer.json) -- [ ] REVERT in initcontainer (evmone-tests: state_tests/state_transition/eof_create/eofcreate_revert_empty_returndata.json) -- [ ] REVERT with return data in initcontainer (evmone-tests: state_tests/state_transition/eof_create/eofcreate_revert_non_empty_returndata.json) -- [ ] Exceptional abort in initcontainer (evmone-tests: state_tests/state_transition/eof_create/eofcreate_initcontainer_aborts.json) -- [ ] EOFCREATE with deploy container of max size 0x6000 (evmone-tests: state_tests/state_transition/eof_create/eofcreate_deploy_container_max_size.json) -- [ ] EOFCREATE with deploy container size above limit (evmone-tests: state_tests/state_transition/eof_create/eofcreate_deploy_container_too_large.json) -- [ ] EOFCREATE with deploy container data size above 64K after appending aux data (evmone-tests: state_tests/state_transition/eof_create/eofcreate_appended_data_size_larger_than_64K.json) -- [ ] EOFCREATE with deploy container size above limit after appending aux data (evmone-tests: state_tests/state_transition/eof_create/eofcreate_deploy_container_with_aux_data_too_large.json) -- [ ] EOFCREATE success nested in EOFCREATE initcode (evmone-tests: state_tests/state_transition/eof_create/eofcreate_nested_eofcreate.json) -- [ ] EOFCREATE success nested in EOFCREATE initcode that reverts (evmone-tests: state_tests/state_transition/eof_create/eofcreate_nested_eofcreate_revert.json) -- [ ] EOFCREATE with value success -- [ ] EOFCREATE with value - not enough caller balance (evmone-tests: state_tests/state_transition/eof_create/eofcreate_caller_balance_too_low.json) -- [ ] EOFCREATE not enough gas for initcode (EIP-3860) charge (evmone-tests: state_tests/state_transition/eof_create/eofcreate_not_enough_gas_for_initcode_charge.json) -- [ ] EOFCREATE not enough gas for input memory expansion (evmone-tests: state_tests/state_transition/eof_create/eofcreate_not_enough_gas_for_mem_expansion.json) -- [ ] RETURNCODE not enough gas for aux data memory expansion (evmone-tests: state_tests/state_transition/eof_create/returncode_not_enough_gas_for_mem_expansion.json) -- [ ] Successful EOFCREATE clears returndata (evmone-tests: state_tests/state_transition/eof_create/eofcreate_clears_returndata.json) -- [ ] Second EOFCREATE with the same container and salt fails (evmone-tests: state_tests/state_transition/eof_create/eofcreate_failure_after_eofcreate_success.json) -- [ ] Call created contract after EOFCREATE (evmone-tests: state_tests/state_transition/eof_create/eofcreate_call_created_contract.json) - -## EIP-7698: EOF - Creation transaction - -TODO: replace with `EIP-7873: EOF - TXCREATE and InitcodeTransaction type` test cases - -### Execution - -- [ ] Creation transaction success with empty deploy container data (evmone-tests: state_tests/state_transition/eof_create/creation_tx.json) -- [ ] Creation transaction success with data in deploy container without aux data (evmone-tests: state_tests/state_transition/eof_create/creation_tx_deploy_data.json) -- [ ] Creation transaction success with data in deploy container with aux data length equal to declared (evmone-tests: state_tests/state_transition/eof_create/creation_tx_static_auxdata_in_calldata.json) -- [ ] Creation transaction success with data in deploy container with aux data longer than declared (evmone-tests: state_tests/state_transition/eof_create/creation_tx_dynamic_auxdata_in_calldata.json) -- [ ] Creation transaction success deploying DATALOADN referring to aux data portion of deploy container data (evmone-tests: state_tests/state_transition/eof_create/creation_tx_dataloadn_referring_to_auxdata.json) -- [ ] Exceptional abort in creation transaction initcode (evmone-tests: state_tests/state_transition/eof_create/creation_tx_initcontainer_aborts.json) -- [ ] RETURN in creation transaction initcode fails (evmone-tests: state_tests/state_transition/eof_create/creation_tx_initcontainer_return.json) -- [ ] STOP in creation transaction initcode fails (evmone-tests: state_tests/state_transition/eof_create/creation_tx_initcontainer_stop.json) -- [ ] Creation transaction with initcode of max allowed size 0xc000 (evmone-tests: state_tests/state_transition/eof_create/creation_tx_initcontainer_max_size.json) -- [ ] Creation transaction with initcode size above limit (evmone-tests: state_tests/state_transition/eof_create/creation_tx_initcontainer_too_large.json) -- [ ] Creation transaction deploys container of max allowed size 0x6000 (evmone-tests: state_tests/state_transition/eof_create/creation_tx_deploy_container_max_size.json) -- [ ] Creation transaction deploying container of size above limit fails (evmone-tests: state_tests/state_transition/eof_create/creation_tx_deploy_container_too_large.json) -- [ ] EOFCREATE success nested in creation transaction initcode (evmone-tests: state_tests/state_transition/eof_create/creation_tx_nested_eofcreate.json) -- [ ] Creation transaction with invalid initcontainer (invalid header) (evmone-tests: state_tests/state_transition/eof_create/creation_tx_invalid_initcode_header.json) -- [ ] Creation transaction with invalid initcontainer (invalid EOF version) (evmone-tests: state_tests/state_transition/eof_create/creation_tx_invalid_eof_version.json) -- [ ] Creation transaction with invalid initcontainer (invalid max stack height) (evmone-tests: state_tests/state_transition/eof_create/creation_tx_invalid_initcode.json) -- [ ] Creation transaction fails if initcontainer has truncated data section (declared size > present data size ) (evmone-tests: state_tests/state_transition/eof_create/creation_tx_truncated_data_initcode.json) -- [ ] Creation transaction with invalid deploy container (evmone-tests: state_tests/state_transition/eof_create/creation_tx_invalid_deploycode.json) -- [ ] Create transaction with legacy initcode and EOF deploy code fails (evmone-tests: state_tests/state_transition/eof_create/creation_tx_deploying_eof.json) -- [ ] EOF creation transaction fails before Prague (evmone-tests: state_tests/state_transition/eof_create/initcode_transaction_before_osaka.json) diff --git a/tests/prague/eip7702_set_code_tx/test_set_code_txs_2.py b/tests/prague/eip7702_set_code_tx/test_set_code_txs_2.py index f8ff7dca71d..6cd2d2b3dbd 100644 --- a/tests/prague/eip7702_set_code_tx/test_set_code_txs_2.py +++ b/tests/prague/eip7702_set_code_tx/test_set_code_txs_2.py @@ -891,7 +891,7 @@ def test_static_to_pointer(state_test: StateTestFiller, pre: Alloc): ) -@pytest.mark.valid_from("Osaka") +@pytest.mark.valid_from("EOFv1") def test_pointer_to_eof(state_test: StateTestFiller, pre: Alloc): """ Tx -> call -> pointer A -> EOF diff --git a/tests/speculative/__init__.py b/tests/speculative/__init__.py new file mode 100644 index 00000000000..de5e463c45d --- /dev/null +++ b/tests/speculative/__init__.py @@ -0,0 +1 @@ +"""Test cases for speculative EVM functionality. A temporary home for features that are not yet CFI'd for inclusion in the next hardfork.""" # noqa: E501 diff --git a/tests/osaka/eip7692_eof_v1/__init__.py b/tests/speculative/eip7692_eof_v1/__init__.py similarity index 98% rename from tests/osaka/eip7692_eof_v1/__init__.py rename to tests/speculative/eip7692_eof_v1/__init__.py index 32bdc8ddb69..39b893bb4af 100644 --- a/tests/osaka/eip7692_eof_v1/__init__.py +++ b/tests/speculative/eip7692_eof_v1/__init__.py @@ -19,4 +19,4 @@ - [ethpandaops/eof-devnet-0](https://notes.ethereum.org/@ethpandaops/eof-devnet-0). """ # noqa: E501 -EOF_FORK_NAME = "Osaka" +EOF_FORK_NAME = "EOFv1" diff --git a/tests/osaka/eip7692_eof_v1/eip3540_eof_v1/__init__.py b/tests/speculative/eip7692_eof_v1/eip3540_eof_v1/__init__.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip3540_eof_v1/__init__.py rename to tests/speculative/eip7692_eof_v1/eip3540_eof_v1/__init__.py diff --git a/tests/osaka/eip7692_eof_v1/eip3540_eof_v1/opcodes.py b/tests/speculative/eip7692_eof_v1/eip3540_eof_v1/opcodes.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip3540_eof_v1/opcodes.py rename to tests/speculative/eip7692_eof_v1/eip3540_eof_v1/opcodes.py diff --git a/tests/osaka/eip7692_eof_v1/eip3540_eof_v1/spec.py b/tests/speculative/eip7692_eof_v1/eip3540_eof_v1/spec.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip3540_eof_v1/spec.py rename to tests/speculative/eip7692_eof_v1/eip3540_eof_v1/spec.py diff --git a/tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py b/tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py rename to tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py diff --git a/tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_size.py b/tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_size.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_size.py rename to tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_size.py diff --git a/tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py b/tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py rename to tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py diff --git a/tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_eof_example.py b/tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_eof_example.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_eof_example.py rename to tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_eof_example.py diff --git a/tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_execution.py b/tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_execution.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_execution.py rename to tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_execution.py diff --git a/tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_execution_function.py b/tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_execution_function.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_execution_function.py rename to tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_execution_function.py diff --git a/tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_extcode.py b/tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_extcode.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_extcode.py rename to tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_extcode.py diff --git a/tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_migrated_valid_invalid.py b/tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_migrated_valid_invalid.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_migrated_valid_invalid.py rename to tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_migrated_valid_invalid.py diff --git a/tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_opcodes_in_legacy.py b/tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_opcodes_in_legacy.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_opcodes_in_legacy.py rename to tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_opcodes_in_legacy.py diff --git a/tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_section_header_body_mismatch.py b/tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_section_header_body_mismatch.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_section_header_body_mismatch.py rename to tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_section_header_body_mismatch.py diff --git a/tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py b/tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py rename to tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py diff --git a/tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_section_size.py b/tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_section_size.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_section_size.py rename to tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_section_size.py diff --git a/tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/__init__.py b/tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/__init__.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/__init__.py rename to tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/__init__.py diff --git a/tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/helpers.py b/tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/helpers.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/helpers.py rename to tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/helpers.py diff --git a/tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py b/tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py rename to tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py diff --git a/tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py b/tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py rename to tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py diff --git a/tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py b/tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py rename to tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py diff --git a/tests/osaka/eip7692_eof_v1/eip4750_functions/__init__.py b/tests/speculative/eip7692_eof_v1/eip4750_functions/__init__.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip4750_functions/__init__.py rename to tests/speculative/eip7692_eof_v1/eip4750_functions/__init__.py diff --git a/tests/osaka/eip7692_eof_v1/eip4750_functions/helpers.py b/tests/speculative/eip7692_eof_v1/eip4750_functions/helpers.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip4750_functions/helpers.py rename to tests/speculative/eip7692_eof_v1/eip4750_functions/helpers.py diff --git a/tests/osaka/eip7692_eof_v1/eip4750_functions/test_callf_execution.py b/tests/speculative/eip7692_eof_v1/eip4750_functions/test_callf_execution.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip4750_functions/test_callf_execution.py rename to tests/speculative/eip7692_eof_v1/eip4750_functions/test_callf_execution.py diff --git a/tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py b/tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip4750_functions/test_code_validation.py rename to tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py diff --git a/tests/osaka/eip7692_eof_v1/eip5450_stack/__init__.py b/tests/speculative/eip7692_eof_v1/eip5450_stack/__init__.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip5450_stack/__init__.py rename to tests/speculative/eip7692_eof_v1/eip5450_stack/__init__.py diff --git a/tests/osaka/eip7692_eof_v1/eip5450_stack/test_code_validation.py b/tests/speculative/eip7692_eof_v1/eip5450_stack/test_code_validation.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip5450_stack/test_code_validation.py rename to tests/speculative/eip7692_eof_v1/eip5450_stack/test_code_validation.py diff --git a/tests/osaka/eip7692_eof_v1/eip5450_stack/test_execution.py b/tests/speculative/eip7692_eof_v1/eip5450_stack/test_execution.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip5450_stack/test_execution.py rename to tests/speculative/eip7692_eof_v1/eip5450_stack/test_execution.py diff --git a/tests/osaka/eip7692_eof_v1/eip6206_jumpf/__init__.py b/tests/speculative/eip7692_eof_v1/eip6206_jumpf/__init__.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip6206_jumpf/__init__.py rename to tests/speculative/eip7692_eof_v1/eip6206_jumpf/__init__.py diff --git a/tests/osaka/eip7692_eof_v1/eip6206_jumpf/helpers.py b/tests/speculative/eip7692_eof_v1/eip6206_jumpf/helpers.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip6206_jumpf/helpers.py rename to tests/speculative/eip7692_eof_v1/eip6206_jumpf/helpers.py diff --git a/tests/osaka/eip7692_eof_v1/eip6206_jumpf/spec.py b/tests/speculative/eip7692_eof_v1/eip6206_jumpf/spec.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip6206_jumpf/spec.py rename to tests/speculative/eip7692_eof_v1/eip6206_jumpf/spec.py diff --git a/tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_execution.py b/tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_execution.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_execution.py rename to tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_execution.py diff --git a/tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py b/tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py rename to tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py diff --git a/tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_target.py b/tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_target.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_target.py rename to tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_target.py diff --git a/tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py b/tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py rename to tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py diff --git a/tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py b/tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py rename to tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py diff --git a/tests/osaka/eip7692_eof_v1/eip663_dupn_swapn_exchange/__init__.py b/tests/speculative/eip7692_eof_v1/eip663_dupn_swapn_exchange/__init__.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip663_dupn_swapn_exchange/__init__.py rename to tests/speculative/eip7692_eof_v1/eip663_dupn_swapn_exchange/__init__.py diff --git a/tests/osaka/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_dupn.py b/tests/speculative/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_dupn.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_dupn.py rename to tests/speculative/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_dupn.py diff --git a/tests/osaka/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_exchange.py b/tests/speculative/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_exchange.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_exchange.py rename to tests/speculative/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_exchange.py diff --git a/tests/osaka/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_swapn.py b/tests/speculative/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_swapn.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_swapn.py rename to tests/speculative/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_swapn.py diff --git a/tests/osaka/eip7692_eof_v1/eip7069_extcall/__init__.py b/tests/speculative/eip7692_eof_v1/eip7069_extcall/__init__.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7069_extcall/__init__.py rename to tests/speculative/eip7692_eof_v1/eip7069_extcall/__init__.py diff --git a/tests/osaka/eip7692_eof_v1/eip7069_extcall/helpers.py b/tests/speculative/eip7692_eof_v1/eip7069_extcall/helpers.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7069_extcall/helpers.py rename to tests/speculative/eip7692_eof_v1/eip7069_extcall/helpers.py diff --git a/tests/osaka/eip7692_eof_v1/eip7069_extcall/spec.py b/tests/speculative/eip7692_eof_v1/eip7069_extcall/spec.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7069_extcall/spec.py rename to tests/speculative/eip7692_eof_v1/eip7069_extcall/spec.py diff --git a/tests/osaka/eip7692_eof_v1/eip7069_extcall/test_address_space_extension.py b/tests/speculative/eip7692_eof_v1/eip7069_extcall/test_address_space_extension.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7069_extcall/test_address_space_extension.py rename to tests/speculative/eip7692_eof_v1/eip7069_extcall/test_address_space_extension.py diff --git a/tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calldata.py b/tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calldata.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calldata.py rename to tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calldata.py diff --git a/tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py b/tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py similarity index 99% rename from tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py rename to tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py index 645a53b58e9..24c2447aa99 100644 --- a/tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py +++ b/tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py @@ -375,7 +375,8 @@ def test_eof_calls_eof_mstore( # `blake2f`` is chosen for the test because it fails unless args_size == 213, which is what we are # interested in. blake2f = Address(0x09) -# `p256verify` / RIP-7212 has been in and out of prague and osaka. Hence we need to test explicitly +# `p256verify` / RIP-7212 has been in and out of prague and speculative. +# Hence we need to test explicitly p256verify = Address(0x100) diff --git a/tests/osaka/eip7692_eof_v1/eip7069_extcall/test_gas.py b/tests/speculative/eip7692_eof_v1/eip7069_extcall/test_gas.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7069_extcall/test_gas.py rename to tests/speculative/eip7692_eof_v1/eip7069_extcall/test_gas.py diff --git a/tests/osaka/eip7692_eof_v1/eip7069_extcall/test_returndatacopy_memory_expansion.py b/tests/speculative/eip7692_eof_v1/eip7069_extcall/test_returndatacopy_memory_expansion.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7069_extcall/test_returndatacopy_memory_expansion.py rename to tests/speculative/eip7692_eof_v1/eip7069_extcall/test_returndatacopy_memory_expansion.py diff --git a/tests/osaka/eip7692_eof_v1/eip7069_extcall/test_returndataload.py b/tests/speculative/eip7692_eof_v1/eip7069_extcall/test_returndataload.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7069_extcall/test_returndataload.py rename to tests/speculative/eip7692_eof_v1/eip7069_extcall/test_returndataload.py diff --git a/tests/osaka/eip7692_eof_v1/eip7480_data_section/__init__.py b/tests/speculative/eip7692_eof_v1/eip7480_data_section/__init__.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7480_data_section/__init__.py rename to tests/speculative/eip7692_eof_v1/eip7480_data_section/__init__.py diff --git a/tests/osaka/eip7692_eof_v1/eip7480_data_section/spec.py b/tests/speculative/eip7692_eof_v1/eip7480_data_section/spec.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7480_data_section/spec.py rename to tests/speculative/eip7692_eof_v1/eip7480_data_section/spec.py diff --git a/tests/osaka/eip7692_eof_v1/eip7480_data_section/test_code_validation.py b/tests/speculative/eip7692_eof_v1/eip7480_data_section/test_code_validation.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7480_data_section/test_code_validation.py rename to tests/speculative/eip7692_eof_v1/eip7480_data_section/test_code_validation.py diff --git a/tests/osaka/eip7692_eof_v1/eip7480_data_section/test_data_opcodes.py b/tests/speculative/eip7692_eof_v1/eip7480_data_section/test_data_opcodes.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7480_data_section/test_data_opcodes.py rename to tests/speculative/eip7692_eof_v1/eip7480_data_section/test_data_opcodes.py diff --git a/tests/osaka/eip7692_eof_v1/eip7480_data_section/test_datacopy_memory_expansion.py b/tests/speculative/eip7692_eof_v1/eip7480_data_section/test_datacopy_memory_expansion.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7480_data_section/test_datacopy_memory_expansion.py rename to tests/speculative/eip7692_eof_v1/eip7480_data_section/test_datacopy_memory_expansion.py diff --git a/tests/osaka/eip7692_eof_v1/eip7620_eof_create/__init__.py b/tests/speculative/eip7692_eof_v1/eip7620_eof_create/__init__.py similarity index 90% rename from tests/osaka/eip7692_eof_v1/eip7620_eof_create/__init__.py rename to tests/speculative/eip7692_eof_v1/eip7620_eof_create/__init__.py index a5729559f7f..cf4aac752c2 100644 --- a/tests/osaka/eip7692_eof_v1/eip7620_eof_create/__init__.py +++ b/tests/speculative/eip7692_eof_v1/eip7620_eof_create/__init__.py @@ -12,7 +12,7 @@ - eofcreate_extcall_returncode - per the new initcode mode tests you cannot have RETURNCODE in a deployed contract - eofcreate_dataloadn_referring_to_auxdata - covered by - tests.osaka.eip7480_data_section.test_data_opcodes.test_data_section_succeed + tests.speculative.eip7480_data_section.test_data_opcodes.test_data_section_succeed - eofcreate_initcontainer_return - RETURN is banned in initcode containers - eofcreate_initcontainer_stop - STOP is banned in initcode containers - All TXCREATE tests. diff --git a/tests/osaka/eip7692_eof_v1/eip7620_eof_create/helpers.py b/tests/speculative/eip7692_eof_v1/eip7620_eof_create/helpers.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7620_eof_create/helpers.py rename to tests/speculative/eip7692_eof_v1/eip7620_eof_create/helpers.py diff --git a/tests/osaka/eip7692_eof_v1/eip7620_eof_create/spec.py b/tests/speculative/eip7692_eof_v1/eip7620_eof_create/spec.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7620_eof_create/spec.py rename to tests/speculative/eip7692_eof_v1/eip7620_eof_create/spec.py diff --git a/tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_eofcreate.py b/tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_eofcreate.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_eofcreate.py rename to tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_eofcreate.py diff --git a/tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_eofcreate_failures.py b/tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_eofcreate_failures.py similarity index 99% rename from tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_eofcreate_failures.py rename to tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_eofcreate_failures.py index abeae6c8e2d..b350e3dbaa5 100644 --- a/tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_eofcreate_failures.py +++ b/tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_eofcreate_failures.py @@ -666,11 +666,11 @@ def test_eof_eofcreate_msg_depth( Test EOFCREATE handles msg depth limit correctly (1024). NOTE: due to block gas limit and the 63/64th rule this limit is unlikely to be hit on mainnet. - NOTE: See `tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_msg_depth` + NOTE: See `tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_msg_depth` for more explanations and comments. Most notable deviation from that test is that here calls and `EOFCREATE`s alternate in order to reach the max depth. `who_fails` decides whether the failing depth 1024 will be on a call or on an `EOFCREATE` to happen. - """ + """ # noqa: E501 # Not a precise gas_limit formula, but enough to exclude risk of gas causing the failure. gas_limit = int(20000000 * (64 / 63) ** 1024) env = Environment(gas_limit=gas_limit) diff --git a/tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_gas.py b/tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_gas.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_gas.py rename to tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_gas.py diff --git a/tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_legacy_eof_creates.py b/tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_legacy_eof_creates.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_legacy_eof_creates.py rename to tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_legacy_eof_creates.py diff --git a/tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_memory.py b/tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_memory.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_memory.py rename to tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_memory.py diff --git a/tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_returncode.py b/tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_returncode.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_returncode.py rename to tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_returncode.py diff --git a/tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_subcontainer_validation.py b/tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_subcontainer_validation.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7620_eof_create/test_subcontainer_validation.py rename to tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_subcontainer_validation.py diff --git a/tests/osaka/eip7692_eof_v1/eip7873_tx_create/__init__.py b/tests/speculative/eip7692_eof_v1/eip7873_tx_create/__init__.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7873_tx_create/__init__.py rename to tests/speculative/eip7692_eof_v1/eip7873_tx_create/__init__.py diff --git a/tests/osaka/eip7692_eof_v1/eip7873_tx_create/spec.py b/tests/speculative/eip7692_eof_v1/eip7873_tx_create/spec.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7873_tx_create/spec.py rename to tests/speculative/eip7692_eof_v1/eip7873_tx_create/spec.py diff --git a/tests/osaka/eip7692_eof_v1/eip7873_tx_create/test_creation_tx.py b/tests/speculative/eip7692_eof_v1/eip7873_tx_create/test_creation_tx.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7873_tx_create/test_creation_tx.py rename to tests/speculative/eip7692_eof_v1/eip7873_tx_create/test_creation_tx.py diff --git a/tests/osaka/eip7692_eof_v1/eip7873_tx_create/test_txcreate.py b/tests/speculative/eip7692_eof_v1/eip7873_tx_create/test_txcreate.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7873_tx_create/test_txcreate.py rename to tests/speculative/eip7692_eof_v1/eip7873_tx_create/test_txcreate.py diff --git a/tests/osaka/eip7692_eof_v1/eip7873_tx_create/test_txcreate_failures.py b/tests/speculative/eip7692_eof_v1/eip7873_tx_create/test_txcreate_failures.py similarity index 99% rename from tests/osaka/eip7692_eof_v1/eip7873_tx_create/test_txcreate_failures.py rename to tests/speculative/eip7692_eof_v1/eip7873_tx_create/test_txcreate_failures.py index 529ae9caa9c..ee4e5200b9b 100644 --- a/tests/osaka/eip7692_eof_v1/eip7873_tx_create/test_txcreate_failures.py +++ b/tests/speculative/eip7692_eof_v1/eip7873_tx_create/test_txcreate_failures.py @@ -628,11 +628,11 @@ def test_eof_txcreate_msg_depth( Test TXCREATE handles msg depth limit correctly (1024). NOTE: due to block gas limit and the 63/64th rule this limit is unlikely to be hit on mainnet. - NOTE: See `tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_msg_depth` + NOTE: See `tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_msg_depth` for more explanations and comments. Most notable deviation from that test is that here calls and `TXCREATE`s alternate in order to reach the max depth. `who_fails` decides whether the failing depth 1024 will be on a call or on an `TXCREATE` to happen. - """ + """ # noqa: E501 # Not a precise gas_limit formula, but enough to exclude risk of gas causing the failure. gas_limit = int(20000000 * (64 / 63) ** 1024) env = Environment(gas_limit=gas_limit) diff --git a/tests/osaka/eip7692_eof_v1/eip7873_tx_create/test_txcreate_validates.py b/tests/speculative/eip7692_eof_v1/eip7873_tx_create/test_txcreate_validates.py similarity index 100% rename from tests/osaka/eip7692_eof_v1/eip7873_tx_create/test_txcreate_validates.py rename to tests/speculative/eip7692_eof_v1/eip7873_tx_create/test_txcreate_validates.py diff --git a/tests/speculative/eip7692_eof_v1/eof_tracker.md b/tests/speculative/eip7692_eof_v1/eof_tracker.md new file mode 100644 index 00000000000..bf5fbd38b9f --- /dev/null +++ b/tests/speculative/eip7692_eof_v1/eof_tracker.md @@ -0,0 +1,502 @@ +# EOF Testing Coverage Tracker + +- [ ] Example Test Case 1 +- [x] Example Test Case 2 ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_eof_example.py`](./eip3540_eof_v1/test_eof_example/index.md)) + +## EIP-3540: EOF - EVM Object Format v1 + +### Validation + +- [x] Empty code is not a valid EOF ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k empty_container`) +- [x] Valid container without data section ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k single_code_section_no_data_section`) +- [x] Valid container with data section ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_valid_containers`](./eip3540_eof_v1/test_container_validation/test_valid_containers.md) `-k single_code_section_with_data_section`) +- [x] Valid container with truncated data section ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k data_section_contents_incomplete`, [`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_migrated_valid_invalid.py::test_migrated_valid_invalid`](./eip3540_eof_v1/test_migrated_valid_invalid/test_migrated_valid_invalid.md) `-k data_section_contents_incomplete`) +- [x] Valid container with data section truncated to empty ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k no_data_section_contents`, [`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_migrated_valid_invalid.py::test_migrated_valid_invalid`](./eip3540_eof_v1/test_migrated_valid_invalid/test_migrated_valid_invalid.md) `-k no_data_section_contents`) +- [x] Valid containers with multiple code sections ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_valid_containers`](./eip3540_eof_v1/test_container_validation/test_valid_containers.md) `-k multiple_code_sections`) +- [x] Valid containers with max number of code sections ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_max_code_sections`](./eip3540_eof_v1/test_container_validation/test_max_code_sections.md)) +- [x] Too many code sections ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k too_many_code_sections`) +- [x] Truncated magic ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k incomplete_magic`) +- [x] Valid container except magic ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_magic_validation`](./eip3540_eof_v1/test_container_validation/test_magic_validation.md)) +- [x] Truncated before version ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k no_version`) +- [x] Valid container except version ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_version_validation`](./eip3540_eof_v1/test_container_validation/test_version_validation.md)) +- [x] Truncated before type section header ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k no_type_header`) +- [x] Truncated before type section size ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k no_type_section_size`) +- [x] Truncated type section size ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k incomplete_type_section_size`) +- [x] No type section header ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py::test_section_order`](./eip3540_eof_v1/test_section_order/index.md) `-k test_position_CasePosition.HEADER-section_test_SectionTest.MISSING-section_kind_TYPE`) +- [x] Truncated before code section header ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k no_code_header`) +- [x] Truncated before code section number ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k code_section_count_missing`) +- [x] Truncated code section number ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k code_section_count_incomplete`) +- [x] Truncated before code section size ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k code_section_size_missing`) +- [x] Truncated code section size ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k code_section_size_incomplete`) +- [x] No code section header ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py::test_section_order`](./eip3540_eof_v1/test_section_order/index.md) `-k test_position_CasePosition.HEADER-section_test_SectionTest.MISSING-section_kind_CODE`) +- [x] Zero code section number ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k zero_code_sections_header`) +- [x] Zero code section size ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k empty_code_section`) +- [x] Zero code section size with non-empty data section ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k empty_code_section_with_non_empty_data`) +- [x] No container sections, truncated before data section header ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k truncated_header_data_section`) +- [x] Container sections present, truncated before data section header ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k truncated_header_data_section_with_container_section`) +- [x] Truncated before data section size ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k no_data_section_size`) +- [x] Truncated data section size ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k data_section_size_incomplete`) +- [x] Truncated before header terminator ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k terminator_incomplete`) +- [x] Truncated before type section ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k truncated_before_type_section`) +- [x] Type section truncated before outputs ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k truncated_type_section_before_outputs`) +- [x] Type section truncated before max_stack_height ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k truncated_type_section_before_max_stack_height`) +- [x] Type section truncated max_stack_height ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k truncated_type_section_truncated_max_stack_height`) +- [x] Truncated before code sections ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k no_code_section_contents`) +- [x] Truncated code section ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k incomplete_code_section_contents`) +- [x] Data section empty, trailing bytes ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k no_data_section_contents`) +- [x] Data section non-empty, trailing bytes ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k trailing_bytes_after_data_section`) +- [x] Wrong order of sections ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py`](./eip3540_eof_v1/index.md)) +- [x] No data section header ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py::test_section_order`](./eip3540_eof_v1/test_section_order/index.md) `-k test_position_CasePosition.HEADER-section_test_SectionTest.MISSING-section_kind_DATA`) +- [x] Multiple data sections ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k multiple_data_sections`, [`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k multiple_code_and_data_sections`) +- [x] Unknown section id ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k unknown_section_1`, [`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k unknown_section_2`) +- [x] Type section size != 4 * code section number ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k type_section_too`) +- [x] Code section with max max_stack_height ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_valid_containers`](./eip3540_eof_v1/test_container_validation/test_valid_containers.md) `-k single_code_section_max_stack_size`) +- [x] Code section with max_stack_height above limit ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_invalid_containers`](./eip3540_eof_v1/test_container_validation/test_invalid_containers.md) `-k single_code_section_max_stack_size_too_large`) +- [x] Valid code sections with inputs/outputs ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k code_section_with_inputs_outputs`) +- [x] Valid code section with max inputs ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k code_section_input_maximum`) +- [x] Valid code section with max outputs ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k code_section_output_maximum`) +- [x] Code sections with invalid number of inputs/outputs ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k code_section_input_too_large`, [`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k code_section_output_too_large`) +- [x] First section with inputs/outputs ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k invalid_first_code_section`) +- [x] Multiple type section headers ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k too_many_type_sections`) +- [x] Multiple code section headers ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k multiple_code_headers`) +- [x] Multiple data section headers ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k multiple_data_sections`) +- [x] Container without type section ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py::test_section_order`](./eip3540_eof_v1/test_section_order/index.md) `-k 'SectionTest.MISSING-section_kind_TYPE'`) +- [x] Container without code sections ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py::test_section_order`](./eip3540_eof_v1/test_section_order/index.md) `-k 'SectionTest.MISSING-section_kind_CODE'`) +- [x] Container without data section ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_section_order.py::test_section_order`](./eip3540_eof_v1/test_section_order/index.md) `-k 'SectionTest.MISSING-section_kind_DATA'`) +- [x] Valid containers without data section and with subcontainers ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_valid_containers`](./eip3540_eof_v1/test_container_validation/test_valid_containers.md)`[fork_speculative-eof_test-single_subcontainer_without_data]`) +- [x] Valid containers with data section and with subcontainers ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_valid_containers`](./eip3540_eof_v1/test_container_validation/test_valid_containers.md)`[fork_speculative-eof_test-single_subcontainer_with_data]`) +- [x] Valid container with maximum number of subcontainers ([`tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_subcontainer_validation.py::test_wide_container`](./eip7620_eof_create/test_subcontainer_validation/test_wide_container.md)`[fork_speculative-eof_test-256]`) +- [x] Container with number of subcontainers above the limit ([`tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_subcontainer_validation.py::test_wide_container`](./eip7620_eof_create/test_subcontainer_validation/test_wide_container.md)`[fork_speculative-eof_test-257]`) +- [x] Subcontainer section header truncated before subcontainer number ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k no_container_section_count`) +- [x] Subcontainer section header truncated before subcontainer size ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k incomplete_container_section_count`) +- [x] Truncated subcontainer size ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k no_container_section_size`, [`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k incomplete_container_section_size`) +- [x] Zero container section number ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k zero_container_section_count`) +- [x] Zero container section size ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k zero_size_container_section`) +- [x] Truncated container section body ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k no_container_section_contents`) +- [x] Multiple container section headers ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k multiple_container_headers`) +- [x] Invalid subcontainer ([`tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_subcontainer_validation.py`](./eip7620_eof_create/test_subcontainer_validation/index.md)`-k invalid`) +- [x] Invalid subcontainer on a deep nesting level ([`tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_subcontainer_validation.py::test_deep_container`](./eip7620_eof_create/test_subcontainer_validation/test_deep_container.md)) +- [x] Max number of inputs/outputs in a section ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_valid_containers`](./eip3540_eof_v1/test_container_validation/test_valid_containers.md)`[fork_speculative-eof_test-code_section_input_maximum]`, [`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py::test_valid_containers`](./eip3540_eof_v1/test_container_validation/test_valid_containers.md)`[fork_speculative-eof_test-code_section_output_maximum]`) +- [x] Number of inputs/outputs in a section above the limit ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k code_section_input_too_large`, [`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py`](./eip3540_eof_v1/test_container_validation/index.md)`-k code_section_output_too_large`) + +### Execution + +- [x] Execution of EOF contracts ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_execution.py::test_eof_execution`](./eip3540_eof_v1/test_execution/test_eof_execution.md)) +- [x] Legacy executing EXTCODESIZE of EOF contract ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_extcode.py::test_legacy_calls_eof_sstore`](./eip3540_eof_v1/test_extcode/test_legacy_calls_eof_sstore.md)) +- [x] Legacy executing EXTCODEHASH of EOF contract ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_extcode.py::test_legacy_calls_eof_sstore`](./eip3540_eof_v1/test_extcode/test_legacy_calls_eof_sstore.md)) +- [x] Legacy executing EXTCODECOPY of EOF contract ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_extcode.py::test_legacy_calls_eof_sstore`](./eip3540_eof_v1/test_extcode/test_legacy_calls_eof_sstore.md)) + +## EIP-3670: EOF - Code Validation + +### Validation + +- [x] Code section with invalid opcodes is rejected ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py::test_all_opcodes_in_container`](./eip3540_eof_v1/test_all_opcodes_in_container/test_all_opcodes_in_container.md)) +- [x] INVALID opcode is valid ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py::test_all_opcodes_in_container`](./eip3540_eof_v1/test_all_opcodes_in_container/test_all_opcodes_in_container.md)) +- [x] Truncated PUSH data ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py::test_truncated_data_portion_opcodes`](./eip3540_eof_v1/test_all_opcodes_in_container/test_truncated_data_portion_opcodes.md)) +- [x] Opcodes deprecated in EOF are rejected ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py::test_all_opcodes_in_container`](./eip3540_eof_v1/test_all_opcodes_in_container/test_all_opcodes_in_container.md)) +- [x] Codes with each valid opcodes ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py::test_all_opcodes_in_container`](./eip3540_eof_v1/test_all_opcodes_in_container/test_all_opcodes_in_container.md)) +- [x] Undefined instruction after terminating instruction ([`tests/speculative/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py::test_invalid_opcodes_after_stop`](./eip3540_eof_v1/test_all_opcodes_in_container/test_invalid_opcodes_after_stop.md)) + +## EIP-4200: EOF - Static relative jumps + +### Validation + +- [x] Valid RJUMP with various offsets ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_positive_negative`](./eip4200_relative_jumps/test_rjump/test_rjump_positive_negative.md)) +- [x] Valid RJUMP with maximum offset ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_maxes`](./eip4200_relative_jumps/test_rjump/test_rjump_maxes.md)) +- [x] Valid RJUMP with minimum offset ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_maxes`](./eip4200_relative_jumps/test_rjump/test_rjump_maxes.md)) +- [x] Valid RJUMPI with various offsets ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_forwards`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_forwards.md)) +- [x] Valid RJUMPI with maximum offset ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_max_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_max_forward.md)) +- [x] Valid RJUMPI with minimum offset ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_max_backward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_max_backward.md)) +- [x] Valid RJUMPV with various number of offsets and various offsets ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_forwards`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_forwards.md)) +- [x] Valid RJUMPV with table size 256 ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_full_table`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_full_table.md)) +- [x] Valid RJUMPV containing maximum offset ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_max_forwards`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_max_forwards.md)) +- [ ] Valid RJUMPV containing minimum offset +- [x] Truncated before RJUMP immediate ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_truncated_rjump`](./eip4200_relative_jumps/test_rjump/test_rjump_truncated_rjump.md)) +- [x] Truncated RJUMP immediate ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_truncated_rjump_2`](./eip4200_relative_jumps/test_rjump/test_rjump_truncated_rjump_2.md)) +- [x] RJUMP out of container bounds ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_after_container`](./eip4200_relative_jumps/test_rjump/test_rjump_after_container.md)) +- [x] RJUMP out of section bounds ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_into_data`](./eip4200_relative_jumps/test_rjump/test_rjump_into_data.md)) +- [x] RJUMP into immediate ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_into_push_1`](./eip4200_relative_jumps/test_rjump/test_rjump_into_push_1.md)) +- [x] Truncated before RJUMPI immediate ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_truncated`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_truncated.md)) +- [x] Truncated RJUMPI immediate ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_truncated_2`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_truncated_2.md)) +- [x] RJUMPI out of container bounds ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_after_container`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_after_container.md)) +- [x] RJUMPI out of section bounds ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_into_data`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_into_data.md)) +- [x] RJUMPI into immediate ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_into_push_1`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_into_push_1.md)) +- [x] Truncated before RJUMPV immediate ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_truncated_empty`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_truncated_empty.md)) +- [x] Truncated RJUMPV immediate ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_truncated`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_truncated.md)) +- [x] RJUMPV out of container bounds ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_after_container`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_after_container.md)) +- [x] RJUMPV out of section bounds ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_into_data`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_into_data.md)) +- [x] RJUMPV into immediate ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_into_push_1`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_into_push_1.md)) + +### Execution + +- [x] RJUMP forwards ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_positive_negative`](./eip4200_relative_jumps/test_rjump/test_rjump_positive_negative.md)) +- [x] RJUMP backwards ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_positive_negative`](./eip4200_relative_jumps/test_rjump/test_rjump_positive_negative.md)) +- [x] RJUMP with 0 offset ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_zero`](./eip4200_relative_jumps/test_rjump/test_rjump_zero.md)) +- [x] RJUMPI forwards with condition true/false ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_condition_forwards`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_condition_forwards.md)) +- [x] RJUMPI backwards with condition true/false ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_condition_backwards`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_condition_backwards.md)) +- [x] RJUMPI with 0 offset with condition true/false ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_condition_zero`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_condition_zero.md)) +- [x] RJUMPV with different case values ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_condition`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_condition.md)) +- [x] RJUMPV with case value out of table bounds ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_condition`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_condition.md)) +- [x] RJUMPV with max cases number ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_condition`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_condition.md), [`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py`](./eip4200_relative_jumps/test_rjumpv/index.md)`-k test_rjumpv_full_table`) + +## EIP-4750: EOF - Functions + +### Validation + +- [x] Valid CALLFs ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_callf_execution.py::test_callf`](./eip4750_functions/test_callf_execution/test_callf.md)) +- [x] CALLFs to non-existing sections ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_invalid_code_section_index`](./eip4750_functions/test_code_validation/test_invalid_code_section_index.md)) +- [x] Truncated CALLF immediate ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_truncated_immediate`](./eip4750_functions/test_code_validation/test_callf_truncated_immediate.md)) +- [x] Unreachable code sections ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_unreachable_code_sections`](./eip4750_functions/test_code_validation/test_unreachable_code_sections.md)) +- [x] Sections reachable from other sections, but not reachable from section 0 ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_unreachable_code_sections`](./eip4750_functions/test_code_validation/test_unreachable_code_sections.md)) +- [x] Unreachable code section that calls itself with JUMPF ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_unreachable_code_sections`](./eip4750_functions/test_code_validation/test_unreachable_code_sections.md)) +- [x] Unreachable code section that calls itself with CALLF ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_unreachable_code_sections`](./eip4750_functions/test_code_validation/test_unreachable_code_sections.md)) +- [ ] RETF with maximum number of outputs (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) + +### Execution + +- [ ] CALLF/RETF execution (ethereum/tests: src/EIPTestsFiller/StateTests/stEOF/stEIP4200/CALLF_RETF_ExecutionFiller.yml) +- [ ] Dispatch to CALLF to different functions based on calldata (ethereum/tests: src/EIPTestsFiller/StateTests/stEOF/stEIP4200/CALLF_RETF_ExecutionFiller.yml) +- [ ] Maximum number of code sections, calling each section with CALLF (ethereum/tests: src/EIPTestsFiller/StateTests/stEOF/stEIP4200/CALLF_RETF_ExecutionFiller.yml) + +## EIP-5450: EOF - Stack Validation + +### Validation + +#### Terminating instructions + +- [ ] Check all terminating opcodes (ethereum/tests: ./src/EOFTestsFiller/efExample/validInvalidFiller.yml src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) +- [ ] Code section not terminating (executing beyond section end) (ethereum/tests: ./src/EOFTestsFiller/efExample/validInvalidFiller.yml src/EOFTestsFiller/EIP5450/validInvalidFiller.yml src/EOFTestsFiller/efStack/no_terminating_instruction_Copier.json) +- [ ] Code section ending with NOP (not terminating) (src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) +- [ ] Check that unreachable code is invalid after all terminating instructions (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) + +#### Jumps + +##### RJUMP + +- [x] Valid RJUMP backwards in a constant stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_valid_backward`](./eip4200_relative_jumps/test_rjump/test_rjump_valid_backward.md) +- [x] Invalid RJUMP backwards with mismatching stack in a constant stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_backward_invalid_max_stack_height`](./eip4200_relative_jumps/test_rjump/test_rjump_backward_invalid_max_stack_height.md) +- [x] Valid RJUMP backwards in a variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_valid_backward`](./eip4200_relative_jumps/test_rjump/test_rjump_valid_backward.md) +- [x] Invalid RJUMP backwards with mismatching stack in a variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_backward_invalid_max_stack_height`](./eip4200_relative_jumps/test_rjump/test_rjump_backward_invalid_max_stack_height.md) +- [x] Valid RJUMP forwards ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_valid_forward`](./eip4200_relative_jumps/test_rjump/test_rjump_valid_forward.md) +- [x] Valid RJUMP forwards from different stack ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_valid_forward`](./eip4200_relative_jumps/test_rjump/test_rjump_valid_forward.md) +- [x] Valid RJUMP forwards in variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_valid_forward`](./eip4200_relative_jumps/test_rjump/test_rjump_valid_forward.md) +- [x] Valid RJUMP forwards from different stack in variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_valid_forward`](./eip4200_relative_jumps/test_rjump/test_rjump_valid_forward.md) +- [ ] Valid empty infinite loop with RJUMP (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) +- [ ] Valid balanced infinite loop (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) +- [x] RJUMP to self (including variadic stack height) ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_into_self`](./eip4200_relative_jumps/test_rjump/test_rjump_into_self.md)) + +##### RJUMPI + +- [x] Valid RJUMPI backwards in a constant stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_backward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_backward.md) +- [x] Invalid RJUMPI backwards with mismatching stack in a constant stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_backward_invalid_max_stack_height`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_backward_invalid_max_stack_height.md) +- [x] Valid RJUMPI backwards in a variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_backward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_backward.md) +- [x] Invalid RJUMPI backwards with mismatching stack in a variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_backward_invalid_max_stack_height`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_backward_invalid_max_stack_height.md) +- [x] RJUMPI forward with branches of equal stack height ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) +- [x] RJUMPI forward with branches of equal stack height in a variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) +- [x] RJUMPI forward with branches of different stack height ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) +- [x] RJUMPI forward with branches of different stack height in a variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) +- [x] Valid loop using RJUMPI ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) +- [x] Valid loop with a break using RJUMPI - equal stack after break and normal loop end ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) +- [x] Valid loop with a break using RJUMPI - equal stack after break and normal loop end, variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) +- [x] Valid loop with a break using RJUMPI - different stack after break and normal loop end ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) +- [x] Valid loop with a break using RJUMPI - different stack after break and normal loop end, variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) +- [x] If-then-else with equal stack height in branches ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) +- [x] If-then-else with equal stack height in branches, variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) +- [x] If-then-else with different stack height in branches ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) +- [x] If-then-else with different stack height in branches, variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_valid_forward`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_valid_forward.md) +- [x] RJUMPI to self (including variadic stack height) ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpi.py::test_rjumpi_into_self`](./eip4200_relative_jumps/test_rjumpi/test_rjumpi_into_self.md)) + +##### RJUMPV + +- [x] Valid RJUMPV backwards in a constant stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_backward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_backward.md) +- [x] Invalid RJUMPV backwards with mismatching stack in a constant stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_backward_invalid_max_stack_height`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_backward_invalid_max_stack_height.md) +- [x] Valid RJUMPV backwards in a variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_backward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_backward.md) +- [x] Invalid RJUMPV backwards with mismatching stack in a variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_backward_invalid_max_stack_height`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_backward_invalid_max_stack_height.md) +- [x] RJUMPV forward with branches of equal stack height ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_forward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_forward.md) +- [x] RJUMPV forward with branches of equal stack height in a variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_forward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_forward.md) +- [x] RJUMPV forward with branches of different stack height ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_forward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_forward.md) +- [x] RJUMPV forward with branches of different stack height in a variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_forward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_forward.md) +- [ ] Valid infinite loop using RJUMPV (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) +- [x] Switch with equal stack height in branches ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_forward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_forward.md) +- [x] Switch with equal stack height in branches, variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_forward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_forward.md) +- [x] Switch with different stack height in branches ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_forward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_forward.md) +- [x] Switch with different stack height in branches, variable stack segment ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_valid_forward`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_valid_forward.md) +- [x] RJUMPV to self (including variadic stack height) ([`tests/speculative/eip7692_eof_v1/eip4200_relative_jumps/test_rjumpv.py::test_rjumpv_into_self`](./eip4200_relative_jumps/test_rjumpv/test_rjumpv_into_self.md)) + +##### Combinations + +- [ ] RJUMP and RJUMPI with the same target and equal stack height (ethereum/tests: src/EOFTestsFiller/efStack/forwards_rjumpi_Copier.json) +- [ ] RJUMP and RJUMPI with the same target and equal stack height in a variable stack segment (ethereum/tests: src/EOFTestsFiller/efStack/forwards_rjumpi_variable_stack_Copier.json) +- [ ] RJUMP and RJUMPI with the same target and different stack height (ethereum/tests: src/EOFTestsFiller/efStack/forwards_rjumpi_Copier.json) +- [ ] RJUMP and RJUMPI with the same target and different stack height in a variable stack segment (ethereum/tests: src/EOFTestsFiller/efStack/forwards_rjumpi_variable_stack_Copier.json) +- [ ] RJUMP and RJUMPV with the same target and equal stack height (ethereum/tests: src/EOFTestsFiller/efStack/forwards_rjumpv_Copier.json) +- [ ] RJUMP and RJUMPV with the same target and equal stack height in a variable stack segment (ethereum/tests: src/EOFTestsFiller/efStack/forwards_rjumpv_variable_stack_Copier.json) +- [ ] RJUMP and RJUMPV with the same target and different stack height (ethereum/tests: src/EOFTestsFiller/efStack/forwards_rjumpv_Copier.json) +- [ ] RJUMP and RJUMPV with the same target and different stack height in a variable stack segment (ethereum/tests: src/EOFTestsFiller/efStack/forwards_rjumpv_variable_stack_Copier.json) +- [ ] RJUMPI and RJUMPV with the same target + +#### Stack underflow + +- [x] Stack underflows ([`tests/speculative/eip7692_eof_v1/eip5450_stack/test_code_validation.py::test_all_opcodes_stack_underflow`](./eip5450_stack/test_code_validation/test_all_opcodes_stack_underflow.md)) +- [x] Stack underflow with enough items available in caller stack - can't dig into caller frame ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_eof_validity`](./eip4750_functions/test_code_validation/test_eof_validity.md)) +- [x] Stack underflow in variable stack segment, only min underflow ([`tests/speculative/eip7692_eof_v1/eip5450_stack/test_code_validation.py::test_all_opcodes_stack_underflow`](./eip5450_stack/test_code_validation/test_all_opcodes_stack_underflow.md)) +- [x] Stack underflow in variable stack segment, both min and max underflow ([`tests/speculative/eip7692_eof_v1/eip5450_stack/test_code_validation.py::test_all_opcodes_stack_underflow`](./eip5450_stack/test_code_validation/test_all_opcodes_stack_underflow.md)) + +#### CALLF + +- [x] Valid CALLFs to functions with inputs ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_eof_validity`](./eip4750_functions/test_code_validation/test_eof_validity.md)) +- [ ] CALLF stack underflows ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_eof_validity`](./eip4750_functions/test_code_validation/test_eof_validity.md)) + - [ ] ./src/EOFTestsFiller/efExample/validInvalidFiller.yml + - [ ] src/EOFTestsFiller/EIP5450/validInvalidFiller.yml +- [x] CALLF stack underflow in variable stack segment, only min underflow ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_stack_underflow_examples`](./eip4750_functions/test_code_validation/test_callf_stack_underflow_examples.md)) +- [x] CALLF stack underflow in variable stack segment, both min and max underflow ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_stack_underflow_examples`](./eip4750_functions/test_code_validation/test_callf_stack_underflow_examples.md)) +- [ ] Branching to CALLFs with the same number of outputs (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) +- [ ] Check that CALLF stack inputs/outputs equal to target section type definition + +#### RETF + +- [ ] Valid RETF with correct number of items on stack ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_eof_validity`](./eip4750_functions/test_code_validation/test_eof_validity.md)) + - [ ] src/EOFTestsFiller/EIP5450/validInvalidFiller.yml +- [ ] Invalid RETF with extra items on stack ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_eof_validity`](./eip4750_functions/test_code_validation/test_eof_validity.md)) + - [ ] ./src/EOFTestsFiller/efExample/validInvalidFiller.yml +- [x] RETF stack underflow ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_eof_validity`](./eip4750_functions/test_code_validation/test_eof_validity.md)) +- [x] RETF reached via different paths ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_eof_validity`](./eip4750_functions/test_code_validation/test_eof_validity.md)) +- [x] RETF in variable stack segment is not allowed ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_eof_validity`](./eip4750_functions/test_code_validation/test_eof_validity.md)) +- [ ] Extra items on stack allowed for terminating instructions other than RETF (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) +- [x] Invalid RETF in a non-returning function ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_first_section_returning`](./eip6206_jumpf/test_nonreturning_validation/test_first_section_returning.md)) + +#### JUMPF + +- [x] Extra items on stack are allowed for JUMPF to non-returning function ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_non_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_non_returning.md) [`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_non_returning_variable_stack`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_non_returning_variable_stack.md)) +- [x] JUMPF stack underflows ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_non_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_non_returning.md) [`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning.md)) +- [x] JUMPF stack underflow in a variable stack segment - only min underflow ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_non_returning_variable_stack`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_non_returning_variable_stack.md)) +- [x] JUMPF stack underflow in a variable stack segment - both min and max underflow ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_non_returning_variable_stack`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_non_returning_variable_stack.md)) +- [x] JUMPF into function with the same number of outputs ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning.md)) +- [x] JUMPF into function with fewer outputs than current one ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning.md)) +- [x] Extra items on stack are allowed for JUMPF to returning function ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning.md)) +- [x] JUMPF to returning in a variable stack segment is not allowed ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning_variable_stack_1`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning_variable_stack_1.md) [`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning_variable_stack_2`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning_variable_stack_2.md) [`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning_variable_stack_3`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning_variable_stack_3.md)) +- (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_to_returning_variable_stack_Copier.json) +- [x] Invalid JUMPF in a non-returning function ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_retf_in_nonreturning`](./eip6206_jumpf/test_nonreturning_validation/test_retf_in_nonreturning.md)) +- [ ] Truncated JUMPF immediate + +#### Stack overflow + +##### CALLF + +- [x] Max allowed stack height reached in CALLF-ed function ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_stack_overflow`](./eip4750_functions/test_code_validation/test_callf_stack_overflow.md)) +- [x] CALLF validation time stack overflow ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_stack_overflow_after_callf`](./eip4750_functions/test_code_validation/test_callf_stack_overflow_after_callf.md)) +- [x] Max allowed stack height reached in CALLF-ed function with inputs ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_with_inputs_stack_overflow`](./eip4750_functions/test_code_validation/test_callf_with_inputs_stack_overflow.md)) +- [x] CALLF validation time stack overflow in function with inputs ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_with_inputs_stack_overflow`](./eip4750_functions/test_code_validation/test_callf_with_inputs_stack_overflow.md)) +- [x] Max allowed stack height reached in CALLF-ed function. CALLF in variable stack segment. ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_stack_overflow_variable_stack`](./eip4750_functions/test_code_validation/test_callf_stack_overflow_variable_stack.md) [`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_stack_overflow_variable_stack_2`](./eip4750_functions/test_code_validation/test_callf_stack_overflow_variable_stack_2.md))) +- [x] CALLF validation time stack overflow in variable stack segment. ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_stack_overflow_variable_stack_3`](./eip4750_functions/test_code_validation/test_callf_stack_overflow_variable_stack_3.md) [`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_stack_overflow_variable_stack_4`](./eip4750_functions/test_code_validation/test_callf_stack_overflow_variable_stack_4.md))) +- [x] Max allowed stack height reached in CALLF-ed function with inputs. CALLF in variable stack segment. ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_with_inputs_stack_overflow_variable_stack`](./eip4750_functions/test_code_validation/test_callf_with_inputs_stack_overflow_variable_stack.md)) +- [x] CALLF validation time stack overflow in function with inputs in variable stack segment. ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_code_validation.py::test_callf_with_inputs_stack_overflow_variable_stack`](./eip4750_functions/test_code_validation/test_callf_with_inputs_stack_overflow_variable_stack.md)) +- [ ] Function inputs are accessible and accounted for (no stack underflow if they are popped) (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) + +##### JUMPF + +- [x] Max allowed stack height reached in JUMPF-ed function ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_other_stack_overflow`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_other_stack_overflow.md)) +- [x] JUMPF validation time stack overflow ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_other_stack_overflow`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_other_stack_overflow.md)) +- [x] Max allowed stack height reached in JUMPF-ed function with inputs ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow.md)) +- [x] JUMPF validation time stack overflow in function with inputs ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow.md)) +- [x] JUMPF validation time stack overflow in function with inputs, variable stack segment, only max overflow ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow_variable_stack`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow_variable_stack.md)) +- [x] JUMPF validation time stack overflow in function with inputs, variable stack segment, both max and min overflow ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow_variable_stack`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow_variable_stack.md)) +- [x] Max allowed stack height reached in JUMPF-ed function. JUMPF in variable stack segment. ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_variadic_stack_overflow`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_variadic_stack_overflow.md)) +- [x] JUMPF validation time stack overflow in variable stack segment - only max overflow. ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_variadic_stack_overflow`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_variadic_stack_overflow.md)) +- [x] JUMPF validation time stack overflow in variable stack segment - both min and max overflow. ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_variadic_stack_overflow`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_variadic_stack_overflow.md)) +- [x] Max allowed stack height reached in JUMPF-ed function with inputs. JUMPF in variable stack segment. ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow_variable_stack`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow_variable_stack.md)) +- [x] JUMPF validation time stack overflow in function with inputs in variable stack segment. ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow_variable_stack`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow_variable_stack.md)) + +#### SWAPN/DUPN/EXCHANGE + +- [ ] Valid DUPN with enough items on stack (ethereum/tests: src/EOFTestsFiller/efStack/dupn_stack_validation_Copier.json) +- [ ] DUPN stack underflow (ethereum/tests: src/EOFTestsFiller/efStack/dupn_stack_validation_Copier.json) +- [ ] Valid SWAPN with enough items on stack (ethereum/tests: src/EOFTestsFiller/efStack/swapn_stack_validation_Copier.json) +- [ ] SWAPN stack underflow (ethereum/tests: src/EOFTestsFiller/efStack/swapn_stack_validation_Copier.json) +- [ ] Valid EXCHANGE with enough items on stack (ethereum/tests: src/EOFTestsFiller/efStack/exchange_deep_stack_validation_Copier.json src/EOFTestsFiller/efStack/exchange_stack_validation_Copier.json) +- [ ] EXCHANGE stack underflow (ethereum/tests: src/EOFTestsFiller/efStack/exchange_stack_validation_Copier.json src/EOFTestsFiller/efStack/exchange_empty_stack_validation_Copier.json) + +#### Other + +- [ ] Wrong max_stack_height (ethereum/tests: ./src/EOFTestsFiller/efExample/validInvalidFiller.yml src/EOFTestsFiller/efValidation/max_stack_height_Copier.json) +- [ ] All opcodes correctly account for stack inputs/outputs (ethereum/tests: src/EOFTestsFiller/EIP5450/validInvalidFiller.yml) +- [ ] Code reachable only via backwards jump is invalid +- [x] Maximally broad [0, 1023] stack range ([`tests/speculative/eip7692_eof_v1/eip_5450_stack/test_code_validation.py::test_stack_range_maximally_broad`](./eip5450_stack/test_code_validation/test_stack_range_maximally_broad.md)) + +### Execution + +- [x] Max stack size (1024) in CALLF-ed function ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_callf_execution.py::test_callf_operand_stack_size_max`](./eip4750_functions/test_callf_execution/test_callf_operand_stack_size_max.md) + + +## EIP-6206: EOF - JUMPF and non-returning functions + +### Validation + +- [x] Zero section returning ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_first_section_returning`](./eip6206_jumpf/test_nonreturning_validation/test_first_section_returning.md), ethereum/tests: ./src/EOFTestsFiller/efExample/validInvalidFiller.yml src/EOFTestsFiller/EIP4750/validInvalidFiller.yml) +- [x] Zero section declared non-returning but ends with RETF ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_retf_in_nonreturning`](./eip6206_jumpf/test_nonreturning_validation/test_retf_in_nonreturning.md), ethereum/tests: src/EOFTestsFiller/EIP4750/validInvalidFiller.yml) +- [x] CALLF into non-returning function ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_callf_to_nonreturning`](./eip6206_jumpf/test_nonreturning_validation/test_callf_to_nonreturning.md)) +- [x] Valid JUMPF into sections with equal number of outputs ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_execution.py::test_jumpf_to_retf`](./eip6206_jumpf/test_jumpf_execution/test_jumpf_to_retf.md)) +- [x] Valid JUMPF into sections with different but compatible number of outputs ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_execution.py::test_jumpf_to_retf`](./eip6206_jumpf/test_jumpf_execution/test_jumpf_to_retf.md)) +- [x] JUMPF into sections with incompatible outputs ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_incompatible_outputs`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_incompatible_outputs.md)) +- [x] Non-returning section without JUMPF ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_execution.py::test_jumpf_forward`](./eip6206_jumpf/test_jumpf_execution/test_jumpf_forward.md)) +- [x] Non-returning section with JUMPF ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_jumpf_in_nonreturning`](./eip6206_jumpf/test_nonreturning_validation/test_jumpf_in_nonreturning.md)) +- [x] Returning section with RETF ([`tests/speculative/eip7692_eof_v1/eip4750_functions/test_callf_execution.py::test_callf`](./eip4750_functions/test_callf_execution/test_callf.md)) +- [x] Returning section with JUMPF ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_returning_jumpf`](./eip6206_jumpf/test_jumpf_validation/test_returning_jumpf.md)) +- [x] Returning section with JUMPF to returning and RETF ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_execution.py::test_jumpf_to_retf`](./eip6206_jumpf/test_jumpf_execution/test_jumpf_to_retf.md)) +- [x] Returning section with JUMPF to non-returning and RETF ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_returning_jumpf`](./eip6206_jumpf/test_jumpf_validation/test_returning_jumpf.md)) +- [x] Returning section without JUMPF nor RETF ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_returning_section_not_returning`](./eip6206_jumpf/test_nonreturning_validation/test_returning_section_not_returning.md)) +- [x] Invalid non-returning flag ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_returning_section_not_returning`](./eip6206_jumpf/test_nonreturning_validation/test_returning_section_not_returning.md)) +- [x] Circular JUMPF between two sections ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_execution.py::test_jumpf_infinite_loop`](./eip6206_jumpf/test_jumpf_execution/test_jumpf_infinite_loop.md)) +- [x] JUMPF into non-existing section ([`tests/speculative/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_invalid_code_section_index`](./eip6206_jumpf/test_jumpf_validation/test_invalid_code_section_index.md)) + +## EIP-7480: EOF - Data section access instructions + +### Validation + +- [x] Valid DATALOADN with various offsets ([`tests/speculative/eip7692_eof_v1/eip7480_data_section/test_data_opcodes.py::test_dataloadn`](./eip7480_data_section/test_data_opcodes/test_dataloadn.md) +- [x] Truncated DATALOADN immediate ([`tests/speculative/eip7692_eof_v1/eip7480_data_section/test_code_validation.py::test_dataloadn_truncated_immediate`](./eip7480_data_section/test_code_validation/test_dataloadn_truncated_immediate.md) +- [x] DATALOADN offset out of bounds ([`tests/speculative/eip7692_eof_v1/eip7480_data_section/test_code_validation.py::test_invalid_containers_with_data_section`](./eip7480_data_section/test_code_validation/test_invalid_containers_with_data_section.md) +- [x] DATALOADN accessing not full word ([`tests/speculative/eip7692_eof_v1/eip7480_data_section/test_code_validation.py::test_invalid_containers_with_data_section`](./eip7480_data_section/test_code_validation/test_invalid_containers_with_data_section.md) + +## EIP-663: SWAPN, DUPN and EXCHANGE instructions + +### Validation + +- [ ] A DUPN instruction causes stack overflow +- [ ] A DUPN instruction causes stack underflow +- [ ] A DUPN instruction causes max stack height mismatch +- [ ] A SWAPN instruction causes stack underflow + +### Execution + +- [x] Positive tests for DUPN instructions ([`./tests/speculative/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_dupn.py::test_dupn_all_valid_immediates`](./eip663_dupn_swapn_exchange/test_dupn/test_dupn_all_valid_immediates.md)) +- [x] Positive tests for SWAPN instructions ([`./tests/speculative/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_swapn.py::test_swapn_all_valid_immediates`](./eip663_dupn_swapn_exchange/test_swapn/test_swapn_all_valid_immediates.md)) +- [x] Positive tests for EXCHANGE instruction ([`./tests/speculative/eip7692_eof_v1/eip663_dupn_swapn_exchange/test_exchange.py::test_exchange_all_valid_immediates`](./eip663_dupn_swapn_exchange/test_exchange/test_exchange_all_valid_immediates.md)) + +## EIP-7069: Revamped CALL instructions + +### Execution + +- [x] EXTDELEGATECALL from EOF to EOF ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_eof_sstore`](./eip7069_extcall/test_calls/test_eof_calls_eof_sstore.md)) +- [x] EXTDELEGATECALL from EOF to legacy fails ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_legacy_sstore`](./eip7069_extcall/test_calls/test_eof_calls_legacy_sstore.md)) +- [ ] EXTDELEGATECALL forwards static mode (evmone-tests: state_tests/state_transition/eof_calls/extdelegatecall_static.json) +- [x] EXTCALL with value success ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_with_value`](./eip7069_extcall/test_calls/test_eof_calls_with_value.md)) +- [x] EXTCALL with value from EXTSTATICCALL ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_static_flag_with_value`](./eip7069_extcall/test_calls/test_eof_calls_static_flag_with_value.md)) +- [x] EXTCALL with value, not enough balance ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_with_value`](./eip7069_extcall/test_calls/test_eof_calls_with_value.md)) +- [x] EXTCALL with value, check additional charge for value ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_gas.py::test_ext_calls_gas`](./eip7069_extcall/test_gas/test_ext_calls_gas.md)) +- [x] EXTCALL with gas not enough for callee to get 5000 gas ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_min_callee_gas`](./eip7069_extcall/test_calls/test_eof_calls_min_callee_gas.md)) +- [x] RETURNDATA* after EXTCALL ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_returndataload.py`](./eip7069_extcall/test_returndataload/index.md)) +- [x] RETURNDATA* after EXTDELEGATECALL ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_returndataload.py`](./eip7069_extcall/test_returndataload/index.md)) +- [x] RETURNDATA* after EXTSTATICCALL ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_returndataload.py`](./eip7069_extcall/test_returndataload/index.md)) +- [x] RETURNDATA* after aborted EXT*CALL ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_clear_return_buffer`](./eip7069_extcall/test_calls/test_eof_calls_clear_return_buffer.md)) +- [x] Failed EXTCALL clears returndata from previous EXTCALL ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_clear_return_buffer`](./eip7069_extcall/test_calls/test_eof_calls_clear_return_buffer.md)) +- [x] EXTCALL not enough gas for input memory charge ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_gas.py::test_ext_calls_gas`](./eip7069_extcall/test_gas/test_ext_calls_gas.md)) +- [x] EXTDELEGATECALL not enough gas for input memory charge ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_gas.py::test_ext_calls_gas`](./eip7069_extcall/test_gas/test_ext_calls_gas.md)) +- [x] EXTSTATICCALL not enough gas for input memory charge ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_gas.py::test_ext_calls_gas`](./eip7069_extcall/test_gas/test_ext_calls_gas.md)) +- [x] EXTCALL exception due to target address overflow (bits set in high 12 bytes) ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_address_space_extension.py`](./eip7069_extcall/test_address_space_extension/index.md)) +- [x] EXTDELEGATECALL exception due to target address overflow (bits set in high 12 bytes) ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_address_space_extension.py`](./eip7069_extcall/test_address_space_extension/index.md)) +- [x] EXTSTATICCALL exception due to target address overflow (bits set in high 12 bytes) ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_address_space_extension.py`](./eip7069_extcall/test_address_space_extension/index.md)) +- [x] EXTCALL not enough gas for warming up target address ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_gas.py::test_ext_calls_gas`](./eip7069_extcall/test_gas/test_ext_calls_gas.md)) +- [x] EXTDELEGATECALL not enough gas for warming up target address ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_gas.py::test_ext_calls_gas`](./eip7069_extcall/test_gas/test_ext_calls_gas.md)) +- [x] EXTSTATICCALL not enough gas for warming up target address ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_gas.py::test_ext_calls_gas`](./eip7069_extcall/test_gas/test_ext_calls_gas.md)) +- [x] EXTCALL not enough gas for account creation cost (transfer value to non-existing account) ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_gas.py::test_ext_calls_gas`](./eip7069_extcall/test_gas/test_ext_calls_gas.md)) +- [x] OOG after EXTCALL ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_eof_then_fails`](./eip7069_extcall/test_calls/test_eof_calls_eof_then_fails.md)) +- [x] OOG after EXTDELEGATECALL ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_eof_then_fails`](./eip7069_extcall/test_calls/test_eof_calls_eof_then_fails.md)) +- [x] OOG after EXTSTATICCALL ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_eof_then_fails`](./eip7069_extcall/test_calls/test_eof_calls_eof_then_fails.md)) +- [x] REVERT inside EXTCALL ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_callee_fails`](./eip7069_extcall/test_calls/test_callee_fails.md)) +- [x] REVERT inside EXTDELEGATECALL ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_callee_fails`](./eip7069_extcall/test_calls/test_callee_fails.md)) +- [x] REVERT inside EXTSTATICCALL ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_callee_fails`](./eip7069_extcall/test_calls/test_callee_fails.md)) +- [x] EXTCALL with input (`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calldata.py`) +- [x] EXTDELEGATECALL with input (`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calldata.py`) +- [x] EXTSTATICCALL with input (`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calldata.py`) +- [x] EXTCALL with just enough gas for MIN_RETAINED_GAS and MIN_CALLEE_GAS ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_min_callee_gas`](./eip7069_extcall/test_calls/test_eof_calls_min_callee_gas.md)) +- [x] EXTCALL with not enough gas for MIN_CALLEE_GAS ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_min_callee_gas`](./eip7069_extcall/test_calls/test_eof_calls_min_callee_gas.md)) +- [x] ADDRESS and CALLER inside EXTCALL ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_callee_context`](./eip7069_extcall/test_calls/test_callee_context.md)) +- [x] ADDRESS and CALLER inside EXTDELEGATECALL ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_callee_context`](./eip7069_extcall/test_calls/test_callee_context.md)) +- [x] ADDRESS and CALLER inside EXTSTATICCALL ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_callee_context`](./eip7069_extcall/test_calls/test_callee_context.md)) +- [ ] Refund inside EXTCALL is applied after the transaction (evmone-tests: state_tests/state_transition/eof_calls/extcall_gas_refund_propagation.json) +- [ ] Refund inside EXTDELEGATECALL is applied after the transaction (evmone-tests: state_tests/state_transition/eof_calls/extdelegatecall_gas_refund_propagation.json) +- [x] EXTSTATICCALL from EOF to non-pure legacy contract failing ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_legacy_sstore`](./eip7069_extcall/test_calls/test_eof_calls_legacy_sstore.md)) +- [x] EXTSTATICCALL from EOF to pure EOF contract ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_legacy_mstore`](./eip7069_extcall/test_calls/test_eof_calls_legacy_mstore.md)) +- [x] EXTSTATICCALL from EOF to non-pure EOF contract failing ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_eof_sstore`](./eip7069_extcall/test_calls/test_eof_calls_eof_sstore.md)) +- [x] `*CALLs` from legacy contracts to EOF contracts (ethereum/tests: ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_legacy_calls_eof_sstore`](./eip7069_extcall/test_calls/test_eof_calls_eof_sstore.md)) +- [x] `EXT*CALLs` from EOF to legacy contracts ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_legacy_sstore`](./eip7069_extcall/test_calls/test_eof_calls_eof_sstore.md)) +- [x] EXTDELEGATECALL from EOF to EOF contract ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_eof_calls_eof_sstore`](./eip7069_extcall/test_calls/test_eof_calls_eof_sstore.md)) +- [x] EXTDELEGATECALL from EOF to legacy contract failing ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_extdelegate_call_targets`](./eip7069_extcall/test_calls/test_extdelegate_call_targets.md)) +- [x] EXTDELEGATECALL from EOF to EOA failing ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_extdelegate_call_targets`](./eip7069_extcall/test_calls/test_extdelegate_call_targets.md)) +- [x] EXTDELEGATECALL from EOF to empty account failing ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_extdelegate_call_targets`](./eip7069_extcall/test_calls/test_extdelegate_call_targets.md)) +- [x] EXTDELEGATECALL to EIP-7702 delegate ([`./tests/speculative/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_extdelegate_call_targets`](./eip7069_extcall/test_calls/test_extdelegate_call_targets.md)) + + +## EIP-7620: EOF Contract Creation + +### Validation + +- [ ] Valid EOFCREATEs referring to various container numbers (ethereum/tests: ./src/EOFTestsFiller/efValidation/EOF1_eofcreate_valid_Copier.json) +- [x] Truncated before EOFCREATE immediate ([`tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_eofcreate.py`](./eip7620_eof_create/test_eofcreate/index.md)`-k test_eofcreate_invalid_truncated_immediate`) +- [ ] EOFCREATE is not a valid terminating instruction +- [x] EOFCREATE immediate referring to non-existing container ([`tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_eofcreate.py`](./eip7620_eof_create/test_eofcreate/index.md)`-k test_eofcreate_invalid_index`) +- [x] EOFCREATE immediate referring to container with truncated data ([`tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_eofcreate.py`](./eip7620_eof_create/test_eofcreate/index.md)`-k test_eofcreate_truncated_container`) +- [x] Valid RETURNCODEs referring to various container numbers ([`tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_returncode.py`](./eip7620_eof_create/test_returncode/index.md)`-k test_returncode_valid_index`) +- [x] Truncated before RETURNCODE immediate ([`tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_returncode.py::test_returncode_invalid_truncated_immediate`](./eip7620_eof_create/test_returncode/test_returncode_invalid_truncated_immediate.md)) +- [x] RETURNCODE immediate referring to non-existing container ([`tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_returncode.py`](./eip7620_eof_create/test_returncode/index.md)`-k test_returncode_invalid_index`) +- [x] Unreachable code after RETURNCODE, check that RETURNCODE is terminating ([`tests/speculative/eip7692_eof_v1/eip7620_eof_create/test_returncode.py::test_returncode_terminating`](./eip7620_eof_create/test_returncode/test_returncode_terminating.md)) + +### Execution + +- [ ] CREATE with EOF initcode fails in Prague (evmone-tests: state_tests/state_transition/eof_create/create_with_eof_initcode.json) +- [ ] CREATE with EOF initcode fails in Cancun (evmone-tests: state_tests/state_transition/eof_create/create_with_eof_initcode_cancun.json) +- [ ] CREATE2 with EOF initcode fails in Prague (evmone-tests: state_tests/state_transition/eof_create/create2_with_eof_initcode.json) +- [ ] CREATE2 with EOF initcode fails in Cancun (evmone-tests: state_tests/state_transition/eof_create/create2_with_eof_initcode_cancun.json) +- [ ] CREATE with legacy initcode and EOF deploy code fails (evmone-tests: state_tests/state_transition/eof_create/create_deploying_eof.json) +- [ ] CREATE2 with legacy initcode and EOF deploy code fails (evmone-tests: state_tests/state_transition/eof_create/create2_deploying_eof.json) +- [ ] EOFCREATE success with empty aux data (evmone-tests: state_tests/state_transition/eof_create/eofcreate_empty_auxdata.json) +- [ ] EOFCREATE success with aux data length equal to declared in deploy container (evmone-tests: state_tests/state_transition/eof_create/eofcreate_auxdata_equal_to_declared.json) +- [ ] EOFCREATE success with aux data longer than size declared in deploy container (evmone-tests: state_tests/state_transition/eof_create/eofcreate_auxdata_longer_than_declared.json) +- [ ] EOFCREATE with aux data shorter than size declared in deploy container fails (evmone-tests: state_tests/state_transition/eof_create/eofcreate_auxdata_shorter_than_declared.json) +- [ ] EOFCREATE success deploying DATALOADN referring to aux data portion of deploy container data (evmone-tests: state_tests/state_transition/eof_create/eofcreate_dataloadn_referring_to_auxdata.json) +- [ ] EOFCREATE success with deploy container having aux data and subcontainer (evmone-tests: state_tests/state_transition/eof_create/eofcreate_with_auxdata_and_subcontainer.json) +- [ ] REVERT in initcontainer (evmone-tests: state_tests/state_transition/eof_create/eofcreate_revert_empty_returndata.json) +- [ ] REVERT with return data in initcontainer (evmone-tests: state_tests/state_transition/eof_create/eofcreate_revert_non_empty_returndata.json) +- [ ] Exceptional abort in initcontainer (evmone-tests: state_tests/state_transition/eof_create/eofcreate_initcontainer_aborts.json) +- [ ] EOFCREATE with deploy container of max size 0x6000 (evmone-tests: state_tests/state_transition/eof_create/eofcreate_deploy_container_max_size.json) +- [ ] EOFCREATE with deploy container size above limit (evmone-tests: state_tests/state_transition/eof_create/eofcreate_deploy_container_too_large.json) +- [ ] EOFCREATE with deploy container data size above 64K after appending aux data (evmone-tests: state_tests/state_transition/eof_create/eofcreate_appended_data_size_larger_than_64K.json) +- [ ] EOFCREATE with deploy container size above limit after appending aux data (evmone-tests: state_tests/state_transition/eof_create/eofcreate_deploy_container_with_aux_data_too_large.json) +- [ ] EOFCREATE success nested in EOFCREATE initcode (evmone-tests: state_tests/state_transition/eof_create/eofcreate_nested_eofcreate.json) +- [ ] EOFCREATE success nested in EOFCREATE initcode that reverts (evmone-tests: state_tests/state_transition/eof_create/eofcreate_nested_eofcreate_revert.json) +- [ ] EOFCREATE with value success +- [ ] EOFCREATE with value - not enough caller balance (evmone-tests: state_tests/state_transition/eof_create/eofcreate_caller_balance_too_low.json) +- [ ] EOFCREATE not enough gas for initcode (EIP-3860) charge (evmone-tests: state_tests/state_transition/eof_create/eofcreate_not_enough_gas_for_initcode_charge.json) +- [ ] EOFCREATE not enough gas for input memory expansion (evmone-tests: state_tests/state_transition/eof_create/eofcreate_not_enough_gas_for_mem_expansion.json) +- [ ] RETURNCODE not enough gas for aux data memory expansion (evmone-tests: state_tests/state_transition/eof_create/returncode_not_enough_gas_for_mem_expansion.json) +- [ ] Successful EOFCREATE clears returndata (evmone-tests: state_tests/state_transition/eof_create/eofcreate_clears_returndata.json) +- [ ] Second EOFCREATE with the same container and salt fails (evmone-tests: state_tests/state_transition/eof_create/eofcreate_failure_after_eofcreate_success.json) +- [ ] Call created contract after EOFCREATE (evmone-tests: state_tests/state_transition/eof_create/eofcreate_call_created_contract.json) + +## EIP-7698: EOF - Creation transaction + +TODO: replace with `EIP-7873: EOF - TXCREATE and InitcodeTransaction type` test cases + +### Execution + +- [ ] Creation transaction success with empty deploy container data (evmone-tests: state_tests/state_transition/eof_create/creation_tx.json) +- [ ] Creation transaction success with data in deploy container without aux data (evmone-tests: state_tests/state_transition/eof_create/creation_tx_deploy_data.json) +- [ ] Creation transaction success with data in deploy container with aux data length equal to declared (evmone-tests: state_tests/state_transition/eof_create/creation_tx_static_auxdata_in_calldata.json) +- [ ] Creation transaction success with data in deploy container with aux data longer than declared (evmone-tests: state_tests/state_transition/eof_create/creation_tx_dynamic_auxdata_in_calldata.json) +- [ ] Creation transaction success deploying DATALOADN referring to aux data portion of deploy container data (evmone-tests: state_tests/state_transition/eof_create/creation_tx_dataloadn_referring_to_auxdata.json) +- [ ] Exceptional abort in creation transaction initcode (evmone-tests: state_tests/state_transition/eof_create/creation_tx_initcontainer_aborts.json) +- [ ] RETURN in creation transaction initcode fails (evmone-tests: state_tests/state_transition/eof_create/creation_tx_initcontainer_return.json) +- [ ] STOP in creation transaction initcode fails (evmone-tests: state_tests/state_transition/eof_create/creation_tx_initcontainer_stop.json) +- [ ] Creation transaction with initcode of max allowed size 0xc000 (evmone-tests: state_tests/state_transition/eof_create/creation_tx_initcontainer_max_size.json) +- [ ] Creation transaction with initcode size above limit (evmone-tests: state_tests/state_transition/eof_create/creation_tx_initcontainer_too_large.json) +- [ ] Creation transaction deploys container of max allowed size 0x6000 (evmone-tests: state_tests/state_transition/eof_create/creation_tx_deploy_container_max_size.json) +- [ ] Creation transaction deploying container of size above limit fails (evmone-tests: state_tests/state_transition/eof_create/creation_tx_deploy_container_too_large.json) +- [ ] EOFCREATE success nested in creation transaction initcode (evmone-tests: state_tests/state_transition/eof_create/creation_tx_nested_eofcreate.json) +- [ ] Creation transaction with invalid initcontainer (invalid header) (evmone-tests: state_tests/state_transition/eof_create/creation_tx_invalid_initcode_header.json) +- [ ] Creation transaction with invalid initcontainer (invalid EOF version) (evmone-tests: state_tests/state_transition/eof_create/creation_tx_invalid_eof_version.json) +- [ ] Creation transaction with invalid initcontainer (invalid max stack height) (evmone-tests: state_tests/state_transition/eof_create/creation_tx_invalid_initcode.json) +- [ ] Creation transaction fails if initcontainer has truncated data section (declared size > present data size ) (evmone-tests: state_tests/state_transition/eof_create/creation_tx_truncated_data_initcode.json) +- [ ] Creation transaction with invalid deploy container (evmone-tests: state_tests/state_transition/eof_create/creation_tx_invalid_deploycode.json) +- [ ] Create transaction with legacy initcode and EOF deploy code fails (evmone-tests: state_tests/state_transition/eof_create/creation_tx_deploying_eof.json) +- [ ] EOF creation transaction fails before Prague (evmone-tests: state_tests/state_transition/eof_create/initcode_transaction_before_speculative.json) diff --git a/tests/osaka/eip7692_eof_v1/gas_test.py b/tests/speculative/eip7692_eof_v1/gas_test.py similarity index 98% rename from tests/osaka/eip7692_eof_v1/gas_test.py rename to tests/speculative/eip7692_eof_v1/gas_test.py index 511c205a1a5..dad7be0a9f8 100644 --- a/tests/osaka/eip7692_eof_v1/gas_test.py +++ b/tests/speculative/eip7692_eof_v1/gas_test.py @@ -7,7 +7,7 @@ from ethereum_test_tools.vm.opcode import Opcodes as Op from ethereum_test_types.eof.v1 import Container, Section from ethereum_test_vm import Bytecode, EVMCodeType -from tests.osaka.eip7692_eof_v1.eip7069_extcall.spec import ( +from tests.speculative.eip7692_eof_v1.eip7069_extcall.spec import ( LEGACY_CALL_FAILURE, LEGACY_CALL_SUCCESS, ) diff --git a/tox.ini b/tox.ini index 9b0123a11ed..8e345b920bb 100644 --- a/tox.ini +++ b/tox.ini @@ -65,7 +65,7 @@ commands = [forks] develop = Prague -eip7692 = Osaka +eip7692 = EOFv1 [testenv:tests-deployed] description = Fill test cases in ./tests/ for deployed mainnet forks. @@ -84,12 +84,12 @@ commands_pre = solc-select use {[testenv]solc_version} --always-install commands = pytest -n auto --until={[forks]develop} -k "not slow" --skip-evm-dump [testenv:tests-eip7692] -description = Fill test cases in ./tests/ for EIP-7692 (EOF) on Osaka +description = Fill test cases in ./tests/ for EIP-7692 (EOF) setenv = # Use custom EELS_RESOLUTIONS_FILE if it is set via the environment (eg, in CI) EELS_RESOLUTIONS_FILE = {env:EELS_RESOLUTIONS_FILE:} commands_pre = solc-select use {[testenv]solc_version} --always-install -commands = pytest -n auto --evm-bin=evmone-t8n --fork={[forks]eip7692} -k "not slow" ./tests/osaka --skip-evm-dump +commands = pytest -n auto --evm-bin=evmone-t8n --fork={[forks]eip7692} -k "not slow" ./tests/speculative --skip-evm-dump # ---------------------------------------------------------------------------------------------- # ALIAS ENVIRONMENTS diff --git a/whitelist.txt b/whitelist.txt index ed149d44c98..a8cd826c02e 100644 --- a/whitelist.txt +++ b/whitelist.txt @@ -886,3 +886,4 @@ uncomp isogeny codomain nametag +CFI'd \ No newline at end of file From 32f5a272be7dfd65051d0c747bedcfba39592219 Mon Sep 17 00:00:00 2001 From: spencer-tb Date: Wed, 7 May 2025 15:23:50 +0100 Subject: [PATCH 2/3] feat(tests): eip-5920 pay opcode basic cases. --- eels_resolutions.json | 11 +- src/ethereum_test_vm/opcode.py | 38 +++ .../eip5920_pay_opcode/__init__.py | 6 + tests/speculative/eip5920_pay_opcode/spec.py | 39 +++ .../eip5920_pay_opcode/test_pay_opcode.py | 231 ++++++++++++++++++ 5 files changed, 322 insertions(+), 3 deletions(-) create mode 100644 tests/speculative/eip5920_pay_opcode/__init__.py create mode 100644 tests/speculative/eip5920_pay_opcode/spec.py create mode 100644 tests/speculative/eip5920_pay_opcode/test_pay_opcode.py diff --git a/eels_resolutions.json b/eels_resolutions.json index 76402d442ce..ecb7a7cca83 100644 --- a/eels_resolutions.json +++ b/eels_resolutions.json @@ -35,8 +35,13 @@ "same_as": "EELSMaster" }, "Prague": { - "git_url": "https://github.com/marioevz/execution-specs.git", - "branch": "forks/prague", - "commit": "bb0eb750d643ced0ebf5dec732cdd23558d0b7f2" + "git_url": "https://github.com/marioevz/execution-specs.git", + "branch": "forks/prague", + "commit": "bb0eb750d643ced0ebf5dec732cdd23558d0b7f2" + }, + "Osaka": { + "git_url": "https://github.com/spencer-tb/execution-specs.git", + "branch": "spec/eip-5920", + "commit": "aed9c231cf88b5baa3397272420dcd20f18a8c81" } } diff --git a/src/ethereum_test_vm/opcode.py b/src/ethereum_test_vm/opcode.py index 155c89f9956..c1c0ef7e064 100644 --- a/src/ethereum_test_vm/opcode.py +++ b/src/ethereum_test_vm/opcode.py @@ -5592,6 +5592,44 @@ class Opcodes(Opcode, Enum): Source: [EIP-7069](https://eips.ethereum.org/EIPS/eip-7069) """ + PAY = Opcode(0xFC, popped_stack_items=2, pushed_stack_items=0) + """ + PAY(addr, val) + ---- + Description + ---- + Transfers wei (val) from the contracts balance to the address addr without executing any code. + Exceptionally halts if addr has any high 12 bytes set to non-zero values or if the contracts + balance is less than val. + + Inputs + ---- + - addr: destination address (20 bytes) + - val: amount to transfer in wei + + Outputs + ---- + None (consumes values and returns nothing) + + Fork + ---- + Osaka + + Gas + ---- + - Is addr in accessed_addresses: + - If yes, WARM_STORAGE_READ_COST (100) + - Otherwise, COLD_ACCOUNT_ACCESS_COST (2600) + - Does addr exist or is val zero: + - If yes to either, zero + - Otherwise, GAS_NEW_ACCOUNT (25000) + - Is val zero: + - If yes, zero + - Otherwise, GAS_CALL_VALUE (9000) + + Source: [EIP-5920](https://eips.ethereum.org/EIPS/eip-5920) + """ + RETURNDATALOAD = Opcode(0xF7, popped_stack_items=1, pushed_stack_items=1, kwargs=["offset"]) """ RETURNDATALOAD(offset) diff --git a/tests/speculative/eip5920_pay_opcode/__init__.py b/tests/speculative/eip5920_pay_opcode/__init__.py new file mode 100644 index 00000000000..aaeae10b306 --- /dev/null +++ b/tests/speculative/eip5920_pay_opcode/__init__.py @@ -0,0 +1,6 @@ +""" +abstract: Tests [EIP-5920: Pay Opcode](https://eips.ethereum.org/EIPS/eip-5920) + Test cases for [EIP-5920: Pay Opcode](https://eips.ethereum.org/EIPS/eip-5920). +""" + +PAY_OPCODE_FORK_NAME = "Osaka" diff --git a/tests/speculative/eip5920_pay_opcode/spec.py b/tests/speculative/eip5920_pay_opcode/spec.py new file mode 100644 index 00000000000..9a0438a4fc2 --- /dev/null +++ b/tests/speculative/eip5920_pay_opcode/spec.py @@ -0,0 +1,39 @@ +"""Defines EIP-5920 specification constants and functions.""" + +from dataclasses import dataclass + + +@dataclass(frozen=True) +class ReferenceSpec: + """Defines the reference spec version and git path.""" + + git_path: str + version: str + + +ref_spec_5920 = ReferenceSpec("EIPS/eip-5920.md", "5840c325ea0daccf4cb9c00cda65f224f4df3b0a") + + +@dataclass(frozen=True) +class Spec: + """Constants and gas‑cost helpers for the PAY opcode (EIP‑5920).""" + + WARM_STORAGE_READ_COST: int = 100 + COLD_ACCOUNT_ACCESS_COST: int = 2_600 + GAS_NEW_ACCOUNT: int = 25_000 + GAS_CALL_VALUE: int = 9_000 + + @staticmethod + def pay_gas( + *, + is_addr_warm: bool, + addr_exists: bool, + value: int, + ) -> int: + """Return total gas cost for a PAY execution.""" + cost = Spec.WARM_STORAGE_READ_COST if is_addr_warm else Spec.COLD_ACCOUNT_ACCESS_COST + if not addr_exists and value != 0: + cost += Spec.GAS_NEW_ACCOUNT + if value != 0: + cost += Spec.GAS_CALL_VALUE + return cost diff --git a/tests/speculative/eip5920_pay_opcode/test_pay_opcode.py b/tests/speculative/eip5920_pay_opcode/test_pay_opcode.py new file mode 100644 index 00000000000..7de521ed552 --- /dev/null +++ b/tests/speculative/eip5920_pay_opcode/test_pay_opcode.py @@ -0,0 +1,231 @@ +""" +abstract: Tests [EIP-5920: PAY opcode](https://eips.ethereum.org/EIPS/eip-5920) + Test cases for [EIP-5920: PAY opcode](https://eips.ethereum.org/EIPS/eip-5920). +""" + +import pytest + +from ethereum_test_tools import ( + Account, + Alloc, + Environment, + StateTestFiller, + Transaction, +) +from ethereum_test_tools.vm.opcode import Opcodes as Op + +from . import PAY_OPCODE_FORK_NAME +from .spec import ref_spec_5920 + +REFERENCE_SPEC_GIT_PATH = ref_spec_5920.git_path +REFERENCE_SPEC_VERSION = ref_spec_5920.version + +pytestmark = pytest.mark.valid_from(PAY_OPCODE_FORK_NAME) + + +@pytest.mark.parametrize("initial_contract_balance, initial_recipient_balance", [(10000, 100)]) +@pytest.mark.parametrize( + "transfer_value,success", + [ + (0, True), + (1000, True), + (1000000, False), + ], + ids=[ + "zero_value", + "non_zero_value", + "insufficient_balance", + ], +) +def test_basic_transfer( + state_test: StateTestFiller, + pre: Alloc, + initial_contract_balance: int, + initial_recipient_balance: int, + transfer_value: int, + success: bool, +): + """ + Tests basic transfer functionality of the PAY opcode under various conditions. + + The pytest cases primarily verify the following: + 1. PAY opcode can transfer value to an existing address. + 2. PAY opcode can transfer value to a new address. + 3. PAY opcode fails if the sender's balance is insufficient. + """ + sender_address = pre.fund_eoa() + recipient = pre.fund_eoa(initial_recipient_balance) + contract_address = pre.deploy_contract( + code=( + Op.SSTORE(0, Op.SELFBALANCE) # Contract balance (slot 0) + + Op.SSTORE(1, Op.BALANCE(recipient)) # Recipient balance (slot 1) + + Op.SSTORE( + 2, + # Perform the transfer + Op.PAY(recipient, transfer_value), + ) # Success marker (slot 2) + + Op.SSTORE(3, Op.SELFBALANCE) # New contract balance (slot 3) + + Op.SSTORE(4, Op.BALANCE(recipient)) # New recipient balance (slot 4) + ), + balance=initial_contract_balance, + ) + + if success: + expected_storage = { + 0: initial_contract_balance, + 1: initial_recipient_balance, + 2: 1, # PAY succeeded + 3: initial_contract_balance - transfer_value, + 4: initial_recipient_balance + transfer_value, + } + post = { + contract_address: Account( + balance=initial_contract_balance - transfer_value, storage=expected_storage + ), + } + # Add recipient to post-state only if a non-zero transfer is made + if transfer_value > 0: + post[recipient] = Account(balance=initial_recipient_balance + transfer_value) + else: + # Contract execution should abort. Only slot 0 and 1 are written. + expected_storage = { + 0: initial_contract_balance, + 1: initial_recipient_balance, + 2: 0, # PAY failed (0) + } + # Check balance remains unchanged for both contract and recipient + post = { + contract_address: Account( + balance=initial_contract_balance, + storage=expected_storage, + ), + } + + tx = Transaction(sender=sender_address, to=contract_address, gas_limit=1000000) + state_test(env=Environment(), pre=pre, post=post, tx=tx) + + +@pytest.mark.parametrize("initial_contract_balance", [10000]) +@pytest.mark.parametrize( + "transfer_amount,success", + [ + (0, True), + (1000, True), + (20000, False), + ], + ids=[ + "zero_value_to_self", + "non_zero_value_to_self", + "insufficient_balance_to_self", + ], +) +def test_transfer_to_self( + state_test: StateTestFiller, + pre: Alloc, + initial_contract_balance: int, + transfer_amount: int, + success: bool, +): + """ + Tests PAY opcode functionality when a contract transfers to itself. + + The pytest cases verify the following: + 1. PAY opcode can transfer zero value to itself. + 2. PAY opcode can transfer non-zero value to itself. + 3. PAY opcode fails if attempted transfer exceeds balance. + """ + sender_address = pre.fund_eoa() + contract_address = pre.deploy_contract( + code=(Op.SSTORE(0, Op.PAY(Op.ADDRESS, transfer_amount))), + balance=initial_contract_balance, + ) + post = { + contract_address: Account( + balance=initial_contract_balance, + storage={ + 0: 1 if success else 0, + }, + ) + } + tx = Transaction(sender=sender_address, to=contract_address, gas_limit=1000000) + state_test(env=Environment(), pre=pre, post=post, tx=tx) + + +@pytest.mark.parametrize("initial_contract_balance, transfer_amount", [(10000, 1000)]) +@pytest.mark.with_all_precompiles +def test_pay_to_precompile( + state_test: StateTestFiller, + pre: Alloc, + initial_contract_balance: int, + transfer_amount: int, + precompile: int, +): + """ + Tests PAY opcode functionality when a contract transfers to a precompile. + + The pytest cases verify the latter across all precompiles available to the fork the test + filled for. + + Precompile addresses will always receive the transferred value. + """ + sender_address = pre.fund_eoa() + contract_address = pre.deploy_contract( + code=( + Op.SSTORE(0, Op.SELFBALANCE) # Contract balance (slot 0) + + Op.SSTORE(1, Op.BALANCE(precompile)) # Precompile balance (slot 1) + + Op.SSTORE(2, Op.PAY(precompile, transfer_amount)) # Success marker (slot 2) + + Op.SSTORE(3, Op.SELFBALANCE) # New contract balance (slot 3) + + Op.SSTORE(4, Op.BALANCE(precompile)) # New precompile balance (slot 4) + ), + balance=initial_contract_balance, + ) + expected_storage = { + 0: initial_contract_balance, + 1: 0, # Original precompile balance + 2: 1, # PAY succeeded + 3: initial_contract_balance - transfer_amount, + 4: transfer_amount, # New precompile balance + } + post = { + contract_address: Account( + balance=initial_contract_balance - transfer_amount, storage=expected_storage + ), + precompile: Account(balance=transfer_amount), + } + + tx = Transaction(sender=sender_address, to=contract_address, gas_limit=1000000) + state_test(env=Environment(), pre=pre, post=post, tx=tx) + + +@pytest.mark.parametrize("initial_contract_balance, transfer_amount", [(10000, 1000)]) +def test_pay_invalid_address( + state_test: StateTestFiller, + pre: Alloc, + initial_contract_balance: int, + transfer_amount: int, +): + """ + Tests PAY opcode functionality with an invalid address (high 12 bytes non-zero). + + The test verifies that the PAY opcode fails when attempting to pay to an address + with non-zero high bytes, where the PAY opcode is expected to fail. + """ + sender_address = pre.fund_eoa() + invalid_recipient = 0xFFFFFFFFFFFFFFFFFFFFFFFF1234567890123456789012 + contract_address = pre.deploy_contract( + code=( + Op.SSTORE(0, Op.PAY(invalid_recipient, transfer_amount)) # Success marker (slot 0) + ), + balance=initial_contract_balance, + ) + post = { + contract_address: Account( + balance=initial_contract_balance, + storage={ + 0: 0, # PAY failed (0) + }, + ) + } + + tx = Transaction(sender=sender_address, to=contract_address, gas_limit=1000000) + state_test(env=Environment(), pre=pre, post=post, tx=tx) From 52840b5dbc77c196319f30c34da3512821bdb948 Mon Sep 17 00:00:00 2001 From: spencer-tb Date: Wed, 7 May 2025 17:24:13 +0100 Subject: [PATCH 3/3] chore: add temp pay opcode eels resolution. --- eels_resolutions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eels_resolutions.json b/eels_resolutions.json index ecb7a7cca83..d9295129fb4 100644 --- a/eels_resolutions.json +++ b/eels_resolutions.json @@ -42,6 +42,6 @@ "Osaka": { "git_url": "https://github.com/spencer-tb/execution-specs.git", "branch": "spec/eip-5920", - "commit": "aed9c231cf88b5baa3397272420dcd20f18a8c81" + "commit": "bba905989fbbced524626f3e46b109f74f0ca6f7" } }