From ebb7affea69b8825b016af781742ca0ed390d173 Mon Sep 17 00:00:00 2001 From: z80 Date: Tue, 30 Jan 2024 16:55:40 -0500 Subject: [PATCH] fix: fix pragma settings parsing --- dasy/compiler.py | 6 +++++- dasy/parser/parse.py | 1 + examples/Transient.vy | 6 ++++++ examples/nonreentrant.dasy | 2 +- examples/nonreentrant2.dasy | 14 ++++++++++++++ examples/nonreentrantenforcer.dasy | 10 ++++++++++ examples/transient_nonreentrant.dasy | 10 ++++++++++ tests/test_dasy.py | 5 ++++- 8 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 examples/Transient.vy create mode 100644 examples/nonreentrant2.dasy create mode 100644 examples/nonreentrantenforcer.dasy create mode 100644 examples/transient_nonreentrant.dasy diff --git a/dasy/compiler.py b/dasy/compiler.py index 0e113b4..dbc6537 100644 --- a/dasy/compiler.py +++ b/dasy/compiler.py @@ -11,6 +11,7 @@ build_layout_output, build_opcodes_output, ) +from vyper.compiler.settings import Settings from dasy.parser import parse_src from dasy.parser.utils import filename_to_contract_name @@ -74,13 +75,16 @@ def layout(self): def generate_compiler_data(src: str, name="DasyContract") -> CompilerData: (ast, settings) = parse_src(src) + settings = Settings(**settings) data = CompilerData( "", ast.name or name, None, source_id=0, - **settings, + settings=settings, ) + print(data) + print(data.settings) data.vyper_module = ast return data diff --git a/dasy/parser/parse.py b/dasy/parser/parse.py index cccdf74..6392252 100644 --- a/dasy/parser/parse.py +++ b/dasy/parser/parse.py @@ -252,6 +252,7 @@ def parse_src(src: str): add_src_map(src, element, v) elif isinstance(ast, dict): settings.update(ast) + continue elif ast: add_src_map(src, element, ast) else: diff --git a/examples/Transient.vy b/examples/Transient.vy new file mode 100644 index 0000000..0e824cf --- /dev/null +++ b/examples/Transient.vy @@ -0,0 +1,6 @@ +#pragma evm-version cancun + +@nonreentrant("lock") +@external +def foo() -> uint256: + return 4 diff --git a/examples/nonreentrant.dasy b/examples/nonreentrant.dasy index 473dec8..ccb6fa7 100644 --- a/examples/nonreentrant.dasy +++ b/examples/nonreentrant.dasy @@ -1,4 +1,4 @@ -(pragma :evm-version "cancun") +(pragma :evm-version "paris") (defn func0 [] [:external (nonreentrant "lock")] (raw_call msg/sender b"" :value 0)) diff --git a/examples/nonreentrant2.dasy b/examples/nonreentrant2.dasy new file mode 100644 index 0000000..8768d32 --- /dev/null +++ b/examples/nonreentrant2.dasy @@ -0,0 +1,14 @@ +;; (interface! "examples/nonreentrantenforcer.dasy") +(definterface Nonreentrantenforcer + (defn func0 [] :nonpayable)) + +(defvar target (public Nonreentrantenforcer)) + +(defn __init__ [:address target] :external + (set self/target (Nonreentrantenforcer target))) + +(defn callback [] :external + (.func0 self/target)) + +(defn __fallback__ [] :external + (.func0 self/target)) diff --git a/examples/nonreentrantenforcer.dasy b/examples/nonreentrantenforcer.dasy new file mode 100644 index 0000000..ccb6fa7 --- /dev/null +++ b/examples/nonreentrantenforcer.dasy @@ -0,0 +1,10 @@ +(pragma :evm-version "paris") + +(defn func0 [] [:external (nonreentrant "lock")] + (raw_call msg/sender b"" :value 0)) + +(defn func1 [] [:external (nonreentrant "lock_2")] + (raw_call msg/sender b"" :value 0)) + +(defn func2 [] [:external (nonreentrant "lock_2")] + (raw_call msg/sender b"" :value 0)) diff --git a/examples/transient_nonreentrant.dasy b/examples/transient_nonreentrant.dasy new file mode 100644 index 0000000..473dec8 --- /dev/null +++ b/examples/transient_nonreentrant.dasy @@ -0,0 +1,10 @@ +(pragma :evm-version "cancun") + +(defn func0 [] [:external (nonreentrant "lock")] + (raw_call msg/sender b"" :value 0)) + +(defn func1 [] [:external (nonreentrant "lock_2")] + (raw_call msg/sender b"" :value 0)) + +(defn func2 [] [:external (nonreentrant "lock_2")] + (raw_call msg/sender b"" :value 0)) diff --git a/tests/test_dasy.py b/tests/test_dasy.py index c019c4d..c679e2e 100644 --- a/tests/test_dasy.py +++ b/tests/test_dasy.py @@ -340,7 +340,10 @@ def testInterface(): def test_reentrancy(): - c = compile("examples/nonreentrant.dasy") # noqa: F841 + # TODO: This test should fail! + c = compile("examples/nonreentrantenforcer.dasy") # noqa: F841 + helper = compile("examples/nonreentrant2.dasy", c.address) # noqa: F841 + helper.callback() def test_auction():