Skip to content

Commit

Permalink
feat[ci]: enable cancun testing (vyperlang#3861)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
charles-cooper authored Mar 19, 2024
1 parent 58ecff5 commit e589278
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 15 deletions.
9 changes: 4 additions & 5 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 3 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
39 changes: 33 additions & 6 deletions tests/unit/cli/storage_layout/test_storage_layout.py
Original file line number Diff line number Diff line change
@@ -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():
Expand Down Expand Up @@ -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():
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
12 changes: 10 additions & 2 deletions tests/unit/semantics/test_storage_slots.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import pytest

from vyper.evm.opcodes import version_check
from vyper.exceptions import StorageLayoutException

code = """
Expand Down Expand Up @@ -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}",
Expand Down

0 comments on commit e589278

Please sign in to comment.