From e5892786c16b9aa1da102943ef8d268637f442c5 Mon Sep 17 00:00:00 2001 From: Charles Cooper Date: Tue, 19 Mar 2024 16:19:26 -0400 Subject: [PATCH] feat[ci]: enable cancun testing (#3861) enable cancun testing. mostly, update to the version of py-evm and eth-tester which enable cancun. adjust a couple tests which need to behave separately depending on cancun vs pre-cancun. --- .github/workflows/test.yml | 9 ++--- setup.py | 5 ++- .../cli/storage_layout/test_storage_layout.py | 39 ++++++++++++++++--- tests/unit/semantics/test_storage_slots.py | 12 +++++- 4 files changed, 50 insertions(+), 15 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d1866ee18c..0497d436c9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -89,11 +89,10 @@ jobs: opt-mode: gas evm-version: shanghai - # enable when py-evm makes it work: - #- python-version: ["3.11", "311"] - # debug: false - # opt-mode: gas - # evm-version: cancun + - python-version: ["3.11", "311"] + debug: false + opt-mode: gas + evm-version: cancun # run with `--memorymock`, but only need to do it one configuration # TODO: consider removing the memorymock tests diff --git a/setup.py b/setup.py index becd73f7e3..b48e1b7030 100644 --- a/setup.py +++ b/setup.py @@ -13,14 +13,15 @@ "pytest-instafail>=0.4,<1.0", "pytest-xdist>=3.5,<4.0", "pytest-split>=0.7.0,<1.0", - "eth-tester[py-evm]>=0.9.0b1,<0.10", + "eth-tester[py-evm]>=0.10.0b4,<0.11", "eth_abi>=4.0.0,<5.0.0", - "py-evm>=0.7.0a1,<0.8", + "py-evm>=0.10.0b4,<0.11", "web3==6.0.0", "lark==1.1.9", "hypothesis[lark]>=6.0,<7.0", "eth-stdlib==0.2.7", "setuptools", + "typing_extensions", # we can remove this once dependencies upgrade to eth-rlp>=2.0 ], "lint": [ "black==23.12.0", diff --git a/tests/unit/cli/storage_layout/test_storage_layout.py b/tests/unit/cli/storage_layout/test_storage_layout.py index 9724dd723c..ece2743b81 100644 --- a/tests/unit/cli/storage_layout/test_storage_layout.py +++ b/tests/unit/cli/storage_layout/test_storage_layout.py @@ -1,4 +1,21 @@ from vyper.compiler import compile_code +from vyper.evm.opcodes import version_check + + +def _adjust_storage_layout_for_cancun(layout): + def _go(layout): + for _varname, item in layout.items(): + if "slot" in item and isinstance(item["slot"], int): + item["slot"] -= 1 + else: + # recurse to submodule + _go(item) + + if version_check(begin="cancun"): + layout["transient_storage_layout"] = { + "$.nonreentrant_key": layout["storage_layout"].pop("$.nonreentrant_key") + } + _go(layout["storage_layout"]) def test_storage_layout(): @@ -40,13 +57,18 @@ def public_foo3(): out = compile_code(code, output_formats=["layout"]) - assert out["layout"]["storage_layout"] == { - "$.nonreentrant_key": {"slot": 0, "type": "nonreentrant lock"}, - "foo": {"slot": 1, "type": "HashMap[address, uint256]"}, - "arr": {"slot": 2, "type": "DynArray[uint256, 3]"}, - "baz": {"slot": 6, "type": "Bytes[65]"}, - "bar": {"slot": 10, "type": "uint256"}, + expected = { + "storage_layout": { + "$.nonreentrant_key": {"slot": 0, "type": "nonreentrant lock"}, + "foo": {"slot": 1, "type": "HashMap[address, uint256]"}, + "arr": {"slot": 2, "type": "DynArray[uint256, 3]"}, + "baz": {"slot": 6, "type": "Bytes[65]"}, + "bar": {"slot": 10, "type": "uint256"}, + } } + _adjust_storage_layout_for_cancun(expected) + + assert out["layout"] == expected def test_storage_and_immutables_layout(): @@ -71,6 +93,7 @@ def __init__(): "name": {"slot": 1, "type": "String[32]"}, }, } + _adjust_storage_layout_for_cancun(expected_layout) out = compile_code(code, output_formats=["layout"]) assert out["layout"] == expected_layout @@ -120,6 +143,7 @@ def __init__(): "a_library": {"supply": {"slot": 3, "type": "uint256"}}, }, } + _adjust_storage_layout_for_cancun(expected_layout) out = compile_code(code, input_bundle=input_bundle, output_formats=["layout"]) assert out["layout"] == expected_layout @@ -169,6 +193,7 @@ def __init__(): "counter2": {"slot": 3, "type": "uint256"}, }, } + _adjust_storage_layout_for_cancun(expected_layout) out = compile_code(code, input_bundle=input_bundle, output_formats=["layout"]) assert out["layout"] == expected_layout @@ -253,6 +278,7 @@ def bar(): "a_library": {"supply": {"slot": 4, "type": "uint256"}}, }, } + _adjust_storage_layout_for_cancun(expected_layout) out = compile_code(code, input_bundle=input_bundle, output_formats=["layout"]) assert out["layout"] == expected_layout @@ -334,6 +360,7 @@ def foo() -> uint256: "counter2": {"slot": 4, "type": "uint256"}, }, } + _adjust_storage_layout_for_cancun(expected_layout) out = compile_code(code, input_bundle=input_bundle, output_formats=["layout"]) assert out["layout"] == expected_layout diff --git a/tests/unit/semantics/test_storage_slots.py b/tests/unit/semantics/test_storage_slots.py index 7cbe71cf29..be0b0c3159 100644 --- a/tests/unit/semantics/test_storage_slots.py +++ b/tests/unit/semantics/test_storage_slots.py @@ -1,5 +1,6 @@ import pytest +from vyper.evm.opcodes import version_check from vyper.exceptions import StorageLayoutException code = """ @@ -97,10 +98,17 @@ def test_reentrancy_lock(get_contract): def test_allocator_overflow(get_contract): - code = """ -# --> global nonreentrancy slot allocated here <-- + # cancun allocates reeentrancy slot in transient storage, + # so allocate an actual storage variable + if version_check(begin="cancun"): + slot1 = "x: uint256" + else: + slot1 = "# --> global nonreentrancy slot allocated here <--" + code = f""" +{slot1} y: uint256[max_value(uint256)] """ + with pytest.raises( StorageLayoutException, match=f"Invalid storage slot, tried to allocate slots 1 through {2**256}",