From 80808c2299e5979f116b49197ade52fb6f0e3809 Mon Sep 17 00:00:00 2001 From: Michael Colburn Date: Fri, 28 May 2021 21:09:16 -0400 Subject: [PATCH 001/101] Add tests for the incorrect-shift detector --- .../0.4.25/shift_parameter_mixup.sol | 8 ++ ..._mixup.sol.0.4.25.ShiftParameterMixup.json | 3 + .../0.5.16/shift_parameter_mixup.sol | 8 ++ ..._mixup.sol.0.5.16.ShiftParameterMixup.json | 3 + .../0.6.11/shift_parameter_mixup.sol | 8 ++ ..._mixup.sol.0.6.11.ShiftParameterMixup.json | 135 ++++++++++++++++++ .../0.7.6/shift_parameter_mixup.sol | 8 ++ ...r_mixup.sol.0.7.6.ShiftParameterMixup.json | 135 ++++++++++++++++++ tests/test_detectors.py | 20 +++ 9 files changed, 328 insertions(+) create mode 100644 tests/detectors/incorrect-shift/0.4.25/shift_parameter_mixup.sol create mode 100644 tests/detectors/incorrect-shift/0.4.25/shift_parameter_mixup.sol.0.4.25.ShiftParameterMixup.json create mode 100644 tests/detectors/incorrect-shift/0.5.16/shift_parameter_mixup.sol create mode 100644 tests/detectors/incorrect-shift/0.5.16/shift_parameter_mixup.sol.0.5.16.ShiftParameterMixup.json create mode 100644 tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol create mode 100644 tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol.0.6.11.ShiftParameterMixup.json create mode 100644 tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol create mode 100644 tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol.0.7.6.ShiftParameterMixup.json diff --git a/tests/detectors/incorrect-shift/0.4.25/shift_parameter_mixup.sol b/tests/detectors/incorrect-shift/0.4.25/shift_parameter_mixup.sol new file mode 100644 index 000000000..89a9210ad --- /dev/null +++ b/tests/detectors/incorrect-shift/0.4.25/shift_parameter_mixup.sol @@ -0,0 +1,8 @@ +contract C { + + function f() internal returns (uint a) { + assembly { + a := shr(a, 8) + } + } +} \ No newline at end of file diff --git a/tests/detectors/incorrect-shift/0.4.25/shift_parameter_mixup.sol.0.4.25.ShiftParameterMixup.json b/tests/detectors/incorrect-shift/0.4.25/shift_parameter_mixup.sol.0.4.25.ShiftParameterMixup.json new file mode 100644 index 000000000..5825bcacc --- /dev/null +++ b/tests/detectors/incorrect-shift/0.4.25/shift_parameter_mixup.sol.0.4.25.ShiftParameterMixup.json @@ -0,0 +1,3 @@ +[ + [] +] \ No newline at end of file diff --git a/tests/detectors/incorrect-shift/0.5.16/shift_parameter_mixup.sol b/tests/detectors/incorrect-shift/0.5.16/shift_parameter_mixup.sol new file mode 100644 index 000000000..89a9210ad --- /dev/null +++ b/tests/detectors/incorrect-shift/0.5.16/shift_parameter_mixup.sol @@ -0,0 +1,8 @@ +contract C { + + function f() internal returns (uint a) { + assembly { + a := shr(a, 8) + } + } +} \ No newline at end of file diff --git a/tests/detectors/incorrect-shift/0.5.16/shift_parameter_mixup.sol.0.5.16.ShiftParameterMixup.json b/tests/detectors/incorrect-shift/0.5.16/shift_parameter_mixup.sol.0.5.16.ShiftParameterMixup.json new file mode 100644 index 000000000..5825bcacc --- /dev/null +++ b/tests/detectors/incorrect-shift/0.5.16/shift_parameter_mixup.sol.0.5.16.ShiftParameterMixup.json @@ -0,0 +1,3 @@ +[ + [] +] \ No newline at end of file diff --git a/tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol b/tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol new file mode 100644 index 000000000..89a9210ad --- /dev/null +++ b/tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol @@ -0,0 +1,8 @@ +contract C { + + function f() internal returns (uint a) { + assembly { + a := shr(a, 8) + } + } +} \ No newline at end of file diff --git a/tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol.0.6.11.ShiftParameterMixup.json b/tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol.0.6.11.ShiftParameterMixup.json new file mode 100644 index 000000000..e6a1c784f --- /dev/null +++ b/tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol.0.6.11.ShiftParameterMixup.json @@ -0,0 +1,135 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "f", + "source_mapping": { + "start": 19, + "length": 106, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol", + "is_dependency": false, + "lines": [ + 3, + 4, + 5, + 6, + 7 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 0, + "length": 128, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "f()" + } + }, + { + "type": "node", + "name": "a = 8 >> a", + "source_mapping": { + "start": 93, + "length": 14, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol", + "is_dependency": false, + "lines": [ + 5 + ], + "starting_column": 13, + "ending_column": 27 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 19, + "length": 106, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol", + "is_dependency": false, + "lines": [ + 3, + 4, + 5, + 6, + 7 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 0, + "length": 128, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "f()" + } + } + } + } + ], + "description": "C.f() (tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol#3-7) contains an incorrect shift operation: a = 8 >> a (tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol#5)\n", + "markdown": "[C.f()](tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol#L3-L7) contains an incorrect shift operation: [a = 8 >> a](tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol#L5)\n", + "first_markdown_element": "tests/detectors/incorrect-shift/0.6.11/shift_parameter_mixup.sol#L3-L7", + "id": "eefda017d078fd6c0cdb19b471ac8d0a96b2b3dba9bac04ac194270820a77301", + "check": "incorrect-shift", + "impact": "High", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol b/tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol new file mode 100644 index 000000000..89a9210ad --- /dev/null +++ b/tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol @@ -0,0 +1,8 @@ +contract C { + + function f() internal returns (uint a) { + assembly { + a := shr(a, 8) + } + } +} \ No newline at end of file diff --git a/tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol.0.7.6.ShiftParameterMixup.json b/tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol.0.7.6.ShiftParameterMixup.json new file mode 100644 index 000000000..5960eb824 --- /dev/null +++ b/tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol.0.7.6.ShiftParameterMixup.json @@ -0,0 +1,135 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "f", + "source_mapping": { + "start": 19, + "length": 106, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol", + "is_dependency": false, + "lines": [ + 3, + 4, + 5, + 6, + 7 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 0, + "length": 128, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "f()" + } + }, + { + "type": "node", + "name": "a = 8 >> a", + "source_mapping": { + "start": 93, + "length": 14, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol", + "is_dependency": false, + "lines": [ + 5 + ], + "starting_column": 13, + "ending_column": 27 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 19, + "length": 106, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol", + "is_dependency": false, + "lines": [ + 3, + 4, + 5, + 6, + 7 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 0, + "length": 128, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "f()" + } + } + } + } + ], + "description": "C.f() (tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol#3-7) contains an incorrect shift operation: a = 8 >> a (tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol#5)\n", + "markdown": "[C.f()](tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol#L3-L7) contains an incorrect shift operation: [a = 8 >> a](tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol#L5)\n", + "first_markdown_element": "tests/detectors/incorrect-shift/0.7.6/shift_parameter_mixup.sol#L3-L7", + "id": "8aa2292fd8d53a23f05aed92384dde452ea1f879d2422c4726b75a79a5aa6f81", + "check": "incorrect-shift", + "impact": "High", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/test_detectors.py b/tests/test_detectors.py index d2822b80f..95ff2c797 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -1144,6 +1144,26 @@ ALL_TESTS = [ "write-after-write.sol", "0.8.0", ), + Test( + all_detectors.ShiftParameterMixup, + "shift_parameter_mixup.sol", + "0.4.25", + ), + Test( + all_detectors.ShiftParameterMixup, + "shift_parameter_mixup.sol", + "0.5.16", + ), + Test( + all_detectors.ShiftParameterMixup, + "shift_parameter_mixup.sol", + "0.6.11", + ), + Test( + all_detectors.ShiftParameterMixup, + "shift_parameter_mixup.sol", + "0.7.6", + ), ] GENERIC_PATH = "/GENERIC_PATH" From f894f7979e1b1f39a66ef739efbea3865398812a Mon Sep 17 00:00:00 2001 From: Michael Colburn Date: Fri, 28 May 2021 21:15:45 -0400 Subject: [PATCH 002/101] Add tests for the missing-inheritance detector --- .../0.4.25/unimplemented_interface.sol | 9 +++ ...terface.sol.0.4.25.MissingInheritance.json | 58 +++++++++++++++++++ .../0.5.16/unimplemented_interface.sol | 9 +++ ...terface.sol.0.5.16.MissingInheritance.json | 58 +++++++++++++++++++ .../0.6.11/unimplemented_interface.sol | 9 +++ ...terface.sol.0.6.11.MissingInheritance.json | 58 +++++++++++++++++++ .../0.7.6/unimplemented_interface.sol | 9 +++ ...nterface.sol.0.7.6.MissingInheritance.json | 58 +++++++++++++++++++ tests/test_detectors.py | 20 +++++++ 9 files changed, 288 insertions(+) create mode 100644 tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol create mode 100644 tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol.0.4.25.MissingInheritance.json create mode 100644 tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol create mode 100644 tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol.0.5.16.MissingInheritance.json create mode 100644 tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol create mode 100644 tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol.0.6.11.MissingInheritance.json create mode 100644 tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol create mode 100644 tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol.0.7.6.MissingInheritance.json diff --git a/tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol b/tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol new file mode 100644 index 000000000..58149d329 --- /dev/null +++ b/tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol @@ -0,0 +1,9 @@ +interface ISomething { + function f1() external returns(uint); +} + +contract Something { + function f1() external returns(uint){ + return 42; + } +} \ No newline at end of file diff --git a/tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol.0.4.25.MissingInheritance.json b/tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol.0.4.25.MissingInheritance.json new file mode 100644 index 000000000..bb52cfa9b --- /dev/null +++ b/tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol.0.4.25.MissingInheritance.json @@ -0,0 +1,58 @@ +[ + [ + { + "elements": [ + { + "type": "contract", + "name": "Something", + "source_mapping": { + "start": 68, + "length": 89, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol", + "is_dependency": false, + "lines": [ + 5, + 6, + 7, + 8, + 9, + 10 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + { + "type": "contract", + "name": "ISomething", + "source_mapping": { + "start": 0, + "length": 66, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3 + ], + "starting_column": 1, + "ending_column": 2 + } + } + ], + "description": "Something (tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol#5-10) should inherit from ISomething (tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol#1-3)\n", + "markdown": "[Something](tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol#L5-L10) should inherit from [ISomething](tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol#L1-L3)\n", + "first_markdown_element": "tests/detectors/missing-inheritance/0.4.25/unimplemented_interface.sol#L5-L10", + "id": "58962dc72a6c49524a027e8e1615ab92be30f1a0f5ef0eb4a029204687159649", + "check": "missing-inheritance", + "impact": "Informational", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol b/tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol new file mode 100644 index 000000000..58149d329 --- /dev/null +++ b/tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol @@ -0,0 +1,9 @@ +interface ISomething { + function f1() external returns(uint); +} + +contract Something { + function f1() external returns(uint){ + return 42; + } +} \ No newline at end of file diff --git a/tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol.0.5.16.MissingInheritance.json b/tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol.0.5.16.MissingInheritance.json new file mode 100644 index 000000000..4dc27f5b5 --- /dev/null +++ b/tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol.0.5.16.MissingInheritance.json @@ -0,0 +1,58 @@ +[ + [ + { + "elements": [ + { + "type": "contract", + "name": "Something", + "source_mapping": { + "start": 68, + "length": 89, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol", + "is_dependency": false, + "lines": [ + 5, + 6, + 7, + 8, + 9, + 10 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + { + "type": "contract", + "name": "ISomething", + "source_mapping": { + "start": 0, + "length": 66, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3 + ], + "starting_column": 1, + "ending_column": 2 + } + } + ], + "description": "Something (tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol#5-10) should inherit from ISomething (tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol#1-3)\n", + "markdown": "[Something](tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol#L5-L10) should inherit from [ISomething](tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol#L1-L3)\n", + "first_markdown_element": "tests/detectors/missing-inheritance/0.5.16/unimplemented_interface.sol#L5-L10", + "id": "58962dc72a6c49524a027e8e1615ab92be30f1a0f5ef0eb4a029204687159649", + "check": "missing-inheritance", + "impact": "Informational", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol b/tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol new file mode 100644 index 000000000..58149d329 --- /dev/null +++ b/tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol @@ -0,0 +1,9 @@ +interface ISomething { + function f1() external returns(uint); +} + +contract Something { + function f1() external returns(uint){ + return 42; + } +} \ No newline at end of file diff --git a/tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol.0.6.11.MissingInheritance.json b/tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol.0.6.11.MissingInheritance.json new file mode 100644 index 000000000..800114e0c --- /dev/null +++ b/tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol.0.6.11.MissingInheritance.json @@ -0,0 +1,58 @@ +[ + [ + { + "elements": [ + { + "type": "contract", + "name": "Something", + "source_mapping": { + "start": 68, + "length": 89, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol", + "is_dependency": false, + "lines": [ + 5, + 6, + 7, + 8, + 9, + 10 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + { + "type": "contract", + "name": "ISomething", + "source_mapping": { + "start": 0, + "length": 66, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3 + ], + "starting_column": 1, + "ending_column": 2 + } + } + ], + "description": "Something (tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol#5-10) should inherit from ISomething (tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol#1-3)\n", + "markdown": "[Something](tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol#L5-L10) should inherit from [ISomething](tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol#L1-L3)\n", + "first_markdown_element": "tests/detectors/missing-inheritance/0.6.11/unimplemented_interface.sol#L5-L10", + "id": "58962dc72a6c49524a027e8e1615ab92be30f1a0f5ef0eb4a029204687159649", + "check": "missing-inheritance", + "impact": "Informational", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol b/tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol new file mode 100644 index 000000000..58149d329 --- /dev/null +++ b/tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol @@ -0,0 +1,9 @@ +interface ISomething { + function f1() external returns(uint); +} + +contract Something { + function f1() external returns(uint){ + return 42; + } +} \ No newline at end of file diff --git a/tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol.0.7.6.MissingInheritance.json b/tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol.0.7.6.MissingInheritance.json new file mode 100644 index 000000000..7746c4a37 --- /dev/null +++ b/tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol.0.7.6.MissingInheritance.json @@ -0,0 +1,58 @@ +[ + [ + { + "elements": [ + { + "type": "contract", + "name": "Something", + "source_mapping": { + "start": 68, + "length": 89, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol", + "is_dependency": false, + "lines": [ + 5, + 6, + 7, + 8, + 9, + 10 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + { + "type": "contract", + "name": "ISomething", + "source_mapping": { + "start": 0, + "length": 66, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3 + ], + "starting_column": 1, + "ending_column": 2 + } + } + ], + "description": "Something (tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol#5-10) should inherit from ISomething (tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol#1-3)\n", + "markdown": "[Something](tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol#L5-L10) should inherit from [ISomething](tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol#L1-L3)\n", + "first_markdown_element": "tests/detectors/missing-inheritance/0.7.6/unimplemented_interface.sol#L5-L10", + "id": "58962dc72a6c49524a027e8e1615ab92be30f1a0f5ef0eb4a029204687159649", + "check": "missing-inheritance", + "impact": "Informational", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/test_detectors.py b/tests/test_detectors.py index 95ff2c797..13f0885b8 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -1164,6 +1164,26 @@ ALL_TESTS = [ "shift_parameter_mixup.sol", "0.7.6", ), + Test( + all_detectors.MissingInheritance, + "unimplemented_interface.sol", + "0.4.25", + ), + Test( + all_detectors.MissingInheritance, + "unimplemented_interface.sol", + "0.5.16", + ), + Test( + all_detectors.MissingInheritance, + "unimplemented_interface.sol", + "0.6.11", + ), + Test( + all_detectors.MissingInheritance, + "unimplemented_interface.sol", + "0.7.6", + ), ] GENERIC_PATH = "/GENERIC_PATH" From eb8f774ea55e7ae0fbad14b02035640d655f4b1c Mon Sep 17 00:00:00 2001 From: Michael Colburn Date: Fri, 28 May 2021 21:16:43 -0400 Subject: [PATCH 003/101] Add test for the enum-conversion detector --- .../enum-conversion/0.4.2/enum_conversion.sol | 9 + ...m_conversion.sol.0.4.2.EnumConversion.json | 222 ++++++++++++++++++ tests/test_detectors.py | 5 + 3 files changed, 236 insertions(+) create mode 100644 tests/detectors/enum-conversion/0.4.2/enum_conversion.sol create mode 100644 tests/detectors/enum-conversion/0.4.2/enum_conversion.sol.0.4.2.EnumConversion.json diff --git a/tests/detectors/enum-conversion/0.4.2/enum_conversion.sol b/tests/detectors/enum-conversion/0.4.2/enum_conversion.sol new file mode 100644 index 000000000..7a72084eb --- /dev/null +++ b/tests/detectors/enum-conversion/0.4.2/enum_conversion.sol @@ -0,0 +1,9 @@ +pragma solidity 0.4.2; + contract Test{ + + enum E{a} + + function bug(uint a) public returns(E){ + return E(a); + } +} \ No newline at end of file diff --git a/tests/detectors/enum-conversion/0.4.2/enum_conversion.sol.0.4.2.EnumConversion.json b/tests/detectors/enum-conversion/0.4.2/enum_conversion.sol.0.4.2.EnumConversion.json new file mode 100644 index 000000000..8eab7b7df --- /dev/null +++ b/tests/detectors/enum-conversion/0.4.2/enum_conversion.sol.0.4.2.EnumConversion.json @@ -0,0 +1,222 @@ +[ + [ + { + "elements": [ + { + "type": "node", + "name": "Test.E(a)", + "source_mapping": { + "start": 118, + "length": 11, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "is_dependency": false, + "lines": [ + 7 + ], + "starting_column": 9, + "ending_column": 20 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bug", + "source_mapping": { + "start": 70, + "length": 69, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "is_dependency": false, + "lines": [ + 6, + 7, + 8 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Test", + "source_mapping": { + "start": 27, + "length": 114, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "starting_column": 5, + "ending_column": 0 + } + }, + "signature": "bug(uint256)" + } + } + } + }, + { + "type": "variable", + "name": "a", + "source_mapping": { + "start": 83, + "length": 6, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "is_dependency": false, + "lines": [ + 6 + ], + "starting_column": 18, + "ending_column": 24 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bug", + "source_mapping": { + "start": 70, + "length": 69, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "is_dependency": false, + "lines": [ + 6, + 7, + 8 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Test", + "source_mapping": { + "start": 27, + "length": 114, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "starting_column": 5, + "ending_column": 0 + } + }, + "signature": "bug(uint256)" + } + } + } + }, + { + "type": "node", + "name": "Test.E(a)", + "source_mapping": { + "start": 118, + "length": 11, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "is_dependency": false, + "lines": [ + 7 + ], + "starting_column": 9, + "ending_column": 20 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bug", + "source_mapping": { + "start": 70, + "length": 69, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "is_dependency": false, + "lines": [ + 6, + 7, + 8 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Test", + "source_mapping": { + "start": 27, + "length": 114, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "starting_column": 5, + "ending_column": 0 + } + }, + "signature": "bug(uint256)" + } + } + } + } + ], + "description": "Test.E(a) (tests/detectors/enum-conversion/0.4.2/enum_conversion.sol#7) has a dangerous enum conversion\n\t- Variable: Test.bug(uint256).a (tests/detectors/enum-conversion/0.4.2/enum_conversion.sol#6) of type: uint256\n\t- Enum conversion: Test.E(a) (tests/detectors/enum-conversion/0.4.2/enum_conversion.sol#7)\n", + "markdown": "[Test.E(a)](tests/detectors/enum-conversion/0.4.2/enum_conversion.sol#L7) has a dangerous enum conversion\n\t- Variable: [Test.bug(uint256).a](tests/detectors/enum-conversion/0.4.2/enum_conversion.sol#L6) of type: uint256\n\t- Enum conversion: [Test.E(a)](tests/detectors/enum-conversion/0.4.2/enum_conversion.sol#L7)\n", + "first_markdown_element": "tests/detectors/enum-conversion/0.4.2/enum_conversion.sol#L7", + "id": "f16bcdd6943fe3ff7ed6cc9b729ed5f95f61375509c7cce6646efa44c69860b7", + "check": "enum-conversion", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/test_detectors.py b/tests/test_detectors.py index 13f0885b8..82461de98 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -1184,6 +1184,11 @@ ALL_TESTS = [ "unimplemented_interface.sol", "0.7.6", ), + Test( + all_detectors.EnumConversion, + "enum_conversion.sol", + "0.4.2", + ), ] GENERIC_PATH = "/GENERIC_PATH" From c620f2871f24761ab04c5ac130de9a4c3d368553 Mon Sep 17 00:00:00 2001 From: Michael Colburn Date: Fri, 28 May 2021 21:17:35 -0400 Subject: [PATCH 004/101] Add test for the multiple-constructors detector --- .../0.4.22/multiple_constructor_schemes.sol | 13 ++ ...sol.0.4.22.MultipleConstructorSchemes.json | 154 ++++++++++++++++++ tests/test_detectors.py | 5 + 3 files changed, 172 insertions(+) create mode 100644 tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol create mode 100644 tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol.0.4.22.MultipleConstructorSchemes.json diff --git a/tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol b/tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol new file mode 100644 index 000000000..3703d71e5 --- /dev/null +++ b/tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol @@ -0,0 +1,13 @@ +contract A { + uint x; + constructor() public { + x = 0; + } + function A() public { + x = 1; + } + + function test() public returns(uint) { + return x; + } +} \ No newline at end of file diff --git a/tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol.0.4.22.MultipleConstructorSchemes.json b/tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol.0.4.22.MultipleConstructorSchemes.json new file mode 100644 index 000000000..cf72d53fb --- /dev/null +++ b/tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol.0.4.22.MultipleConstructorSchemes.json @@ -0,0 +1,154 @@ +[ + [ + { + "elements": [ + { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 193, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + { + "type": "function", + "name": "constructor", + "source_mapping": { + "start": 29, + "length": 43, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol", + "is_dependency": false, + "lines": [ + 3, + 4, + 5 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 193, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "constructor()" + } + }, + { + "type": "function", + "name": "A", + "source_mapping": { + "start": 77, + "length": 42, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol", + "is_dependency": false, + "lines": [ + 6, + 7, + 8 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 193, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "A()" + } + } + ], + "description": "A (tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol#1-14) contains multiple constructors in the same contract:\n\t- A.constructor() (tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol#3-5)\n\t- A.A() (tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol#6-8)\n", + "markdown": "[A](tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol#L1-L14) contains multiple constructors in the same contract:\n\t- [A.constructor()](tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol#L3-L5)\n\t- [A.A()](tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol#L6-L8)\n", + "first_markdown_element": "tests/detectors/multiple-constructors/0.4.22/multiple_constructor_schemes.sol#L1-L14", + "id": "704cdb1c05e919913c22befaf077b9585bc75e31b5033fa46c930ad82dc6852e", + "check": "multiple-constructors", + "impact": "High", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/test_detectors.py b/tests/test_detectors.py index 82461de98..8719a899c 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -1189,6 +1189,11 @@ ALL_TESTS = [ "enum_conversion.sol", "0.4.2", ), + Test( + all_detectors.MultipleConstructorSchemes, + "multiple_constructor_schemes.sol", + "0.4.22", + ), ] GENERIC_PATH = "/GENERIC_PATH" From 327a95246c35b300c2e25d22817d52a9ce339357 Mon Sep 17 00:00:00 2001 From: Michael Colburn Date: Fri, 28 May 2021 21:18:21 -0400 Subject: [PATCH 005/101] Add test for the deprecated-standards detector --- .../0.4.25/deprecated_calls.sol | 10 + ..._calls.sol.0.4.25.DeprecatedStandards.json | 176 ++++++++++++++++++ tests/test_detectors.py | 5 + 3 files changed, 191 insertions(+) create mode 100644 tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol create mode 100644 tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol.0.4.25.DeprecatedStandards.json diff --git a/tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol b/tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol new file mode 100644 index 000000000..57ed13641 --- /dev/null +++ b/tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol @@ -0,0 +1,10 @@ +contract Test { + + function functionWithDeprecatedThrow() public constant { + // Deprecated: Change msg.gas -> gasleft() + if(msg.gas == msg.value) { + // Deprecated: Change throw -> revert() + throw; + } + } +} \ No newline at end of file diff --git a/tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol.0.4.25.DeprecatedStandards.json b/tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol.0.4.25.DeprecatedStandards.json new file mode 100644 index 000000000..ad121123d --- /dev/null +++ b/tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol.0.4.25.DeprecatedStandards.json @@ -0,0 +1,176 @@ +[ + [ + { + "elements": [ + { + "type": "node", + "name": "msg.gas == msg.value", + "source_mapping": { + "start": 140, + "length": 20, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol", + "is_dependency": false, + "lines": [ + 5 + ], + "starting_column": 12, + "ending_column": 32 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "functionWithDeprecatedThrow", + "source_mapping": { + "start": 21, + "length": 229, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol", + "is_dependency": false, + "lines": [ + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Test", + "source_mapping": { + "start": 0, + "length": 252, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "functionWithDeprecatedThrow()" + } + } + } + } + ], + "description": "Deprecated standard detected msg.gas == msg.value (tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol#5):\n\t- Usage of \"msg.gas\" should be replaced with \"gasleft()\"\n", + "markdown": "Deprecated standard detected [msg.gas == msg.value](tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol#L5):\n\t- Usage of \"msg.gas\" should be replaced with \"gasleft()\"\n", + "first_markdown_element": "tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol#L5", + "id": "e779713eabc28919356310f06b9413a8a3b7e9e713026d6cfae2d9f6839c1e57", + "check": "deprecated-standards", + "impact": "Informational", + "confidence": "High" + }, + { + "elements": [ + { + "type": "node", + "name": "", + "source_mapping": { + "start": 228, + "length": 5, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol", + "is_dependency": false, + "lines": [ + 7 + ], + "starting_column": 13, + "ending_column": 18 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "functionWithDeprecatedThrow", + "source_mapping": { + "start": 21, + "length": 229, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol", + "is_dependency": false, + "lines": [ + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Test", + "source_mapping": { + "start": 0, + "length": 252, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "functionWithDeprecatedThrow()" + } + } + } + } + ], + "description": "Deprecated standard detected THROW (tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol#7):\n\t- Usage of \"throw\" should be replaced with \"revert()\"\n", + "markdown": "Deprecated standard detected [THROW](tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol#L7):\n\t- Usage of \"throw\" should be replaced with \"revert()\"\n", + "first_markdown_element": "tests/detectors/deprecated-standards/0.4.25/deprecated_calls.sol#L7", + "id": "5fbf4a42467953d0fd8d0661cbb4eeb81d4b40f69ae3820196bf10c4be53044e", + "check": "deprecated-standards", + "impact": "Informational", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/test_detectors.py b/tests/test_detectors.py index 8719a899c..0f65bf137 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -1194,6 +1194,11 @@ ALL_TESTS = [ "multiple_constructor_schemes.sol", "0.4.22", ), + Test( + all_detectors.DeprecatedStandards, + "deprecated_calls.sol", + "0.4.25", + ), ] GENERIC_PATH = "/GENERIC_PATH" From 7b94b576f1b6103d5ef1e5db1c43be903631182a Mon Sep 17 00:00:00 2001 From: Michael Colburn Date: Fri, 28 May 2021 21:19:03 -0400 Subject: [PATCH 006/101] Add tests for the divide-before-multiply detector --- .../0.4.25/divide_before_multiply.sol | 5 + ...tiply.sol.0.4.25.DivideBeforeMultiply.json | 127 ++++++++++++++++++ .../0.5.16/divide_before_multiply.sol | 5 + ...tiply.sol.0.5.16.DivideBeforeMultiply.json | 127 ++++++++++++++++++ .../0.6.11/divide_before_multiply.sol | 5 + ...tiply.sol.0.6.11.DivideBeforeMultiply.json | 127 ++++++++++++++++++ .../0.7.6/divide_before_multiply.sol | 5 + ...ltiply.sol.0.7.6.DivideBeforeMultiply.json | 127 ++++++++++++++++++ tests/test_detectors.py | 20 +++ 9 files changed, 548 insertions(+) create mode 100644 tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol create mode 100644 tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol.0.4.25.DivideBeforeMultiply.json create mode 100644 tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol create mode 100644 tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol.0.5.16.DivideBeforeMultiply.json create mode 100644 tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol create mode 100644 tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol.0.6.11.DivideBeforeMultiply.json create mode 100644 tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol create mode 100644 tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol.0.7.6.DivideBeforeMultiply.json diff --git a/tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol b/tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol new file mode 100644 index 000000000..baf27a44e --- /dev/null +++ b/tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol @@ -0,0 +1,5 @@ +contract A { + function f(uint a, uint b, uint c) public returns (uint) { + return (a / b) * c; + } +} \ No newline at end of file diff --git a/tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol.0.4.25.DivideBeforeMultiply.json b/tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol.0.4.25.DivideBeforeMultiply.json new file mode 100644 index 000000000..529f9444b --- /dev/null +++ b/tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol.0.4.25.DivideBeforeMultiply.json @@ -0,0 +1,127 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "f", + "source_mapping": { + "start": 14, + "length": 92, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4 + ], + "starting_column": 2, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 108, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f(uint256,uint256,uint256)" + } + }, + { + "type": "node", + "name": "(a / b) * c", + "source_mapping": { + "start": 81, + "length": 18, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 3 + ], + "starting_column": 9, + "ending_column": 27 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 14, + "length": 92, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4 + ], + "starting_column": 2, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 108, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f(uint256,uint256,uint256)" + } + } + } + } + ], + "description": "A.f(uint256,uint256,uint256) (tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol#2-4) performs a multiplication on the result of a division:\n\t-(a / b) * c (tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol#3)\n", + "markdown": "[A.f(uint256,uint256,uint256)](tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol#L2-L4) performs a multiplication on the result of a division:\n\t-[(a / b) * c](tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol#L3)\n", + "first_markdown_element": "tests/detectors/divide-before-multiply/0.4.25/divide_before_multiply.sol#L2-L4", + "id": "fe40e2f72824d1270402b09af057ec7364af1ad2f8c48ef4df72fc27012b3186", + "check": "divide-before-multiply", + "impact": "Medium", + "confidence": "Medium" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol b/tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol new file mode 100644 index 000000000..baf27a44e --- /dev/null +++ b/tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol @@ -0,0 +1,5 @@ +contract A { + function f(uint a, uint b, uint c) public returns (uint) { + return (a / b) * c; + } +} \ No newline at end of file diff --git a/tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol.0.5.16.DivideBeforeMultiply.json b/tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol.0.5.16.DivideBeforeMultiply.json new file mode 100644 index 000000000..4421fa0ef --- /dev/null +++ b/tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol.0.5.16.DivideBeforeMultiply.json @@ -0,0 +1,127 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "f", + "source_mapping": { + "start": 14, + "length": 92, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4 + ], + "starting_column": 2, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 108, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f(uint256,uint256,uint256)" + } + }, + { + "type": "node", + "name": "(a / b) * c", + "source_mapping": { + "start": 81, + "length": 18, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 3 + ], + "starting_column": 9, + "ending_column": 27 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 14, + "length": 92, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4 + ], + "starting_column": 2, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 108, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f(uint256,uint256,uint256)" + } + } + } + } + ], + "description": "A.f(uint256,uint256,uint256) (tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol#2-4) performs a multiplication on the result of a division:\n\t-(a / b) * c (tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol#3)\n", + "markdown": "[A.f(uint256,uint256,uint256)](tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol#L2-L4) performs a multiplication on the result of a division:\n\t-[(a / b) * c](tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol#L3)\n", + "first_markdown_element": "tests/detectors/divide-before-multiply/0.5.16/divide_before_multiply.sol#L2-L4", + "id": "a484421df5c9ebf3dc3d8bcec6701ab3065e03b21e294c4972142c4503f2fccb", + "check": "divide-before-multiply", + "impact": "Medium", + "confidence": "Medium" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol b/tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol new file mode 100644 index 000000000..baf27a44e --- /dev/null +++ b/tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol @@ -0,0 +1,5 @@ +contract A { + function f(uint a, uint b, uint c) public returns (uint) { + return (a / b) * c; + } +} \ No newline at end of file diff --git a/tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol.0.6.11.DivideBeforeMultiply.json b/tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol.0.6.11.DivideBeforeMultiply.json new file mode 100644 index 000000000..564cac140 --- /dev/null +++ b/tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol.0.6.11.DivideBeforeMultiply.json @@ -0,0 +1,127 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "f", + "source_mapping": { + "start": 14, + "length": 92, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4 + ], + "starting_column": 2, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 108, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f(uint256,uint256,uint256)" + } + }, + { + "type": "node", + "name": "(a / b) * c", + "source_mapping": { + "start": 81, + "length": 18, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 3 + ], + "starting_column": 9, + "ending_column": 27 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 14, + "length": 92, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4 + ], + "starting_column": 2, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 108, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f(uint256,uint256,uint256)" + } + } + } + } + ], + "description": "A.f(uint256,uint256,uint256) (tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol#2-4) performs a multiplication on the result of a division:\n\t-(a / b) * c (tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol#3)\n", + "markdown": "[A.f(uint256,uint256,uint256)](tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol#L2-L4) performs a multiplication on the result of a division:\n\t-[(a / b) * c](tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol#L3)\n", + "first_markdown_element": "tests/detectors/divide-before-multiply/0.6.11/divide_before_multiply.sol#L2-L4", + "id": "9010aa3fdf8f7689d4c4d4ea0bcd771668212100e5427e48644ed7337de03a6d", + "check": "divide-before-multiply", + "impact": "Medium", + "confidence": "Medium" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol b/tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol new file mode 100644 index 000000000..baf27a44e --- /dev/null +++ b/tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol @@ -0,0 +1,5 @@ +contract A { + function f(uint a, uint b, uint c) public returns (uint) { + return (a / b) * c; + } +} \ No newline at end of file diff --git a/tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol.0.7.6.DivideBeforeMultiply.json b/tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol.0.7.6.DivideBeforeMultiply.json new file mode 100644 index 000000000..23dd10c28 --- /dev/null +++ b/tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol.0.7.6.DivideBeforeMultiply.json @@ -0,0 +1,127 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "f", + "source_mapping": { + "start": 14, + "length": 92, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4 + ], + "starting_column": 2, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 108, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f(uint256,uint256,uint256)" + } + }, + { + "type": "node", + "name": "(a / b) * c", + "source_mapping": { + "start": 81, + "length": 18, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 3 + ], + "starting_column": 9, + "ending_column": 27 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 14, + "length": 92, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4 + ], + "starting_column": 2, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 108, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f(uint256,uint256,uint256)" + } + } + } + } + ], + "description": "A.f(uint256,uint256,uint256) (tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol#2-4) performs a multiplication on the result of a division:\n\t-(a / b) * c (tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol#3)\n", + "markdown": "[A.f(uint256,uint256,uint256)](tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol#L2-L4) performs a multiplication on the result of a division:\n\t-[(a / b) * c](tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol#L3)\n", + "first_markdown_element": "tests/detectors/divide-before-multiply/0.7.6/divide_before_multiply.sol#L2-L4", + "id": "9bc6cb85ece6cd57fa946707784180957080ad5f9575abc17af218f0d2801f77", + "check": "divide-before-multiply", + "impact": "Medium", + "confidence": "Medium" + } + ] +] \ No newline at end of file diff --git a/tests/test_detectors.py b/tests/test_detectors.py index 0f65bf137..678799cd6 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -1199,6 +1199,26 @@ ALL_TESTS = [ "deprecated_calls.sol", "0.4.25", ), + Test( + all_detectors.DivideBeforeMultiply, + "divide_before_multiply.sol", + "0.4.25", + ), + Test( + all_detectors.DivideBeforeMultiply, + "divide_before_multiply.sol", + "0.5.16", + ), + Test( + all_detectors.DivideBeforeMultiply, + "divide_before_multiply.sol", + "0.6.11", + ), + Test( + all_detectors.DivideBeforeMultiply, + "divide_before_multiply.sol", + "0.7.6", + ), ] GENERIC_PATH = "/GENERIC_PATH" From ee8baf581a09040b885db0b06d96613947ce34a0 Mon Sep 17 00:00:00 2001 From: Michael Colburn Date: Fri, 28 May 2021 21:19:47 -0400 Subject: [PATCH 007/101] Add tests for the tautology detector --- .../tautology/0.4.25/type_based_tautology.sol | 12 + ...utology.sol.0.4.25.TypeBasedTautology.json | 284 ++++++++++++++++++ .../tautology/0.5.16/type_based_tautology.sol | 12 + ...utology.sol.0.5.16.TypeBasedTautology.json | 284 ++++++++++++++++++ .../tautology/0.6.11/type_based_tautology.sol | 12 + ...utology.sol.0.6.11.TypeBasedTautology.json | 284 ++++++++++++++++++ .../tautology/0.7.6/type_based_tautology.sol | 12 + ...autology.sol.0.7.6.TypeBasedTautology.json | 284 ++++++++++++++++++ tests/test_detectors.py | 20 ++ 9 files changed, 1204 insertions(+) create mode 100644 tests/detectors/tautology/0.4.25/type_based_tautology.sol create mode 100644 tests/detectors/tautology/0.4.25/type_based_tautology.sol.0.4.25.TypeBasedTautology.json create mode 100644 tests/detectors/tautology/0.5.16/type_based_tautology.sol create mode 100644 tests/detectors/tautology/0.5.16/type_based_tautology.sol.0.5.16.TypeBasedTautology.json create mode 100644 tests/detectors/tautology/0.6.11/type_based_tautology.sol create mode 100644 tests/detectors/tautology/0.6.11/type_based_tautology.sol.0.6.11.TypeBasedTautology.json create mode 100644 tests/detectors/tautology/0.7.6/type_based_tautology.sol create mode 100644 tests/detectors/tautology/0.7.6/type_based_tautology.sol.0.7.6.TypeBasedTautology.json diff --git a/tests/detectors/tautology/0.4.25/type_based_tautology.sol b/tests/detectors/tautology/0.4.25/type_based_tautology.sol new file mode 100644 index 000000000..cfd3997c6 --- /dev/null +++ b/tests/detectors/tautology/0.4.25/type_based_tautology.sol @@ -0,0 +1,12 @@ +contract A { + function f(uint x) public returns (uint) { + if (x >= 0) { // bad -- always true + return 1; + } + return 7; + } + + function g(uint8 y) public returns (bool) { + return (y < 512); // bad! + } +} \ No newline at end of file diff --git a/tests/detectors/tautology/0.4.25/type_based_tautology.sol.0.4.25.TypeBasedTautology.json b/tests/detectors/tautology/0.4.25/type_based_tautology.sol.0.4.25.TypeBasedTautology.json new file mode 100644 index 000000000..1592c496c --- /dev/null +++ b/tests/detectors/tautology/0.4.25/type_based_tautology.sol.0.4.25.TypeBasedTautology.json @@ -0,0 +1,284 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "f", + "source_mapping": { + "start": 14, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6, + 7 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f(uint256)" + } + }, + { + "type": "node", + "name": "x >= 0", + "source_mapping": { + "start": 69, + "length": 6, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 3 + ], + "starting_column": 13, + "ending_column": 19 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 14, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6, + 7 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f(uint256)" + } + } + } + } + ], + "description": "A.f(uint256) (tests/detectors/tautology/0.4.25/type_based_tautology.sol#2-7) contains a tautology or contradiction:\n\t- x >= 0 (tests/detectors/tautology/0.4.25/type_based_tautology.sol#3)\n", + "markdown": "[A.f(uint256)](tests/detectors/tautology/0.4.25/type_based_tautology.sol#L2-L7) contains a tautology or contradiction:\n\t- [x >= 0](tests/detectors/tautology/0.4.25/type_based_tautology.sol#L3)\n", + "first_markdown_element": "tests/detectors/tautology/0.4.25/type_based_tautology.sol#L2-L7", + "id": "c9b8085dbb7e6d0dfc2ee5711ac45a70e4c0f494ac4efcae42a6b947e3170ddb", + "check": "tautology", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "g", + "source_mapping": { + "start": 150, + "length": 80, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 9, + 10, + 11 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "g(uint8)" + } + }, + { + "type": "node", + "name": "(y < 512)", + "source_mapping": { + "start": 202, + "length": 16, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 10 + ], + "starting_column": 9, + "ending_column": 25 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "g", + "source_mapping": { + "start": 150, + "length": 80, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 9, + 10, + 11 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.4.25/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "g(uint8)" + } + } + } + } + ], + "description": "A.g(uint8) (tests/detectors/tautology/0.4.25/type_based_tautology.sol#9-11) contains a tautology or contradiction:\n\t- (y < 512) (tests/detectors/tautology/0.4.25/type_based_tautology.sol#10)\n", + "markdown": "[A.g(uint8)](tests/detectors/tautology/0.4.25/type_based_tautology.sol#L9-L11) contains a tautology or contradiction:\n\t- [(y < 512)](tests/detectors/tautology/0.4.25/type_based_tautology.sol#L10)\n", + "first_markdown_element": "tests/detectors/tautology/0.4.25/type_based_tautology.sol#L9-L11", + "id": "75dfe0b8776a8cf490a4e3f30366dec173fd0dc7418335f77c68ba5bca536382", + "check": "tautology", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/tautology/0.5.16/type_based_tautology.sol b/tests/detectors/tautology/0.5.16/type_based_tautology.sol new file mode 100644 index 000000000..cfd3997c6 --- /dev/null +++ b/tests/detectors/tautology/0.5.16/type_based_tautology.sol @@ -0,0 +1,12 @@ +contract A { + function f(uint x) public returns (uint) { + if (x >= 0) { // bad -- always true + return 1; + } + return 7; + } + + function g(uint8 y) public returns (bool) { + return (y < 512); // bad! + } +} \ No newline at end of file diff --git a/tests/detectors/tautology/0.5.16/type_based_tautology.sol.0.5.16.TypeBasedTautology.json b/tests/detectors/tautology/0.5.16/type_based_tautology.sol.0.5.16.TypeBasedTautology.json new file mode 100644 index 000000000..2b347f0e8 --- /dev/null +++ b/tests/detectors/tautology/0.5.16/type_based_tautology.sol.0.5.16.TypeBasedTautology.json @@ -0,0 +1,284 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "f", + "source_mapping": { + "start": 14, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6, + 7 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f(uint256)" + } + }, + { + "type": "node", + "name": "x >= 0", + "source_mapping": { + "start": 69, + "length": 6, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 3 + ], + "starting_column": 13, + "ending_column": 19 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 14, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6, + 7 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f(uint256)" + } + } + } + } + ], + "description": "A.f(uint256) (tests/detectors/tautology/0.5.16/type_based_tautology.sol#2-7) contains a tautology or contradiction:\n\t- x >= 0 (tests/detectors/tautology/0.5.16/type_based_tautology.sol#3)\n", + "markdown": "[A.f(uint256)](tests/detectors/tautology/0.5.16/type_based_tautology.sol#L2-L7) contains a tautology or contradiction:\n\t- [x >= 0](tests/detectors/tautology/0.5.16/type_based_tautology.sol#L3)\n", + "first_markdown_element": "tests/detectors/tautology/0.5.16/type_based_tautology.sol#L2-L7", + "id": "764eb2c7aa5cd1a30d16deb620e0dc3b8a9e9170978908bcc1f6fc1ac5a8daa1", + "check": "tautology", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "g", + "source_mapping": { + "start": 150, + "length": 80, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 9, + 10, + 11 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "g(uint8)" + } + }, + { + "type": "node", + "name": "(y < 512)", + "source_mapping": { + "start": 202, + "length": 16, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 10 + ], + "starting_column": 9, + "ending_column": 25 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "g", + "source_mapping": { + "start": 150, + "length": 80, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 9, + 10, + 11 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.5.16/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "g(uint8)" + } + } + } + } + ], + "description": "A.g(uint8) (tests/detectors/tautology/0.5.16/type_based_tautology.sol#9-11) contains a tautology or contradiction:\n\t- (y < 512) (tests/detectors/tautology/0.5.16/type_based_tautology.sol#10)\n", + "markdown": "[A.g(uint8)](tests/detectors/tautology/0.5.16/type_based_tautology.sol#L9-L11) contains a tautology or contradiction:\n\t- [(y < 512)](tests/detectors/tautology/0.5.16/type_based_tautology.sol#L10)\n", + "first_markdown_element": "tests/detectors/tautology/0.5.16/type_based_tautology.sol#L9-L11", + "id": "0c29aa92764cb30104a4c4ba02e307d5949143b4cbfa2d8a52d9473140907872", + "check": "tautology", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/tautology/0.6.11/type_based_tautology.sol b/tests/detectors/tautology/0.6.11/type_based_tautology.sol new file mode 100644 index 000000000..cfd3997c6 --- /dev/null +++ b/tests/detectors/tautology/0.6.11/type_based_tautology.sol @@ -0,0 +1,12 @@ +contract A { + function f(uint x) public returns (uint) { + if (x >= 0) { // bad -- always true + return 1; + } + return 7; + } + + function g(uint8 y) public returns (bool) { + return (y < 512); // bad! + } +} \ No newline at end of file diff --git a/tests/detectors/tautology/0.6.11/type_based_tautology.sol.0.6.11.TypeBasedTautology.json b/tests/detectors/tautology/0.6.11/type_based_tautology.sol.0.6.11.TypeBasedTautology.json new file mode 100644 index 000000000..971033eae --- /dev/null +++ b/tests/detectors/tautology/0.6.11/type_based_tautology.sol.0.6.11.TypeBasedTautology.json @@ -0,0 +1,284 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "f", + "source_mapping": { + "start": 14, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6, + 7 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f(uint256)" + } + }, + { + "type": "node", + "name": "x >= 0", + "source_mapping": { + "start": 69, + "length": 6, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 3 + ], + "starting_column": 13, + "ending_column": 19 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 14, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6, + 7 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f(uint256)" + } + } + } + } + ], + "description": "A.f(uint256) (tests/detectors/tautology/0.6.11/type_based_tautology.sol#2-7) contains a tautology or contradiction:\n\t- x >= 0 (tests/detectors/tautology/0.6.11/type_based_tautology.sol#3)\n", + "markdown": "[A.f(uint256)](tests/detectors/tautology/0.6.11/type_based_tautology.sol#L2-L7) contains a tautology or contradiction:\n\t- [x >= 0](tests/detectors/tautology/0.6.11/type_based_tautology.sol#L3)\n", + "first_markdown_element": "tests/detectors/tautology/0.6.11/type_based_tautology.sol#L2-L7", + "id": "fec3df769045cbe4984e50b2f651f60ffc36b116bc7273a64f761e8fbfc674b9", + "check": "tautology", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "g", + "source_mapping": { + "start": 150, + "length": 80, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 9, + 10, + 11 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "g(uint8)" + } + }, + { + "type": "node", + "name": "(y < 512)", + "source_mapping": { + "start": 202, + "length": 16, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 10 + ], + "starting_column": 9, + "ending_column": 25 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "g", + "source_mapping": { + "start": 150, + "length": 80, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 9, + 10, + 11 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.6.11/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "g(uint8)" + } + } + } + } + ], + "description": "A.g(uint8) (tests/detectors/tautology/0.6.11/type_based_tautology.sol#9-11) contains a tautology or contradiction:\n\t- (y < 512) (tests/detectors/tautology/0.6.11/type_based_tautology.sol#10)\n", + "markdown": "[A.g(uint8)](tests/detectors/tautology/0.6.11/type_based_tautology.sol#L9-L11) contains a tautology or contradiction:\n\t- [(y < 512)](tests/detectors/tautology/0.6.11/type_based_tautology.sol#L10)\n", + "first_markdown_element": "tests/detectors/tautology/0.6.11/type_based_tautology.sol#L9-L11", + "id": "51bc777574da16aab9aefb9d0294fdad9ef3a44136e9e7b1f7e05cfd9c1d4e54", + "check": "tautology", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/tautology/0.7.6/type_based_tautology.sol b/tests/detectors/tautology/0.7.6/type_based_tautology.sol new file mode 100644 index 000000000..cfd3997c6 --- /dev/null +++ b/tests/detectors/tautology/0.7.6/type_based_tautology.sol @@ -0,0 +1,12 @@ +contract A { + function f(uint x) public returns (uint) { + if (x >= 0) { // bad -- always true + return 1; + } + return 7; + } + + function g(uint8 y) public returns (bool) { + return (y < 512); // bad! + } +} \ No newline at end of file diff --git a/tests/detectors/tautology/0.7.6/type_based_tautology.sol.0.7.6.TypeBasedTautology.json b/tests/detectors/tautology/0.7.6/type_based_tautology.sol.0.7.6.TypeBasedTautology.json new file mode 100644 index 000000000..633bbaa05 --- /dev/null +++ b/tests/detectors/tautology/0.7.6/type_based_tautology.sol.0.7.6.TypeBasedTautology.json @@ -0,0 +1,284 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "f", + "source_mapping": { + "start": 14, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6, + 7 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f(uint256)" + } + }, + { + "type": "node", + "name": "x >= 0", + "source_mapping": { + "start": 69, + "length": 6, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 3 + ], + "starting_column": 13, + "ending_column": 19 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 14, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6, + 7 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f(uint256)" + } + } + } + } + ], + "description": "A.f(uint256) (tests/detectors/tautology/0.7.6/type_based_tautology.sol#2-7) contains a tautology or contradiction:\n\t- x >= 0 (tests/detectors/tautology/0.7.6/type_based_tautology.sol#3)\n", + "markdown": "[A.f(uint256)](tests/detectors/tautology/0.7.6/type_based_tautology.sol#L2-L7) contains a tautology or contradiction:\n\t- [x >= 0](tests/detectors/tautology/0.7.6/type_based_tautology.sol#L3)\n", + "first_markdown_element": "tests/detectors/tautology/0.7.6/type_based_tautology.sol#L2-L7", + "id": "e444c1c7287bff97cae3505472d10d8ef5e01aa1f2e7660c81a3beb11eeaea0e", + "check": "tautology", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "g", + "source_mapping": { + "start": 150, + "length": 80, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 9, + 10, + 11 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "g(uint8)" + } + }, + { + "type": "node", + "name": "(y < 512)", + "source_mapping": { + "start": 202, + "length": 16, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 10 + ], + "starting_column": 9, + "ending_column": 25 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "g", + "source_mapping": { + "start": 150, + "length": 80, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 9, + 10, + 11 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "A", + "source_mapping": { + "start": 0, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/tautology/0.7.6/type_based_tautology.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "g(uint8)" + } + } + } + } + ], + "description": "A.g(uint8) (tests/detectors/tautology/0.7.6/type_based_tautology.sol#9-11) contains a tautology or contradiction:\n\t- (y < 512) (tests/detectors/tautology/0.7.6/type_based_tautology.sol#10)\n", + "markdown": "[A.g(uint8)](tests/detectors/tautology/0.7.6/type_based_tautology.sol#L9-L11) contains a tautology or contradiction:\n\t- [(y < 512)](tests/detectors/tautology/0.7.6/type_based_tautology.sol#L10)\n", + "first_markdown_element": "tests/detectors/tautology/0.7.6/type_based_tautology.sol#L9-L11", + "id": "036b1ecab6ee0dcb07806dbd8ffb05abf29941bbbcbb161da0013b31be51b3de", + "check": "tautology", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/test_detectors.py b/tests/test_detectors.py index 678799cd6..dbb097680 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -1219,6 +1219,26 @@ ALL_TESTS = [ "divide_before_multiply.sol", "0.7.6", ), + Test( + all_detectors.TypeBasedTautology, + "type_based_tautology.sol", + "0.4.25", + ), + Test( + all_detectors.TypeBasedTautology, + "type_based_tautology.sol", + "0.5.16", + ), + Test( + all_detectors.TypeBasedTautology, + "type_based_tautology.sol", + "0.6.11", + ), + Test( + all_detectors.TypeBasedTautology, + "type_based_tautology.sol", + "0.7.6", + ), ] GENERIC_PATH = "/GENERIC_PATH" From 0faf335d29fc50f9e1caa28fe8af20a4b92a1274 Mon Sep 17 00:00:00 2001 From: Michael Colburn Date: Fri, 28 May 2021 21:21:56 -0400 Subject: [PATCH 008/101] Add tests for the similar-names detector --- .../0.4.25/similar_variables.sol | 7 + ...ables.sol.0.4.25.SimilarVarsDetection.json | 155 ++++++++++++++++++ .../0.5.16/similar_variables.sol | 7 + ...ables.sol.0.5.16.SimilarVarsDetection.json | 155 ++++++++++++++++++ .../0.6.11/similar_variables.sol | 7 + ...ables.sol.0.6.11.SimilarVarsDetection.json | 155 ++++++++++++++++++ .../similar-names/0.7.6/similar_variables.sol | 7 + ...iables.sol.0.7.6.SimilarVarsDetection.json | 155 ++++++++++++++++++ tests/test_detectors.py | 20 +++ 9 files changed, 668 insertions(+) create mode 100644 tests/detectors/similar-names/0.4.25/similar_variables.sol create mode 100644 tests/detectors/similar-names/0.4.25/similar_variables.sol.0.4.25.SimilarVarsDetection.json create mode 100644 tests/detectors/similar-names/0.5.16/similar_variables.sol create mode 100644 tests/detectors/similar-names/0.5.16/similar_variables.sol.0.5.16.SimilarVarsDetection.json create mode 100644 tests/detectors/similar-names/0.6.11/similar_variables.sol create mode 100644 tests/detectors/similar-names/0.6.11/similar_variables.sol.0.6.11.SimilarVarsDetection.json create mode 100644 tests/detectors/similar-names/0.7.6/similar_variables.sol create mode 100644 tests/detectors/similar-names/0.7.6/similar_variables.sol.0.7.6.SimilarVarsDetection.json diff --git a/tests/detectors/similar-names/0.4.25/similar_variables.sol b/tests/detectors/similar-names/0.4.25/similar_variables.sol new file mode 100644 index 000000000..57f969867 --- /dev/null +++ b/tests/detectors/similar-names/0.4.25/similar_variables.sol @@ -0,0 +1,7 @@ +contract Similar { + function f() public returns (uint) { + uint testVariable = 1; + uint textVariable = 2; + return testVariable + textVariable; + } +} \ No newline at end of file diff --git a/tests/detectors/similar-names/0.4.25/similar_variables.sol.0.4.25.SimilarVarsDetection.json b/tests/detectors/similar-names/0.4.25/similar_variables.sol.0.4.25.SimilarVarsDetection.json new file mode 100644 index 000000000..3393d1d06 --- /dev/null +++ b/tests/detectors/similar-names/0.4.25/similar_variables.sol.0.4.25.SimilarVarsDetection.json @@ -0,0 +1,155 @@ +[ + [ + { + "elements": [ + { + "type": "variable", + "name": "testVariable", + "source_mapping": { + "start": 69, + "length": 21, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.4.25/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.4.25/similar_variables.sol", + "is_dependency": false, + "lines": [ + 3 + ], + "starting_column": 9, + "ending_column": 30 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 23, + "length": 149, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.4.25/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.4.25/similar_variables.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Similar", + "source_mapping": { + "start": 0, + "length": 174, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.4.25/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.4.25/similar_variables.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f()" + } + } + } + }, + { + "type": "variable", + "name": "textVariable", + "source_mapping": { + "start": 100, + "length": 21, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.4.25/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.4.25/similar_variables.sol", + "is_dependency": false, + "lines": [ + 4 + ], + "starting_column": 9, + "ending_column": 30 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 23, + "length": 149, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.4.25/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.4.25/similar_variables.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Similar", + "source_mapping": { + "start": 0, + "length": 174, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.4.25/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.4.25/similar_variables.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f()" + } + } + } + } + ], + "description": "Variable Similar.f().testVariable (tests/detectors/similar-names/0.4.25/similar_variables.sol#3) is too similar to Similar.f().textVariable (tests/detectors/similar-names/0.4.25/similar_variables.sol#4)\n", + "markdown": "Variable [Similar.f().testVariable](tests/detectors/similar-names/0.4.25/similar_variables.sol#L3) is too similar to [Similar.f().textVariable](tests/detectors/similar-names/0.4.25/similar_variables.sol#L4)\n", + "first_markdown_element": "tests/detectors/similar-names/0.4.25/similar_variables.sol#L3", + "id": "2f767a2bb6f48a8435ce456e2d3ad859bdeccf66507735a14e20515e914038d5", + "check": "similar-names", + "impact": "Informational", + "confidence": "Medium" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/similar-names/0.5.16/similar_variables.sol b/tests/detectors/similar-names/0.5.16/similar_variables.sol new file mode 100644 index 000000000..57f969867 --- /dev/null +++ b/tests/detectors/similar-names/0.5.16/similar_variables.sol @@ -0,0 +1,7 @@ +contract Similar { + function f() public returns (uint) { + uint testVariable = 1; + uint textVariable = 2; + return testVariable + textVariable; + } +} \ No newline at end of file diff --git a/tests/detectors/similar-names/0.5.16/similar_variables.sol.0.5.16.SimilarVarsDetection.json b/tests/detectors/similar-names/0.5.16/similar_variables.sol.0.5.16.SimilarVarsDetection.json new file mode 100644 index 000000000..543023e43 --- /dev/null +++ b/tests/detectors/similar-names/0.5.16/similar_variables.sol.0.5.16.SimilarVarsDetection.json @@ -0,0 +1,155 @@ +[ + [ + { + "elements": [ + { + "type": "variable", + "name": "testVariable", + "source_mapping": { + "start": 69, + "length": 21, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.5.16/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.5.16/similar_variables.sol", + "is_dependency": false, + "lines": [ + 3 + ], + "starting_column": 9, + "ending_column": 30 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 23, + "length": 149, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.5.16/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.5.16/similar_variables.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Similar", + "source_mapping": { + "start": 0, + "length": 174, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.5.16/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.5.16/similar_variables.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f()" + } + } + } + }, + { + "type": "variable", + "name": "textVariable", + "source_mapping": { + "start": 100, + "length": 21, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.5.16/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.5.16/similar_variables.sol", + "is_dependency": false, + "lines": [ + 4 + ], + "starting_column": 9, + "ending_column": 30 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 23, + "length": 149, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.5.16/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.5.16/similar_variables.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Similar", + "source_mapping": { + "start": 0, + "length": 174, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.5.16/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.5.16/similar_variables.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f()" + } + } + } + } + ], + "description": "Variable Similar.f().testVariable (tests/detectors/similar-names/0.5.16/similar_variables.sol#3) is too similar to Similar.f().textVariable (tests/detectors/similar-names/0.5.16/similar_variables.sol#4)\n", + "markdown": "Variable [Similar.f().testVariable](tests/detectors/similar-names/0.5.16/similar_variables.sol#L3) is too similar to [Similar.f().textVariable](tests/detectors/similar-names/0.5.16/similar_variables.sol#L4)\n", + "first_markdown_element": "tests/detectors/similar-names/0.5.16/similar_variables.sol#L3", + "id": "2f767a2bb6f48a8435ce456e2d3ad859bdeccf66507735a14e20515e914038d5", + "check": "similar-names", + "impact": "Informational", + "confidence": "Medium" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/similar-names/0.6.11/similar_variables.sol b/tests/detectors/similar-names/0.6.11/similar_variables.sol new file mode 100644 index 000000000..57f969867 --- /dev/null +++ b/tests/detectors/similar-names/0.6.11/similar_variables.sol @@ -0,0 +1,7 @@ +contract Similar { + function f() public returns (uint) { + uint testVariable = 1; + uint textVariable = 2; + return testVariable + textVariable; + } +} \ No newline at end of file diff --git a/tests/detectors/similar-names/0.6.11/similar_variables.sol.0.6.11.SimilarVarsDetection.json b/tests/detectors/similar-names/0.6.11/similar_variables.sol.0.6.11.SimilarVarsDetection.json new file mode 100644 index 000000000..89aa1e5dc --- /dev/null +++ b/tests/detectors/similar-names/0.6.11/similar_variables.sol.0.6.11.SimilarVarsDetection.json @@ -0,0 +1,155 @@ +[ + [ + { + "elements": [ + { + "type": "variable", + "name": "testVariable", + "source_mapping": { + "start": 69, + "length": 21, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.6.11/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.6.11/similar_variables.sol", + "is_dependency": false, + "lines": [ + 3 + ], + "starting_column": 9, + "ending_column": 30 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 23, + "length": 149, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.6.11/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.6.11/similar_variables.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Similar", + "source_mapping": { + "start": 0, + "length": 174, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.6.11/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.6.11/similar_variables.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f()" + } + } + } + }, + { + "type": "variable", + "name": "textVariable", + "source_mapping": { + "start": 100, + "length": 21, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.6.11/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.6.11/similar_variables.sol", + "is_dependency": false, + "lines": [ + 4 + ], + "starting_column": 9, + "ending_column": 30 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 23, + "length": 149, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.6.11/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.6.11/similar_variables.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Similar", + "source_mapping": { + "start": 0, + "length": 174, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.6.11/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.6.11/similar_variables.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f()" + } + } + } + } + ], + "description": "Variable Similar.f().testVariable (tests/detectors/similar-names/0.6.11/similar_variables.sol#3) is too similar to Similar.f().textVariable (tests/detectors/similar-names/0.6.11/similar_variables.sol#4)\n", + "markdown": "Variable [Similar.f().testVariable](tests/detectors/similar-names/0.6.11/similar_variables.sol#L3) is too similar to [Similar.f().textVariable](tests/detectors/similar-names/0.6.11/similar_variables.sol#L4)\n", + "first_markdown_element": "tests/detectors/similar-names/0.6.11/similar_variables.sol#L3", + "id": "2f767a2bb6f48a8435ce456e2d3ad859bdeccf66507735a14e20515e914038d5", + "check": "similar-names", + "impact": "Informational", + "confidence": "Medium" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/similar-names/0.7.6/similar_variables.sol b/tests/detectors/similar-names/0.7.6/similar_variables.sol new file mode 100644 index 000000000..57f969867 --- /dev/null +++ b/tests/detectors/similar-names/0.7.6/similar_variables.sol @@ -0,0 +1,7 @@ +contract Similar { + function f() public returns (uint) { + uint testVariable = 1; + uint textVariable = 2; + return testVariable + textVariable; + } +} \ No newline at end of file diff --git a/tests/detectors/similar-names/0.7.6/similar_variables.sol.0.7.6.SimilarVarsDetection.json b/tests/detectors/similar-names/0.7.6/similar_variables.sol.0.7.6.SimilarVarsDetection.json new file mode 100644 index 000000000..dd05b4133 --- /dev/null +++ b/tests/detectors/similar-names/0.7.6/similar_variables.sol.0.7.6.SimilarVarsDetection.json @@ -0,0 +1,155 @@ +[ + [ + { + "elements": [ + { + "type": "variable", + "name": "testVariable", + "source_mapping": { + "start": 69, + "length": 21, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.7.6/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.7.6/similar_variables.sol", + "is_dependency": false, + "lines": [ + 3 + ], + "starting_column": 9, + "ending_column": 30 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 23, + "length": 149, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.7.6/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.7.6/similar_variables.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Similar", + "source_mapping": { + "start": 0, + "length": 174, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.7.6/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.7.6/similar_variables.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f()" + } + } + } + }, + { + "type": "variable", + "name": "textVariable", + "source_mapping": { + "start": 100, + "length": 21, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.7.6/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.7.6/similar_variables.sol", + "is_dependency": false, + "lines": [ + 4 + ], + "starting_column": 9, + "ending_column": 30 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "f", + "source_mapping": { + "start": 23, + "length": 149, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.7.6/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.7.6/similar_variables.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5, + 6 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Similar", + "source_mapping": { + "start": 0, + "length": 174, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/similar-names/0.7.6/similar_variables.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/similar-names/0.7.6/similar_variables.sol", + "is_dependency": false, + "lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "f()" + } + } + } + } + ], + "description": "Variable Similar.f().testVariable (tests/detectors/similar-names/0.7.6/similar_variables.sol#3) is too similar to Similar.f().textVariable (tests/detectors/similar-names/0.7.6/similar_variables.sol#4)\n", + "markdown": "Variable [Similar.f().testVariable](tests/detectors/similar-names/0.7.6/similar_variables.sol#L3) is too similar to [Similar.f().textVariable](tests/detectors/similar-names/0.7.6/similar_variables.sol#L4)\n", + "first_markdown_element": "tests/detectors/similar-names/0.7.6/similar_variables.sol#L3", + "id": "2f767a2bb6f48a8435ce456e2d3ad859bdeccf66507735a14e20515e914038d5", + "check": "similar-names", + "impact": "Informational", + "confidence": "Medium" + } + ] +] \ No newline at end of file diff --git a/tests/test_detectors.py b/tests/test_detectors.py index dbb097680..a83084164 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -1239,6 +1239,26 @@ ALL_TESTS = [ "type_based_tautology.sol", "0.7.6", ), + Test( + all_detectors.SimilarVarsDetection, + "similar_variables.sol", + "0.4.25", + ), + Test( + all_detectors.SimilarVarsDetection, + "similar_variables.sol", + "0.5.16", + ), + Test( + all_detectors.SimilarVarsDetection, + "similar_variables.sol", + "0.6.11", + ), + Test( + all_detectors.SimilarVarsDetection, + "similar_variables.sol", + "0.7.6", + ), ] GENERIC_PATH = "/GENERIC_PATH" From 8539c03e22e2dbbef95a6be14a384139c91d258a Mon Sep 17 00:00:00 2001 From: Josselin Date: Tue, 22 Jun 2021 11:34:28 +0200 Subject: [PATCH 009/101] Improve debug info in case of name reuse --- .../slither_compilation_unit_solc.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/slither/solc_parsing/slither_compilation_unit_solc.py b/slither/solc_parsing/slither_compilation_unit_solc.py index e7ff8d099..aafd3fe0d 100644 --- a/slither/solc_parsing/slither_compilation_unit_solc.py +++ b/slither/solc_parsing/slither_compilation_unit_solc.py @@ -311,7 +311,7 @@ Please rename it, this name is reserved for Slither's internals""" father_constructors = [] # try: # Resolve linearized base contracts. - missing_inheritance = False + missing_inheritance = None for i in contract_parser.linearized_base_contracts[1:]: if i in contract_parser.remapping: @@ -321,7 +321,7 @@ Please rename it, this name is reserved for Slither's internals""" elif i in self._contracts_by_id: ancestors.append(self._contracts_by_id[i]) else: - missing_inheritance = True + missing_inheritance = i # Resolve immediate base contracts for i in contract_parser.baseContracts: @@ -332,7 +332,7 @@ Please rename it, this name is reserved for Slither's internals""" elif i in self._contracts_by_id: fathers.append(self._contracts_by_id[i]) else: - missing_inheritance = True + missing_inheritance = i # Resolve immediate base constructor calls for i in contract_parser.baseConstructorContractsCalled: @@ -343,7 +343,7 @@ Please rename it, this name is reserved for Slither's internals""" elif i in self._contracts_by_id: father_constructors.append(self._contracts_by_id[i]) else: - missing_inheritance = True + missing_inheritance = i contract_parser.underlying_contract.set_inheritance( ancestors, fathers, father_constructors @@ -353,7 +353,14 @@ Please rename it, this name is reserved for Slither's internals""" self._compilation_unit.contracts_with_missing_inheritance.add( contract_parser.underlying_contract ) - contract_parser.log_incorrect_parsing(f"Missing inheritance {contract_parser}") + txt = f"Missing inheritance {contract_parser.underlying_contract} ({contract_parser.compilation_unit.crytic_compile_compilation_unit.unique_id})\n" + txt += f"Missing inheritance ID: {missing_inheritance}\n" + if contract_parser.underlying_contract.inheritance: + txt += f"Inheritance found:\n" + for contract_inherited in contract_parser.underlying_contract.inheritance: + txt += f"\t - {contract_inherited} (ID {contract_inherited.id})\n" + contract_parser.log_incorrect_parsing(txt) + contract_parser.set_is_analyzed(True) contract_parser.delete_content() From ace923595ccf9d0af5607ec918624be714bf5ace Mon Sep 17 00:00:00 2001 From: Josselin Date: Thu, 8 Jul 2021 10:35:37 +0200 Subject: [PATCH 010/101] Minor improvements to the function-id printer - Do not print shadowed functions - Do not printer slither's internal function --- setup.py | 6 +++--- slither/printers/summary/function_ids.py | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 7079af30d..7e88b57a7 100644 --- a/setup.py +++ b/setup.py @@ -11,10 +11,10 @@ setup( install_requires=[ "prettytable>=0.7.2", "pysha3>=1.0.2", - # "crytic-compile>=0.2.0", - "crytic-compile", + "crytic-compile>=0.2.0", + # "crytic-compile", ], - dependency_links=["git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile"], + # dependency_links=["git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile"], license="AGPL-3.0", long_description=open("README.md").read(), entry_points={ diff --git a/slither/printers/summary/function_ids.py b/slither/printers/summary/function_ids.py index 7152b74cf..9181b88c0 100644 --- a/slither/printers/summary/function_ids.py +++ b/slither/printers/summary/function_ids.py @@ -26,6 +26,8 @@ class FunctionIds(AbstractPrinter): txt += "\n{}:\n".format(contract.name) table = MyPrettyTable(["Name", "ID"]) for function in contract.functions: + if function.is_shadowed or function.is_constructor_variables: + continue if function.visibility in ["public", "external"]: function_id = get_function_id(function.solidity_signature) table.add_row([function.solidity_signature, f"{function_id:#0{10}x}"]) From d7c5809ea884878f558144dd547e2ba644e89b89 Mon Sep 17 00:00:00 2001 From: Illia Bobyr Date: Fri, 3 Sep 2021 17:55:29 -0700 Subject: [PATCH 011/101] Handle ignore markers when `exclude-dependencies` is set `valid_results` behaviour is described in terms of "results are valid, unless ...". A matching implementation would be to only return `True` a the end of the function, and have all the cases only return `False` if they detect an invalid result. `show-ignored-findings` is the only exception to the rule above. --- slither/core/slither_core.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/slither/core/slither_core.py b/slither/core/slither_core.py index 77f64ccd2..d43430c42 100644 --- a/slither/core/slither_core.py +++ b/slither/core/slither_core.py @@ -46,7 +46,7 @@ class SlitherCore(Context): self._previous_results_ids: Set[str] = set() # Every slither object has a list of result from detector # Because of the multiple compilation support, we might analyze - # Multiple time the same result, so we remove dupplicate + # Multiple time the same result, so we remove duplicates self._currently_seen_resuts: Set[str] = set() self._paths_to_filter: Set[str] = set() @@ -207,7 +207,7 @@ class SlitherCore(Context): - There is an ignore comment on the preceding line """ - # Remove dupplicate due to the multiple compilation support + # Remove duplicate due to the multiple compilation support if r["id"] in self._currently_seen_resuts: return False self._currently_seen_resuts.add(r["id"]) @@ -240,7 +240,8 @@ class SlitherCore(Context): if r["elements"] and matching: return False if r["elements"] and self._exclude_dependencies: - return not all(element["source_mapping"]["is_dependency"] for element in r["elements"]) + if all(element["source_mapping"]["is_dependency"] for element in r["elements"]): + return False if self._show_ignored_findings: return True if r["id"] in self._previous_results_ids: @@ -248,7 +249,10 @@ class SlitherCore(Context): if self.has_ignore_comment(r): return False # Conserve previous result filtering. This is conserved for compatibility, but is meant to be removed - return not r["description"] in [pr["description"] for pr in self._previous_results] + if r["description"] in [pr["description"] for pr in self._previous_results]: + return False + + return True def load_previous_results(self): filename = self._previous_results_filename From cfc1343723cb1fef7e373171cf677804d997c562 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 4 Mar 2022 10:13:12 -0600 Subject: [PATCH 012/101] Update bug_report.yml I changed the `value` fields to `placeholder` so that you don't have to delete existing text to fill out an issue --- .github/ISSUE_TEMPLATE/bug_report.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index aa39e1daa..e39b8d54b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,41 +1,41 @@ name: Bug Report description: File a bug report title: "[Bug]: " -labels: ["bug"] +labels: ["bug-candidate"] body: - type: markdown attributes: - value: | + value: > Please check the issues tab to avoid duplicates. - Thanks for taking the time to fill out this bug report! - type: textarea id: what-happened attributes: - label: What happened? - description: Also tell us, what did you expect to happen? - value: "A bug happened!" + label: "Describe the issue:" validations: required: true - type: textarea id: reproduce attributes: - label: Can you share code with us to reproduce this bug? - description: It can be a github repo, etherscan link, or code snippet. - value: "contract A {}" + label: "Reproduce the code example: + description: > + It can be a github repo, etherscan link, or code snippet. + placeholder: "contract A {}" validations: required: true - type: textarea id: version attributes: - label: Version - description: What version of our software are you running? - value: Run `slither --version` + label: "Version:" + description: What version of slither are you running? Run `slither --version` + placeholder: 0.8.2 validations: required: true - type: textarea id: logs attributes: label: Relevant log output - description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. + description: > + Please copy and paste any relevant log output. This + will be automatically formatted into code, so no need for backticks. render: shell From 2bca57220f4a22511db49175a8a9795d6fe55b05 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 9 Mar 2022 21:23:25 -0600 Subject: [PATCH 013/101] Update bug_report.yml --- .github/ISSUE_TEMPLATE/bug_report.yml | 75 +++++++++++++++------------ 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index e39b8d54b..a7ebed1cf 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,41 +1,48 @@ -name: Bug Report -description: File a bug report -title: "[Bug]: " -labels: ["bug-candidate"] -body: - - type: markdown - attributes: - value: > - Please check the issues tab to avoid duplicates. - Thanks for taking the time to fill out this bug report! - - type: textarea - id: what-happened - attributes: +--- +body: + - + attributes: + value: | + Please check the issues tab to avoid duplicates. + Thanks for taking the time to fill out this bug report! + type: markdown + - + attributes: label: "Describe the issue:" - validations: + id: what-happened + type: textarea + validations: required: true - - type: textarea + - + attributes: + description: "It can be a github repo, etherscan link, or code snippet." + label: "Code example to reproduce the issue:" + placeholder: "`contract A {}`\n" id: reproduce - attributes: - label: "Reproduce the code example: - description: > - It can be a github repo, etherscan link, or code snippet. - placeholder: "contract A {}" - validations: + type: textarea + validations: required: true - - type: textarea - id: version - attributes: + - + attributes: + description: | + What version of slither are you running? + Run `slither --version` label: "Version:" - description: What version of slither are you running? Run `slither --version` - placeholder: 0.8.2 - validations: + id: version + type: textarea + validations: required: true - - type: textarea + - + attributes: + description: | + Please copy and paste any relevant log output. This + will be automatically formatted into code, so no need for backticks. + render: shell + label: "Relevant log output:" id: logs - attributes: - label: Relevant log output - description: > - Please copy and paste any relevant log output. This - will be automatically formatted into code, so no need for backticks. - render: shell + type: textarea +description: "File a bug report" +labels: + - bug-candidate +name: "Bug Report" +title: "[Bug-Candidate]: " From ad6bf13851852fb713e5328adceba71e10551fa7 Mon Sep 17 00:00:00 2001 From: Josselin Date: Thu, 17 Mar 2022 13:52:36 +0100 Subject: [PATCH 014/101] Disable embark CI --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 24352f124..5ccd15dd9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: matrix: type: ["cli", "data_dependency", - "embark", + # "embark", "erc", "etherlime", "find_paths", From dc0cec2d7c3250a9c76ff72b5dbf73b646c5176d Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Fri, 18 Mar 2022 08:18:30 +0100 Subject: [PATCH 015/101] Improve slither-flat (#1125) * Improve slither-flat - Better support of multiple compilation unit - Better support if there are multiple contracts with the same name - Better support of top level object (partially fix #955). The support for the local import strategy is missing --- slither/core/declarations/contract.py | 4 +- .../solidity_types/type_parsing.py | 2 +- slither/tools/flattening/__main__.py | 45 +++--- slither/tools/flattening/flattening.py | 152 +++++++++++++----- 4 files changed, 140 insertions(+), 63 deletions(-) diff --git a/slither/core/declarations/contract.py b/slither/core/declarations/contract.py index ec0a20c8a..2db1cd964 100644 --- a/slither/core/declarations/contract.py +++ b/slither/core/declarations/contract.py @@ -75,7 +75,7 @@ class Contract(SourceMapping): # pylint: disable=too-many-public-methods self._custom_errors: Dict[str, "CustomErrorContract"] = {} # The only str is "*" - self._using_for: Dict[Union[str, Type], List[str]] = {} + self._using_for: Dict[Union[str, Type], List[Type]] = {} self._kind: Optional[str] = None self._is_interface: bool = False @@ -245,7 +245,7 @@ class Contract(SourceMapping): # pylint: disable=too-many-public-methods ################################################################################### @property - def using_for(self) -> Dict[Union[str, Type], List[str]]: + def using_for(self) -> Dict[Union[str, Type], List[Type]]: return self._using_for # endregion diff --git a/slither/solc_parsing/solidity_types/type_parsing.py b/slither/solc_parsing/solidity_types/type_parsing.py index 118b97ce3..4c4282f5d 100644 --- a/slither/solc_parsing/solidity_types/type_parsing.py +++ b/slither/solc_parsing/solidity_types/type_parsing.py @@ -198,7 +198,7 @@ def _find_from_type_name( # pylint: disable=too-many-locals,too-many-branches,t def parse_type( t: Union[Dict, UnknownType], caller_context: Union[CallerContextExpression, "SlitherCompilationUnitSolc"], -): +) -> Type: """ caller_context can be a SlitherCompilationUnitSolc because we recursively call the function and go up in the context's scope. If we are really lost we just go over the SlitherCompilationUnitSolc diff --git a/slither/tools/flattening/__main__.py b/slither/tools/flattening/__main__.py index 308dd8106..e0888f222 100644 --- a/slither/tools/flattening/__main__.py +++ b/slither/tools/flattening/__main__.py @@ -104,28 +104,31 @@ def main(): args = parse_args() slither = Slither(args.filename, **vars(args)) - flat = Flattening( - slither, - external_to_public=args.convert_external, - remove_assert=args.remove_assert, - private_to_internal=args.convert_private, - export_path=args.dir, - pragma_solidity=args.pragma_solidity, - ) - try: - strategy = Strategy[args.strategy] - except KeyError: - to_log = f"{args.strategy} is not a valid strategy, use: {STRATEGIES_NAMES} (default MostDerived)" - logger.error(to_log) - return - flat.export( - strategy=strategy, - target=args.contract, - json=args.json, - zip=args.zip, - zip_type=args.zip_type, - ) + for compilation_unit in slither.compilation_units: + + flat = Flattening( + compilation_unit, + external_to_public=args.convert_external, + remove_assert=args.remove_assert, + private_to_internal=args.convert_private, + export_path=args.dir, + pragma_solidity=args.pragma_solidity, + ) + + try: + strategy = Strategy[args.strategy] + except KeyError: + to_log = f"{args.strategy} is not a valid strategy, use: {STRATEGIES_NAMES} (default MostDerived)" + logger.error(to_log) + return + flat.export( + strategy=strategy, + target=args.contract, + json=args.json, + zip=args.zip, + zip_type=args.zip_type, + ) if __name__ == "__main__": diff --git a/slither/tools/flattening/flattening.py b/slither/tools/flattening/flattening.py index a1dbc0a9d..f067bde6d 100644 --- a/slither/tools/flattening/flattening.py +++ b/slither/tools/flattening/flattening.py @@ -1,17 +1,21 @@ import logging import re +import uuid from collections import namedtuple from enum import Enum as PythonEnum from pathlib import Path from typing import List, Set, Dict, Optional +from slither.core.compilation_unit import SlitherCompilationUnit from slither.core.declarations import SolidityFunction, EnumContract, StructureContract from slither.core.declarations.contract import Contract -from slither.core.slither_core import SlitherCore +from slither.core.declarations.function_top_level import FunctionTopLevel +from slither.core.declarations.top_level import TopLevel from slither.core.solidity_types import MappingType, ArrayType +from slither.core.solidity_types.type import Type from slither.core.solidity_types.user_defined_type import UserDefinedType from slither.exceptions import SlitherException -from slither.slithir.operations import NewContract, TypeConversion, SolidityCall +from slither.slithir.operations import NewContract, TypeConversion, SolidityCall, InternalCall from slither.tools.flattening.export.export import ( Export, export_as_json, @@ -44,7 +48,7 @@ class Flattening: # pylint: disable=too-many-instance-attributes,too-many-arguments,too-many-locals,too-few-public-methods def __init__( self, - slither: SlitherCore, + compilation_unit: SlitherCompilationUnit, external_to_public=False, remove_assert=False, private_to_internal=False, @@ -52,7 +56,8 @@ class Flattening: pragma_solidity: Optional[str] = None, ): self._source_codes: Dict[Contract, str] = {} - self._slither: SlitherCore = slither + self._source_codes_top_level: Dict[TopLevel, str] = {} + self._compilation_unit: SlitherCompilationUnit = compilation_unit self._external_to_public = external_to_public self._remove_assert = remove_assert self._use_abi_encoder_v2 = False @@ -63,20 +68,32 @@ class Flattening: self._check_abi_encoder_v2() - for contract in slither.contracts: + for contract in compilation_unit.contracts: self._get_source_code(contract) + self._get_source_code_top_level(compilation_unit.structures_top_level) + self._get_source_code_top_level(compilation_unit.enums_top_level) + self._get_source_code_top_level(compilation_unit.variables_top_level) + self._get_source_code_top_level(compilation_unit.functions_top_level) + + def _get_source_code_top_level(self, elems: List[TopLevel]) -> None: + for elem in elems: + src_mapping = elem.source_mapping + content = self._compilation_unit.core.source_code[src_mapping["filename_absolute"]] + start = src_mapping["start"] + end = src_mapping["start"] + src_mapping["length"] + self._source_codes_top_level[elem] = content[start:end] + def _check_abi_encoder_v2(self): """ Check if ABIEncoderV2 is required Set _use_abi_encorder_v2 :return: """ - for compilation_unit in self._slither.compilation_units: - for p in compilation_unit.pragma_directives: - if "ABIEncoderV2" in str(p.directive): - self._use_abi_encoder_v2 = True - return + for p in self._compilation_unit.pragma_directives: + if "ABIEncoderV2" in str(p.directive): + self._use_abi_encoder_v2 = True + return def _get_source_code( self, contract: Contract @@ -88,7 +105,7 @@ class Flattening: :return: """ src_mapping = contract.source_mapping - content = self._slither.source_code[src_mapping["filename_absolute"]] + content = self._compilation_unit.core.source_code[src_mapping["filename_absolute"]] start = src_mapping["start"] end = src_mapping["start"] + src_mapping["length"] @@ -132,11 +149,9 @@ class Flattening: if self._private_to_internal: for variable in contract.state_variables_declared: if variable.visibility == "private": - print(variable.source_mapping) attributes_start = variable.source_mapping["start"] attributes_end = attributes_start + variable.source_mapping["length"] attributes = content[attributes_start:attributes_end] - print(attributes) regex = re.search(r" private ", attributes) if regex: to_patch.append( @@ -191,35 +206,54 @@ class Flattening: ret += f"pragma solidity {self._pragma_solidity};\n" else: # TODO support multiple compiler version - ret += f"pragma solidity {list(self._slither.crytic_compile.compilation_units.values())[0].compiler_version.version};\n" + ret += f"pragma solidity {list(self._compilation_unit.crytic_compile.compilation_units.values())[0].compiler_version.version};\n" if self._use_abi_encoder_v2: ret += "pragma experimental ABIEncoderV2;\n" return ret - def _export_from_type(self, t, contract, exported, list_contract): + def _export_from_type( + self, + t: Type, + contract: Contract, + exported: Set[str], + list_contract: List[Contract], + list_top_level: List[TopLevel], + ): if isinstance(t, UserDefinedType): - if isinstance(t.type, (EnumContract, StructureContract)): - if t.type.contract != contract and t.type.contract not in exported: - self._export_list_used_contracts(t.type.contract, exported, list_contract) + t_type = t.type + if isinstance(t_type, (EnumContract, StructureContract)): + if t_type.contract != contract and t_type.contract not in exported: + self._export_list_used_contracts( + t_type.contract, exported, list_contract, list_top_level + ) else: assert isinstance(t.type, Contract) if t.type != contract and t.type not in exported: - self._export_list_used_contracts(t.type, exported, list_contract) + self._export_list_used_contracts( + t.type, exported, list_contract, list_top_level + ) elif isinstance(t, MappingType): - self._export_from_type(t.type_from, contract, exported, list_contract) - self._export_from_type(t.type_to, contract, exported, list_contract) + self._export_from_type(t.type_from, contract, exported, list_contract, list_top_level) + self._export_from_type(t.type_to, contract, exported, list_contract, list_top_level) elif isinstance(t, ArrayType): - self._export_from_type(t.type, contract, exported, list_contract) + self._export_from_type(t.type, contract, exported, list_contract, list_top_level) def _export_list_used_contracts( # pylint: disable=too-many-branches - self, contract: Contract, exported: Set[str], list_contract: List[Contract] + self, + contract: Contract, + exported: Set[str], + list_contract: List[Contract], + list_top_level: List[TopLevel], ): + # TODO: investigate why this happen + if not isinstance(contract, Contract): + return if contract.name in exported: return exported.add(contract.name) for inherited in contract.inheritance: - self._export_list_used_contracts(inherited, exported, list_contract) + self._export_list_used_contracts(inherited, exported, list_contract, list_top_level) # Find all the external contracts called externals = contract.all_library_calls + contract.all_high_level_calls @@ -228,7 +262,16 @@ class Flattening: externals = list({e[0] for e in externals if e[0] != contract}) for inherited in externals: - self._export_list_used_contracts(inherited, exported, list_contract) + self._export_list_used_contracts(inherited, exported, list_contract, list_top_level) + + for list_libs in contract.using_for.values(): + for lib_candidate_type in list_libs: + if isinstance(lib_candidate_type, UserDefinedType): + lib_candidate = lib_candidate_type.type + if isinstance(lib_candidate, Contract): + self._export_list_used_contracts( + lib_candidate, exported, list_contract, list_top_level + ) # Find all the external contracts use as a base type local_vars = [] @@ -236,11 +279,11 @@ class Flattening: local_vars += f.variables for v in contract.variables + local_vars: - self._export_from_type(v.type, contract, exported, list_contract) + self._export_from_type(v.type, contract, exported, list_contract, list_top_level) for s in contract.structures: for elem in s.elems.values(): - self._export_from_type(elem.type, contract, exported, list_contract) + self._export_from_type(elem.type, contract, exported, list_contract, list_top_level) # Find all convert and "new" operation that can lead to use an external contract for f in contract.functions_declared: @@ -248,21 +291,38 @@ class Flattening: if isinstance(ir, NewContract): if ir.contract_created != contract and not ir.contract_created in exported: self._export_list_used_contracts( - ir.contract_created, exported, list_contract + ir.contract_created, exported, list_contract, list_top_level ) if isinstance(ir, TypeConversion): - self._export_from_type(ir.type, contract, exported, list_contract) + self._export_from_type( + ir.type, contract, exported, list_contract, list_top_level + ) + + for read in ir.read: + if isinstance(read, TopLevel): + if read not in list_top_level: + list_top_level.append(read) + if isinstance(ir, InternalCall): + function_called = ir.function + if isinstance(function_called, FunctionTopLevel): + list_top_level.append(function_called) + if contract not in list_contract: list_contract.append(contract) def _export_contract_with_inheritance(self, contract) -> Export: list_contracts: List[Contract] = [] # will contain contract itself - self._export_list_used_contracts(contract, set(), list_contracts) - path = Path(self._export_path, f"{contract.name}.sol") + list_top_level: List[TopLevel] = [] + self._export_list_used_contracts(contract, set(), list_contracts, list_top_level) + path = Path(self._export_path, f"{contract.name}_{uuid.uuid4()}.sol") content = "" content += self._pragmas() + for listed_top_level in list_top_level: + content += self._source_codes_top_level[listed_top_level] + content += "\n" + for listed_contract in list_contracts: content += self._source_codes[listed_contract] content += "\n" @@ -271,7 +331,7 @@ class Flattening: def _export_most_derived(self) -> List[Export]: ret: List[Export] = [] - for contract in self._slither.contracts_derived: + for contract in self._compilation_unit.contracts_derived: ret.append(self._export_contract_with_inheritance(contract)) return ret @@ -281,8 +341,13 @@ class Flattening: content = "" content += self._pragmas() + for top_level_content in self._source_codes_top_level.values(): + content += "\n" + content += top_level_content + content += "\n" + contract_seen = set() - contract_to_explore = list(self._slither.contracts) + contract_to_explore = list(self._compilation_unit.contracts) # We only need the inheritance order here, as solc can compile # a contract that use another contract type (ex: state variable) that he has not seen yet @@ -303,9 +368,17 @@ class Flattening: def _export_with_import(self) -> List[Export]: exports: List[Export] = [] - for contract in self._slither.contracts: + for contract in self._compilation_unit.contracts: list_contracts: List[Contract] = [] # will contain contract itself - self._export_list_used_contracts(contract, set(), list_contracts) + list_top_level: List[TopLevel] = [] + self._export_list_used_contracts(contract, set(), list_contracts, list_top_level) + + if list_top_level: + logger.info( + "Top level objects are not yet supported with the local import flattening" + ) + for elem in list_top_level: + logger.info(f"Missing {elem} for {contract.name}") path = Path(self._export_path, f"{contract.name}.sol") @@ -341,12 +414,13 @@ class Flattening: elif strategy == Strategy.LocalImport: exports = self._export_with_import() else: - contracts = self._slither.get_contract_from_name(target) - if len(contracts) != 1: + contracts = self._compilation_unit.get_contract_from_name(target) + if len(contracts) == 0: logger.error(f"{target} not found") return - contract = contracts[0] - exports = [self._export_contract_with_inheritance(contract)] + exports = [] + for contract in contracts: + exports.append(self._export_contract_with_inheritance(contract)) if json: export_as_json(exports, json) From c57e272d6c8a707bbbfe74075ce4d1bc4a25f143 Mon Sep 17 00:00:00 2001 From: Boyan MILANOV Date: Fri, 18 Mar 2022 08:45:45 +0100 Subject: [PATCH 016/101] Ignore private `__gap` variables in shadowing detectors (#1117) * Don't consider shadowing of private __gap variables in state and abstract shadowing detectors --- slither/core/solidity_types/__init__.py | 1 + slither/detectors/shadowing/abstract.py | 4 + slither/detectors/shadowing/common.py | 30 ++++++ slither/detectors/shadowing/state.py | 8 +- .../0.7.5/public_gap_variable.sol | 8 ++ ....sol.0.7.5.ShadowingAbstractDetection.json | 95 ++++++++++++++++++ .../0.7.5/shadowing_state_variable.sol | 8 ++ ....sol.0.7.5.ShadowingAbstractDetection.json | 3 + .../0.7.5/public_gap_variable.sol | 10 ++ ...gap_variable.sol.0.7.5.StateShadowing.json | 97 +++++++++++++++++++ .../0.7.5/shadowing_state_variable.sol | 8 ++ ...ate_variable.sol.0.7.5.StateShadowing.json | 3 + tests/test_detectors.py | 20 ++++ 13 files changed, 294 insertions(+), 1 deletion(-) create mode 100644 slither/detectors/shadowing/common.py create mode 100644 tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol create mode 100644 tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol.0.7.5.ShadowingAbstractDetection.json create mode 100644 tests/detectors/shadowing-abstract/0.7.5/shadowing_state_variable.sol create mode 100644 tests/detectors/shadowing-abstract/0.7.5/shadowing_state_variable.sol.0.7.5.ShadowingAbstractDetection.json create mode 100644 tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol create mode 100644 tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol.0.7.5.StateShadowing.json create mode 100644 tests/detectors/shadowing-state/0.7.5/shadowing_state_variable.sol create mode 100644 tests/detectors/shadowing-state/0.7.5/shadowing_state_variable.sol.0.7.5.StateShadowing.json diff --git a/slither/core/solidity_types/__init__.py b/slither/core/solidity_types/__init__.py index 4a6e8e5df..13b1efefb 100644 --- a/slither/core/solidity_types/__init__.py +++ b/slither/core/solidity_types/__init__.py @@ -3,4 +3,5 @@ from .elementary_type import ElementaryType from .function_type import FunctionType from .mapping_type import MappingType from .user_defined_type import UserDefinedType +from .type import Type from .type_information import TypeInformation diff --git a/slither/detectors/shadowing/abstract.py b/slither/detectors/shadowing/abstract.py index a770d1c17..d019d0f25 100644 --- a/slither/detectors/shadowing/abstract.py +++ b/slither/detectors/shadowing/abstract.py @@ -8,6 +8,7 @@ from slither.core.declarations import Contract from slither.core.variables.state_variable import StateVariable from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification from slither.utils.output import Output, AllSupportedOutput +from .common import is_upgradable_gap_variable def detect_shadowing(contract: Contract) -> List[List[StateVariable]]: @@ -19,6 +20,9 @@ def detect_shadowing(contract: Contract) -> List[List[StateVariable]]: var: StateVariable for var in contract.state_variables_declared: + if is_upgradable_gap_variable(contract, var): + continue + shadow: List[StateVariable] = [v for v in variables_fathers if v.name == var.name] if shadow: ret.append([var] + shadow) diff --git a/slither/detectors/shadowing/common.py b/slither/detectors/shadowing/common.py new file mode 100644 index 000000000..248dbb86a --- /dev/null +++ b/slither/detectors/shadowing/common.py @@ -0,0 +1,30 @@ +from slither.core.declarations import Contract +from slither.core.variables.state_variable import StateVariable +from slither.core.solidity_types import ArrayType, ElementaryType + + +def is_upgradable_gap_variable(contract: Contract, variable: StateVariable) -> bool: + """Helper function that returns true if 'variable' is a gap variable used + for upgradable contracts. More specifically, the function returns true if: + - variable is named "__gap" + - it is a uint256 array declared at the end of the contract + - it has private visibility""" + + # Return early on if the variable name is != gap to avoid iterating over all the state variables + if variable.name != "__gap": + return False + + declared_variable_ordered = [ + v for v in contract.state_variables_ordered if v in contract.state_variables_declared + ] + + if not declared_variable_ordered: + return False + + variable_type = variable.type + return ( + declared_variable_ordered[-1] is variable + and isinstance(variable_type, ArrayType) + and variable_type.type == ElementaryType("uint256") + and variable.visibility == "private" + ) diff --git a/slither/detectors/shadowing/state.py b/slither/detectors/shadowing/state.py index b125e86d7..766c2437d 100644 --- a/slither/detectors/shadowing/state.py +++ b/slither/detectors/shadowing/state.py @@ -3,9 +3,11 @@ Module detecting shadowing of state variables """ from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification +from slither.core.declarations import Contract +from .common import is_upgradable_gap_variable -def detect_shadowing(contract): +def detect_shadowing(contract: Contract): ret = [] variables_fathers = [] for father in contract.inheritance: @@ -13,6 +15,10 @@ def detect_shadowing(contract): variables_fathers += father.state_variables_declared for var in contract.state_variables_declared: + # Ignore __gap variables for updatable contracts + if is_upgradable_gap_variable(contract, var): + continue + shadow = [v for v in variables_fathers if v.name == var.name] if shadow: ret.append([var] + shadow) diff --git a/tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol b/tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol new file mode 100644 index 000000000..d259a3d4b --- /dev/null +++ b/tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol @@ -0,0 +1,8 @@ +pragma solidity ^0.7.5; +contract BaseContract{ + uint256[50] private __gap; +} + +contract DerivedContract is BaseContract{ + uint256[50] public __gap; +} diff --git a/tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol.0.7.5.ShadowingAbstractDetection.json b/tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol.0.7.5.ShadowingAbstractDetection.json new file mode 100644 index 000000000..c20743f0d --- /dev/null +++ b/tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol.0.7.5.ShadowingAbstractDetection.json @@ -0,0 +1,95 @@ +[ + [ + { + "elements": [ + { + "type": "variable", + "name": "__gap", + "source_mapping": { + "start": 127, + "length": 24, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol", + "is_dependency": false, + "lines": [ + 7 + ], + "starting_column": 5, + "ending_column": 29 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DerivedContract", + "source_mapping": { + "start": 81, + "length": 73, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol", + "is_dependency": false, + "lines": [ + 6, + 7, + 8 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + }, + { + "type": "variable", + "name": "__gap", + "source_mapping": { + "start": 51, + "length": 25, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol", + "is_dependency": false, + "lines": [ + 3 + ], + "starting_column": 5, + "ending_column": 30 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "BaseContract", + "source_mapping": { + "start": 24, + "length": 55, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + } + ], + "description": "DerivedContract.__gap (tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol#7) shadows:\n\t- BaseContract.__gap (tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol#3)\n", + "markdown": "[DerivedContract.__gap](tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol#L7) shadows:\n\t- [BaseContract.__gap](tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol#L3)\n", + "first_markdown_element": "tests/detectors/shadowing-abstract/0.7.5/public_gap_variable.sol#L7", + "id": "8f81b2b4b3285fe96f0b580cdd2144cc6cf6808d970ba68878b9901744069c4c", + "check": "shadowing-abstract", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/shadowing-abstract/0.7.5/shadowing_state_variable.sol b/tests/detectors/shadowing-abstract/0.7.5/shadowing_state_variable.sol new file mode 100644 index 000000000..3c5b16db9 --- /dev/null +++ b/tests/detectors/shadowing-abstract/0.7.5/shadowing_state_variable.sol @@ -0,0 +1,8 @@ +pragma solidity ^0.7.5; +contract BaseContract{ + uint256[50] private __gap; +} + +contract DerivedContract is BaseContract{ + uint256[50] private __gap; +} diff --git a/tests/detectors/shadowing-abstract/0.7.5/shadowing_state_variable.sol.0.7.5.ShadowingAbstractDetection.json b/tests/detectors/shadowing-abstract/0.7.5/shadowing_state_variable.sol.0.7.5.ShadowingAbstractDetection.json new file mode 100644 index 000000000..5825bcacc --- /dev/null +++ b/tests/detectors/shadowing-abstract/0.7.5/shadowing_state_variable.sol.0.7.5.ShadowingAbstractDetection.json @@ -0,0 +1,3 @@ +[ + [] +] \ No newline at end of file diff --git a/tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol b/tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol new file mode 100644 index 000000000..5bf5d2fa6 --- /dev/null +++ b/tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol @@ -0,0 +1,10 @@ +pragma solidity ^0.7.5; +contract BaseContract{ + uint256[50] private __gap; + function f() external {} +} + +contract DerivedContract is BaseContract{ + uint256[50] public __gap; + function g() external {} +} diff --git a/tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol.0.7.5.StateShadowing.json b/tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol.0.7.5.StateShadowing.json new file mode 100644 index 000000000..e40c6a413 --- /dev/null +++ b/tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol.0.7.5.StateShadowing.json @@ -0,0 +1,97 @@ +[ + [ + { + "elements": [ + { + "type": "variable", + "name": "__gap", + "source_mapping": { + "start": 156, + "length": 24, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol", + "is_dependency": false, + "lines": [ + 8 + ], + "starting_column": 5, + "ending_column": 29 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DerivedContract", + "source_mapping": { + "start": 110, + "length": 102, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol", + "is_dependency": false, + "lines": [ + 7, + 8, + 9, + 10 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + }, + { + "type": "variable", + "name": "__gap", + "source_mapping": { + "start": 51, + "length": 25, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol", + "is_dependency": false, + "lines": [ + 3 + ], + "starting_column": 5, + "ending_column": 30 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "BaseContract", + "source_mapping": { + "start": 24, + "length": 84, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol", + "is_dependency": false, + "lines": [ + 2, + 3, + 4, + 5 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + } + ], + "description": "DerivedContract.__gap (tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol#8) shadows:\n\t- BaseContract.__gap (tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol#3)\n", + "markdown": "[DerivedContract.__gap](tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol#L8) shadows:\n\t- [BaseContract.__gap](tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol#L3)\n", + "first_markdown_element": "tests/detectors/shadowing-state/0.7.5/public_gap_variable.sol#L8", + "id": "8f81b2b4b3285fe96f0b580cdd2144cc6cf6808d970ba68878b9901744069c4c", + "check": "shadowing-state", + "impact": "High", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/shadowing-state/0.7.5/shadowing_state_variable.sol b/tests/detectors/shadowing-state/0.7.5/shadowing_state_variable.sol new file mode 100644 index 000000000..3c5b16db9 --- /dev/null +++ b/tests/detectors/shadowing-state/0.7.5/shadowing_state_variable.sol @@ -0,0 +1,8 @@ +pragma solidity ^0.7.5; +contract BaseContract{ + uint256[50] private __gap; +} + +contract DerivedContract is BaseContract{ + uint256[50] private __gap; +} diff --git a/tests/detectors/shadowing-state/0.7.5/shadowing_state_variable.sol.0.7.5.StateShadowing.json b/tests/detectors/shadowing-state/0.7.5/shadowing_state_variable.sol.0.7.5.StateShadowing.json new file mode 100644 index 000000000..5825bcacc --- /dev/null +++ b/tests/detectors/shadowing-state/0.7.5/shadowing_state_variable.sol.0.7.5.StateShadowing.json @@ -0,0 +1,3 @@ +[ + [] +] \ No newline at end of file diff --git a/tests/test_detectors.py b/tests/test_detectors.py index f7884d68f..a81d38de3 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -635,6 +635,16 @@ ALL_TEST_OBJECTS = [ "shadowing_abstract.sol", "0.5.16", ), + Test( + all_detectors.ShadowingAbstractDetection, + "shadowing_state_variable.sol", + "0.7.5", + ), + Test( + all_detectors.ShadowingAbstractDetection, + "public_gap_variable.sol", + "0.7.5", + ), Test( all_detectors.StateShadowing, "shadowing_state_variable.sol", @@ -650,6 +660,16 @@ ALL_TEST_OBJECTS = [ "shadowing_state_variable.sol", "0.6.11", ), + Test( + all_detectors.StateShadowing, + "shadowing_state_variable.sol", + "0.7.5", + ), + Test( + all_detectors.StateShadowing, + "public_gap_variable.sol", + "0.7.5", + ), Test( all_detectors.StateShadowing, "shadowing_state_variable.sol", From bab44b77d29e26161c28f509dbb9c00a3a4acb04 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 18 Mar 2022 02:46:35 -0500 Subject: [PATCH 017/101] reentrancy-no-eth: do not count staticcalls as reentrant (#1119) * reentrancy-no-eth: do not count staticcalls as reentrant * change can_reenter of low-level-calls to false for staticcall --- slither/slithir/operations/high_level_call.py | 16 +++++++----- slither/slithir/operations/library_call.py | 2 ++ slither/slithir/operations/low_level_call.py | 2 ++ .../0.5.16/no-reentrancy-staticcall.sol | 20 ++++++++++++++ ...ol.0.5.16.ReentrancyReadBeforeWritten.json | 3 +++ .../0.6.11/no-reentrancy-staticcall.sol | 26 +++++++++++++++++++ ...ol.0.6.11.ReentrancyReadBeforeWritten.json | 3 +++ .../0.7.6/no-reentrancy-staticcall.sol | 25 ++++++++++++++++++ ...sol.0.7.6.ReentrancyReadBeforeWritten.json | 3 +++ tests/test_detectors.py | 15 +++++++++++ 10 files changed, 109 insertions(+), 6 deletions(-) create mode 100644 tests/detectors/reentrancy-no-eth/0.5.16/no-reentrancy-staticcall.sol create mode 100644 tests/detectors/reentrancy-no-eth/0.5.16/no-reentrancy-staticcall.sol.0.5.16.ReentrancyReadBeforeWritten.json create mode 100644 tests/detectors/reentrancy-no-eth/0.6.11/no-reentrancy-staticcall.sol create mode 100644 tests/detectors/reentrancy-no-eth/0.6.11/no-reentrancy-staticcall.sol.0.6.11.ReentrancyReadBeforeWritten.json create mode 100644 tests/detectors/reentrancy-no-eth/0.7.6/no-reentrancy-staticcall.sol create mode 100644 tests/detectors/reentrancy-no-eth/0.7.6/no-reentrancy-staticcall.sol.0.7.6.ReentrancyReadBeforeWritten.json diff --git a/slither/slithir/operations/high_level_call.py b/slither/slithir/operations/high_level_call.py index fd6078bbe..0cac823ba 100644 --- a/slither/slithir/operations/high_level_call.py +++ b/slither/slithir/operations/high_level_call.py @@ -96,6 +96,14 @@ class HighLevelCall(Call, OperationWithLValue): # region Analyses ################################################################################### ################################################################################### + def is_static_call(self): + # If solidity >0.5, STATICCALL is used + if self.compilation_unit.solc_version and self.compilation_unit.solc_version >= "0.5.0": + if isinstance(self.function, Function) and (self.function.view or self.function.pure): + return True + if isinstance(self.function, Variable): + return True + return False def can_reenter(self, callstack=None): """ @@ -105,12 +113,8 @@ class HighLevelCall(Call, OperationWithLValue): :param callstack: check for recursion :return: bool """ - # If solidity >0.5, STATICCALL is used - if self.compilation_unit.solc_version and self.compilation_unit.solc_version >= "0.5.0": - if isinstance(self.function, Function) and (self.function.view or self.function.pure): - return False - if isinstance(self.function, Variable): - return False + if self.is_static_call(): + return False # If there is a call to itself # We can check that the function called is # reentrancy-safe diff --git a/slither/slithir/operations/library_call.py b/slither/slithir/operations/library_call.py index 95b4751e1..1f1f507a6 100644 --- a/slither/slithir/operations/library_call.py +++ b/slither/slithir/operations/library_call.py @@ -17,6 +17,8 @@ class LibraryCall(HighLevelCall): Must be called after slithIR analysis pass :return: bool """ + if self.is_static_call(): + return False # In case of recursion, return False callstack = [] if callstack is None else callstack if self.function in callstack: diff --git a/slither/slithir/operations/low_level_call.py b/slither/slithir/operations/low_level_call.py index acef3513b..83bbbb336 100644 --- a/slither/slithir/operations/low_level_call.py +++ b/slither/slithir/operations/low_level_call.py @@ -61,6 +61,8 @@ class LowLevelCall(Call, OperationWithLValue): # pylint: disable=too-many-insta Must be called after slithIR analysis pass :return: bool """ + if self.function_name == "staticcall": + return False return True def can_send_eth(self): diff --git a/tests/detectors/reentrancy-no-eth/0.5.16/no-reentrancy-staticcall.sol b/tests/detectors/reentrancy-no-eth/0.5.16/no-reentrancy-staticcall.sol new file mode 100644 index 000000000..856d5dae2 --- /dev/null +++ b/tests/detectors/reentrancy-no-eth/0.5.16/no-reentrancy-staticcall.sol @@ -0,0 +1,20 @@ +library MyLibrary { + + function aViewCall(address token) internal view { + (bool success ,) = token.staticcall(abi.encodeWithSignature("decimals")); + require(success, "call failed"); + } +} + +contract A { + uint256 private protectMe = 1; + function good() external { + MyLibrary.aViewCall(0x6B175474E89094C44Da98b954EedeAC495271d0F); + protectMe += 1; + } + function good1() external { + (bool success,) = address(MyLibrary).staticcall(abi.encodeWithSignature("aViewCall(address)")); + require(success, "call failed"); + protectMe += 1; + } +} diff --git a/tests/detectors/reentrancy-no-eth/0.5.16/no-reentrancy-staticcall.sol.0.5.16.ReentrancyReadBeforeWritten.json b/tests/detectors/reentrancy-no-eth/0.5.16/no-reentrancy-staticcall.sol.0.5.16.ReentrancyReadBeforeWritten.json new file mode 100644 index 000000000..5825bcacc --- /dev/null +++ b/tests/detectors/reentrancy-no-eth/0.5.16/no-reentrancy-staticcall.sol.0.5.16.ReentrancyReadBeforeWritten.json @@ -0,0 +1,3 @@ +[ + [] +] \ No newline at end of file diff --git a/tests/detectors/reentrancy-no-eth/0.6.11/no-reentrancy-staticcall.sol b/tests/detectors/reentrancy-no-eth/0.6.11/no-reentrancy-staticcall.sol new file mode 100644 index 000000000..4b939fee7 --- /dev/null +++ b/tests/detectors/reentrancy-no-eth/0.6.11/no-reentrancy-staticcall.sol @@ -0,0 +1,26 @@ +interface IERC20 { + function decimals() external view returns (uint8); +} + +library MyLibrary { + + function aViewCall(address token) internal view { + (bool success , ) = token.staticcall( + abi.encodeWithSelector(IERC20.decimals.selector) + ); + require(success, "call failed"); + } +} + +contract A { + uint256 private protectMe = 1; + function good() external { + MyLibrary.aViewCall(0x6B175474E89094C44Da98b954EedeAC495271d0F); + protectMe += 1; + } + function good1() external { + (bool success,) = address(MyLibrary).staticcall(abi.encodeWithSignature("aViewCall(address)")); + require(success, "call failed"); + protectMe += 1; + } +} diff --git a/tests/detectors/reentrancy-no-eth/0.6.11/no-reentrancy-staticcall.sol.0.6.11.ReentrancyReadBeforeWritten.json b/tests/detectors/reentrancy-no-eth/0.6.11/no-reentrancy-staticcall.sol.0.6.11.ReentrancyReadBeforeWritten.json new file mode 100644 index 000000000..5825bcacc --- /dev/null +++ b/tests/detectors/reentrancy-no-eth/0.6.11/no-reentrancy-staticcall.sol.0.6.11.ReentrancyReadBeforeWritten.json @@ -0,0 +1,3 @@ +[ + [] +] \ No newline at end of file diff --git a/tests/detectors/reentrancy-no-eth/0.7.6/no-reentrancy-staticcall.sol b/tests/detectors/reentrancy-no-eth/0.7.6/no-reentrancy-staticcall.sol new file mode 100644 index 000000000..d17d07d71 --- /dev/null +++ b/tests/detectors/reentrancy-no-eth/0.7.6/no-reentrancy-staticcall.sol @@ -0,0 +1,25 @@ +interface IERC20 { + function decimals() external view returns (uint8); +} + +library MyLibrary { + + function aViewCall(address token) internal view { + (bool success , ) = token.staticcall( + abi.encodeWithSelector(IERC20.decimals.selector) + ); + require(success, "call failed"); + } +} + +contract A { + uint256 private protectMe = 1; function good() external { + MyLibrary.aViewCall(0x6B175474E89094C44Da98b954EedeAC495271d0F); + protectMe += 1; + } + function good1() external { + (bool success,) = address(MyLibrary).staticcall(abi.encodeWithSignature("aViewCall(address)")); + require(success, "call failed"); + protectMe += 1; + } +} diff --git a/tests/detectors/reentrancy-no-eth/0.7.6/no-reentrancy-staticcall.sol.0.7.6.ReentrancyReadBeforeWritten.json b/tests/detectors/reentrancy-no-eth/0.7.6/no-reentrancy-staticcall.sol.0.7.6.ReentrancyReadBeforeWritten.json new file mode 100644 index 000000000..5825bcacc --- /dev/null +++ b/tests/detectors/reentrancy-no-eth/0.7.6/no-reentrancy-staticcall.sol.0.7.6.ReentrancyReadBeforeWritten.json @@ -0,0 +1,3 @@ +[ + [] +] \ No newline at end of file diff --git a/tests/test_detectors.py b/tests/test_detectors.py index a81d38de3..b174f026d 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -116,6 +116,21 @@ ALL_TEST_OBJECTS = [ "DAO.sol", "0.4.25", ), + Test( + all_detectors.ReentrancyReadBeforeWritten, + "no-reentrancy-staticcall.sol", + "0.5.16", + ), + Test( + all_detectors.ReentrancyReadBeforeWritten, + "no-reentrancy-staticcall.sol", + "0.6.11", + ), + Test( + all_detectors.ReentrancyReadBeforeWritten, + "no-reentrancy-staticcall.sol", + "0.7.6", + ), Test( all_detectors.BooleanEquality, "boolean-constant-equality.sol", From 4a6ba78aca5eebff237509274b48c26e011853d6 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 18 Mar 2022 02:47:03 -0500 Subject: [PATCH 018/101] Prioritize ignore comment over exclude dependencies (#1120) --- slither/core/slither_core.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/slither/core/slither_core.py b/slither/core/slither_core.py index 98a2c2429..78ff30ca5 100644 --- a/slither/core/slither_core.py +++ b/slither/core/slither_core.py @@ -239,14 +239,14 @@ class SlitherCore(Context): if r["elements"] and matching: return False - if r["elements"] and self._exclude_dependencies: - return not all(element["source_mapping"]["is_dependency"] for element in r["elements"]) if self._show_ignored_findings: return True - if r["id"] in self._previous_results_ids: - return False if self.has_ignore_comment(r): return False + if r["id"] in self._previous_results_ids: + return False + if r["elements"] and self._exclude_dependencies: + return not all(element["source_mapping"]["is_dependency"] for element in r["elements"]) # Conserve previous result filtering. This is conserved for compatibility, but is meant to be removed return not r["description"] in [pr["description"] for pr in self._previous_results] From 4b74b62f856fd9fdce179872f37ee2a2f0cc530b Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 18 Mar 2022 02:47:45 -0500 Subject: [PATCH 019/101] Remove results if functions have onlyProxy modifier (#1122) * unprotected-upgrade: filter results that have onlyProxy modifier --- .../statements/unprotected_upgradeable.py | 23 ++++++++++++++----- .../unprotected-upgrade/0.4.25/OnlyProxy.sol | 5 ++++ .../0.4.25/whitelisted.sol | 15 ++++++++++++ ...ted.sol.0.4.25.UnprotectedUpgradeable.json | 3 +++ .../unprotected-upgrade/0.5.16/OnlyProxy.sol | 5 ++++ .../0.5.16/whitelisted.sol | 15 ++++++++++++ ...ted.sol.0.5.16.UnprotectedUpgradeable.json | 3 +++ .../unprotected-upgrade/0.6.11/OnlyProxy.sol | 5 ++++ .../0.6.11/whitelisted.sol | 15 ++++++++++++ ...ted.sol.0.6.11.UnprotectedUpgradeable.json | 3 +++ .../unprotected-upgrade/0.7.6/OnlyProxy.sol | 5 ++++ .../unprotected-upgrade/0.7.6/whitelisted.sol | 15 ++++++++++++ ...sted.sol.0.7.6.UnprotectedUpgradeable.json | 3 +++ tests/test_detectors.py | 20 ++++++++++++++++ 14 files changed, 129 insertions(+), 6 deletions(-) create mode 100644 tests/detectors/unprotected-upgrade/0.4.25/OnlyProxy.sol create mode 100644 tests/detectors/unprotected-upgrade/0.4.25/whitelisted.sol create mode 100644 tests/detectors/unprotected-upgrade/0.4.25/whitelisted.sol.0.4.25.UnprotectedUpgradeable.json create mode 100644 tests/detectors/unprotected-upgrade/0.5.16/OnlyProxy.sol create mode 100644 tests/detectors/unprotected-upgrade/0.5.16/whitelisted.sol create mode 100644 tests/detectors/unprotected-upgrade/0.5.16/whitelisted.sol.0.5.16.UnprotectedUpgradeable.json create mode 100644 tests/detectors/unprotected-upgrade/0.6.11/OnlyProxy.sol create mode 100644 tests/detectors/unprotected-upgrade/0.6.11/whitelisted.sol create mode 100644 tests/detectors/unprotected-upgrade/0.6.11/whitelisted.sol.0.6.11.UnprotectedUpgradeable.json create mode 100644 tests/detectors/unprotected-upgrade/0.7.6/OnlyProxy.sol create mode 100644 tests/detectors/unprotected-upgrade/0.7.6/whitelisted.sol create mode 100644 tests/detectors/unprotected-upgrade/0.7.6/whitelisted.sol.0.7.6.UnprotectedUpgradeable.json diff --git a/slither/detectors/statements/unprotected_upgradeable.py b/slither/detectors/statements/unprotected_upgradeable.py index a32ea3308..f39eb31a4 100644 --- a/slither/detectors/statements/unprotected_upgradeable.py +++ b/slither/detectors/statements/unprotected_upgradeable.py @@ -1,11 +1,12 @@ from typing import List from slither.core.declarations import SolidityFunction, Function +from slither.core.declarations.contract import Contract from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification from slither.slithir.operations import LowLevelCall, SolidityCall -def _can_be_destroyed(contract) -> List[Function]: +def _can_be_destroyed(contract: Contract) -> List[Function]: targets = [] for f in contract.functions_entry_points: for ir in f.all_slithir_operations(): @@ -29,6 +30,18 @@ def _has_initializer_modifier(functions: List[Function]) -> bool: return False +def _whitelisted_modifiers(f: Function) -> bool: + # The onlyProxy modifier prevents calling the implementation contract (must be delegatecall) + # https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/3dec82093ea4a490d63aab3e925fed4f692909e8/contracts/proxy/utils/UUPSUpgradeable.sol#L38-L42 + return "onlyProxy" not in [modifier.name for modifier in f.modifiers] + + +def _initialize_functions(contract: Contract) -> List[Function]: + return list( + filter(_whitelisted_modifiers, [f for f in contract.functions if f.name == "initialize"]) + ) + + class UnprotectedUpgradeable(AbstractDetector): ARGUMENT = "unprotected-upgrade" @@ -72,12 +85,10 @@ class UnprotectedUpgradeable(AbstractDetector): if not _has_initializer_modifier(contract.constructors): functions_that_can_destroy = _can_be_destroyed(contract) if functions_that_can_destroy: - initiliaze_functions = [ - f for f in contract.functions if f.name == "initialize" - ] + initialize_functions = _initialize_functions(contract) vars_init_ = [ - init.all_state_variables_written() for init in initiliaze_functions + init.all_state_variables_written() for init in initialize_functions ] vars_init = [item for sublist in vars_init_ for item in sublist] @@ -93,7 +104,7 @@ class UnprotectedUpgradeable(AbstractDetector): contract, " is an upgradeable contract that does not protect its initiliaze functions: ", ] - + initiliaze_functions + + initialize_functions + [ ". Anyone can delete the contract with: ", ] diff --git a/tests/detectors/unprotected-upgrade/0.4.25/OnlyProxy.sol b/tests/detectors/unprotected-upgrade/0.4.25/OnlyProxy.sol new file mode 100644 index 000000000..1ffa63272 --- /dev/null +++ b/tests/detectors/unprotected-upgrade/0.4.25/OnlyProxy.sol @@ -0,0 +1,5 @@ +contract OnlyProxy { + modifier onlyProxy() { + _; + } +} diff --git a/tests/detectors/unprotected-upgrade/0.4.25/whitelisted.sol b/tests/detectors/unprotected-upgrade/0.4.25/whitelisted.sol new file mode 100644 index 000000000..d33a1816a --- /dev/null +++ b/tests/detectors/unprotected-upgrade/0.4.25/whitelisted.sol @@ -0,0 +1,15 @@ +import "./Initializable.sol"; +import "./OnlyProxy.sol"; + +contract Whitelisted is Initializable, OnlyProxy{ + address owner; + + function initialize() external initializer onlyProxy { + owner = msg.sender; + } + + function kill() external { + require(msg.sender == owner); + selfdestruct(owner); + } +} diff --git a/tests/detectors/unprotected-upgrade/0.4.25/whitelisted.sol.0.4.25.UnprotectedUpgradeable.json b/tests/detectors/unprotected-upgrade/0.4.25/whitelisted.sol.0.4.25.UnprotectedUpgradeable.json new file mode 100644 index 000000000..5825bcacc --- /dev/null +++ b/tests/detectors/unprotected-upgrade/0.4.25/whitelisted.sol.0.4.25.UnprotectedUpgradeable.json @@ -0,0 +1,3 @@ +[ + [] +] \ No newline at end of file diff --git a/tests/detectors/unprotected-upgrade/0.5.16/OnlyProxy.sol b/tests/detectors/unprotected-upgrade/0.5.16/OnlyProxy.sol new file mode 100644 index 000000000..1ffa63272 --- /dev/null +++ b/tests/detectors/unprotected-upgrade/0.5.16/OnlyProxy.sol @@ -0,0 +1,5 @@ +contract OnlyProxy { + modifier onlyProxy() { + _; + } +} diff --git a/tests/detectors/unprotected-upgrade/0.5.16/whitelisted.sol b/tests/detectors/unprotected-upgrade/0.5.16/whitelisted.sol new file mode 100644 index 000000000..c99b1929f --- /dev/null +++ b/tests/detectors/unprotected-upgrade/0.5.16/whitelisted.sol @@ -0,0 +1,15 @@ +import "./Initializable.sol"; +import "./OnlyProxy.sol"; + +contract Whitelisted is Initializable, OnlyProxy{ + address payable owner; + + function initialize() external initializer onlyProxy { + owner = msg.sender; + } + + function kill() external { + require(msg.sender == owner); + selfdestruct(owner); + } +} diff --git a/tests/detectors/unprotected-upgrade/0.5.16/whitelisted.sol.0.5.16.UnprotectedUpgradeable.json b/tests/detectors/unprotected-upgrade/0.5.16/whitelisted.sol.0.5.16.UnprotectedUpgradeable.json new file mode 100644 index 000000000..5825bcacc --- /dev/null +++ b/tests/detectors/unprotected-upgrade/0.5.16/whitelisted.sol.0.5.16.UnprotectedUpgradeable.json @@ -0,0 +1,3 @@ +[ + [] +] \ No newline at end of file diff --git a/tests/detectors/unprotected-upgrade/0.6.11/OnlyProxy.sol b/tests/detectors/unprotected-upgrade/0.6.11/OnlyProxy.sol new file mode 100644 index 000000000..1ffa63272 --- /dev/null +++ b/tests/detectors/unprotected-upgrade/0.6.11/OnlyProxy.sol @@ -0,0 +1,5 @@ +contract OnlyProxy { + modifier onlyProxy() { + _; + } +} diff --git a/tests/detectors/unprotected-upgrade/0.6.11/whitelisted.sol b/tests/detectors/unprotected-upgrade/0.6.11/whitelisted.sol new file mode 100644 index 000000000..c99b1929f --- /dev/null +++ b/tests/detectors/unprotected-upgrade/0.6.11/whitelisted.sol @@ -0,0 +1,15 @@ +import "./Initializable.sol"; +import "./OnlyProxy.sol"; + +contract Whitelisted is Initializable, OnlyProxy{ + address payable owner; + + function initialize() external initializer onlyProxy { + owner = msg.sender; + } + + function kill() external { + require(msg.sender == owner); + selfdestruct(owner); + } +} diff --git a/tests/detectors/unprotected-upgrade/0.6.11/whitelisted.sol.0.6.11.UnprotectedUpgradeable.json b/tests/detectors/unprotected-upgrade/0.6.11/whitelisted.sol.0.6.11.UnprotectedUpgradeable.json new file mode 100644 index 000000000..5825bcacc --- /dev/null +++ b/tests/detectors/unprotected-upgrade/0.6.11/whitelisted.sol.0.6.11.UnprotectedUpgradeable.json @@ -0,0 +1,3 @@ +[ + [] +] \ No newline at end of file diff --git a/tests/detectors/unprotected-upgrade/0.7.6/OnlyProxy.sol b/tests/detectors/unprotected-upgrade/0.7.6/OnlyProxy.sol new file mode 100644 index 000000000..1ffa63272 --- /dev/null +++ b/tests/detectors/unprotected-upgrade/0.7.6/OnlyProxy.sol @@ -0,0 +1,5 @@ +contract OnlyProxy { + modifier onlyProxy() { + _; + } +} diff --git a/tests/detectors/unprotected-upgrade/0.7.6/whitelisted.sol b/tests/detectors/unprotected-upgrade/0.7.6/whitelisted.sol new file mode 100644 index 000000000..c99b1929f --- /dev/null +++ b/tests/detectors/unprotected-upgrade/0.7.6/whitelisted.sol @@ -0,0 +1,15 @@ +import "./Initializable.sol"; +import "./OnlyProxy.sol"; + +contract Whitelisted is Initializable, OnlyProxy{ + address payable owner; + + function initialize() external initializer onlyProxy { + owner = msg.sender; + } + + function kill() external { + require(msg.sender == owner); + selfdestruct(owner); + } +} diff --git a/tests/detectors/unprotected-upgrade/0.7.6/whitelisted.sol.0.7.6.UnprotectedUpgradeable.json b/tests/detectors/unprotected-upgrade/0.7.6/whitelisted.sol.0.7.6.UnprotectedUpgradeable.json new file mode 100644 index 000000000..5825bcacc --- /dev/null +++ b/tests/detectors/unprotected-upgrade/0.7.6/whitelisted.sol.0.7.6.UnprotectedUpgradeable.json @@ -0,0 +1,3 @@ +[ + [] +] \ No newline at end of file diff --git a/tests/test_detectors.py b/tests/test_detectors.py index b174f026d..07fdd096b 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -853,6 +853,11 @@ ALL_TEST_OBJECTS = [ "Fixed.sol", "0.4.25", ), + Test( + all_detectors.UnprotectedUpgradeable, + "whitelisted.sol", + "0.4.25", + ), Test( all_detectors.UnprotectedUpgradeable, "Buggy.sol", @@ -863,6 +868,11 @@ ALL_TEST_OBJECTS = [ "Fixed.sol", "0.5.16", ), + Test( + all_detectors.UnprotectedUpgradeable, + "whitelisted.sol", + "0.5.16", + ), Test( all_detectors.UnprotectedUpgradeable, "Buggy.sol", @@ -873,6 +883,11 @@ ALL_TEST_OBJECTS = [ "Fixed.sol", "0.6.11", ), + Test( + all_detectors.UnprotectedUpgradeable, + "whitelisted.sol", + "0.6.11", + ), Test( all_detectors.UnprotectedUpgradeable, "Buggy.sol", @@ -883,6 +898,11 @@ ALL_TEST_OBJECTS = [ "Fixed.sol", "0.7.6", ), + Test( + all_detectors.UnprotectedUpgradeable, + "whitelisted.sol", + "0.7.6", + ), Test( all_detectors.ABIEncoderV2Array, "storage_ABIEncoderV2_array.sol", From 61bcec446824e3a59a1f1c9ae062054174449ae0 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Fri, 18 Mar 2022 10:19:37 +0100 Subject: [PATCH 020/101] Improve top level custom error parsing (#1131) * Improve top level function loopkup Fix #1116 * Improve top level custom error parsing Fix #1115 --- slither/core/declarations/custom_error.py | 16 +++++++++++----- slither/slithir/convert.py | 6 +++++- .../solc_parsing/declarations/custom_error.py | 1 + .../solc_parsing/expressions/find_variable.py | 14 +++++++++++--- .../import_free/Caller.sol-0.8.2-compact.zip | Bin 0 -> 2968 bytes ...r_with_state_variable.sol-0.8.10-compact.zip | Bin 0 -> 1935 bytes ...r_with_state_variable.sol-0.8.11-compact.zip | Bin 0 -> 1938 bytes ...r_with_state_variable.sol-0.8.12-compact.zip | Bin 0 -> 1938 bytes ...or_with_state_variable.sol-0.8.4-compact.zip | Bin 0 -> 1928 bytes ...or_with_state_variable.sol-0.8.5-compact.zip | Bin 0 -> 1928 bytes ...or_with_state_variable.sol-0.8.6-compact.zip | Bin 0 -> 1927 bytes ...or_with_state_variable.sol-0.8.7-compact.zip | Bin 0 -> 1930 bytes ...or_with_state_variable.sol-0.8.8-compact.zip | Bin 0 -> 1924 bytes ...or_with_state_variable.sol-0.8.9-compact.zip | Bin 0 -> 1934 bytes tests/ast-parsing/complex_imports/FreeFuns.sol | 4 ++++ .../complex_imports/import_free/Caller.sol | 11 +++++++++++ .../custom_error_with_state_variable.sol | 13 +++++++++++++ .../import_free/Caller.sol-0.8.2-compact.json | 6 ++++++ ..._with_state_variable.sol-0.8.10-compact.json | 3 +++ ..._with_state_variable.sol-0.8.11-compact.json | 3 +++ ..._with_state_variable.sol-0.8.12-compact.json | 3 +++ ...r_with_state_variable.sol-0.8.4-compact.json | 3 +++ ...r_with_state_variable.sol-0.8.5-compact.json | 3 +++ ...r_with_state_variable.sol-0.8.6-compact.json | 3 +++ ...r_with_state_variable.sol-0.8.7-compact.json | 3 +++ ...r_with_state_variable.sol-0.8.8-compact.json | 3 +++ ...r_with_state_variable.sol-0.8.9-compact.json | 3 +++ tests/test_ast_parsing.py | 13 +++++++++++++ 28 files changed, 102 insertions(+), 9 deletions(-) create mode 100644 tests/ast-parsing/compile/complex_imports/import_free/Caller.sol-0.8.2-compact.zip create mode 100644 tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.10-compact.zip create mode 100644 tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.11-compact.zip create mode 100644 tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.12-compact.zip create mode 100644 tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.4-compact.zip create mode 100644 tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.5-compact.zip create mode 100644 tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.6-compact.zip create mode 100644 tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.7-compact.zip create mode 100644 tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.8-compact.zip create mode 100644 tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.9-compact.zip create mode 100644 tests/ast-parsing/complex_imports/FreeFuns.sol create mode 100644 tests/ast-parsing/complex_imports/import_free/Caller.sol create mode 100644 tests/ast-parsing/custom_error_with_state_variable.sol create mode 100644 tests/ast-parsing/expected/complex_imports/import_free/Caller.sol-0.8.2-compact.json create mode 100644 tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.10-compact.json create mode 100644 tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.11-compact.json create mode 100644 tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.12-compact.json create mode 100644 tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.4-compact.json create mode 100644 tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.5-compact.json create mode 100644 tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.6-compact.json create mode 100644 tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.7-compact.json create mode 100644 tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.8-compact.json create mode 100644 tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.9-compact.json diff --git a/slither/core/declarations/custom_error.py b/slither/core/declarations/custom_error.py index fc2066982..9bd27ee0f 100644 --- a/slither/core/declarations/custom_error.py +++ b/slither/core/declarations/custom_error.py @@ -56,13 +56,19 @@ class CustomError(SourceMapping): Contract and converted into address :return: the solidity signature """ - if self._solidity_signature is None: - parameters = [ - self._convert_type_for_solidity_signature(x.type) for x in self.parameters - ] - self._solidity_signature = self.name + "(" + ",".join(parameters) + ")" + assert self._solidity_signature is not None return self._solidity_signature + def set_solidity_sig(self) -> None: + """ + Function to be called once all the parameters have been set + + Returns: + + """ + parameters = [self._convert_type_for_solidity_signature(x.type) for x in self.parameters] + self._solidity_signature = self.name + "(" + ",".join(parameters) + ")" + # endregion ################################################################################### ################################################################################### diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index cebad8f96..ef0adb015 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -1463,7 +1463,11 @@ def convert_type_of_high_and_internal_level_call(ir: Operation, contract: Option for import_statement in contract.file_scope.imports: if import_statement.alias and import_statement.alias == ir.contract_name: imported_scope = contract.compilation_unit.get_scope(import_statement.filename) - candidates += list(imported_scope.functions) + candidates += [ + f + for f in list(imported_scope.functions) + if f.name == ir.function_name and len(f.parameters) == len(ir.arguments) + ] func = _find_function_from_parameter(ir, candidates) diff --git a/slither/solc_parsing/declarations/custom_error.py b/slither/solc_parsing/declarations/custom_error.py index 7534b9198..83f6f0e5c 100644 --- a/slither/solc_parsing/declarations/custom_error.py +++ b/slither/solc_parsing/declarations/custom_error.py @@ -80,6 +80,7 @@ class CustomErrorSolc(CallerContextExpression): assert param[self.get_key()] == "VariableDeclaration" local_var = self._add_param(param) self._custom_error.add_parameters(local_var.underlying_variable) + self._custom_error.set_solidity_sig() def _add_param(self, param: Dict) -> LocalVariableSolc: diff --git a/slither/solc_parsing/expressions/find_variable.py b/slither/solc_parsing/expressions/find_variable.py index 2a71aa5d8..1c607fb69 100644 --- a/slither/solc_parsing/expressions/find_variable.py +++ b/slither/solc_parsing/expressions/find_variable.py @@ -125,13 +125,21 @@ def _find_top_level( new_val = SolidityImportPlaceHolder(import_directive) return new_val, True + if var_name in scope.variables: + return scope.variables[var_name], False + + # This path should be reached only after the top level custom error have been parsed + # If not, slither will crash + # It does not seem to be reacheable, but if so, we will have to adapt the order of logic + # This must be at the end, because other top level objects might require to go over "_find_top_level" + # Before the parsing of the top level custom error + # For example, a top variable that use another top level variable + # IF more top level objects are added to Solidity, we have to be careful with the order of the lookup + # in this function for custom_error in scope.custom_errors: if custom_error.solidity_signature == var_name: return custom_error, False - if var_name in scope.variables: - return scope.variables[var_name], False - return None, False diff --git a/tests/ast-parsing/compile/complex_imports/import_free/Caller.sol-0.8.2-compact.zip b/tests/ast-parsing/compile/complex_imports/import_free/Caller.sol-0.8.2-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..f7aa589ce59e73002276bd0c7a3bc0b817ab15fc GIT binary patch literal 2968 zcmaKu`9Bj51INc4A(<>WA`H2*f!m+P2MXI<;%vz3~&Gdq5uHRq@*W`CyM^1lVeTl zoQ3_qo)TTc@#wn(TGu{sv@6%I_l8$AKLnC@IAfy-UDlG`-yGMHMscq!sD~!GPu{Xy zoz9ulpm*RAxNJH!=xS$Zq2vb$_39mVwSr1J5(=8t!#S&DC#uf z$ev%Na4|+uoG1jl@p*PgdL*S}gveyL3EDa4p6+?!_Y{m7(!^KOc=80t z!++MC9*j142~Qs*Dc77V2U_AS2niR{Xc`NBR@Chy%G2wg%4sLx#myKI0JW6dD$Hfu zx{W@3QZsv?NuS##Xj7>AuMlvaLC)U&#SaMlIiuxz_XVL4382)p{|L1r`h`KXZmFb4?iiY*_B5aAMQdlXZ?r}kO3)m;_&fKA8nZU7m)yV8`>)RVy z#F|}`u&#&{V+D+-reiyK0r{hpa+UE*aFL^{Ug5 z3QXC$%{({4?79LDl5uc2tDd5o zl(;M0NQ~TGnhv4+s zg?ia6dt5nud1Uf1a25W1^<|v||11#p*vxdjC(pW|J9e#)?TXyaStjg_mN8MKhg0W~UtreDyM=#H} z2pLx?ez53GB;^flDN9ccG85MU_=Ydqjz~;&SrKYEOjWyUBcNJ?!5zYh6d%k#c{bk? zNY~=YbqO3BN$nG{EmT_54!Jll49tdYjax0m^~wrZdOQfR?)#yjVzlaby_rC+2QNKp zIG2F<$nai;%3K&CH=IZygUdiP4-a3IbxNtDnUPc%Xrz4h&0IBChO@n0I-zI3MqEj` z^AK~*`%W{u>qDKI)9nv;(%qtf9X=8de06Ai!{^$D7QAC$tOXc%p(2}uY*aBx>4vSK z906a+!%HL?GFd>1YzU9gmVpvkvse%Ieaj~k=@Fl0_TSXKy?K1TRp-|yXrxs3Cgb6? z%ujys`MychyV}zDnQbREK%o*>(XX-Tcj)bRT$~cWLnXhX&QhzXFE5R0P})6El8!r~ zW=ledNPo?EyPp_wGi1y&1$W+p^Bn@~z_fdy8@GwAU2cqzwa&i;2N>Grzw;|y35F6E zt6(rk?-?cMk!-0Pz<2#y6iXK$z5Er#Yhh?1kKUd}BVI+3OMH>XF8DNCio}Bv%Y*-3 z(md?PK9;bv4EGepmfkc7YLA`G76!9qKn}vni;lr*P;#DMP2zlmnOa!wD<2lEoEJR^ z!Q>_ht`HaToMH9kk8rm<1NniLTnQhb<=kZzqW3#vQ6oz!mElIm(j|(RvePm!-(T;S zOjF5NXC`#VuCU@&GghY)o;?vDmF6FBB7oz;zRvX*Fxb;Hv;Q3yiGACM8rSn+yU*L( z^c%+1oyt}dYf2Ki1=3P)_4dAAA9l z5GBo9RRy*$SG^fu5i5TX7j6J-!q2yX6>0ypE@)m>s^zu1l>Oi=*1c38Tett!Ov~Og zBd!T27?FHrLM;(?>eC<4L5X@>YDcaZJ$bSj4P0}ukqQ;wLw$>~o}n%}NUkXsH&Cy% z#i;Mg9xx5FjJaMY3ttz)02_jxe9lsPck1gIm_?dcX`pt3+9jg%2_NG-tyx?({nDgR z>Dt(*R^tqd9tML!v}ztd4s=;gB?d`<$tl(lz5QMKIz@LoEN8_h#sQL?)wQ1QeEZ%#5ONJ(8k7e|d zsPbqC=rI&{7cH1$D5--TrDGhJkk^8MaZFg3rSQ-TK|Kea+v`R_q7iA}Zr{`Q({eM5 zIM>c*sJzWdd6!je2j}i8VN;AmCW{iwq~R` zn3d?X7xAzJ$F4tnBmJqd!s%Bw+5YT&Z|W z#&jCm)Hw;i@+;0XQ;YwssmPi8nB}>ddQG=Gfv1LdjH_eVa6aLlW%0jI! zpx-Q|aU;G-?lvg(QpJJSWq4n}!-L9yw0Iz{zhU#;wa~FwFt^vA$Wag=X=dsj(8I-l zM0;V8ixyD>N-hJ7??XQ&bmM6+&p|oruH*Q@DFjc?CN!4{! zbH6inQ3zMECw{_Jto9`SA3egBmabtx@wq6KIeEHgI!YKW-Y3n{JctBt zzb?6wQdrtNK7ShWCF2BX{`N@`PNqBSOX)1)Vh>Y(Wqp9YX&IlUff~>&M|ni4m!#4N zI-OzQ@dNJlxpj?hY2q5%VxFDr&UAsbdE~#i;Wzv`rj@|z5~ej-CUqauerJ=5Rlsn1nSv?7lB&@VPX9UF?m(+L{S*tnV6YaekYa4s$56TT$v-HL~D zw^I0AMfyRMjR|1B_3N#Rcc;#73n5+)Mk@7e$Sz@{?pIp{3xRUEt;D2KIa zVtg(rEylD41_V4Zs6?IhKKho6FkxWS2L5kv{-e(SO%%hw`2QA-Fkxo-_r>t1rhlly H@$dQ%8gQMv literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.10-compact.zip b/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.10-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..01047e8a48f9854f508f08b3b0e0bcf1b6b64cf8 GIT binary patch literal 1935 zcmbW&`#;kQ0|)T0xr`yLwJ`TO7-{YnQ*I%fkhI8QR0~;X?zdX4a_MjwBX?SMv*yOKTn6Klu05&$5n z3;@Rg0Jt0(9uaz-KqQkx$%N>jh(JPkgntB)5amw}^1nnPqQXN-1Y%5BC^>@QPre)& z6h%Z`3l9yE5)%h}0DuAjCz6u`jD^NG%0^x_Vq^=uLxMEhRqv&_BTi~Rm2NYwTja%; zH+hOq{VhwS478uu3ZC~}NPhXO)OBSG_b{LW;;}pKIN{w*>-!2+LWo$2nKYFZ1xu%5 z^V&@@igT4ol~GKiFJDiZZW;{@Zjg27R8CLv6-FPW$)v%Vd3g4&*hoxbJE~4=OYO?Q z6=Y8_w%LKYV}Q3-eX%(I)akptKTv;rZvW}T0uS$yH_t~|?i zwXuY-TUfq*k#BWgmZ}7s-!SaEoSfUcL?}yoS4Y;N?>#GTkm=8>sbi5N z`Ba5J%qnSFCnc~31D`R0`oeg1%i+ta zQy;BKx&hzNvzdM=D@$zR+f+fOvCkOfA?l9zDo7 zF7`;|@CxdZSX@!Y>^jeTSwX2Vdf)xS@aZF-(yCA z2){M(`c5@Ju}|>GMV)mRnXxU-ARA`j3>-wf_!cS5?Wf85dG)L3noGAoH#y;No!+BOX;)9$k4Wi3#}W|P zs07mZV8ceQRDroN7~|Xs*&6oc3?c;0=YKoB86<7lrw00aGgdBkfZ0?;&l_ail-9PU zH(y)|M_rkdQ`4-6Bp7>MqJq}qE3bM8g2Pq&p$RWS=yhcg5sR>#3*D1{JPvH?>0Oc* zYj<($4Om(Q)K5uDV}oaMJHMGYJlubK1ang!we~jDkk2~Kl44)x*TPOL_+3s#ZtH^* zVJu$Jdv$H9#!{B*EZ!inIhT9$!K=tX(Z`xf!zVchR5a`$P-Us;EAgOH<>?V0y;z|q z8l?ECYZEi#pe#s7z4hLxr4zhcMBdLxq03`vDemL`RfwG=lxx4=rtWcC0{(T*w)aTx zdZ>@UA?A<)C8}DJ4nfax`NexiN%S!VmtgY*#L_`DWNg{OGakMS=fm`t-S6C9qi-pLL}7_(`AR zu5L!OQ~EzFG8?Mi^p3I}xit%a3EbDq&Mbl*-nAiuYR42Og>37vjN2{gxv!tb+Gfff zkz+EvHd_G7++U?EU9C8`%>b8;<55be-1P2qTk6&#&jr=jpShu zwCsagXBPEB7>g|PnNA4VT#ti-5z%C^Gj#cuY5tPk{bWC5BvY~w9|^kl%K%qOVOg{> ziaEr2k;&@$&h#+3mb^iDg^a@p zXZZ`r^4*jhA;{(P`n_k9+_jM4QDHLnmA^QSgXmLSxAx{uGitmhq(Xc&hZ}BI5R|); zN=lwf@fp$fUmFDN1f6?PDfsJ)EwTzjaw;x2+RoZ^hh?Oas#NmBwbxbHcH`ozkK-}s z&Q&GZE8ezPYHZwCA53UF!)>>gonFbv-%?rYpIN60=Q}DmHI5GQNx#0^ch8x0F|nrd z;K#DC3kLDC>!G{^=RL~`xv9H<@&r@w$HGMPc?s#oSId}TcL(OO!+RFOK9Fj7Hp4W~ zrqbI|(n++UC-wX9jTr?DA9w-Tpx8a@fopz7N=c$AFNXt5CwGUZHo~j~lf~Q1%}RIJ zwiC9kN)Er_DRgQ2IV9Dk-FTN$_UZn)IvjDNydz=IR4qx)Ff3wFmh)v9d~r9a9!Bml39qo>*LUJpE~6=KjYASa4A3S;t!41o!um^CDIKi{u5dN5c%1wKNkl6_x%Hdf{P&l literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.11-compact.zip b/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.11-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..bd6e4601b9859148540cf153e5a653e0d793c9aa GIT binary patch literal 1938 zcmbW&`9IT-0|)STnPcv2A6H~V`sOG%VfvIbN5b|siJ469$!3m*<;XQT${eZY{@^ob zQOFXjCL1B-T0V%0j}BMM@$K{d{rk)J_4?uUc>M*>%Z>sd7;qSn1R`A`5rd;!3NM5J zK;#Gjm;(TCEecP-g`u&Lk+?{7bPypBjVE9TSTqq68HDi*#p>g6p=fMO1TK<*#zbBV z3?gFngYmd5&IwPC%u^YZ?=FsQLKZ|T(;_}q80q1 zMZ+eD>{M@DZy3|&!_pNiFo~84X_av6s{6=gDUOwAi)TZsi&5jii8}vk7W}Mv5|@in zPSU!1vkuj=vs>XmRAT;IR$Ifyu5>V%VnnWbaYSBrZ#Jn06uN06K7VYM20pPFmLLn- zqYEhf-X%7g4eH~952&mpU+|n}1oVOX5xn#7_q)E1G49D+^MNTJm`#j~iu+PeVetE; z_ zi=O12)OKGQ{)@CyI6dDMrRqdE_3|N9gWZd)vC7TpGWKY=V5TD$1hzG%U-~q+?jGw4 zo$&UtC#_13#(dWAZ`35;B>L-0*F&?=uX_x566f-r+p`8}R|-j7e{B!FD+j%leZ~w1 zah3^cCkHQX_Wcy5cpB?=my@oBJQN`?tUb4+zg?B&`P(0b)aaV!mdPk|m9~oHuQAkH zKp2_7J2q(i!+P8QM#(LxtED8#Dty!PhVu$3M+}ly?q@{m81?ke_(U5nF;g0(QAqh_ ze?hHy*#ULvR1ri_)Le;^Ls>OP>+rg(aBL4K&w_%3gEYHbw;T8k<*`Io?6OYkpk8l!GYARcp zYfipXk@+&MGI^(Rnz5o!da2g%P~A`cc}nU&$El(z#t&D`Y%Iw4xwYJY(8TQHu@Fte)~ z#c6$`K^3ypRXyr=Rj(%K+>H3i#2kHh($!V|XRhCHLK4w=3dx3-XEsTw&mcn3)-7>^ z3jx!?Vh6$r2NSP{CE(cI$}N^zyH0VV{|_)cF$Q;MlIhBi9?MV;w?~z^=scAwsGDD2 zP=<8O!m1$Iz0YsRjk~khkC%x;o~odIa&2P#W}K)>*F>G0u`PXCD;gW3F$nY&s4SV5 z9-w@*A<>W~P2}T8i6g!nk<u<{77~Llp%5f2QZ($0y~? zA&jN^WyR{nPOnPA;w%7eDmL*XZiX#FJPW)mcp9L2eW^d`eS94BX=1(>{tm*p&obRm zQPqpD;rX(~p`iOL-=7QbsHC7w)4?tTkf z{TY@eL@hUyOelt)H|7VK8Fx62dOAHf=jn%3m!zXStGu9gtGEaF=)LNQFhC zFI_vuVuZXsrouKZ%KGn~8=0Xu-@p5-^)>Z@ej`qS6XI6^@}i!g#Yj8Q{7-ooHX;!7 zbHd(gSz4*BYs#ZyA+<$lJKLrYLd&!COiE@=hrFCh%g=Q%Er9j(N%48dR0#d^r^;uL z{PjO$c=fi8lSFU9n)Ue8Wd^q{=3-n#Obt5TrkM`ZKU&pNt(B>fnooP*IEnO=TixQF u*|TufyzF@BFihZoyZDR7|Au_%pZR~4yzD6W%US?9^s52C_BY{w-hTjdL7RU7 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.12-compact.zip b/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.12-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..280e34a23f920e04ffc4c01a0ccbed6ad80add82 GIT binary patch literal 1938 zcmbW&`9IT-0|)Ron>)Ej&aY$U`)MRcA6L%s$lN0;44JkZV~zr!R4ZbU+@Ef zpdtVm0RV6#CMp^ihC<`ssBSivSNzSYARYX7>yReTCf`-(-s#-<(QP5Q#mr!!fO-Nyn`eX+)qDHPEx@# z_f#saYx!%+^d2M$PT=w1f_j4aED1z!&{r?=239Uo=CLb{{ zW$NdRpLcC59DksV1J%d8&hFVZm8&eMOlfb%?drSUe}0kH5+n8f2e3w?&1rcB&njNEl4lJ6Plx9;x+=lVB;n!;1i~u-MUY> zW!t!MG0e#)PTeg!k9cj>nkSJyLM1QX;7#`j$*oIJ)WTKi5DmS& zgrXvxd0IqXK4(o;-P}o;7J12bot)kRk@%Cyd?+&XzSG{Q1IDLIQ#F@A-?d~S>9A5f6!cGjz9OTVp;aOLArGL9J^U$U?;pHb`&YDu! z8SF`3W02BRWy@?yixuNwvU#Dg;8_Ir4|YXUV3VSeVdlD;pH|D_YmDZN7cckKZum z>ZN$fPA-`5y73tDag>fir;M0Rx|U?b?{W7Ub9vPr1UF~P2%$<##7@tz-;cvi|L3hm z*`pAzRb?%&9PsuQzr7NIMWnbb-VO4KI6@F0p5&|_q=A&`k~J%#dd~ig*n_f=C)_&& z0Xxwc3)e$f$nSiS{%`9Pl*;*w@L~2sla{##RQm^5vpkhln``@ImJ{s4mLB|yH`{po z9M+{{dyVgKdit+w+f-=@coX+UchO=H#iupXDm7-m{PoFRKl9I z)G(iSmSTCv0_W;}BVbQwwY~iBYim6QpU>ja+}ghE6MZW6@yibF z3JTI;A3KHLxmtb`op}3+2=qNgyt`(Zy3JHgb8nU>IcsnW9%W9$pXnBk2WUAm;YtyNc#BsI(>X)<=S9b^Z=7LHHtYWOT8$+Q=is0XeAb2 zJpHbO1Qlxg8XY0pKkszFvo!$gNK9rM_Zxg!AM)HXyP2KYLqeYx4BW`-h!mxc&WNcV zvz590@;s|gbws=w*9!!sc0^HjEQzS3%m+*mirlo6psx5hYSWC?M`t&4{dCbLXXUap z^g?UEBg{L4M$F!xa>DUeeV z{GrP+f>&EnaagUOGEn(>4CSc-6%VsxdlzPCp4g(d)CaZ$Pb}WbM}$rmm3fIYVS1{> z__&&j4^rzp`~_b4Q^>-jF_(M{>Er!BEQ!{$N~4-ZB%ku=FP<2kat8&Q{l;baVvFJW zDV`--Blt8j#vuc`Sh=xY__bZ?$CHSU%t4zvAMTvZZabAzfaZ|z+UJtn87nN6ZXAsu zsHWAt2fuI>7?*Cjv^;G6z3tVw+Z~DQ1;OXm_ZZSQ8g|;$=2IpLjxt(xRAX#=t~uLq zZ_K3?@qLsLf44*2OC%|x!N>lah^ma>DH)Ha8eq^DCz{mo(!wjUVq6^)<4!@EB)0D% zAF{cO53nqj~scEy}uL4=+9gQ@eA&oBj?Gt{zCLKX$FD^hJr&bPr)qD21jB);uK$ zYbL1-mH040AVFiB-7dc26X{<=;#9UK=%?g|yA7N2&%6;9w8xwF-J*r=rtW-r{Vcf@ z24#0DTI{c6$?*7Q@OKvFR5`t?y`5&&6aYWJt;`rCB5UqniF%s5zOwRSQ#R2+D5%RA uMdA+ajUTxpcz7*9|J%i%H2#|uo`2^5Rnir~_tRPc;Q86$p9>NA=lu=6k&@~F literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.4-compact.zip b/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.4-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..6f266328a7c3f2222bd18c7873d74c3efe778975 GIT binary patch literal 1928 zcmbW&`#;kQ0|)T0TXJidRKpaxoDM^-Ar6_@=1vZoX0)~$V;7@%av51_BIOblb&~rf z&Qf+b3%N`<5po@J9z{Z~VV=(O`}525`TX#Ceg1;CCt5<%9uNl(0W=Sq??my33hn^_ zaMb_+D*ymOqv?#u2rQmPi=<&=NDLyD&cHG7SSF4}!i9w6Vf4swEIu|WlE%Q|XrV+B z6AufcM^a=YrGOv+NCbehY&OAk*OXfPu9s`0P}oi(>9jyoIo=REy&AbD^SV#1aZg|P zOH8dOuo8P(&g+stUYuvY{k_OzaSNSCD3$dUeL#!`w%_U80Lo?Yr~}g+jm4w3$cJaD z*Ci8OE6gfR$8s-r8OYr;k5MAmD|qwDg;QNehaPj}IfqLgAsa$(F0HDi#gq=UJIs9} z7c#yzj-3AlOXiJy$gwqFh02AwmqQwe!LAW$dw8Z%DiV<8$*XRa>fU zU^dFpgCqG6Q>;Q~WN`WW?Ql(TKhjXEgo|JA?kpkS+c@U{sM~B>58AV2w{Kw?x`7By zj8uP8=C^0Hvpi&gabtHYeqLoH;4n_y;1fcW=su|D2A_H??4JAYgsKMB>`x@Y<9UJc z{M1*uy|7)N*=&+Q=ez3{vMQY~v8u*vfh-$hdOAVWN5;H|0X%ASATbYNd(nVEb>g#wfpL3oed&5a<7>Fk6H=vMj6ZwbjAVKfE0;yEU|J69`Bw1+ zw;}e(!SBrpwmWOQtqfc3^-jFc+;7)r|L%%c47Rt}?j7yG6mBp@VXkYvB}USZ2PIvO zq1{zO#ii`BA8(VW0^+rZfb=bmdEXGtnG;RYbjoB_pT&bORZLclXnm!n!Hlf7t`yTG zJ*IVdR;uh^TP>0A^I`_iF)T%@vJ@VYVUA3{ZM3TS&6IfYLzvgb3)a)C%fb8mh5RvV zBQjP=#Tx>dR2^7O>`lH5sT_3oQeo79ksX<+r(SECJB`MnvEVcH<>uUHO0RUd%7>Sa z%r0y-q;XzH-*__EA29KXHuDU`N>1)EDtDeS@fX+ZUabzYx4>rKh<$k(ZQtaX`c?KY z=@HWEPLGH)D>T}UNcv{#d}OiMK^yCQdRj?6`;<~N14)TFRl9CzjL0mC-OX@f$s@M< zY-FjXRQ2x!HIy1gR1AJ_Pr1PJ-{G1EH^(uAqD0{p#ERldd*aD5fiJ!Gh;v*2T}y!# zzv4~oGwr$5yuMRTkbna44+DtP$_@=8P_Q<$nBFyhH!u8S7zLXAF~Xu6%AxNrhe_#CmCY02Y1S8Q-ke@t-9Rcm%9N31^J?E1`j1E^45Z*)^7Qxp%K+* zKCLEr6+ODzDcei=oWAN%@ZK`BG2jA+LIIyOLgeh-CDsL@rJhGd4b4GxbgzNotUofF zhA+xU+oEsR2yPlft#SudKYW>*!2EV^i=-v;aWjj0;Z$up57(1m20uxF z!HF5V-X`$TthNfGdUWSX(ZI_rq{mLtUiDl3hl+sOGUuG^L#z3biO7u&m;;6TYk;+; zz;I}Mc-lgFM>k2%Yq8;1u7P!T?{fEP7~k1VxOm;vm+BoKr2Nz-3YFWcYnA5uf7SRkPm(O-h(Fm{)e zF|34BtiK!E9j_m@r|J4?GRb{`)pv?3mU2hW!vV`f3)R`0S#ZBxw*}yiY_ff{z6Ug@ zv*2pbpW45m^E*1QICaSZFcI`72a89w5Nv;f=Gss!$K6U`qe>4pW%C`6c0~I@Cpxag zYLZhx+c=ub>v!ovwpRibqs7CWMj3jAdiFmrgk_+w&CR5<`#H~hsr$#;F9DutF>!l| i|E=K<5dWJ*v47_Owb2tT^+Q+y5c|=~KUQA)pZ6c1D1|=& literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.5-compact.zip b/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.5-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..4a40284c5744b934bc2fd66aa4768c2da09852e8 GIT binary patch literal 1928 zcmbW&`#;kQ0|)Sp;b@pN*Nu}*9CC?Kxr()%D0qqm_9yR?mA6RP%k?~Xc+`SWjeZGkxZ!d)b%nd(a_R;No( z)P06rcCA6zm?Q#0ua7|U%@X#Lp2&JNbEYO=s|?*^$}ko0mn{c+vvjo)83|QGeEYc# zQVD(I*$D2V;nn8x-EWDn5Vfe``(^=L(<@(>!k1t&POr{<0=x7$qAE2spd%-*9{XiH zcnWPV{x%?qlX>>*^MP!bgOLq9q*J*Z;Uwk)OoRQ`BY-QCIZCq%7D{gYJ%8t=-alEU zr}0kRP^wf{akHM!Seg5A26=saeZ2=ueGvN^-tHZDPrFCuAB#G%(!L-VRfn2J)8io| z+pG5I{;-zahpDGOaRiN%DKBFPe`aC%^cu@6;UaXG&~a4L{MW%;nO0bj(5u0uUdwow zt6U}p3^=?{VoY(N6&rFdFjJlk#7*;?cCim2JiuyR*e_)g&pB$v^~9<&J5TpYZC)AX zB!{k^^)&x*{^a&>f30EtURN~ju{l5)0GoqnFQG2}X!#J|VftZ}Da#SlNOti7PG!9FWHk~3Rtg>&Y_E9YAVUew z^kJstr7?%kp?nBBF4AF#bNv}`aLw_MTtz$v)5dP8{(ZBOor#J6(lq7}oUwP_WN0Bs zNH&&8F~k=^#b6hKjFn6r_|<(uhSBbXnXXO{&>cV;VVBog9@W<;5R&;>Asmlm@~|Nl z7GA0{P){vWjJ<(IQA+s;+K>Cy1$dT*a zcd}21?f99dt_V^G_orM2+^x~-BPMWgU^0rslX7uezhwr!xhlOp6U!ILm8Bry9&)vIRwbktHlsAaI$x5hB4~34n4}!02&93sxZ$qZAr;VcAx93@&IzzF}Z4%j|VSBxHuXIYzEViq;>4dDC zIB!0@K*_f%k55KMUpr8fyOSdVciFug>yLPULePP%+_dj=d9}f`P4x|^;7#7!w(B}f zNntw~6&{H?f|S|Z(*3i>nz3}(95=30-O@23NU{+NT(q@!)++olD}K<|&yhJsp^3N$ zq)`Jp`%$CXkcTU!KIykfqJgWO1%+O^yXkdpJGmal46a^;`C9~K8D*|enRIQhud#rW zW)f+9KHX(tLVix1h;bUua|f(C;0q_VmNCf;&HO1)w2)}@6=z-SwyxA@Y}ImDEwQl$ zX)!UHq)6u(X+FbG{Nv13y4E0cwK%VkgU(Nw+8#vxv3p!!E;_5Gf+w7gWowOZ*`E1p4e^;={ zs^5Pqw=E;s;tNQ#$)uX%cF=F<(01o0tM+#501~H92~+>t4=4$Ax3mvpXTF6fG!Ym# z8?1Bi;#xRQw3DyJ1<%2#!Md8PMU&(;vviyUt<_$1o0*p?Y}{HXh^7-HS3esRWjrv0 zVi&SfV7#XeMY?M?uI@+XHlF*<_wK~ptqU^eK7y~M>qhYdWAR}Q65hrQ@&VBVg~t_g z@GchVtbSvR`@CJKXy=^sccP^$JIpOeSj=KU3DC%`JYQVNYT_*P4Zwyksk=H9BEA*9 zurBcUb(8FzX!|^-4=YPZ?1>P2OZpyT+$KM%OSrGqu%bT&F|I1!TmK5b=Yau>*^2*f h4S$08-&_X&JO8hZ9vF$A!h%5HpN;srGE)D({{TVIiiZFI literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.6-compact.zip b/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.6-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..2018f2bc021b5451236d9bbde282998092432497 GIT binary patch literal 1927 zcmbW&`#;kQ0|)RgTP`yvb2(T?^{^5l#@xe7#wJ8NDdal0(QGai5kfd;4($x<8D_aP zmq?ael0+_Z8AH(tF>*N)<$ifO&+pGK&*$^Q=k@su-cC3W*b)#0egY_tl*`XHJVWcm z0Ki@a0E__u@QnU$0Pz5DHZ?Use^;MeIM~NElV-Nx2s+VnG@0rQw@`l~)rhK@ zZ;L5@?h2atDt#}W*MdJuoVorvwYQGtxU`AO4JdN_~zzTBW3d5e3!OG}E5x(OrJN;@}kCMUX-M%Yv+RiT8P1^E89yn5vR&9aep zv~Z2cj99CGho9F;Y#QI+zSVl90x?>Ga<9=(*jgei9fo3BT~yIQCF~3N-7VTxx2a_iK%n8%1lrL zR7qMfeyyOS9fy)q*y0n!_VtjF#|8+mBaYTC{2Ft?9Fa1phF_4=nmUXQJ9u+XreLG` z;w=*Q4oCiY$R+S(Woy&ia>U@+H4>@~VT;ck^!y`AAqRHF=|$g(M@b{oE!32fv!aGN z#q>7Qks-$n(yBD4O^v6P6a$Hk?Kc}QAhCKa>(0Hu4r+EfB}nX|`rrN_&*r6uV@uqBYev}*I>LUBopKxC9r6xe`?WtXzojShd zXvW#1IZ%3u``!Up$y;Vi^Xj+nCIzPL)j()*5&o~x2Dn5RtRxx#YnAzkUded){STbt zxh!J!V~ElpB|=LVOI?TK{?R<))`g|)&M4>PF_}&JYy|h?7DIPcvKj-GgC^Lbf}FLQ z#reUbxs5o}N~wM+U*#a?T{q@AonWG-+u&DiG)PAF0phtNRM~Z`+pGn$8vyb9v$^bQ z^DcNg)Z3sq(yPKs{3mwY`(#n)z4o=Ia94Xq`3{S?Gig@Q!~2#$+j4t3oUe81er13p z+)t{rTQb2ghaHj`SD;Oip089z$3`CSzgDNIp-L-iUsVz7jJc$m-)XmX7p#9kekpj$ znLf$awG;0aeWGdnj<4-1?`KYfIh$-9I;3jq)n}}9GbxytCX7<$SboAzu4$7jyk&%KoOeDFEXJRH z$Y?E}t9=6ARr&64pxGVy>@4LW>vs=&`%tN$zg-4@aw$j@;%#&_PCLfkkp23}khLrt zGoWZAuqYk)ic>HW8ZIeJ*thk`XsR&h-JW+RdSe;XfpFUcd;k(|M(M+VU%%TzUbyTNh?MKG;99`5q8ojHldU%MDXEf22z(!lC|-zwR-7oySWMgRT9d7MMoQ{Me5tDtBZpSl^!=&(bQJ)s?^Nr zXX|Un+$~vxZ9B!&$~IbbIojIPl-JwbezK#v5=|R({&>Eg<<;oCTZZs{PspZl4JLKSuRZ-u2>6MU(Tt&Ab+LyE!S9UK)-mK8KiT=>Q z`@HpWb@TLmt1vRGKPOP7v?W#+_WjLCu-HrALOsf6KZ=-S_}8nZ_}~oWuEV+GxPpLF zwGHgNyg(@3tFi&A5o;M*nTz_wIgF1h(>^Z^A9h5NbDOyf7G!yW*{Kx|37L=C>Ge68 zhM%#Ues(EH+S6Y}#DiB(x6{h?PVZ1Mn!}_I*rP0;`a*S5TM>^@AN>ewg^~WUYziHL zIHegb3e_%{5%IlewdIGEGH$~ICH4-bWc@NFEpUGs^X%v5^xR;C1q1{+H4iA)IpGv4 z+2ecg=9+1c1pQHu#-Ov0$^0vaGsW*f9lN@(661tun}le4A8N_YvUJLU;C9j%C!C0= kCFp-+_`}2hCSK&9`G0A2!X5enEC7i7sQ-_Z694D@2f?R`wEzGB literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.7-compact.zip b/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.7-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..32caea70c77a867409e5312590f7e6f438608532 GIT binary patch literal 1930 zcmbW&`#;kQ0|)T$SYyVJ%Ta41bewZSuOw=i)p0o?xu42)F^sXb4Rb5E4sBE}(V~US z+?U%V8B#mSU4=v_m)x&8uJd%B-=ANe&*z8F>+=`9?X1PYrhpg#2Pl^)PGu-2{}}`T zY>)tO1^@u>5Gsun!iRFBU0c%u!we>zM)uv*69MakIc8?fA~CF}|Mj`a zwZI(O+Ot9D8Qr)SpG4dA7DSomK;db(%2Tmh^Z0pLY0DPJRghJ?nI;E?f(@RJGnD*< z8`D20KI|4*!f+IH%U7u#(e$_zSCa&(Yc3BQzlDh8SG$yJM;Z7KnE}0`ASqJ)qQvSi zOa<>TGp7=j^2Xk6H?8aF9$td>E47}_{G|Sct!By-uL$}vTBQ0=g@-Ifi*l3tTO9(@ zTC`7dl@*A}d-Igj&$c5ad(|bCVEX)RGa2kFqVc+7aUxGKtVe{eM}yLbF=!vN=B(5t1R>O)s2fMH}U)VmerDie%2A&6M?f%fN)njZ(J0iHTApd z_kAceZ+%ULWF>ORHomW@r&=?&e)O%5Vq)}sGcnS@vaQbBHO6HNJxyPPIMBNa%T*v4 zZ9IAB?56i}Q;Rif!talMr1E=7M&$gx+Z~7E^HXgeu;Wry!X=u?X^v9%6jE;*tPd03}h#-4W7>BfxX+p zV-L+8y?Ss}ivX0xTC<6BlKVMXhS~D);nB3Ara9GlaCV>bV+O{5Nn-{WUO5G~euuVi zs4_9z09>ynB)x-@ipw;oZU1I)m)G%0=DYpJ@06Nd(&6~W_GO%3UKmQzEVg1~nDi39 z5Bq9Ac3L%T*FcvcaywAMqV&D5+=VxH1{8j&KGe8!qMb$l`u9ZTD^8k`kj#h%3yBYo z3dT65`C6TjI`NPCu~)e6C0%t=17PeeG4%;dayIS}>_)iGQ?8D$%*x0_h0QwGMJ}s$ zp>D#otH3^oy;#Z8uts^FFxR(VGvN77x<-9`sv9&2CtzxClQ_V^4e0X#WN@Ce7j;TE z7uaWrBNaa<-_)CVU_3&vU}SFS2890Pjf#IQ7UnQ^S%y{frMSrK=RqTR8;4+*vqxId zu|vzrSN@r%a+n|lwqxHV2!B1k@qI>ysLBge@E0Rs`&Q2Lds9vq=lqrAaXRR{QRv}M z1M+-Koc3oMtSx+G5;V(eArcuM4F)jQ8L#&Xq&xJwtqRf0#pwe4CJEYd~qm zKtI@ZG9Mz(JfhiI=4rGcx4ZGp_$--(LS~Q19O^Y>S23{>bM0zMz9`Un{^T4Wrw{@) z6MTA^G+ZHkVgXFP5?+ z+1bZ$nC%MEE8%y%RLTMjo+00cLwYaE-L*`<*~EecMhzH?clXxsk90GowJk~(2ISLX z=x@1X4Z5L!rct=<)}B~sXR4#IEI)lrsh%`Wi+C7F%^Q~`D6Gtme*xXtN&GCI*5J>4 zWrLH+Zbu~B^PYGSKwtmqo{npZ7F=)--&l{Rgy^QODwE9buJr7#?@@w0sHqAf23l!4ro8P(kGPirM{WrJ@ik&q` l%vAh;d-#LI|0V|X@BF_y+F2j?VJrZEe$@BJ!X^HF{{h0vp~(OM literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.8-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..9db379a5843606d8388aca0fcef2fa8e285af447 GIT binary patch literal 1924 zcmbW&`#;kQ0|)T$+^;1kmzCRMB$u!@+T3Z>=4|MoQ_Q82%i6^yq>v?-rO}E#E+HJ@ zxHG0l$>nKBR%C9c++r?C;UJlu&hz{8%k%mC@Ogdyf;S!`E@20V0S5pYj&}Ya>HU{R zDFFC<6acIM00@eXj3Sc=L>i4uBU}rOxSVghKP0f7-j(@1gzff!36)1n9g zw4f`YF+|g_Nb*%#2}!^g0FnT}CM_)lCW28*hWM>0#e&|eq0nbqx9@r!u{EfZ?|?Tf zbzd*%_=r!fDW)X7diINc_?+Kj+CWP&ZsjW`FQiiL{P%H}iHp5CFSmdyIpR5~nY)@R z>egqAPS|*#Zwy-e+^vU_tnmYZc7<%;0gE^9|y=0m6@w7@&#GE+zx$MVZrgW z`3I@8c2_pHuLZmxkXbe40NxN#EJ#|75L?3X*4E>;q|6!L`M0UbJB|tN54AMyg%AsO zoezaCm9-QAMk97Mf%e;hjNo&d+Me$P%v4zksi#WK$q}0B|2>+^(@p)QhU<7H%HUI86SIuZlL-;9iqYFbO%<$F4~BP zMj@4%6sa;(roO$qoY3oVdt1Kka51#cdvj$`pr4M#cc^LfxCYyZ_dKL5OG)UeifNn( z2Pr&nX*sTJLeHo(dyNXPEF$-u74e*n)=U#uSjD(&hv@t~nMvE;8o`r|N8S;}&;vdx z!RHt!g6(h9pM+X#Mhjv*wc|8zDCwV(>Y^1p?bbf`=i+;6pry&ow@1c4tm58GDskHM z=MOq(eQFvp6Iw3oISfZ{){d0lL@l=u1hD3tdMWdoar{3)xxLdJAST94OJ5>wmYc;6csedsoDb|9pf)W<ptDwxxJ!p*GEqwWskps=MrKx}M>5G4vdRBR!lE$%akK zyY-Cov2IRFF_ws;%+4kUj>Kar2bb`_=5xd*27M*#7IEAYdrS$#8?s?T8>JzYhNHk8 z4N`L!tIDw=&GQn|VUoft{bSw#RR>37@On<&>2A|m_$ZRq{~U79IbisUw_UWnM%H0Iguz`u>Fb~QG(?##_AvirdkylwPjH{(Mc zC-+2YdhNc}q@U&QSPwE_@w(*5U-s@BUB|KYP3@^j5$dowP6+nZl$YOF>-EX?LZbP4 ziNCs!gi>!pxC1KEU?Ix7=9Yna^+p-UaW|Ge;+o4zyON5=-O0>+VdglpP%7$Tl%EZ+ zD|f~4#~#j7-Lc(@M!&xs5kKTE$R}s52Fk}HJh_%df3AI>mrw!Th%%r zMc`#cr^|yt#%7Yt9Fe%H2sdX-1=D^h2_?mdf7u(8tpxCm?KjoUZ>tlTUL zv=3sAcoF5g{F27&i2dTP9F$raB-MydQ_ypWt+l+4xA~k)lLBG>aJj;wmWwH>kE3iX zyv=d0&1wCXC6ka{pcMDLav(v%K_3ylkeOVTe2QK{CO*f9v)Vv6mM#Qh8(8XUm-cF*ld4Bt3MGS z5boN`KUJj^5UZU~m9wYffR{#M0Xz-7fk^blX4gNTRtN;K2 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.9-compact.zip b/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.9-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..f7978ae927327ea4ee4da05b7570dd5da7bd9b96 GIT binary patch literal 1934 zcmbW&`9IT-0|)Ro8#VWm<=mJf2{Gp(@@84g(uh$Q+$LlY6x;lWsR)8QN0gzls9@@o{oiBv}V4orY zm;wNRk04XRLa{+4QWyyv6-*&u$&^4!5H>Q96dZ`V5~NEGyMhghz8XfNU;{~bLU3e| z?qzZq5dszh&I14q04&ndE*b0?gqIGyW1ERHJBh*SE%4-QcX`Xhe~C63vA(s(RW$g3 zCVq$~(%!asYJ|-Ce@*LsR^r0nbhv%#v53dss2$h0Grwycs1yl0BRrL@#FsTk7ynVa z2BtYy8CId9+5Q}D(L$prXvkA>_m`EE6CBy$vTU(znTL>3@GZhHKpv8z`2+YC7O z+IQLbQ~gm~`osxYv2=%gwFBR!XY|2tH%c*L%XXXARhCs>G9uni-`ZTl!nO6ztXoc3 zs~c|<;{D&*AcA z+6H!D@dPMNBVgm`n+8eWe2?;H+hoIjy)&`)-o4B^-c;IWO0E zG4J3;dC63aL?LL!IH8tcyPG$w!_d0cAR+a$a$UE!h;iUP^PJ3T0y>14tan5{P#5j} z5Y+txOfzq28RcH|U1&lmFQTmfE>MnYbYoTQi@`?f4sB+;@*K5bKjG#QH^U@wB5+3s|Ax@GpLn3oJeicwYbL)hd7fh6RX8R;; zYu`Xi2ig)(Yi_*Ib9f|-ASm4@4ugUM>}6=3i25G30UR}TVXlA@Eh&T1VqamM|*PqZ~mNrX%H4l$uGnqvy=hx!klYB6aR zhO5MPt|IH2hlXrdg)Xf14$_+I8#7f)J_vS$osDmLJ!#MQ1akgy$PzXay~S(YcC9&G zL${kFPd+*6376Az0Guip%VTez3#>kCvDL*~y0E6&)wwLwra1Ve#)@UogK9q zk$zBMKp#1lFjmu9=iYlMR+t`DK#TpO)2q;8f9XaT0 zch}+E90QN{M{irG+j~r)Led3b_*2txp}gzf2itAR-4zf7$tDR&j7r1t`Q!6)uWxO5 z*Tug(60awdgC)cBYx^ujc^%~?-02Qbr+!m-o?ZX)@%!fMgUd;s^Osdgz?Ea8wuFOv zE1PJ~f;jzWd=36XBO>o~RHZNF+&FFXeWttgL|cgtPfLKTj$h0&zNx}NK4zrxcXaNL z;+A7Yvg$Z>Z?R03F0of;O{tmci6h$xa@#&Y^v{mAPFf;xp*S`wQ|Am6rPTob&Oj z02>)=pZyxQne@(^7+zO!?Aub*kbgFCuzbQOhMQ7=>vX z&&9VW9(DCm^SXMur-x(I3!kF?8F|w!4n2@Pndn3GEJr8amT!zk_Px+lpv&sqiJ6v> z4>?-XOP$&5&3PV>V?R7V!YAQ|oc^(b_+R6iLR(&G8VgNzzYhw6C3s}Igi}^ci{$H@ z8nhtJwO`g0^f#m(K06{8LQj)RdU8^iAQ10rzkg68Y(BnnCsM#O?;T)U)nV}KlM^n$ o)j>ee3iQ8C{LSKjLlgLS{$C+o9fW>63jhMYd-3-k*!S=I4`%mqQUCw| literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/complex_imports/FreeFuns.sol b/tests/ast-parsing/complex_imports/FreeFuns.sol new file mode 100644 index 000000000..3f96aedab --- /dev/null +++ b/tests/ast-parsing/complex_imports/FreeFuns.sol @@ -0,0 +1,4 @@ +function foo(uint256 x) pure returns (uint256) { return 0; } +function bar(uint256 x, uint256 y) pure returns (uint256) { return 0; } + + diff --git a/tests/ast-parsing/complex_imports/import_free/Caller.sol b/tests/ast-parsing/complex_imports/import_free/Caller.sol new file mode 100644 index 000000000..82e8659fd --- /dev/null +++ b/tests/ast-parsing/complex_imports/import_free/Caller.sol @@ -0,0 +1,11 @@ +import "../FreeFuns.sol" as Free; + +contract Caller { + function foo(uint256 x) public pure returns (uint256) { + return Free.foo(x); + } + + function bar(uint256 x, uint256 y) public pure returns (uint256) { + return Free.bar(x, y); + } +} diff --git a/tests/ast-parsing/custom_error_with_state_variable.sol b/tests/ast-parsing/custom_error_with_state_variable.sol new file mode 100644 index 000000000..3c38202f4 --- /dev/null +++ b/tests/ast-parsing/custom_error_with_state_variable.sol @@ -0,0 +1,13 @@ +// This test check our custom error lookup +// Which require a strict order of logic +// As _find_top_level require custom error +// To be parsed when they the function reaches +// the custom error lookup +// See https://github.com/crytic/slither/issues/1115 + +error ErrorWithParam(uint256 value); +uint256 constant ONE = 1; +uint256 constant TWO = ONE + 1; +function foo() pure { revert ErrorWithParam(0); } +contract Bar { } + diff --git a/tests/ast-parsing/expected/complex_imports/import_free/Caller.sol-0.8.2-compact.json b/tests/ast-parsing/expected/complex_imports/import_free/Caller.sol-0.8.2-compact.json new file mode 100644 index 000000000..cabd7e6cf --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_free/Caller.sol-0.8.2-compact.json @@ -0,0 +1,6 @@ +{ + "Caller": { + "foo(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "bar(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.10-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.10-compact.json new file mode 100644 index 000000000..4355f9aef --- /dev/null +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.10-compact.json @@ -0,0 +1,3 @@ +{ + "Bar": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.11-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.11-compact.json new file mode 100644 index 000000000..4355f9aef --- /dev/null +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.11-compact.json @@ -0,0 +1,3 @@ +{ + "Bar": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.12-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.12-compact.json new file mode 100644 index 000000000..4355f9aef --- /dev/null +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.12-compact.json @@ -0,0 +1,3 @@ +{ + "Bar": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.4-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.4-compact.json new file mode 100644 index 000000000..4355f9aef --- /dev/null +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.4-compact.json @@ -0,0 +1,3 @@ +{ + "Bar": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.5-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.5-compact.json new file mode 100644 index 000000000..4355f9aef --- /dev/null +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.5-compact.json @@ -0,0 +1,3 @@ +{ + "Bar": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.6-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.6-compact.json new file mode 100644 index 000000000..4355f9aef --- /dev/null +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.6-compact.json @@ -0,0 +1,3 @@ +{ + "Bar": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.7-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.7-compact.json new file mode 100644 index 000000000..4355f9aef --- /dev/null +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.7-compact.json @@ -0,0 +1,3 @@ +{ + "Bar": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.8-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.8-compact.json new file mode 100644 index 000000000..4355f9aef --- /dev/null +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.8-compact.json @@ -0,0 +1,3 @@ +{ + "Bar": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.9-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.9-compact.json new file mode 100644 index 000000000..4355f9aef --- /dev/null +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.9-compact.json @@ -0,0 +1,3 @@ +{ + "Bar": {} +} \ No newline at end of file diff --git a/tests/test_ast_parsing.py b/tests/test_ast_parsing.py index 904c054fc..a19d77e8b 100644 --- a/tests/test_ast_parsing.py +++ b/tests/test_ast_parsing.py @@ -2,6 +2,7 @@ import json import os import re import sys +from pathlib import Path from typing import List, Dict, Tuple import pytest @@ -394,6 +395,11 @@ ALL_TESTS = [ "while-all.sol", ALL_VERSIONS, ), + Test( + "complex_imports/import_free/Caller.sol", + ["0.8.2"], + ), + Test("custom_error_with_state_variable.sol", make_version(8, 4, 12)), ] # create the output folder if needed try: @@ -492,6 +498,10 @@ def _generate_test(test_item: Test, skip_existing=False): actual = generate_output(sl) print(f"Generate {expected_file}") + + # pylint: disable=no-member + Path(expected_file).parents[0].mkdir(parents=True, exist_ok=True) + with open(expected_file, "w", encoding="utf8") as f: json.dump(actual, f, indent=" ") @@ -518,6 +528,9 @@ def _generate_compile(test_item: Test, skip_existing=False): print(f"Compiled to {expected_file}") cc = CryticCompile(test_file, solc_force_legacy_json=flavor == "legacy") + # pylint: disable=no-member + Path(expected_file).parents[0].mkdir(parents=True, exist_ok=True) + save_to_zip([cc], expected_file) From 81daa56f66488d4ff1961ff4f1033edf15566d36 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Fri, 18 Mar 2022 16:03:39 +0100 Subject: [PATCH 021/101] Improve import alias support (#1133) * Improve import alias - Fix #962 - Fix #1106 - Fix #1067 --- slither/core/declarations/import_directive.py | 4 +- slither/core/scope/scope.py | 8 ++++ .../solc_parsing/expressions/find_variable.py | 3 ++ .../slither_compilation_unit_solc.py | 45 ++++++++++++++++-- .../solidity_types/type_parsing.py | 30 ++++++++++-- .../import_aliases/test.sol-0.8.0-compact.zip | Bin 0 -> 2424 bytes .../import_aliases/test.sol-0.8.1-compact.zip | Bin 0 -> 2421 bytes .../test.sol-0.8.10-compact.zip | Bin 0 -> 2484 bytes .../test.sol-0.8.11-compact.zip | Bin 0 -> 2479 bytes .../test.sol-0.8.12-compact.zip | Bin 0 -> 2544 bytes .../import_aliases/test.sol-0.8.2-compact.zip | Bin 0 -> 2482 bytes .../import_aliases/test.sol-0.8.3-compact.zip | Bin 0 -> 2485 bytes .../import_aliases/test.sol-0.8.4-compact.zip | Bin 0 -> 2486 bytes .../import_aliases/test.sol-0.8.5-compact.zip | Bin 0 -> 2489 bytes .../import_aliases/test.sol-0.8.6-compact.zip | Bin 0 -> 2486 bytes .../import_aliases/test.sol-0.8.7-compact.zip | Bin 0 -> 2489 bytes .../import_aliases/test.sol-0.8.8-compact.zip | Bin 0 -> 2471 bytes .../import_aliases/test.sol-0.8.9-compact.zip | Bin 0 -> 2481 bytes .../complex_imports/import_aliases/import.sol | 14 ++++++ .../complex_imports/import_aliases/test.sol | 10 ++++ .../test.sol-0.8.0-compact.json | 7 +++ .../test.sol-0.8.1-compact.json | 7 +++ .../test.sol-0.8.10-compact.json | 7 +++ .../test.sol-0.8.11-compact.json | 7 +++ .../test.sol-0.8.12-compact.json | 7 +++ .../test.sol-0.8.2-compact.json | 7 +++ .../test.sol-0.8.3-compact.json | 7 +++ .../test.sol-0.8.4-compact.json | 7 +++ .../test.sol-0.8.5-compact.json | 7 +++ .../test.sol-0.8.6-compact.json | 7 +++ .../test.sol-0.8.7-compact.json | 7 +++ .../test.sol-0.8.8-compact.json | 7 +++ .../test.sol-0.8.9-compact.json | 7 +++ tests/test_ast_parsing.py | 1 + 34 files changed, 196 insertions(+), 10 deletions(-) create mode 100644 tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.0-compact.zip create mode 100644 tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.1-compact.zip create mode 100644 tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.10-compact.zip create mode 100644 tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.11-compact.zip create mode 100644 tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.12-compact.zip create mode 100644 tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.2-compact.zip create mode 100644 tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.3-compact.zip create mode 100644 tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.4-compact.zip create mode 100644 tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.5-compact.zip create mode 100644 tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.6-compact.zip create mode 100644 tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.7-compact.zip create mode 100644 tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.8-compact.zip create mode 100644 tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.9-compact.zip create mode 100644 tests/ast-parsing/complex_imports/import_aliases/import.sol create mode 100644 tests/ast-parsing/complex_imports/import_aliases/test.sol create mode 100644 tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.0-compact.json create mode 100644 tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.1-compact.json create mode 100644 tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.10-compact.json create mode 100644 tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.11-compact.json create mode 100644 tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.12-compact.json create mode 100644 tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.2-compact.json create mode 100644 tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.3-compact.json create mode 100644 tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.4-compact.json create mode 100644 tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.5-compact.json create mode 100644 tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.6-compact.json create mode 100644 tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.7-compact.json create mode 100644 tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.8-compact.json create mode 100644 tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.9-compact.json diff --git a/slither/core/declarations/import_directive.py b/slither/core/declarations/import_directive.py index 02d9d13f4..11c564ccc 100644 --- a/slither/core/declarations/import_directive.py +++ b/slither/core/declarations/import_directive.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import Optional, TYPE_CHECKING +from typing import Optional, TYPE_CHECKING, Dict from slither.core.source_mapping.source_mapping import SourceMapping @@ -13,6 +13,8 @@ class Import(SourceMapping): self._filename: Path = filename self._alias: Optional[str] = None self.scope: "FileScope" = scope + # Map local name -> original name + self.renaming: Dict[str, str] = {} @property def filename(self) -> str: diff --git a/slither/core/scope/scope.py b/slither/core/scope/scope.py index 7414502b3..dd755de94 100644 --- a/slither/core/scope/scope.py +++ b/slither/core/scope/scope.py @@ -39,6 +39,11 @@ class FileScope: self.structures: Dict[str, StructureTopLevel] = {} self.variables: Dict[str, TopLevelVariable] = {} + # Renamed created by import + # import A as B + # local name -> original name (A -> B) + self.renaming: Dict[str, str] = {} + def add_accesible_scopes(self) -> bool: """ Add information from accessible scopes. Return true if new information was obtained @@ -74,6 +79,9 @@ class FileScope: if not _dict_contain(new_scope.variables, self.variables): self.variables.update(new_scope.variables) learn_something = True + if not _dict_contain(new_scope.renaming, self.renaming): + self.renaming.update(new_scope.renaming) + learn_something = True return learn_something diff --git a/slither/solc_parsing/expressions/find_variable.py b/slither/solc_parsing/expressions/find_variable.py index 1c607fb69..b88d97782 100644 --- a/slither/solc_parsing/expressions/find_variable.py +++ b/slither/solc_parsing/expressions/find_variable.py @@ -334,6 +334,9 @@ def find_variable( # Because functions are copied between contracts, two functions can have the same ref # So we need to first look with respect to the direct context + if var_name in current_scope.renaming: + var_name = current_scope.renaming[var_name] + # Use ret0/ret1 to help mypy ret0 = _find_variable_from_ref_declaration( referenced_declaration, direct_contracts, direct_functions diff --git a/slither/solc_parsing/slither_compilation_unit_solc.py b/slither/solc_parsing/slither_compilation_unit_solc.py index 5e6a937f0..5a1d08392 100644 --- a/slither/solc_parsing/slither_compilation_unit_solc.py +++ b/slither/solc_parsing/slither_compilation_unit_solc.py @@ -14,6 +14,7 @@ from slither.core.declarations.function_top_level import FunctionTopLevel from slither.core.declarations.import_directive import Import from slither.core.declarations.pragma_directive import Pragma from slither.core.declarations.structure_top_level import StructureTopLevel +from slither.core.scope.scope import FileScope from slither.core.variables.top_level_variable import TopLevelVariable from slither.exceptions import SlitherException from slither.solc_parsing.declarations.contract import ContractSolc @@ -28,6 +29,33 @@ logger = logging.getLogger("SlitherSolcParsing") logger.setLevel(logging.INFO) +def _handle_import_aliases( + symbol_aliases: Dict, import_directive: Import, scope: FileScope +) -> None: + """ + Handle the parsing of import aliases + + Args: + symbol_aliases (Dict): json dict from solc + import_directive (Import): current import directive + scope (FileScope): current file scape + + Returns: + + """ + for symbol_alias in symbol_aliases: + if ( + "foreign" in symbol_alias + and "name" in symbol_alias["foreign"] + and "local" in symbol_alias + ): + original_name = symbol_alias["foreign"]["name"] + local_name = symbol_alias["local"] + import_directive.renaming[local_name] = original_name + # Assuming that two imports cannot collide in renaming + scope.renaming[local_name] = original_name + + class SlitherCompilationUnitSolc: # pylint: disable=no-self-use,too-many-instance-attributes def __init__(self, compilation_unit: SlitherCompilationUnit): @@ -204,6 +232,9 @@ class SlitherCompilationUnitSolc: # TODO investigate unitAlias in version < 0.7 and legacy ast if "unitAlias" in top_level_data: import_directive.alias = top_level_data["unitAlias"] + if "symbolAliases" in top_level_data: + symbol_aliases = top_level_data["symbolAliases"] + _handle_import_aliases(symbol_aliases, import_directive, scope) else: import_directive = Import( Path( @@ -356,12 +387,16 @@ Please rename it, this name is reserved for Slither's internals""" for i in contract_parser.linearized_base_contracts[1:]: if i in contract_parser.remapping: - ancestors.append( - contract_parser.underlying_contract.file_scope.get_contract_from_name( - contract_parser.remapping[i] - ) - # self._compilation_unit.get_contract_from_name(contract_parser.remapping[i]) + contract_name = contract_parser.remapping[i] + if contract_name in contract_parser.underlying_contract.file_scope.renaming: + contract_name = contract_parser.underlying_contract.file_scope.renaming[ + contract_name + ] + target = contract_parser.underlying_contract.file_scope.get_contract_from_name( + contract_name ) + assert target + ancestors.append(target) elif i in self._contracts_by_id: ancestors.append(self._contracts_by_id[i]) else: diff --git a/slither/solc_parsing/solidity_types/type_parsing.py b/slither/solc_parsing/solidity_types/type_parsing.py index 4c4282f5d..206985d9f 100644 --- a/slither/solc_parsing/solidity_types/type_parsing.py +++ b/slither/solc_parsing/solidity_types/type_parsing.py @@ -223,6 +223,7 @@ def parse_type( from slither.solc_parsing.variables.top_level_variable import TopLevelVariableSolc sl: "SlitherCompilationUnit" + renaming: Dict[str, str] # Note: for convenicence top level functions use the same parser than function in contract # but contract_parser is set to None if isinstance(caller_context, SlitherCompilationUnitSolc) or ( @@ -232,10 +233,12 @@ def parse_type( if isinstance(caller_context, SlitherCompilationUnitSolc): sl = caller_context.compilation_unit next_context = caller_context + renaming = {} else: assert isinstance(caller_context, FunctionSolc) sl = caller_context.underlying_function.compilation_unit next_context = caller_context.slither_parser + renaming = caller_context.underlying_function.file_scope.renaming structures_direct_access = sl.structures_top_level all_structuress = [c.structures for c in sl.contracts] all_structures = [item for sublist in all_structuress for item in sublist] @@ -269,6 +272,8 @@ def parse_type( all_enums = scope.enums.values() contracts = scope.contracts.values() functions = list(scope.functions) + + renaming = scope.renaming elif isinstance(caller_context, (ContractSolc, FunctionSolc)): if isinstance(caller_context, FunctionSolc): underlying_func = caller_context.underlying_function @@ -277,9 +282,11 @@ def parse_type( assert isinstance(underlying_func, FunctionContract) contract = underlying_func.contract next_context = caller_context.contract_parser + scope = caller_context.underlying_function.file_scope else: contract = caller_context.underlying_contract next_context = caller_context + scope = caller_context.underlying_contract.file_scope structures_direct_access = contract.structures structures_direct_access += contract.file_scope.structures.values() @@ -293,6 +300,8 @@ def parse_type( all_enums += contract.file_scope.enums.values() contracts = contract.file_scope.contracts.values() functions = contract.functions + contract.modifiers + + renaming = scope.renaming else: raise ParsingError(f"Incorrect caller context: {type(caller_context)}") @@ -303,8 +312,11 @@ def parse_type( key = "name" if isinstance(t, UnknownType): + name = t.name + if name in renaming: + name = renaming[name] return _find_from_type_name( - t.name, + name, functions, contracts, structures_direct_access, @@ -320,8 +332,11 @@ def parse_type( if t[key] == "UserDefinedTypeName": if is_compact_ast: + name = t["typeDescriptions"]["typeString"] + if name in renaming: + name = renaming[name] return _find_from_type_name( - t["typeDescriptions"]["typeString"], + name, functions, contracts, structures_direct_access, @@ -332,8 +347,12 @@ def parse_type( # Determine if we have a type node (otherwise we use the name node, as some older solc did not have 'type'). type_name_key = "type" if "type" in t["attributes"] else key + + name = t["attributes"][type_name_key] + if name in renaming: + name = renaming[name] return _find_from_type_name( - t["attributes"][type_name_key], + name, functions, contracts, structures_direct_access, @@ -345,8 +364,11 @@ def parse_type( # Introduced with Solidity 0.8 if t[key] == "IdentifierPath": if is_compact_ast: + name = t["name"] + if name in renaming: + name = renaming[name] return _find_from_type_name( - t["name"], + name, functions, contracts, structures_direct_access, diff --git a/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.0-compact.zip b/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.0-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..e51a04a735d90b41f939e816022539e288591e6c GIT binary patch literal 2424 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.10-compact.zip b/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.10-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..6d89f76a34364df2687a2de73568955d2a8bda18 GIT binary patch literal 2484 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.11-compact.zip b/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.11-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..b902ba52d20976bde530756594a12b67da3e9b4d GIT binary patch literal 2479 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.12-compact.zip b/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.12-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..80e5589a3d11fd98a69d333e16569fc2568c708c GIT binary patch literal 2544 zcmaLZ_aoE~0|)TW-65OIzV?=R)*%(?2zQS_S824ruMZU&IbaU}(Ey;Hl!TH$m-j21#=ldgdp_XfA>7Rq zpJv9PAzDw<4r|!%3wzmO1z9?xi;W)dwiNMPcleq#(Ohc0N7BznRa0AB&Kn&1N$FU{mp2_ItrHjBR5rYB&l~g_w3wD z6A2)Z?W)VF<=T+RsWu7S#0h$QBxfozH{JOmKg28i#Z@<-3y@CJAAsZ5VlM2+VPfUk z*!bHxLL?}PeOJ#o$YFEs*Bkj8^nN=LRW*D_Hi3(FXR6fNHOc+RM0ol6CmDJ|)!Gi1 z_h~}id94E%x_kKB!SL62+2dKY2=!o7oDvh!F9va`)=GI|$^M3yF^v2xr)Hi3Q_2$oUUol5W1v;|v1XSE$)UC3Q=}YrSmRNM7aR zgZ?|OdfjRcn4JvW@~iOL>mlu114Ts=F8un7iPtos={)ovkSa@tfZ&&XS|y(ew;!Ba z%T6(5-27G-PP%Y$kd-!huu5M>Y7`p`sJ%u#qEZdA?yMc3!80leT_Au|#JiWG3n?uYRkc#iEEH-QBrhlX~(oCz`a^CC&`&}%T+8ocH%pp>ZZ^sr3=7O#n{#t=Gg}A+=fs4SmIv?Y4MLy)^MM)A>&ibj*Jv4gpqmjXXjML z=uwKsJ{lg#$Sfd=oIP=|bN7xOm3BRB89oYc^+dd?Ki&#=|Jg4T+Ua=J@>QQI3r3( zxU_91ktp=lBCFQgh}mqDcJyq$fuVA&9L*r9*wv3@dEs^Gvw&s1M@!|i{L5q2lQOw7 zlCF?~ZwkXz`D}uH)IaU4f_t$siLuFSCDBQ-QzYTsEsERli*gf{O|}jj%@Ah1Ztux$ z_3SA{%{bdiqUzKB?>cSmXO1|VFBRfL7Vq*AS8`WZ+_f-pGlc}d&L)E#Psx=TEZq~D zZRd^vlfm`5?vbk{v*q%2?b5|X$F*vTPtw;mg=hx}mv6?E#zvG7QVj%2b9?2Jx4gT5 zmu!M9`}_`8KlQ2D?|Kwpb^^OMHOMJ^0Whnn)GkfgGIeA>NVD&k%gUs^Oh>Pugr>Gl zi`Y-!olbW9gZ93lDRXP_R7N5!h=g??dVx*>-v{T`&Uu^V*`Mp^nkaIzZ@uB#RGRtA z*mU}2vhE{=(ds>Ouvzw?z;`z$HcKF%2PqQaYMhZC`q|fi+=(Zj6WG=vZ%QC3yHdGPYZM zld0%~&n>@wy*>0#K|M%9m$6fO?+?R`>yW19n}^A-RQ)qoGCp?mVI~Th*!26QxUE$ zrHLrnh>FS1o9_ViG|tT>ek@FFk#-Xyi@ZWL0@yt>%`IQwqr*EGlpZuU+c=UWFCfd6VtY zp>xB;ke?b~s^0R964 C^S-$N literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.2-compact.zip b/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.2-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..727906e4a8d214700b9ed1e07904a85613645791 GIT binary patch literal 2482 zcmaKuX*kpi1I7Qw*tfA}dxxwMvJ)A*h7krcmLf|G*D{vTghUyxeF>AKjHE_o8T-y4 zWsf98vKu5@LQJ>&et+L{KAbP-<9W{WvqLa~4FM3q4GiB7b4+RBS`}skfPHlU5C;GN z=M#=o3C9Lr_qi2<4Z~gc4DWI4+a1!m2h0-;Pmt29yW|Qxq47_(Z5686`d8^SFPZ zS4o#Ei>x}UES~zj`pYZA0OGDz4`LewIg-T8Nmx0KBfCfx$VyQ6JOYHHZF@>Bi30fR|R)5nN=wI{%6S{%my0&(gr69W?L2n`NsaojIZ5p6_&yH z2tds2PkUb!6fZpb!9}QdmyjsE^@Zl%ADU89@)>NdI$sx~=nH1<+RJgy?z=S0CmCLO zQk7un7t6pYZu(Asp=-3|-onjOXycC(#TAs>wNg`mjrZUVV=8Z%cSfg;JgaC>V>Hb} zLNB*s-P}4|Q1{K*(+ly2YA!sV1qu>FcH%zu%D2_OY}v39bVzT0c35bRGt;xj%~R+` zrNPU?G~Ehsc)qF5@>Oz0?!>$({i`&W)KKrZ}Vd3KGm8!&vLf0JyP zXh?f&@cK!cK6l@*(k(YL;yEo6mb}t8Buslc6MW6pBn-w=gVTpjs2Pr<%P)G(5bHu! ziY~&X)fvCHEU8H9Pc(?N@qR5@nS@PLHm5!38YuCh@9Fu0EykwwFn8BC#ANXPI>D*t zU(9;+h1dJbNIAbork*^MF@JpX~^tr}d; zLG~VFv#W#pIJ!%Il(_mvcUibsO2kT)8AIC$CI~0tYf<;BzaH30JVYdQhaa4Ju0<^{ zhnHV6$}iOO=L!G2_ll|1vhK&b(^4qzMXyxY5*&85BDZi+!{)XX9u)8WM0|H|y7yh9 zSXB0YQ<#2XCBaygy3xO)3G+m}qs+)nxt&=@PTs&(7}RLN9*2w`Jl9D}#eFHfY$0VG zeXiO}3j5*xub$f;0&6_4J#s^sVJ32+tvo4NFFCyPTZ$XhyMk^-7-A`eId)~HkLZcA zF)z#+XH+MJdSrXk5n}2U7vTJz8>W_TyzL@BG7pl<7>K=hV(%gKtAKNfBW#SPx=H!< zGtD|sUrMqX<@`_Om_?vV;s@LeBG&YsGeWR$qWXQ)9<)>JRShv7`L+tQib>WSoQBB0 z+nR^4M>*#_^R;3%&C@hJn<9KWA8v-$C zk*Pb>CeUX}T{}OV)wK3>?9geMcCt>6y4Eh9 z<_WTuG_oGm!*NwjF8l)=2qGBYiMO|KgI}!hhk1Wx2`NSH z4((g9ltE%6g7$Y#TqNtNKZqVvYKU- zoZ4yM|BL!DZ(6q{HR3*%c$A|E+?c%&h4+hyn{FYoiHHsJnEiHac|x94ZNgVSzqe`; zoMiAF>xc`;2W@z^sP&K8&Uo{Tg{rudd(@9v!`T!ZNMjG;*`EZS1L{n zEWd~E;s<8eHOm?T`43IUj6&K-QKPs9RRd7Sn+2rY+OafuRDqc?+@ulD8YY|e zk_BYMq)$wRhN|i`wDzcu$Khwu{m6{WBz>x-Dyf%%dTH~to>wjeX|>bbAxu?u=Z(M9 zSCT;&G`D;~Y_(G3a2)F9x8~e~vt-ny&c%N06?qNPqgbcuD)h%te6saf%DmJo;$-*K z2bh~#?U@KLy@xVMH%iv;ijwabTC7LlSlBc5H?1j;lOwc^7qygc|GDa^W|_BY*7KVK z$JtF~2dVrt8HE#cU_)1Gi4!rDedA~7mmP$5w_VU@qDFbosESb9izBR?1AP*^3HN~) zx+J78jM8QmTKi!Sm^9K6i56n_2Fc8Sv)%}jF>@_`zBIa)&EJB8;HP|omFTwqXd&gF z(-cR*CaYtu4Rh0LcL^>cA2i01GRLs^?1Yzc0?IiQKZi~us4!G^ueU%g?KU%AG(m8JexTa<=N#JGrMq zE(7SG0({Pc$%;^;1=$U4R6-7;tw-(fqm$DVlZpD}YJA-&-E_Wh@@dD6K597djT8@t zoW7h4dHq-E2*~zSz@I4#1

Iy1w5|2tCOjKTUW}cNZuWf{k;b! q)Y>5!K!%L}o2mX_)qfSo@NfJ-!m>j!G5_0P_+zU-Y5#}J0N@`TBBEdb literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.3-compact.zip b/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.3-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..4403beec1286e2891656adcbf49065adab4a06ed GIT binary patch literal 2485 zcmaLZWkb`A0tN6t5(AlvJfigA0h#0oM+_;a)R1yW3?#=kiILLMDR2d)8!jyk198+~ zl!UZ^Iwv8ZQX(b7^||lwJ?F)Fb3VY&7{$n>0h|La0%O5m==EQ}KzwWfuqO`y`~U#> zV7+~0yos*1Sbqd-p&*YJk*-k{P}3r5<`g~+gxE;BKg<%er=qb-F--wsikxQg@W(|N;f zm^LD$C4Cp>1L+LN6=_w_D~bPHS4%o*VW+77yL#yr@o!#A??Px-#A;Sx%zb$gFee=hqij+bT39 zWX#-%Rt=~4!q-~e_Ba#I5dTU_Hfc$LoumAHU;r&pd+kU~e}YYMRjFS`LQfn)ekR1bMRJ6+iE{p-=1Y z9v93Ip9P=OxKiXA4g->qVaNa+OYT5xVVoUZ3zpk;&l~#`N>uBcIw_P&1Fx=Yx}99Q zo^$vG|LLZOvLB`^d2a@JY(D!sHJ|QI4ur5(7JP~ zA1BrR$?f?*UPvxuf2-OZU)4;xPIgXY&oOLdW6(| zI>p8HnlJyybY}OWSl;OmY_Y#ZAINP55KAkCB(F40o;4@vdJ#lR7s{9VP@ln z{a?Q*QrnQ}j)I9_QN;A;ou~vw4ONU^Hmw7Sy6iniA@BrEn$s;uDRw21)Tx!7M!H46 zcn^gYrizFWf*^b=^#$oh2eu^*aD(vAP?)~h3g_Km=a`>WsoCW}nSKbcnJsEy4P9${ zW-yv>`Zj72`t03bQ=*Cv)2h~5dqd?34jkb(JTkzB_NT;1?+X4xH`^OQx zoTMf&qy1IsuOdurddBH|z+h+M9ek5BKf!yOKM81oI(`qMvCs*POltD4o)3Zy(VNR9 ziBfOvpY<b?`u7x@yh`3D$CoAtr}6R<4B9#gkogHC@;bfiie9ghZ{|yeu`G> zvKdv*`4=;XwmnJaAAloH#P0?Nu6nR$4oJz@&#EkSyy@B6(lTIGywR1(sY;o3l8t|X zivLRly-zh;{r#vy*STN$y3B+OQyZvq>AAA?NcmoMyJiQ@ksH0L^!yh~Uaj@L)?*-C)Bh^swRB+VigqBYb7KQ^%Wi9bYjrL#Qp1 zPG14SochX&Yp>L^Otme2GB$gu)@ZY|vXdvP`1qU2=TS>3H*}F5qli=Hm2E8vFkQSV zv=|c?Jd+Gp{(F~-SZID5A4LPu!ag7h{AOn=PB)sx8C^Tmd)isY&=mQB&V8$aTx`yv zd0#Cy3RHRp6y4)jHccw~nOBBzfIWSMoUIlf2^m(jYQug_9*SOenU zW*D|-M(F-}VhQEhe0v&H2T;}m97DLhn1DjA&R+@Sj6`Ek#?G>bL=7L$QR$KDdZR%T zbTIZv8ALwda@q3eZJzTLRaZK}Y`XkA$q8aiPN7{s#O0lOo1u}^)%NCf8K3_oBVvlOu1sZ%sxRG`{24{Nei_tg%W z%`8T!OdIqdAv+{@a|K}~%=;4Ct5^ZWU0T}CrB&z-q}m27WWM%}ebOgk*9Iko3ZxxO zUmd@cX}a!y%j6Ek7vpTABsvpM>Wm%R?{&*M4%20mHzKV}$2Ahx=09GVOclW|J6xZs@wf@ES2EV53t<5)!!XK*{E+r+U)GMlRG~zW~hShXnE)DqGLIqck z7Nf*`rwJIUojGC_w8ftw#7$X6EutQWU>7}dJ=lcfXbdC=#toj4Hvz@PL5eYkbIjav zG`AO^?7O=k!^<|G$2@#}@<3XRD^x;wzpYr(abA5Jf%zeTiv$-WtUkZLGLjo#xb2EN z@qfrAKN4g5*J0SHxR9R61O2@p_+5D3EIfN~zcf-j*eFk%@Aek>sjC>VqbcbDVSyZ|5N1&nY#nQ>^FDvToP~ zzNED-wr`#3e+|kynX8J6wZDr`mMgS@BSclL16e%j$F@3lMb zP{4eHk_SJrdxD8llQY_mv*}`Kcibb@C#D08;xsYPn&^8rXXzMXr(T(UloA@-Sul1Y zyUP0V;yHSKliHYworBGXCVC=|`-h7$lUO^A-+56=8@kNwE$I*u+e}yH>jt>o(IE_l ua5ku7E@g~jIH$q*zghK1R{u>H!$0%?kY$WwX8GsC@TdBJ*6a_?0N_7RO|^3X literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.4-compact.zip b/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.4-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..555941eb6d70a4f65c99b6d890a2db4cf385f3fa GIT binary patch literal 2486 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.5-compact.zip b/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.5-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..20e1f23d048706f287984e3543e9f5d4da722801 GIT binary patch literal 2489 zcmaLZ`6Ck!0|xLpCS!z`7;?*fd>L|^EB7(C6^pqw*M@~GL%O6nM#z;USH4K(KFToU zcq2)3wS{DkoO%1czrXME{P6tp`~e>)TNYMh05gCaFqRnY>K^wwLL3AD$ZG-sq5uE@ z6A*(@jfn{N4Tz77h{pI{kM<7^i49N0R0015UFwDpZ(mc_ODw`a8t;C!pqNbgUmZ1rSW+~y+SN4woFg{}C|GAJ#jjvEKI`9Uu@Tz}6w z{8Y2lOKQnusA0sra7EHh%Ld+nH|?fd9}WGt!3WdYOo5|2N%8Q8l(a(+F!)J=L}9Pz zi;+che_+TmcS^=<^`Vpeq)_~FdIG2A39MfH->(irtMe^%vj#V{Od<=O?JJk)41~WS zqW#r%Bllc}P(aKlP>_iMeA|d0!BDyeC{?IC)FC+Bvv2m+dhi8uUy+gZKA*L+3VFPJ z;NB-^Uva1SUyP?uR(-V=3l*bH*bz6=j32k5)X-mi6Hx1@DUYfsW6JvDHCe;*(F>@ zgfpq@r#qbW-uXd%C~pt$0(i7dG=p){)(rw zPZnAJE%zSx9POD`(wfUgI`0m?;4WX!3LRYl_-%~W(O@|neLzybE4a5POV2nxrbgN8I2;O^I#=0p-E>ok|lS$?9(zd~~ zM%0O-82yVMUMsKhvhq@x!Cs9`2Et3W0cp2Ww^cE_U});q3bzkX=V2D1^w}pqXw;d; z6A?iqySn`zt^}x-W*!FwY2nkIq~! z+LtA&^Tk-pG);1#*!7*F1S6-m&5A|+ugsM=F9sWk<*Wy!jZ06jl+41A#*gGVf6jc7 zP?!Td@F%@X<(@ug!`^|1vn)>7sdCR9Xur+)f8x2QGsh#+{^obWC+gNn*O`Me-JkPwW! zA=$1sRrS5LDRVpcjmMIcPjSQkDKJ5IkA+8E&&W*~JNOb>FyKr_NZAbT>etmct&Ch` zBlPM$&i`&Y2;Kl(6~H^z9o}-;x3ZNKG+p%IxNK(sV@se8d#!Wx^zp)}0% zeZ$}R5wa-Mqa<5IY{q7z-&iTBgErVQHc^4I8{6)3WYt!ppCt*kRX@EIc~j zn}jFEzDY<7#V^>>VJ_21MsL5AAc6;#kgK0xtMuVp&oVZoWk^B?z&nWb6r220vURg>-=kM5K?^DRgqmDGQ@0d}0I%F&%f zhc7l6r^cU2Eq=qvA$Lo?I*y=fT~R!{VMkd-uz?7$_wMn|2EKq+C`~_rAJQP1GP6}# zC@J;6TxYGcoHR#U8Im++ceRY@!*4Eq+NECfm^^ud9%rW1M{I757_#x!PY+A{wvKNI z%Hq=Jl`1wm-M0qt9iCqGZU4Muafn;*VtK%TAQvecX?~@g8MB2)O{2v;&jVXKm~uNjH1j}%XCKBSsL#$T*`I19{l4sPQ<1X zd4hYAmmBLf38l(eL{pGCm6s}lJ30|6or$tuh`3VcMb`Fc9qspy_nj9`bn0iPn5JLgNF8% znNlht@>bv9Bd=AT=M!h(7uAv9Jm(`rhX7;Fi-%ATB z9|h;$!GULw?s`!5A9QIFD%p}C8x`-C6eZ5#iodob*Pc-i8;P^kl=OI`UZoPYv*G-M zy_kxgK+`Yblm@k}w!T7k zyx?enxC%C9#Acq2vIC~h$iT8;MIPNizfr*u7%}Sn_l_doo8lJvE(Q`W+&rZ6Br}h+ z8L$ej_A5O@Uk4h5-O=Qvs|D7~>i>E#@>nUFg>#})BS!&oyLhv5w*!UFUIfnETV6k; z=t8}d-_=2fxBM)Uc^wAx?rSRjnA%7wn6kTaXtK5>qv@_N*QCAD%1uu@hS~-J1b<+pyD}<2~U7v@fal@f4r6n=1^%p={NRZ>FTJl8NlmwrT%|?6oU|tJfIi45QgStKMFu=){iP@Otf79xZuKpW5(?9e7pygx>Wc%mC^rtp|*6R<@0D%7hFgvhE literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.6-compact.zip b/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.6-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..5df5f53486567e74c0f35b279e8aab24ccdeed3a GIT binary patch literal 2486 zcmaLZ_aoE~0|)TW;c&)v5z1B(aztL=gbM3jlz>`vZT; z2Us6R_h1~>&)?D6&-I>Xpu42k11ttY2L|o}KqLUDCMKd0RD^HI_{eKz)`EVFr*J2K zT&g*@+O=BdR=N81-cUmGZQ8H9tTBaU#!REEmaVIt`EKfrPpLO4^n4A0J z3ic#JqZ40Clc@ROUXkSZP-Y}mvqoUL?%3;PzOG_M|F)b44qtXCQKZo4)A9u4Dy@h+ zupqgC{Xav{8YPL2hPNZxT^?CY^aKF6!< za;n0hv`i_si`yM^J~b*{$}t?uOEC5E1*XF|?>)A;2gr6hk#?TbMuKU|YC(pTA{se^ zzwnkV&%0BJz&3-p6wBT$m#CF`)~3+eVY`C5+6mPVc2;1bjY2%0k7U;3hc0ER2A?zY zJy_B^VejZ_cQ2BnC_G4?(`&~fgmL>);iBWDlEJzVMN#{j$3q-3d03vyX&o5AnOyib3;(e)}#*W^XrMSc(MeLv=Xx53R_T(jfFQd4s;LkSR zaE&SsHv5&uZI7Vwz(vAJ@RgLPKUJ4&sp?DB^jLp8rOlU#TDC{EgQ}>6@RfQPUPx@x zq@X&*PI(%(rU(a!b~|TgIk8dIFJ}xraAB!NS|VJE)LsQm-p`~vVZD&L3>b7%K35U#wD)e+lhUO;XqC;5vmeA(Lnh2SYYZr;!OX-M>L`KoetuH?0eu~`f zl6N|q6e`@`Q?I$&m<=OwIw;1e`92LJ2H+SdQ7u!3@hZIob^EwLlG5{`k`ebwO<>vOV8_ z!5;Z6wBasUPfa0)C&zg3@SZ}<=MODAGqd_ES{eDXfW-9)%;OU7c|uR+AlH+mH=(i8 zWAb&n4dIpb*Ya>BW?ipS6W8|Zb0v%xdK;lzLXWvJ%j@b6-Al`(S6_epFt-0l(+zw( zri?Hx;Krwp?%Hn;V;PvX{;hfI?hSHh<&U@3pgXQ>#z1P!Bhx%2j z%(&#=*955Hfu&T;Tb`|vA3k>SO3XpAY*RjH7&Wzy3B!%!i0?MD-FPLRC;8qfhP)?V z4t0rSC@VVrmGfApD7-g3z>$F~0P$#Q+WX8F&RRNszlvD;6B@>OtASNvnc^NHxZ^Al zVUn@9p15f=yVowjS(^VPUTF7tBeM#;0J%Scy;Qb;c!f#hb~tPNls+^2JPZxQ%9xR( z3xufIR2rhV;6;a{f~6yu=VzShzccxRrbMy$ZW|OykMg|#AbC-_k(UFi^JGq14%{bh ztM>;r-U12p`Kj|tW(^54*rO3-TkayEoADfw8*|gE^t!~Q) z+mtpYaY9=^tGRIA5Kie8M*9b>Tam(8XLU9!_crTBcly06;0LM(`0}A&Jz4RkA{(?2 zsLabFVzgukuOFanpCD3wzpg$h;a%{2LN1MLF&2E|eR-g=1DPd&&EX&Qv8J`u(%-4? z&Tdv|WSo+6eiJ_m(F}{qaE8L9J?nBGwv{~PaXGeYqZmvO7uP}U5Ks+fg`8@*Ov$EY z*OP2r+|r(6%iJcM^m5;|d(_>c2`+8HR$In1qK_OKq#BES?OXQx|kxG%~-6E^%bGOGCfng08VLhGKT zF(o@(UNK2t(Z#NU1%oOt=MdsJsU;`nvZ2KS(8Q$WV@OFC^=C2Q<|GOjNOAhO}q%N1R2dqfZShCE{7C-wr)&n#J5`L$c8r_ zHN!i5+9zo%J43X+T*qZln-L;$MFo7UZTGs4wR{vgr@ryWJAXyX8N4npohNvDeoC&P zZlNwdNZ^ZCSeNYt4IWloiEDF*s?^WiwyqF_Q!G9<;@zv#V@ba zFn;5=D7-hw)0|Iq1ln|a()?B-RG{ZHG2f&9xNLC8?bKMhWI?6__dGKL(I?w>11e3Nx&QzG literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.7-compact.zip b/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.7-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..32ecbeb82fb1d7a251755c592791cdf1c1ac01fa GIT binary patch literal 2489 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.8-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..1da464acc046a2b9aa4e031ee1a7b1b5b369ac89 GIT binary patch literal 2471 zcmaLZ`6JVf0|)SrE3D1!A#4?iQikNrEgolU6Sj)xCP(gL&hXgWa}7!E+(!rzo+L+1 zu7^41%9&`67~$LV{r&rWzkhiD^8N!}2qPwD4S*5g0LZ~!W~*acS0L;FfRzCN5dZ*u z?7e-Yy**s5?E{{9c==dky=URUtXu z?#|*Ju;>J&kh(<8`PSQY>s`3wCQGI{8YD7&pyR>Sr(dns@Pmzc_cjlWG961nW~UU> zA83F$zpk7rUgR^E%cr#NcV1ZTp7OKtV|zk_7D%sGJ|&_VGy@!0zIHXdbUN z3Ndn~Z4Jp^7_%d~vXweex*xF#fwC@F+HdD|EFOnb5=Zr&^qd)jv85A0nML zB5$zk2Ix1TQI4ujcs2XtWedevK~&3-vB;>1JDZ|S2f^_CkydwNk{WpXQ&u5ipD&cB zomHNh*>mj4g%W;mgv@t_*R34ex6~ltly_@zTPmkmN#mUM=!uOniz@_?@rgQAV0Sf3 z#6~KW5fx)L$ZQHqZpUXeaJ`kZ~+WBF`)qt8nD=Z$7c;3*vD(y4!703y%z z-L9doe&T-@I3YY9+rY+O17}KRBnI}R3-^eL&BOU|D4vyFOoIifPX!Z$07IS^Qk!>> zN#*@IWePCXv{edoK(39J7@h1So*r|U&du0`PS7YLyDYb=zrW6`cOB(@TO+KLf{)Mh)D zhA#~3={M_{sIzUsCCMn&j)sp%8>yX&m6j-MV-~LH5{eUnyUserrI&dmR4~53TG2!7 zkh})*qz;!WS%!vrHD7CK6}nY18FcYBVXyp_pYK^2OQy*KBbH@O%K&^Df3RoMi4N4D z-`2SPTWXp37K${#9St>&0H+XnoGjSg@NNaf#p&EV3=eI)XW}O58UEuGD4t!`I4O!f zg0%SkW7<(qdj}&};&iE~KRntX!osj1eWB8if-eS$5WZu3yS2F`4}ZyzeVU-ZUm{}BUhIAyT|BLnYA}ZBEzBt)ANM9F%0d>^R(=d; z%TJlpH_vk1gTlH}DOI5)@{=V28_^NgVOWXES#P?s0PiE!FHdTf-`_NTu<=~^gd%cz zNFVC>UDSg3u#>k1lLfGr^viF!a*sbIjY#tYkW*{I(FB2EOrh#ZY~P{EuJeMFrMRSS$aR}T;fVcC zXO~p4{-n>@>?rXgt55-mI1JmYREE@4mqGi^zd17n!yJ;H?8pS7dR|2|%YGN*-A`+4 z37UVbpy|9S^>bex@(1IIIaS(*MUgYZ8Nz#{ub#wlEniKKSyfIqOWUFS-GU#pULQ%+ zpK3JcFEr_QH5pSszr&efct^lA>%(1G0T_3LK>3u$GzKJ#G8x%vdWkH~K}|fYV9E!_ zP&+kA@2V=0dEL?GPFv9z@0CrLJ0$OIpPaD9O^~tz-MR6@pHjO4EV^3H-ZEbk)IwIm z8pC8>g^_oA@*f#DZx=;X4}-IEEzKZ&d6E3+6)-ezl0ceP&AiQ?R(L$LHIsGx(m@e780YWX4DRYwW^N zktsckn%opQ)4!bJzEziB=Q7I0cP?a?Q!YJO(Yx0!9U-c|zFa7GzZm2RbYxADk)ITE zjxVA#r?IUeJTaM1@OcNWveJ)z6@OBC_u*VRMH|f~>4UXQG2EiNWDVc=`>}kQXS@vX zuE3-PfA=A~$mRiAVg|TUaDkq~x0RRwMyM{dXDGvlDvW5F|HqMDd%2J~j?ueCx^7{(I zidv=1xni%d=8hQFKXLFD57*jDITm!dP@Jb4EDt1Psenf#(8XzvPY-wpJ=q+rWUgX? zt4F#{TsPsbtI-C!Mbdeyae4{L-|L@qBmgP_W+`q2)pU8G%Rey@5VYNma?l}>-rqnT zigzmw{hE8S_FSk;TAJXVdHsz-Kf2#RDrV3CeE+Zg@w~*T;uRoFv{Ikp&dG+HiBoI} z$OuL!9k3@ZJfrt`748kTjp>WL$PrPh?~v0FRY!}*TdYwu5+P^(5?^%@MhuJ^O#d5F gzb*COgfsj*|BqD&BbIajei(k&@b~Kf<`@9{2LtM!%K!iX literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.9-compact.zip b/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.9-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..a1f9ff6e42a5e7d7f9679f09f20f291702022b2d GIT binary patch literal 2481 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/complex_imports/import_aliases/import.sol b/tests/ast-parsing/complex_imports/import_aliases/import.sol new file mode 100644 index 000000000..67dcfd506 --- /dev/null +++ b/tests/ast-parsing/complex_imports/import_aliases/import.sol @@ -0,0 +1,14 @@ +contract Test{} + + +struct St{ + uint v; +} + +uint constant A = 0; + +library Lib { + struct Data { + uint256 version; + } +} diff --git a/tests/ast-parsing/complex_imports/import_aliases/test.sol b/tests/ast-parsing/complex_imports/import_aliases/test.sol new file mode 100644 index 000000000..e1aa214c6 --- /dev/null +++ b/tests/ast-parsing/complex_imports/import_aliases/test.sol @@ -0,0 +1,10 @@ +import {Test as TestAlias, St as StAlias, A as Aalias, Lib as LibAlias} from "./import.sol"; + +contract C is TestAlias{ + + using LibAlias for LibAlias.Data; + + function f(StAlias storage s) internal{ + s.v = Aalias; + } +} diff --git a/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.0-compact.json b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.0-compact.json new file mode 100644 index 000000000..6710349b1 --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.0-compact.json @@ -0,0 +1,7 @@ +{ + "Test": {}, + "Lib": {}, + "C": { + "f(St)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.1-compact.json b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.1-compact.json new file mode 100644 index 000000000..6710349b1 --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.1-compact.json @@ -0,0 +1,7 @@ +{ + "Test": {}, + "Lib": {}, + "C": { + "f(St)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.10-compact.json b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.10-compact.json new file mode 100644 index 000000000..6710349b1 --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.10-compact.json @@ -0,0 +1,7 @@ +{ + "Test": {}, + "Lib": {}, + "C": { + "f(St)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.11-compact.json b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.11-compact.json new file mode 100644 index 000000000..6710349b1 --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.11-compact.json @@ -0,0 +1,7 @@ +{ + "Test": {}, + "Lib": {}, + "C": { + "f(St)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.12-compact.json b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.12-compact.json new file mode 100644 index 000000000..6710349b1 --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.12-compact.json @@ -0,0 +1,7 @@ +{ + "Test": {}, + "Lib": {}, + "C": { + "f(St)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.2-compact.json b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.2-compact.json new file mode 100644 index 000000000..6710349b1 --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.2-compact.json @@ -0,0 +1,7 @@ +{ + "Test": {}, + "Lib": {}, + "C": { + "f(St)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.3-compact.json b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.3-compact.json new file mode 100644 index 000000000..6710349b1 --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.3-compact.json @@ -0,0 +1,7 @@ +{ + "Test": {}, + "Lib": {}, + "C": { + "f(St)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.4-compact.json b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.4-compact.json new file mode 100644 index 000000000..6710349b1 --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.4-compact.json @@ -0,0 +1,7 @@ +{ + "Test": {}, + "Lib": {}, + "C": { + "f(St)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.5-compact.json b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.5-compact.json new file mode 100644 index 000000000..6710349b1 --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.5-compact.json @@ -0,0 +1,7 @@ +{ + "Test": {}, + "Lib": {}, + "C": { + "f(St)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.6-compact.json b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.6-compact.json new file mode 100644 index 000000000..6710349b1 --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.6-compact.json @@ -0,0 +1,7 @@ +{ + "Test": {}, + "Lib": {}, + "C": { + "f(St)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.7-compact.json b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.7-compact.json new file mode 100644 index 000000000..6710349b1 --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.7-compact.json @@ -0,0 +1,7 @@ +{ + "Test": {}, + "Lib": {}, + "C": { + "f(St)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.8-compact.json b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.8-compact.json new file mode 100644 index 000000000..6710349b1 --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.8-compact.json @@ -0,0 +1,7 @@ +{ + "Test": {}, + "Lib": {}, + "C": { + "f(St)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.9-compact.json b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.9-compact.json new file mode 100644 index 000000000..6710349b1 --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.9-compact.json @@ -0,0 +1,7 @@ +{ + "Test": {}, + "Lib": {}, + "C": { + "f(St)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/test_ast_parsing.py b/tests/test_ast_parsing.py index a19d77e8b..234fdd2d1 100644 --- a/tests/test_ast_parsing.py +++ b/tests/test_ast_parsing.py @@ -400,6 +400,7 @@ ALL_TESTS = [ ["0.8.2"], ), Test("custom_error_with_state_variable.sol", make_version(8, 4, 12)), + Test("complex_imports/import_aliases/test.sol", VERSIONS_08), ] # create the output folder if needed try: From d41861e6cfd95ba7b33518927342244390699521 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Fri, 18 Mar 2022 19:43:44 +0100 Subject: [PATCH 022/101] Add support for enhanced analyses through code comments (#1089) * Add support for enhanced analyses through code comments - Parse /// ... on variable declaration - Disable reentrancy for variables marked as 'sec:non-reentrant' - Create a new detector looking for wrong access control ('@custom:security write-protection="some_func") --- slither/core/variables/variable.py | 20 +- slither/detectors/all_detectors.py | 1 + .../detectors/functions/protected_variable.py | 81 +++++++ slither/slithir/operations/high_level_call.py | 4 + .../variables/variable_declaration.py | 20 ++ .../protected-vars/0.8.2/comment.sol | 35 +++ .../comment.sol.0.8.2.ProtectedVariables.json | 223 ++++++++++++++++++ .../reentrancy-no-eth/0.8.2/comment.sol | 35 +++ ...sol.0.8.2.ReentrancyReadBeforeWritten.json | 3 + tests/test_detectors.py | 10 + 10 files changed, 431 insertions(+), 1 deletion(-) create mode 100644 slither/detectors/functions/protected_variable.py create mode 100644 tests/detectors/protected-vars/0.8.2/comment.sol create mode 100644 tests/detectors/protected-vars/0.8.2/comment.sol.0.8.2.ProtectedVariables.json create mode 100644 tests/detectors/reentrancy-no-eth/0.8.2/comment.sol create mode 100644 tests/detectors/reentrancy-no-eth/0.8.2/comment.sol.0.8.2.ReentrancyReadBeforeWritten.json diff --git a/slither/core/variables/variable.py b/slither/core/variables/variable.py index c0a5fe0ff..5f94bc922 100644 --- a/slither/core/variables/variable.py +++ b/slither/core/variables/variable.py @@ -10,7 +10,7 @@ from slither.core.solidity_types.elementary_type import ElementaryType if TYPE_CHECKING: from slither.core.expressions.expression import Expression - +# pylint: disable=too-many-instance-attributes class Variable(SourceMapping): def __init__(self): super().__init__() @@ -21,6 +21,8 @@ class Variable(SourceMapping): self._visibility: Optional[str] = None self._is_constant = False self._is_immutable: bool = False + self._is_reentrant: bool = True + self._write_protection: Optional[List[str]] = None @property def is_scalar(self) -> bool: @@ -90,6 +92,22 @@ class Variable(SourceMapping): def is_constant(self, is_cst: bool): self._is_constant = is_cst + @property + def is_reentrant(self) -> bool: + return self._is_reentrant + + @is_reentrant.setter + def is_reentrant(self, is_reentrant: bool): + self._is_reentrant = is_reentrant + + @property + def write_protection(self) -> Optional[List[str]]: + return self._write_protection + + @write_protection.setter + def write_protection(self, write_protection: List[str]): + self._write_protection = write_protection + @property def visibility(self) -> Optional[str]: """ diff --git a/slither/detectors/all_detectors.py b/slither/detectors/all_detectors.py index 62143ad3f..e287c258f 100644 --- a/slither/detectors/all_detectors.py +++ b/slither/detectors/all_detectors.py @@ -81,3 +81,4 @@ from .functions.dead_code import DeadCode from .statements.write_after_write import WriteAfterWrite from .statements.msg_value_in_loop import MsgValueInLoop from .statements.delegatecall_in_loop import DelegatecallInLoop +from .functions.protected_variable import ProtectedVariables diff --git a/slither/detectors/functions/protected_variable.py b/slither/detectors/functions/protected_variable.py new file mode 100644 index 000000000..0c1341d3c --- /dev/null +++ b/slither/detectors/functions/protected_variable.py @@ -0,0 +1,81 @@ +""" +Module detecting suicidal contract + +A suicidal contract is an unprotected function that calls selfdestruct +""" +from typing import List + +from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification +from slither.core.declarations import Function, Contract +from slither.utils.output import Output + + +class ProtectedVariables(AbstractDetector): + + ARGUMENT = "protected-vars" + HELP = "Detected unprotected variables" + IMPACT = DetectorClassification.HIGH + CONFIDENCE = DetectorClassification.HIGH + + WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#protected-variables" + + WIKI_TITLE = "Protected Variables" + WIKI_DESCRIPTION = "Detect unprotected variable that are marked protected" + + # region wiki_exploit_scenario + WIKI_EXPLOIT_SCENARIO = """ +```solidity +contract Buggy{ + + /// @custom:security write-protection="onlyOwner()" + address owner; + + function set_protected() public onlyOwner(){ + owner = msg.sender; + } + + function set_not_protected() public{ + owner = msg.sender; + } +} +``` +`owner` must be always written by function using `onlyOwner` (`write-protection="onlyOwner()"`), however anyone can call `set_not_protected`. +""" + # endregion wiki_exploit_scenario + + WIKI_RECOMMENDATION = "Add access controls to the vulnerable function" + + def _analyze_function(self, function: Function, contract: Contract) -> List[Output]: + results = [] + + for state_variable_written in function.state_variables_written: + if state_variable_written.write_protection: + for function_sig in state_variable_written.write_protection: + function_protection = contract.get_function_from_signature(function_sig) + if not function_protection: + function_protection = contract.get_modifier_from_signature(function_sig) + if not function_protection: + self.logger.error(f"{function_sig} not found") + continue + if function_protection not in function.all_internal_calls(): + info = [ + function, + " should have ", + function_protection, + " to protect ", + state_variable_written, + "\n", + ] + + res = self.generate_result(info) + results.append(res) + return results + + def _detect(self): + """Detect the suicidal functions""" + results = [] + for contract in self.compilation_unit.contracts_derived: + for function in contract.functions_entry_points: + results += self._analyze_function(function, contract) + + return results diff --git a/slither/slithir/operations/high_level_call.py b/slither/slithir/operations/high_level_call.py index 0cac823ba..ff72a0899 100644 --- a/slither/slithir/operations/high_level_call.py +++ b/slither/slithir/operations/high_level_call.py @@ -128,6 +128,10 @@ class HighLevelCall(Call, OperationWithLValue): callstack = callstack + [self.function] if self.function.can_reenter(callstack): return True + if isinstance(self.destination, Variable): + if not self.destination.is_reentrant: + return False + return True def can_send_eth(self): diff --git a/slither/solc_parsing/variables/variable_declaration.py b/slither/solc_parsing/variables/variable_declaration.py index 8bfe65e12..119604ca4 100644 --- a/slither/solc_parsing/variables/variable_declaration.py +++ b/slither/solc_parsing/variables/variable_declaration.py @@ -1,4 +1,5 @@ import logging +import re from typing import Dict from slither.solc_parsing.declarations.caller_context import CallerContextExpression @@ -103,6 +104,23 @@ class VariableDeclarationSolc: """ return self._reference_id + def _handle_comment(self, attributes: Dict): + if "documentation" in attributes and "text" in attributes["documentation"]: + + candidates = attributes["documentation"]["text"].split(",") + + for candidate in candidates: + if "@custom:security non-reentrant" in candidate: + self._variable.is_reentrant = False + + write_protection = re.search( + r'@custom:security write-protection="([\w, ()]*)"', candidate + ) + if write_protection: + if self._variable.write_protection is None: + self._variable.write_protection = [] + self._variable.write_protection.append(write_protection.group(1)) + def _analyze_variable_attributes(self, attributes: Dict): if "visibility" in attributes: self._variable.visibility = attributes["visibility"] @@ -145,6 +163,8 @@ class VariableDeclarationSolc: if attributes["mutability"] == "immutable": self._variable.is_immutable = True + self._handle_comment(attributes) + self._analyze_variable_attributes(attributes) if self._is_compact_ast: diff --git a/tests/detectors/protected-vars/0.8.2/comment.sol b/tests/detectors/protected-vars/0.8.2/comment.sol new file mode 100644 index 000000000..e06ff3902 --- /dev/null +++ b/tests/detectors/protected-vars/0.8.2/comment.sol @@ -0,0 +1,35 @@ +interface I{ + function external_call() external; +} + +contract ReentrancyAndWrite{ + + /// @custom:security non-reentrant + /// @custom:security write-protection="onlyOwner()" + I external_contract; + + modifier onlyOwner(){ + // lets assume there is an access control + _; + } + + mapping(address => uint) balances; + + function withdraw() public{ + uint balance = balances[msg.sender]; + + external_contract.external_call(); + + balances[msg.sender] = 0; + payable(msg.sender).transfer(balance); + } + + function set_protected() public onlyOwner(){ + external_contract = I(msg.sender); + } + + function set_not_protected() public{ + external_contract = I(msg.sender); + } +} + diff --git a/tests/detectors/protected-vars/0.8.2/comment.sol.0.8.2.ProtectedVariables.json b/tests/detectors/protected-vars/0.8.2/comment.sol.0.8.2.ProtectedVariables.json new file mode 100644 index 000000000..3b1d1eb07 --- /dev/null +++ b/tests/detectors/protected-vars/0.8.2/comment.sol.0.8.2.ProtectedVariables.json @@ -0,0 +1,223 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "set_not_protected", + "source_mapping": { + "start": 653, + "length": 85, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/protected-vars/0.8.2/comment.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/protected-vars/0.8.2/comment.sol", + "is_dependency": false, + "lines": [ + 31, + 32, + 33 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ReentrancyAndWrite", + "source_mapping": { + "start": 55, + "length": 685, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/protected-vars/0.8.2/comment.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/protected-vars/0.8.2/comment.sol", + "is_dependency": false, + "lines": [ + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "set_not_protected()" + } + }, + { + "type": "function", + "name": "onlyOwner", + "source_mapping": { + "start": 210, + "length": 88, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/protected-vars/0.8.2/comment.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/protected-vars/0.8.2/comment.sol", + "is_dependency": false, + "lines": [ + 11, + 12, + 13, + 14 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ReentrancyAndWrite", + "source_mapping": { + "start": 55, + "length": 685, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/protected-vars/0.8.2/comment.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/protected-vars/0.8.2/comment.sol", + "is_dependency": false, + "lines": [ + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "onlyOwner()" + } + }, + { + "type": "variable", + "name": "external_contract", + "source_mapping": { + "start": 184, + "length": 19, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/protected-vars/0.8.2/comment.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/protected-vars/0.8.2/comment.sol", + "is_dependency": false, + "lines": [ + 9 + ], + "starting_column": 5, + "ending_column": 24 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ReentrancyAndWrite", + "source_mapping": { + "start": 55, + "length": 685, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/protected-vars/0.8.2/comment.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/protected-vars/0.8.2/comment.sol", + "is_dependency": false, + "lines": [ + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + } + ], + "description": "ReentrancyAndWrite.set_not_protected() (tests/detectors/protected-vars/0.8.2/comment.sol#31-33) should have ReentrancyAndWrite.onlyOwner() (tests/detectors/protected-vars/0.8.2/comment.sol#11-14) to protect ReentrancyAndWrite.external_contract (tests/detectors/protected-vars/0.8.2/comment.sol#9)\n", + "markdown": "[ReentrancyAndWrite.set_not_protected()](tests/detectors/protected-vars/0.8.2/comment.sol#L31-L33) should have [ReentrancyAndWrite.onlyOwner()](tests/detectors/protected-vars/0.8.2/comment.sol#L11-L14) to protect [ReentrancyAndWrite.external_contract](tests/detectors/protected-vars/0.8.2/comment.sol#L9)\n", + "first_markdown_element": "tests/detectors/protected-vars/0.8.2/comment.sol#L31-L33", + "id": "3f3bc8c8a9b3e23482f47f1133aceaed81c2c781c6aaf25656a8e578c9f6cb0e", + "check": "protected-vars", + "impact": "High", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/reentrancy-no-eth/0.8.2/comment.sol b/tests/detectors/reentrancy-no-eth/0.8.2/comment.sol new file mode 100644 index 000000000..e06ff3902 --- /dev/null +++ b/tests/detectors/reentrancy-no-eth/0.8.2/comment.sol @@ -0,0 +1,35 @@ +interface I{ + function external_call() external; +} + +contract ReentrancyAndWrite{ + + /// @custom:security non-reentrant + /// @custom:security write-protection="onlyOwner()" + I external_contract; + + modifier onlyOwner(){ + // lets assume there is an access control + _; + } + + mapping(address => uint) balances; + + function withdraw() public{ + uint balance = balances[msg.sender]; + + external_contract.external_call(); + + balances[msg.sender] = 0; + payable(msg.sender).transfer(balance); + } + + function set_protected() public onlyOwner(){ + external_contract = I(msg.sender); + } + + function set_not_protected() public{ + external_contract = I(msg.sender); + } +} + diff --git a/tests/detectors/reentrancy-no-eth/0.8.2/comment.sol.0.8.2.ReentrancyReadBeforeWritten.json b/tests/detectors/reentrancy-no-eth/0.8.2/comment.sol.0.8.2.ReentrancyReadBeforeWritten.json new file mode 100644 index 000000000..5825bcacc --- /dev/null +++ b/tests/detectors/reentrancy-no-eth/0.8.2/comment.sol.0.8.2.ReentrancyReadBeforeWritten.json @@ -0,0 +1,3 @@ +[ + [] +] \ No newline at end of file diff --git a/tests/test_detectors.py b/tests/test_detectors.py index 07fdd096b..f8374e1c9 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -116,6 +116,11 @@ ALL_TEST_OBJECTS = [ "DAO.sol", "0.4.25", ), + Test( + all_detectors.ReentrancyReadBeforeWritten, + "comment.sol", + "0.8.2", + ), Test( all_detectors.ReentrancyReadBeforeWritten, "no-reentrancy-staticcall.sol", @@ -1262,6 +1267,11 @@ ALL_TEST_OBJECTS = [ "delegatecall_loop.sol", "0.8.0", ), + Test( + all_detectors.ProtectedVariables, + "comment.sol", + "0.8.2", + ), ] From c0792068febf613f2001a721f62a901aa0ad7b3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= <2642849+elopez@users.noreply.github.com> Date: Fri, 18 Mar 2022 15:43:56 -0300 Subject: [PATCH 023/101] Fix path confusion on Windows (#1065) This fixes an issue when running Slither on Windows. Some paths were being stringified as Windows-style (backslash) while the rest of the paths use POSIX-style (forward slash). This caused an issue when trying to match paths, and Slither would complain the dependency was not present. After this change, the paths for import directives are always expressed as POSIX-style paths when stringified. See the following issue for a complete error message: https://github.com/crytic/crytic-compile/issues/241 --- slither/core/declarations/import_directive.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/core/declarations/import_directive.py b/slither/core/declarations/import_directive.py index 11c564ccc..745f8007f 100644 --- a/slither/core/declarations/import_directive.py +++ b/slither/core/declarations/import_directive.py @@ -24,7 +24,7 @@ class Import(SourceMapping): :return: :rtype: """ - return str(self._filename) + return self._filename.as_posix() @property def filename_path(self) -> Path: From 496c8e1910b3478ebc98f59631f5e81876d0ddec Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Mon, 21 Mar 2022 16:50:06 +0100 Subject: [PATCH 024/101] Add fallback/receive info to echidna printer (#1132) --- slither/printers/guidance/echidna.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/slither/printers/guidance/echidna.py b/slither/printers/guidance/echidna.py index 5debfaef1..2ae7c4612 100644 --- a/slither/printers/guidance/echidna.py +++ b/slither/printers/guidance/echidna.py @@ -296,6 +296,24 @@ def _use_balance(slither: SlitherCore) -> Dict[str, List[str]]: return ret +def _with_fallback(slither: SlitherCore) -> Set[str]: + ret: Set[str] = set() + for contract in slither.contracts: + for function in contract.functions_entry_points: + if function.is_fallback: + ret.add(contract.name) + return ret + + +def _with_receive(slither: SlitherCore) -> Set[str]: + ret: Set[str] = set() + for contract in slither.contracts: + for function in contract.functions_entry_points: + if function.is_receive: + ret.add(contract.name) + return ret + + def _call_a_parameter(slither: SlitherCore) -> Dict[str, List[Dict]]: """ Detect the functions with external calls @@ -376,6 +394,10 @@ class Echidna(AbstractPrinter): use_balance = _use_balance(self.slither) + with_fallback = list(_with_fallback(self.slither)) + + with_receive = list(_with_receive(self.slither)) + d = { "payable": payable, "timestamp": timestamp, @@ -392,6 +414,8 @@ class Echidna(AbstractPrinter): "call_a_parameter": call_parameters, "use_balance": use_balance, "solc_versions": [unit.solc_version for unit in self.slither.compilation_units], + "with_fallback": with_fallback, + "with_receive": with_receive, } self.info(json.dumps(d, indent=4)) From 5863c30747eee5440911fb21bb5cc396098a5c9a Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Tue, 22 Mar 2022 14:07:23 +0100 Subject: [PATCH 025/101] Add support for user defined types (#1135) * Add support for user defined types - Create a new core object TypeAlias (top level or contract) - Add support for wrap/unwrap - Add tests --- slither/core/scope/scope.py | 8 + slither/core/solidity_types/__init__.py | 1 + slither/core/solidity_types/type_alias.py | 41 +++++ slither/solc_parsing/declarations/contract.py | 26 +++ .../solc_parsing/expressions/find_variable.py | 5 + .../slither_compilation_unit_solc.py | 18 ++ .../solidity_types/type_parsing.py | 14 ++ .../visitors/slithir/expression_to_slithir.py | 165 +++++++++++------- .../user_defined_types.sol-0.8.10-compact.zip | Bin 0 -> 3215 bytes .../user_defined_types.sol-0.8.11-compact.zip | Bin 0 -> 3215 bytes .../user_defined_types.sol-0.8.12-compact.zip | Bin 0 -> 3217 bytes .../user_defined_types.sol-0.8.8-compact.zip | Bin 0 -> 3180 bytes ...user_defined_types.sol-0.8.10-compact.json | 10 ++ ...user_defined_types.sol-0.8.11-compact.json | 10 ++ ...user_defined_types.sol-0.8.12-compact.json | 10 ++ .../user_defined_types.sol-0.8.8-compact.json | 10 ++ tests/ast-parsing/user_defined_types.sol | 30 ++++ tests/test_ast_parsing.py | 2 + 18 files changed, 289 insertions(+), 61 deletions(-) create mode 100644 slither/core/solidity_types/type_alias.py create mode 100644 tests/ast-parsing/compile/user_defined_types.sol-0.8.10-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_types.sol-0.8.11-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_types.sol-0.8.12-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_types.sol-0.8.8-compact.zip create mode 100644 tests/ast-parsing/expected/user_defined_types.sol-0.8.10-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_types.sol-0.8.11-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_types.sol-0.8.12-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_types.sol-0.8.8-compact.json create mode 100644 tests/ast-parsing/user_defined_types.sol diff --git a/slither/core/scope/scope.py b/slither/core/scope/scope.py index dd755de94..c6d18556e 100644 --- a/slither/core/scope/scope.py +++ b/slither/core/scope/scope.py @@ -6,6 +6,7 @@ from slither.core.declarations.custom_error_top_level import CustomErrorTopLevel from slither.core.declarations.enum_top_level import EnumTopLevel from slither.core.declarations.function_top_level import FunctionTopLevel from slither.core.declarations.structure_top_level import StructureTopLevel +from slither.core.solidity_types import TypeAlias from slither.core.variables.top_level_variable import TopLevelVariable from slither.slithir.variables import Constant @@ -44,6 +45,10 @@ class FileScope: # local name -> original name (A -> B) self.renaming: Dict[str, str] = {} + # User defined types + # Name -> type alias + self.user_defined_types: Dict[str, TypeAlias] = {} + def add_accesible_scopes(self) -> bool: """ Add information from accessible scopes. Return true if new information was obtained @@ -82,6 +87,9 @@ class FileScope: if not _dict_contain(new_scope.renaming, self.renaming): self.renaming.update(new_scope.renaming) learn_something = True + if not _dict_contain(new_scope.user_defined_types, self.user_defined_types): + self.user_defined_types.update(new_scope.user_defined_types) + learn_something = True return learn_something diff --git a/slither/core/solidity_types/__init__.py b/slither/core/solidity_types/__init__.py index 13b1efefb..a6de75bf5 100644 --- a/slither/core/solidity_types/__init__.py +++ b/slither/core/solidity_types/__init__.py @@ -5,3 +5,4 @@ from .mapping_type import MappingType from .user_defined_type import UserDefinedType from .type import Type from .type_information import TypeInformation +from .type_alias import TypeAlias, TypeAliasTopLevel, TypeAliasContract diff --git a/slither/core/solidity_types/type_alias.py b/slither/core/solidity_types/type_alias.py new file mode 100644 index 000000000..06aa06a8b --- /dev/null +++ b/slither/core/solidity_types/type_alias.py @@ -0,0 +1,41 @@ +from typing import TYPE_CHECKING, Tuple + +from slither.core.children.child_contract import ChildContract +from slither.core.declarations.top_level import TopLevel +from slither.core.solidity_types import Type + +if TYPE_CHECKING: + from slither.core.declarations import Contract + from slither.core.scope.scope import FileScope + + +class TypeAlias(Type): + def __init__(self, underlying_type: Type, name: str): + super().__init__() + self.name = name + self.underlying_type = underlying_type + + @property + def storage_size(self) -> Tuple[int, bool]: + return self.underlying_type.storage_size + + def __hash__(self): + return hash(str(self)) + + +class TypeAliasTopLevel(TypeAlias, TopLevel): + def __init__(self, underlying_type: Type, name: str, scope: "FileScope"): + super().__init__(underlying_type, name) + self.file_scope: "FileScope" = scope + + def __str__(self): + return self.name + + +class TypeAliasContract(TypeAlias, ChildContract): + def __init__(self, underlying_type: Type, name: str, contract: "Contract"): + super().__init__(underlying_type, name) + self._contract: "Contract" = contract + + def __str__(self): + return self.contract.name + "." + self.name diff --git a/slither/solc_parsing/declarations/contract.py b/slither/solc_parsing/declarations/contract.py index 0cdb5d848..efc53f2aa 100644 --- a/slither/solc_parsing/declarations/contract.py +++ b/slither/solc_parsing/declarations/contract.py @@ -5,6 +5,7 @@ from slither.core.declarations import Modifier, Event, EnumContract, StructureCo from slither.core.declarations.contract import Contract from slither.core.declarations.custom_error_contract import CustomErrorContract from slither.core.declarations.function_contract import FunctionContract +from slither.core.solidity_types import ElementaryType, TypeAliasContract from slither.core.variables.state_variable import StateVariable from slither.solc_parsing.declarations.caller_context import CallerContextExpression from slither.solc_parsing.declarations.custom_error import CustomErrorSolc @@ -230,6 +231,7 @@ class ContractSolc(CallerContextExpression): self.baseConstructorContractsCalled.append(referencedDeclaration) def _parse_contract_items(self): + # pylint: disable=too-many-branches if not self.get_children() in self._data: # empty contract return for item in self._data[self.get_children()]: @@ -253,10 +255,34 @@ class ContractSolc(CallerContextExpression): self._usingForNotParsed.append(item) elif item[self.get_key()] == "ErrorDefinition": self._customErrorParsed.append(item) + elif item[self.get_key()] == "UserDefinedValueTypeDefinition": + self._parse_type_alias(item) else: raise ParsingError("Unknown contract item: " + item[self.get_key()]) return + def _parse_type_alias(self, item: Dict) -> None: + assert "name" in item + assert "underlyingType" in item + underlying_type = item["underlyingType"] + assert "nodeType" in underlying_type and underlying_type["nodeType"] == "ElementaryTypeName" + assert "name" in underlying_type + + original_type = ElementaryType(underlying_type["name"]) + + # For user defined types defined at the contract level the lookup can be done + # Using the name or the canonical name + # For example during the type parsing the canonical name + # Note that Solidity allows shadowing of user defined types + # Between top level and contract definitions + alias = item["name"] + alias_canonical = self._contract.name + "." + item["name"] + + user_defined_type = TypeAliasContract(original_type, alias, self.underlying_contract) + user_defined_type.set_offset(item["src"], self.compilation_unit) + self._contract.file_scope.user_defined_types[alias] = user_defined_type + self._contract.file_scope.user_defined_types[alias_canonical] = user_defined_type + def _parse_struct(self, struct: Dict): st = StructureContract(self._contract.compilation_unit) diff --git a/slither/solc_parsing/expressions/find_variable.py b/slither/solc_parsing/expressions/find_variable.py index b88d97782..f3f9a2d99 100644 --- a/slither/solc_parsing/expressions/find_variable.py +++ b/slither/solc_parsing/expressions/find_variable.py @@ -18,6 +18,7 @@ from slither.core.solidity_types import ( ArrayType, FunctionType, MappingType, + TypeAlias, ) from slither.core.variables.top_level_variable import TopLevelVariable from slither.core.variables.variable import Variable @@ -292,6 +293,7 @@ def find_variable( Enum, Structure, CustomError, + TypeAlias, ], bool, ]: @@ -337,6 +339,9 @@ def find_variable( if var_name in current_scope.renaming: var_name = current_scope.renaming[var_name] + if var_name in current_scope.user_defined_types: + return current_scope.user_defined_types[var_name], False + # Use ret0/ret1 to help mypy ret0 = _find_variable_from_ref_declaration( referenced_declaration, direct_contracts, direct_functions diff --git a/slither/solc_parsing/slither_compilation_unit_solc.py b/slither/solc_parsing/slither_compilation_unit_solc.py index 5a1d08392..b7a9d4467 100644 --- a/slither/solc_parsing/slither_compilation_unit_solc.py +++ b/slither/solc_parsing/slither_compilation_unit_solc.py @@ -15,6 +15,7 @@ from slither.core.declarations.import_directive import Import from slither.core.declarations.pragma_directive import Pragma from slither.core.declarations.structure_top_level import StructureTopLevel from slither.core.scope.scope import FileScope +from slither.core.solidity_types import ElementaryType, TypeAliasTopLevel from slither.core.variables.top_level_variable import TopLevelVariable from slither.exceptions import SlitherException from slither.solc_parsing.declarations.contract import ContractSolc @@ -298,6 +299,23 @@ class SlitherCompilationUnitSolc: self._compilation_unit.custom_errors.append(custom_error) self._custom_error_parser.append(custom_error_parser) + elif top_level_data[self.get_key()] == "UserDefinedValueTypeDefinition": + assert "name" in top_level_data + alias = top_level_data["name"] + assert "underlyingType" in top_level_data + underlying_type = top_level_data["underlyingType"] + assert ( + "nodeType" in underlying_type + and underlying_type["nodeType"] == "ElementaryTypeName" + ) + assert "name" in underlying_type + + original_type = ElementaryType(underlying_type["name"]) + + user_defined_type = TypeAliasTopLevel(original_type, alias, scope) + user_defined_type.set_offset(top_level_data["src"], self._compilation_unit) + scope.user_defined_types[alias] = user_defined_type + else: raise SlitherException(f"Top level {top_level_data[self.get_key()]} not supported") diff --git a/slither/solc_parsing/solidity_types/type_parsing.py b/slither/solc_parsing/solidity_types/type_parsing.py index 206985d9f..f052bba05 100644 --- a/slither/solc_parsing/solidity_types/type_parsing.py +++ b/slither/solc_parsing/solidity_types/type_parsing.py @@ -6,6 +6,7 @@ from slither.core.declarations.custom_error_contract import CustomErrorContract from slither.core.declarations.custom_error_top_level import CustomErrorTopLevel from slither.core.declarations.function_contract import FunctionContract from slither.core.expressions.literal import Literal +from slither.core.solidity_types import TypeAlias from slither.core.solidity_types.array_type import ArrayType from slither.core.solidity_types.elementary_type import ( ElementaryType, @@ -224,6 +225,7 @@ def parse_type( sl: "SlitherCompilationUnit" renaming: Dict[str, str] + user_defined_types: Dict[str, TypeAlias] # Note: for convenicence top level functions use the same parser than function in contract # but contract_parser is set to None if isinstance(caller_context, SlitherCompilationUnitSolc) or ( @@ -234,11 +236,13 @@ def parse_type( sl = caller_context.compilation_unit next_context = caller_context renaming = {} + user_defined_types = {} else: assert isinstance(caller_context, FunctionSolc) sl = caller_context.underlying_function.compilation_unit next_context = caller_context.slither_parser renaming = caller_context.underlying_function.file_scope.renaming + user_defined_types = caller_context.underlying_function.file_scope.user_defined_types structures_direct_access = sl.structures_top_level all_structuress = [c.structures for c in sl.contracts] all_structures = [item for sublist in all_structuress for item in sublist] @@ -274,6 +278,7 @@ def parse_type( functions = list(scope.functions) renaming = scope.renaming + user_defined_types = scope.user_defined_types elif isinstance(caller_context, (ContractSolc, FunctionSolc)): if isinstance(caller_context, FunctionSolc): underlying_func = caller_context.underlying_function @@ -302,6 +307,7 @@ def parse_type( functions = contract.functions + contract.modifiers renaming = scope.renaming + user_defined_types = scope.user_defined_types else: raise ParsingError(f"Incorrect caller context: {type(caller_context)}") @@ -315,6 +321,8 @@ def parse_type( name = t.name if name in renaming: name = renaming[name] + if name in user_defined_types: + return user_defined_types[name] return _find_from_type_name( name, functions, @@ -335,6 +343,8 @@ def parse_type( name = t["typeDescriptions"]["typeString"] if name in renaming: name = renaming[name] + if name in user_defined_types: + return user_defined_types[name] return _find_from_type_name( name, functions, @@ -351,6 +361,8 @@ def parse_type( name = t["attributes"][type_name_key] if name in renaming: name = renaming[name] + if name in user_defined_types: + return user_defined_types[name] return _find_from_type_name( name, functions, @@ -367,6 +379,8 @@ def parse_type( name = t["name"] if name in renaming: name = renaming[name] + if name in user_defined_types: + return user_defined_types[name] return _find_from_type_name( name, functions, diff --git a/slither/visitors/slithir/expression_to_slithir.py b/slither/visitors/slithir/expression_to_slithir.py index c4fb780a8..0029c29ed 100644 --- a/slither/visitors/slithir/expression_to_slithir.py +++ b/slither/visitors/slithir/expression_to_slithir.py @@ -1,10 +1,13 @@ import logging +from typing import List + from slither.core.declarations import ( Function, SolidityVariable, SolidityVariableComposed, SolidityFunction, + Contract, ) from slither.core.expressions import ( AssignmentOperationType, @@ -13,8 +16,9 @@ from slither.core.expressions import ( ElementaryTypeNameExpression, CallExpression, Identifier, + MemberAccess, ) -from slither.core.solidity_types import ArrayType, ElementaryType +from slither.core.solidity_types import ArrayType, ElementaryType, TypeAlias from slither.core.solidity_types.type import Type from slither.core.variables.local_variable_init_from_tuple import LocalVariableInitFromTuple from slither.core.variables.variable import Variable @@ -33,6 +37,7 @@ from slither.slithir.operations import ( Unpack, Return, SolidityCall, + Operation, ) from slither.slithir.tmp_operations.argument import Argument from slither.slithir.tmp_operations.tmp_call import TmpCall @@ -59,6 +64,10 @@ def get(expression): return val +def get_without_removing(expression): + return expression.context[key] + + def set_val(expression, val): expression.context[key] = val @@ -127,7 +136,7 @@ class ExpressionToSlithIR(ExpressionVisitor): self._expression = expression self._node = node - self._result = [] + self._result: List[Operation] = [] self._visit_expression(self.expression) if node.type == NodeType.RETURN: r = Return(get(self.expression)) @@ -240,8 +249,13 @@ class ExpressionToSlithIR(ExpressionVisitor): def _post_call_expression( self, expression - ): # pylint: disable=too-many-branches,too-many-statements - called = get(expression.called) + ): # pylint: disable=too-many-branches,too-many-statements,too-many-locals + + assert isinstance(expression, CallExpression) + + expression_called = expression.called + called = get(expression_called) + args = [get(a) for a in expression.arguments if a] for arg in args: arg_ = Argument(arg) @@ -259,66 +273,81 @@ class ExpressionToSlithIR(ExpressionVisitor): internal_call.set_expression(expression) self._result.append(internal_call) set_val(expression, val) + + # User defined types + elif ( + isinstance(called, TypeAlias) + and isinstance(expression_called, MemberAccess) + and expression_called.member_name in ["wrap", "unwrap"] + and len(args) == 1 + ): + val = TemporaryVariable(self._node) + var = TypeConversion(val, args[0], called) + var.set_expression(expression) + val.set_type(called) + self._result.append(var) + set_val(expression, val) + + # yul things + elif called.name == "caller()": + val = TemporaryVariable(self._node) + var = Assignment(val, SolidityVariableComposed("msg.sender"), "uint256") + self._result.append(var) + set_val(expression, val) + elif called.name == "origin()": + val = TemporaryVariable(self._node) + var = Assignment(val, SolidityVariableComposed("tx.origin"), "uint256") + self._result.append(var) + set_val(expression, val) + elif called.name == "extcodesize(uint256)": + val = ReferenceVariable(self._node) + var = Member(args[0], Constant("codesize"), val) + self._result.append(var) + set_val(expression, val) + elif called.name == "selfbalance()": + val = TemporaryVariable(self._node) + var = TypeConversion(val, SolidityVariable("this"), ElementaryType("address")) + val.set_type(ElementaryType("address")) + self._result.append(var) + + val1 = ReferenceVariable(self._node) + var1 = Member(val, Constant("balance"), val1) + self._result.append(var1) + set_val(expression, val1) + elif called.name == "address()": + val = TemporaryVariable(self._node) + var = TypeConversion(val, SolidityVariable("this"), ElementaryType("address")) + val.set_type(ElementaryType("address")) + self._result.append(var) + set_val(expression, val) + elif called.name == "callvalue()": + val = TemporaryVariable(self._node) + var = Assignment(val, SolidityVariableComposed("msg.value"), "uint256") + self._result.append(var) + set_val(expression, val) + else: - # yul things - if called.name == "caller()": - val = TemporaryVariable(self._node) - var = Assignment(val, SolidityVariableComposed("msg.sender"), "uint256") - self._result.append(var) - set_val(expression, val) - elif called.name == "origin()": - val = TemporaryVariable(self._node) - var = Assignment(val, SolidityVariableComposed("tx.origin"), "uint256") - self._result.append(var) - set_val(expression, val) - elif called.name == "extcodesize(uint256)": - val = ReferenceVariable(self._node) - var = Member(args[0], Constant("codesize"), val) - self._result.append(var) - set_val(expression, val) - elif called.name == "selfbalance()": - val = TemporaryVariable(self._node) - var = TypeConversion(val, SolidityVariable("this"), ElementaryType("address")) - val.set_type(ElementaryType("address")) - self._result.append(var) - - val1 = ReferenceVariable(self._node) - var1 = Member(val, Constant("balance"), val1) - self._result.append(var1) - set_val(expression, val1) - elif called.name == "address()": - val = TemporaryVariable(self._node) - var = TypeConversion(val, SolidityVariable("this"), ElementaryType("address")) - val.set_type(ElementaryType("address")) - self._result.append(var) - set_val(expression, val) - elif called.name == "callvalue()": - val = TemporaryVariable(self._node) - var = Assignment(val, SolidityVariableComposed("msg.value"), "uint256") - self._result.append(var) - set_val(expression, val) + # If tuple + if expression.type_call.startswith("tuple(") and expression.type_call != "tuple()": + val = TupleVariable(self._node) else: - # If tuple - if expression.type_call.startswith("tuple(") and expression.type_call != "tuple()": - val = TupleVariable(self._node) - else: - val = TemporaryVariable(self._node) + val = TemporaryVariable(self._node) - message_call = TmpCall(called, len(args), val, expression.type_call) - message_call.set_expression(expression) - # Gas/value are only accessible here if the syntax {gas: , value: } - # Is used over .gas().value() - if expression.call_gas: - call_gas = get(expression.call_gas) - message_call.call_gas = call_gas - if expression.call_value: - call_value = get(expression.call_value) - message_call.call_value = call_value - if expression.call_salt: - call_salt = get(expression.call_salt) - message_call.call_salt = call_salt - self._result.append(message_call) - set_val(expression, val) + message_call = TmpCall(called, len(args), val, expression.type_call) + message_call.set_expression(expression) + # Gas/value are only accessible here if the syntax {gas: , value: } + # Is used over .gas().value() + if expression.call_gas: + call_gas = get(expression.call_gas) + message_call.call_gas = call_gas + if expression.call_value: + call_value = get(expression.call_value) + message_call.call_value = call_value + if expression.call_salt: + call_salt = get(expression.call_salt) + message_call.call_salt = call_salt + self._result.append(message_call) + set_val(expression, val) def _post_conditional_expression(self, expression): raise Exception(f"Ternary operator are not convertible to SlithIR {expression}") @@ -413,6 +442,20 @@ class ExpressionToSlithIR(ExpressionVisitor): set_val(expression, val) return + if isinstance(expr, TypeAlias) and expression.member_name in ["wrap", "unwrap"]: + # The logic is be handled by _post_call_expression + set_val(expression, expr) + return + + # Early lookup to detect user defined types from other contracts definitions + # contract A { type MyInt is int} + # contract B { function f() public{ A.MyInt test = A.MyInt.wrap(1);}} + # The logic is handled by _post_call_expression + if isinstance(expr, Contract): + if expression.member_name in expr.file_scope.user_defined_types: + set_val(expression, expr.file_scope.user_defined_types[expression.member_name]) + return + val = ReferenceVariable(self._node) member = Member(expr, Constant(expression.member_name), val) member.set_expression(expression) diff --git a/tests/ast-parsing/compile/user_defined_types.sol-0.8.10-compact.zip b/tests/ast-parsing/compile/user_defined_types.sol-0.8.10-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..245529e6b77aa572359813a25dc4f242f759cd74 GIT binary patch literal 3215 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_types.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/user_defined_types.sol-0.8.8-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..36924b8c2c904640651d8fb697001be94eda7f5c GIT binary patch literal 3180 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\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + }, + "D": {}, + "C": { + "f(Left[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_types.sol-0.8.11-compact.json b/tests/ast-parsing/expected/user_defined_types.sol-0.8.11-compact.json new file mode 100644 index 000000000..06367c7cd --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_types.sol-0.8.11-compact.json @@ -0,0 +1,10 @@ +{ + "B": { + "u()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + }, + "D": {}, + "C": { + "f(Left[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_types.sol-0.8.12-compact.json b/tests/ast-parsing/expected/user_defined_types.sol-0.8.12-compact.json new file mode 100644 index 000000000..06367c7cd --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_types.sol-0.8.12-compact.json @@ -0,0 +1,10 @@ +{ + "B": { + "u()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + }, + "D": {}, + "C": { + "f(Left[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_types.sol-0.8.8-compact.json b/tests/ast-parsing/expected/user_defined_types.sol-0.8.8-compact.json new file mode 100644 index 000000000..06367c7cd --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_types.sol-0.8.8-compact.json @@ -0,0 +1,10 @@ +{ + "B": { + "u()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + }, + "D": {}, + "C": { + "f(Left[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/user_defined_types.sol b/tests/ast-parsing/user_defined_types.sol new file mode 100644 index 000000000..d05bdf396 --- /dev/null +++ b/tests/ast-parsing/user_defined_types.sol @@ -0,0 +1,30 @@ +type MyInt is uint; + +contract B { + type MyInt is int; + + function u() internal returns(int) {} + + function f() public{ + MyInt mi = MyInt.wrap(u()); + } +} + +function f(MyInt a) pure returns (MyInt b) { + b = MyInt(a); +} + +contract D +{ + B.MyInt x = B.MyInt.wrap(int(1)); +} + +contract C { + function f(Left[] memory a) internal returns(Left){ + return a[0]; + } +} +type Left is bytes2; + +MyInt constant x = MyInt.wrap(20); + diff --git a/tests/test_ast_parsing.py b/tests/test_ast_parsing.py index 234fdd2d1..68e0aebca 100644 --- a/tests/test_ast_parsing.py +++ b/tests/test_ast_parsing.py @@ -401,6 +401,8 @@ ALL_TESTS = [ ), Test("custom_error_with_state_variable.sol", make_version(8, 4, 12)), Test("complex_imports/import_aliases/test.sol", VERSIONS_08), + # 0.8.9 crashes on our testcase + Test("user_defined_types.sol", ["0.8.8"] + make_version(8, 10, 12)), ] # create the output folder if needed try: From 380f41937c57a26d10a57f8319e331b706262a9f Mon Sep 17 00:00:00 2001 From: Bo <8527067+bohendo@users.noreply.github.com> Date: Fri, 1 Apr 2022 08:25:38 -0400 Subject: [PATCH 026/101] fix typo in output (#1141) * fix typo in constant_pragma's output --- slither/__main__.py | 2 +- slither/detectors/attributes/constant_pragma.py | 2 +- .../0.4.25/pragma.0.4.25.sol.0.4.25.ConstantPragma.json | 6 +++--- .../0.5.16/pragma.0.5.16.sol.0.5.16.ConstantPragma.json | 6 +++--- .../0.6.11/pragma.0.6.11.sol.0.6.11.ConstantPragma.json | 6 +++--- .../pragma/0.7.6/pragma.0.7.6.sol.0.7.6.ConstantPragma.json | 6 +++--- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/slither/__main__.py b/slither/__main__.py index 9e1bdfc72..bc34e7081 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -776,7 +776,7 @@ def main_impl(all_detector_classes, all_printer_classes): if args.checklist: output_results_to_markdown(results_detectors, args.checklist_limit) - # Dont print the number of result for printers + # Don't print the number of result for printers if number_contracts == 0: logger.warning(red("No contract was analyzed")) if printer_classes: diff --git a/slither/detectors/attributes/constant_pragma.py b/slither/detectors/attributes/constant_pragma.py index 98c12d338..fe68051c2 100644 --- a/slither/detectors/attributes/constant_pragma.py +++ b/slither/detectors/attributes/constant_pragma.py @@ -29,7 +29,7 @@ class ConstantPragma(AbstractDetector): versions = sorted(list(set(versions))) if len(versions) > 1: - info = ["Different versions of Solidity is used:\n"] + info = ["Different versions of Solidity are used:\n"] info += [f"\t- Version used: {[str(v) for v in versions]}\n"] for p in pragma: diff --git a/tests/detectors/pragma/0.4.25/pragma.0.4.25.sol.0.4.25.ConstantPragma.json b/tests/detectors/pragma/0.4.25/pragma.0.4.25.sol.0.4.25.ConstantPragma.json index 7c69fdcc0..e2332ac11 100644 --- a/tests/detectors/pragma/0.4.25/pragma.0.4.25.sol.0.4.25.ConstantPragma.json +++ b/tests/detectors/pragma/0.4.25/pragma.0.4.25.sol.0.4.25.ConstantPragma.json @@ -55,10 +55,10 @@ } } ], - "description": "Different versions of Solidity is used:\n\t- Version used: ['^0.4.24', '^0.4.25']\n\t- ^0.4.24 (tests/detectors/pragma/0.4.25/pragma.0.4.24.sol#1)\n\t- ^0.4.25 (tests/detectors/pragma/0.4.25/pragma.0.4.25.sol#1)\n", - "markdown": "Different versions of Solidity is used:\n\t- Version used: ['^0.4.24', '^0.4.25']\n\t- [^0.4.24](tests/detectors/pragma/0.4.25/pragma.0.4.24.sol#L1)\n\t- [^0.4.25](tests/detectors/pragma/0.4.25/pragma.0.4.25.sol#L1)\n", + "description": "Different versions of Solidity are used:\n\t- Version used: ['^0.4.24', '^0.4.25']\n\t- ^0.4.24 (tests/detectors/pragma/0.4.25/pragma.0.4.24.sol#1)\n\t- ^0.4.25 (tests/detectors/pragma/0.4.25/pragma.0.4.25.sol#1)\n", + "markdown": "Different versions of Solidity are used:\n\t- Version used: ['^0.4.24', '^0.4.25']\n\t- [^0.4.24](tests/detectors/pragma/0.4.25/pragma.0.4.24.sol#L1)\n\t- [^0.4.25](tests/detectors/pragma/0.4.25/pragma.0.4.25.sol#L1)\n", "first_markdown_element": "tests/detectors/pragma/0.4.25/pragma.0.4.24.sol#L1", - "id": "4c6393f838949def61fef871f6771fee22a8783f10fcc084c78287fd2f1d60ed", + "id": "1b4bdffe0c7fc63e2a8d589f34ff29de46139cf79ff3b9cb13dee36502b8fbc6", "check": "pragma", "impact": "Informational", "confidence": "High" diff --git a/tests/detectors/pragma/0.5.16/pragma.0.5.16.sol.0.5.16.ConstantPragma.json b/tests/detectors/pragma/0.5.16/pragma.0.5.16.sol.0.5.16.ConstantPragma.json index cc19f31d1..21afabc73 100644 --- a/tests/detectors/pragma/0.5.16/pragma.0.5.16.sol.0.5.16.ConstantPragma.json +++ b/tests/detectors/pragma/0.5.16/pragma.0.5.16.sol.0.5.16.ConstantPragma.json @@ -55,10 +55,10 @@ } } ], - "description": "Different versions of Solidity is used:\n\t- Version used: ['^0.5.15', '^0.5.16']\n\t- ^0.5.15 (tests/detectors/pragma/0.5.16/pragma.0.5.15.sol#1)\n\t- ^0.5.16 (tests/detectors/pragma/0.5.16/pragma.0.5.16.sol#1)\n", - "markdown": "Different versions of Solidity is used:\n\t- Version used: ['^0.5.15', '^0.5.16']\n\t- [^0.5.15](tests/detectors/pragma/0.5.16/pragma.0.5.15.sol#L1)\n\t- [^0.5.16](tests/detectors/pragma/0.5.16/pragma.0.5.16.sol#L1)\n", + "description": "Different versions of Solidity are used:\n\t- Version used: ['^0.5.15', '^0.5.16']\n\t- ^0.5.15 (tests/detectors/pragma/0.5.16/pragma.0.5.15.sol#1)\n\t- ^0.5.16 (tests/detectors/pragma/0.5.16/pragma.0.5.16.sol#1)\n", + "markdown": "Different versions of Solidity are used:\n\t- Version used: ['^0.5.15', '^0.5.16']\n\t- [^0.5.15](tests/detectors/pragma/0.5.16/pragma.0.5.15.sol#L1)\n\t- [^0.5.16](tests/detectors/pragma/0.5.16/pragma.0.5.16.sol#L1)\n", "first_markdown_element": "tests/detectors/pragma/0.5.16/pragma.0.5.15.sol#L1", - "id": "fb131cf132ddad4e4550414541cc4b778b66e14a2a134874ad78197e54fbc020", + "id": "f3c6aef8c4d19f960e801fe9343d7cb4c290460cb7b4b14dca769269f0234b31", "check": "pragma", "impact": "Informational", "confidence": "High" diff --git a/tests/detectors/pragma/0.6.11/pragma.0.6.11.sol.0.6.11.ConstantPragma.json b/tests/detectors/pragma/0.6.11/pragma.0.6.11.sol.0.6.11.ConstantPragma.json index dc5f6ad5a..ba544823b 100644 --- a/tests/detectors/pragma/0.6.11/pragma.0.6.11.sol.0.6.11.ConstantPragma.json +++ b/tests/detectors/pragma/0.6.11/pragma.0.6.11.sol.0.6.11.ConstantPragma.json @@ -55,10 +55,10 @@ } } ], - "description": "Different versions of Solidity is used:\n\t- Version used: ['^0.6.10', '^0.6.11']\n\t- ^0.6.10 (tests/detectors/pragma/0.6.11/pragma.0.6.10.sol#1)\n\t- ^0.6.11 (tests/detectors/pragma/0.6.11/pragma.0.6.11.sol#1)\n", - "markdown": "Different versions of Solidity is used:\n\t- Version used: ['^0.6.10', '^0.6.11']\n\t- [^0.6.10](tests/detectors/pragma/0.6.11/pragma.0.6.10.sol#L1)\n\t- [^0.6.11](tests/detectors/pragma/0.6.11/pragma.0.6.11.sol#L1)\n", + "description": "Different versions of Solidity are used:\n\t- Version used: ['^0.6.10', '^0.6.11']\n\t- ^0.6.10 (tests/detectors/pragma/0.6.11/pragma.0.6.10.sol#1)\n\t- ^0.6.11 (tests/detectors/pragma/0.6.11/pragma.0.6.11.sol#1)\n", + "markdown": "Different versions of Solidity are used:\n\t- Version used: ['^0.6.10', '^0.6.11']\n\t- [^0.6.10](tests/detectors/pragma/0.6.11/pragma.0.6.10.sol#L1)\n\t- [^0.6.11](tests/detectors/pragma/0.6.11/pragma.0.6.11.sol#L1)\n", "first_markdown_element": "tests/detectors/pragma/0.6.11/pragma.0.6.10.sol#L1", - "id": "cca73553e40b6b9e04136a89efd83aea4283d56c8b3e49371384fc39e0a905e9", + "id": "05ad5ab9a596fc401c485ede8f164ebd0df3052e307bb036f70a64d47cbc2933", "check": "pragma", "impact": "Informational", "confidence": "High" diff --git a/tests/detectors/pragma/0.7.6/pragma.0.7.6.sol.0.7.6.ConstantPragma.json b/tests/detectors/pragma/0.7.6/pragma.0.7.6.sol.0.7.6.ConstantPragma.json index 4f4fea023..d471ff7de 100644 --- a/tests/detectors/pragma/0.7.6/pragma.0.7.6.sol.0.7.6.ConstantPragma.json +++ b/tests/detectors/pragma/0.7.6/pragma.0.7.6.sol.0.7.6.ConstantPragma.json @@ -55,10 +55,10 @@ } } ], - "description": "Different versions of Solidity is used:\n\t- Version used: ['^0.7.5', '^0.7.6']\n\t- ^0.7.5 (tests/detectors/pragma/0.7.6/pragma.0.7.5.sol#1)\n\t- ^0.7.6 (tests/detectors/pragma/0.7.6/pragma.0.7.6.sol#1)\n", - "markdown": "Different versions of Solidity is used:\n\t- Version used: ['^0.7.5', '^0.7.6']\n\t- [^0.7.5](tests/detectors/pragma/0.7.6/pragma.0.7.5.sol#L1)\n\t- [^0.7.6](tests/detectors/pragma/0.7.6/pragma.0.7.6.sol#L1)\n", + "description": "Different versions of Solidity are used:\n\t- Version used: ['^0.7.5', '^0.7.6']\n\t- ^0.7.5 (tests/detectors/pragma/0.7.6/pragma.0.7.5.sol#1)\n\t- ^0.7.6 (tests/detectors/pragma/0.7.6/pragma.0.7.6.sol#1)\n", + "markdown": "Different versions of Solidity are used:\n\t- Version used: ['^0.7.5', '^0.7.6']\n\t- [^0.7.5](tests/detectors/pragma/0.7.6/pragma.0.7.5.sol#L1)\n\t- [^0.7.6](tests/detectors/pragma/0.7.6/pragma.0.7.6.sol#L1)\n", "first_markdown_element": "tests/detectors/pragma/0.7.6/pragma.0.7.5.sol#L1", - "id": "21aac87dfbfe74fd5fcee57ee3edcd75cb659d22b3845b2cc8508a8c44c87d1a", + "id": "bbddfc60b33090137a744cf0ebdfb2acbe88e3f353368626723e8bec7558f72f", "check": "pragma", "impact": "Informational", "confidence": "High" From 114983c17daafcfed62b96ad8999075f38bb062c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= <2642849+elopez@users.noreply.github.com> Date: Fri, 1 Apr 2022 09:31:31 -0300 Subject: [PATCH 027/101] Windows CI for Slither (#1137) * workflows: parser: use solc-select from pip The hardcoded, manually-installed version is out of date. This updates the workflow to install directly from pip now that it is available there. * workflows: parser: Run tests also on Windows * workflows: parser: bump solc-select to >=v1.0.0b1 This version introduces Windows support. * workflows: parser: FIXME: install patched crytic-compile * workflows: features: enable Windows runs This enables runs on windows-2022 and updates solc-select to support running on Windows. * workflows: features: FIXME: install patched crytic-compile * workflows: detectors: enable Windows runs This enables runs on windows-2022 and updates solc-select to support running on Windows. * workflows: detectors, features, parser: disable fail-fast Disable fail-fast so failures in one platform do not hide failures in the other OS. * tests: detectors: adjust GENERIC_PATH replacement for Windows Backslashes are escaped in the string representation, so we need to double them before replacing. Also change generic path to a constant string to avoid it being converted to "\GENERIC_PATH" in Windows and getting an invalid escape error from the JSON decoder later on. * tests: use lf endings for test code If autocrlf is enabled on Windows, it will rewrite solc code with CRLF file endings and break tests that depend on byte offsets in the code files. * workflows: detectors: FIXME: install patched crytic-compile * workflows: ci: enable Windows runs This enables runs on windows-2022 and updates solc-select to support running on Windows. Some tests with Linux requirements are excluded. * workflows: ci: FIXME: install patched crytic-compile * workflows: *: update actions/setup-python to v3 v1 does not install Python correctly on Windows. While at it, update all instances to v3. * workflows: ci: add msys2 tools to path * workflows: ci: disable broken Windows workflows * workflows: apply linter fixes * workflows: ci: enable dapp test * tests: dapp: fix test * core: normalize paths on POSIX style * workflows: ci: enable printers tests on Windows --- .github/ISSUE_TEMPLATE/feature_request.yml | 1 + .github/workflows/black.yml | 4 +- .github/workflows/ci.yml | 88 +++++++++++++++------- .github/workflows/detectors.yml | 17 +++-- .github/workflows/features.yml | 17 +++-- .github/workflows/linter.yml | 4 +- .github/workflows/parser.yml | 23 +++--- .github/workflows/pip-audit.yml | 29 +++---- .github/workflows/pylint.yml | 4 +- scripts/ci_test_dapp.sh | 13 ++-- slither/core/slither_core.py | 5 +- tests/.gitattributes | 3 + tests/test_detectors.py | 17 ++--- 13 files changed, 141 insertions(+), 84 deletions(-) create mode 100644 tests/.gitattributes diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 3356bea03..651f78037 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,3 +1,4 @@ +--- name: Feature request description: Suggest a feature labels: ["enhancement"] diff --git a/.github/workflows/black.yml b/.github/workflows/black.yml index eddac1480..1f54bfd3e 100644 --- a/.github/workflows/black.yml +++ b/.github/workflows/black.yml @@ -11,7 +11,7 @@ on: branches: [master, dev] schedule: # run CI every day even if no PRs/merges occur - - cron: '0 12 * * *' + - cron: '0 12 * * *' jobs: build: @@ -23,7 +23,7 @@ jobs: uses: actions/checkout@v2 - name: Set up Python 3.6 - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: 3.6 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5ccd15dd9..dbe540ea2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,3 +1,4 @@ +--- name: CI defaults: @@ -13,46 +14,81 @@ on: pull_request: schedule: # run CI every day even if no PRs/merges occur - - cron: '0 12 * * *' + - cron: '0 12 * * *' jobs: tests: - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} strategy: + fail-fast: false matrix: + os: ["ubuntu-latest", "windows-2022"] type: ["cli", + "dapp", "data_dependency", # "embark", "erc", "etherlime", + # "etherscan" "find_paths", + "flat", "kspec", "printers", + # "prop" "simil", "slither_config", "truffle", - "upgradability", - # "prop", - "flat"] + "upgradability"] + exclude: + # Requires nix + - os: windows-2022 + type: dapp + # Requires nvm + - os: windows-2022 + type: etherlime + # Requires nvm + - os: windows-2022 + type: truffle steps: - - uses: actions/checkout@v1 - - name: Set up Python 3.6 - uses: actions/setup-python@v1 - with: - python-version: 3.6 - - name: Install dependencies - run: | - python setup.py install - # Used by ci_test.sh - pip install deepdiff - - pip install solc-select - solc-select install all - solc-select use 0.5.1 - - - name: Run Tests - env: - TEST_TYPE: ${{ matrix.type }} - GITHUB_ETHERSCAN: ${{ secrets.GITHUB_ETHERSCAN }} - run: | - bash "scripts/ci_test_${TEST_TYPE}.sh" + - uses: actions/checkout@v1 + + - name: Set up shell + if: runner.os == 'Windows' + run: | + echo 'C:\msys64\mingw64\bin' >> "$GITHUB_PATH" + echo 'C:\msys64\usr\bin' >> "$GITHUB_PATH" + + - name: Set up Python 3.6 + uses: actions/setup-python@v3 + with: + python-version: 3.6 + - name: Install dependencies + run: | + # FIXME: patched crytic-compile is used to support Windows. + # Install from pip once branch is merged and crytic-compile released + pip install "crytic-compile@https://github.com/crytic/crytic-compile/archive/refs/heads/dev-windows-long-paths.zip" + + python setup.py install + # Used by ci_test.sh + pip install deepdiff + + pip install "solc-select>=v1.0.0b1" + solc-select install all + solc-select use 0.5.1 + + - name: Set up nix + if: matrix.type == 'dapp' + uses: cachix/install-nix-action@v16 + + - name: Set up cachix + if: matrix.type == 'dapp' + uses: cachix/cachix-action@v10 + with: + name: dapp + + - name: Run Tests + env: + TEST_TYPE: ${{ matrix.type }} + GITHUB_ETHERSCAN: ${{ secrets.GITHUB_ETHERSCAN }} + run: | + bash "scripts/ci_test_${TEST_TYPE}.sh" diff --git a/.github/workflows/detectors.yml b/.github/workflows/detectors.yml index 13f4ca6ff..46c3ffcbd 100644 --- a/.github/workflows/detectors.yml +++ b/.github/workflows/detectors.yml @@ -11,32 +11,39 @@ on: branches: [master, dev] schedule: # run CI every day even if no PRs/merges occur - - cron: '0 12 * * *' + - cron: '0 12 * * *' jobs: build: name: Detectors tests - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-2022] steps: - name: Checkout Code uses: actions/checkout@v2 - name: Set up Python 3.6 - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: 3.6 - name: Install dependencies run: | + # FIXME: patched crytic-compile is used to support Windows. + # Install from pip once branch is merged and crytic-compile released + pip install "crytic-compile@https://github.com/crytic/crytic-compile/archive/refs/heads/dev-windows-long-paths.zip" + python setup.py install pip install deepdiff pip install pytest - pip install solc-select + pip install "solc-select>=v1.0.0b1" solc-select install all solc-select use 0.7.3 - name: Test with pytest run: | pytest tests/test_detectors.py - diff --git a/.github/workflows/features.yml b/.github/workflows/features.yml index 72aeec986..ffef3d537 100644 --- a/.github/workflows/features.yml +++ b/.github/workflows/features.yml @@ -11,29 +11,37 @@ on: branches: [master, dev] schedule: # run CI every day even if no PRs/merges occur - - cron: '0 12 * * *' + - cron: '0 12 * * *' jobs: build: name: Features tests - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-2022] steps: - name: Checkout Code uses: actions/checkout@v2 - name: Set up Python 3.6 - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: 3.6 - name: Install dependencies run: | + # FIXME: patched crytic-compile is used to support Windows. + # Install from pip once branch is merged and crytic-compile released + pip install "crytic-compile@https://github.com/crytic/crytic-compile/archive/refs/heads/dev-windows-long-paths.zip" + python setup.py install pip install deepdiff pip install pytest - pip install solc-select + pip install "solc-select>=v1.0.0b1" solc-select install all solc-select use 0.8.0 @@ -45,4 +53,3 @@ jobs: run: | pytest tests/test_features.py pytest tests/test_constant_folding_unary.py - diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 94bc3a97b..2fb81477b 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -11,7 +11,7 @@ on: branches: [master, dev] schedule: # run CI every day even if no PRs/merges occur - - cron: '0 12 * * *' + - cron: '0 12 * * *' jobs: build: @@ -23,7 +23,7 @@ jobs: uses: actions/checkout@v2 - name: Set up Python 3.6 - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: 3.6 diff --git a/.github/workflows/parser.yml b/.github/workflows/parser.yml index a06e895ae..dbe10bac2 100644 --- a/.github/workflows/parser.yml +++ b/.github/workflows/parser.yml @@ -11,37 +11,42 @@ on: branches: [master, dev] schedule: # run CI every day even if no PRs/merges occur - - cron: '0 12 * * *' + - cron: '0 12 * * *' jobs: build: name: Parser tests - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-2022] steps: - name: Checkout Code uses: actions/checkout@v2 - name: Set up Python 3.6 - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: 3.6 - name: Install dependencies run: | + # FIXME: patched crytic-compile is used to support Windows. + # Install from pip once branch is merged and crytic-compile released + pip install "crytic-compile@https://github.com/crytic/crytic-compile/archive/refs/heads/dev-windows-long-paths.zip" + python setup.py install pip install deepdiff pip install pytest + pip install "solc-select>=v1.0.0b1" - git clone https://github.com/crytic/solc-select.git - cd solc-select - git checkout 119dd05f58341811cb02b546f25269a7e8a10875 - python setup.py install + - name: Install solc + run: | solc-select install all solc-select use 0.8.0 - cd .. - name: Test with pytest run: | pytest tests/test_ast_parsing.py - diff --git a/.github/workflows/pip-audit.yml b/.github/workflows/pip-audit.yml index f6360056c..c14674ce7 100644 --- a/.github/workflows/pip-audit.yml +++ b/.github/workflows/pip-audit.yml @@ -1,3 +1,4 @@ +--- name: pip-audit on: @@ -11,17 +12,17 @@ jobs: audit: runs-on: ubuntu-latest steps: - - name: Checkout repository - uses: actions/checkout@v2 - - name: Set up Python 3.10 - uses: actions/setup-python@v2 - with: - python-version: "3.10" - - name: Install pip-audit - run: | - python -m pip install --upgrade pip - python -m pip install pip-audit - - name: Run pip-audit - run: | - python -m pip install . - pip-audit --desc -v + - name: Checkout repository + uses: actions/checkout@v2 + - name: Set up Python 3.10 + uses: actions/setup-python@v3 + with: + python-version: "3.10" + - name: Install pip-audit + run: | + python -m pip install --upgrade pip + python -m pip install pip-audit + - name: Run pip-audit + run: | + python -m pip install . + pip-audit --desc -v diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml index c4b7c36df..b5e5b25b0 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/pylint.yml @@ -11,7 +11,7 @@ on: branches: [master, dev] schedule: # run CI every day even if no PRs/merges occur - - cron: '0 12 * * *' + - cron: '0 12 * * *' jobs: build: @@ -23,7 +23,7 @@ jobs: uses: actions/checkout@v2 - name: Set up Python 3.6 - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: 3.6 diff --git a/scripts/ci_test_dapp.sh b/scripts/ci_test_dapp.sh index bc2c92607..d353d8f23 100755 --- a/scripts/ci_test_dapp.sh +++ b/scripts/ci_test_dapp.sh @@ -8,23 +8,20 @@ cd test_dapp || exit 255 git config --global user.email "ci@trailofbits.com" git config --global user.name "CI User" -curl https://nixos.org/nix/install | sh -# shellcheck disable=SC1090,SC1091 -. "$HOME/.nix-profile/etc/profile.d/nix.sh" -nix-env -iA nixpkgs.cachix -cachix use dapp +which nix-env || exit 255 git clone --recursive https://github.com/dapphub/dapptools "$HOME/.dapp/dapptools" nix-env -f "$HOME/.dapp/dapptools" -iA dapp seth solc hevm ethsign dapp init -slither . +slither . --detect external-function -if [ $? -eq 21 ] +# TODO: make more elaborate test +if [ $? -eq 3 ] then exit 0 fi -echo "Truffle test failed" +echo "Dapp test failed" exit 255 diff --git a/slither/core/slither_core.py b/slither/core/slither_core.py index 78ff30ca5..2a76f3e6e 100644 --- a/slither/core/slither_core.py +++ b/slither/core/slither_core.py @@ -4,6 +4,7 @@ import json import logging import os +import posixpath import re from typing import Optional, Dict, List, Set, Union @@ -172,7 +173,7 @@ class SlitherCore(Context): return False mapping_elements_with_lines = ( ( - os.path.normpath(elem["source_mapping"]["filename_absolute"]), + posixpath.normpath(elem["source_mapping"]["filename_absolute"]), elem["source_mapping"]["lines"], ) for elem in r["elements"] @@ -218,7 +219,7 @@ class SlitherCore(Context): if "source_mapping" in elem ] source_mapping_elements = map( - lambda x: os.path.normpath(x) if x else x, source_mapping_elements + lambda x: posixpath.normpath(x) if x else x, source_mapping_elements ) matching = False diff --git a/tests/.gitattributes b/tests/.gitattributes new file mode 100644 index 000000000..e6e5f7d87 --- /dev/null +++ b/tests/.gitattributes @@ -0,0 +1,3 @@ +# Always checkout test solidity code with lf endings +# autocrlf breaks file offsets in tests. +*.sol text eol=lf diff --git a/tests/test_detectors.py b/tests/test_detectors.py index f8374e1c9..30999389c 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -1314,11 +1314,10 @@ def test_detector(test_item: Test): for additional_file in test_item.additional_files: additional_path = str(pathlib.Path(test_dir_path, additional_file).absolute()) - results_as_string = results_as_string.replace( - additional_path, str(pathlib.Path(GENERIC_PATH)) - ) - results_as_string = results_as_string.replace(test_file_path, str(pathlib.Path(GENERIC_PATH))) - + additional_path = additional_path.replace("\\", "\\\\") + results_as_string = results_as_string.replace(additional_path, GENERIC_PATH) + test_file_path = test_file_path.replace("\\", "\\\\") + results_as_string = results_as_string.replace(test_file_path, GENERIC_PATH) results = json.loads(results_as_string) diff = DeepDiff(results, expected_result, ignore_order=True, verbose_level=2) @@ -1358,13 +1357,13 @@ def _generate_test(test_item: Test, skip_existing=False): results = sl.run_detectors() results_as_string = json.dumps(results) - results_as_string = results_as_string.replace(test_file_path, str(pathlib.Path(GENERIC_PATH))) + test_file_path = test_file_path.replace("\\", "\\\\") + results_as_string = results_as_string.replace(test_file_path, GENERIC_PATH) for additional_file in test_item.additional_files: additional_path = str(pathlib.Path(test_dir_path, additional_file).absolute()) - results_as_string = results_as_string.replace( - additional_path, str(pathlib.Path(GENERIC_PATH)) - ) + additional_path = additional_path.replace("\\", "\\\\") + results_as_string = results_as_string.replace(additional_path, GENERIC_PATH) results = json.loads(results_as_string) with open(expected_result_path, "w", encoding="utf8") as f: From 7dde5feb245d02d67be7f212bbbbee630688ef22 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Tue, 5 Apr 2022 11:23:47 +0200 Subject: [PATCH 028/101] Update to gh super linter 4.9.2 + linters (#1157) * Update to gh super linter 4.9.2 + linters This PR cleanup our CI to use a fix version of gh super linter, to avoid breaking the CI on new super linter release. Additionally it update our linters, the new versions: - pylint 2.13.4 - black 22.3.0 Similar to https://github.com/crytic/crytic-compile/pull/252 Additionally, update to use crytic-compile@master --- .github/workflows/black.yml | 2 +- .github/workflows/ci.yml | 3 --- .github/workflows/detectors.yml | 3 --- .github/workflows/features.yml | 3 --- .github/workflows/linter.yml | 2 +- .github/workflows/parser.yml | 3 --- .github/workflows/pylint.yml | 2 +- CONTRIBUTING.md | 3 ++- setup.py | 6 +++--- slither/core/solidity_types/elementary_type.py | 6 +++--- .../detectors/attributes/unimplemented_interface.py | 2 +- .../detectors/naming_convention/naming_convention.py | 12 ++++-------- slither/detectors/source/rtlo.py | 2 +- slither/detectors/statements/type_based_tautology.py | 2 +- slither/slithir/convert.py | 4 ++-- slither/solc_parsing/yul/parse_yul.py | 1 + slither/utils/integer_conversion.py | 2 +- slither/visitors/expression/constants_folding.py | 2 +- 18 files changed, 23 insertions(+), 37 deletions(-) diff --git a/.github/workflows/black.yml b/.github/workflows/black.yml index 1f54bfd3e..c1a999b80 100644 --- a/.github/workflows/black.yml +++ b/.github/workflows/black.yml @@ -36,7 +36,7 @@ jobs: cp pyproject.toml .github/linters - name: Black - uses: github/super-linter/slim@v4.8.7 + uses: github/super-linter/slim@v4.9.2 if: always() env: # run linter on everything to catch preexisting problems diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dbe540ea2..ea0234869 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -64,9 +64,6 @@ jobs: python-version: 3.6 - name: Install dependencies run: | - # FIXME: patched crytic-compile is used to support Windows. - # Install from pip once branch is merged and crytic-compile released - pip install "crytic-compile@https://github.com/crytic/crytic-compile/archive/refs/heads/dev-windows-long-paths.zip" python setup.py install # Used by ci_test.sh diff --git a/.github/workflows/detectors.yml b/.github/workflows/detectors.yml index 46c3ffcbd..f2081d875 100644 --- a/.github/workflows/detectors.yml +++ b/.github/workflows/detectors.yml @@ -33,9 +33,6 @@ jobs: - name: Install dependencies run: | - # FIXME: patched crytic-compile is used to support Windows. - # Install from pip once branch is merged and crytic-compile released - pip install "crytic-compile@https://github.com/crytic/crytic-compile/archive/refs/heads/dev-windows-long-paths.zip" python setup.py install pip install deepdiff diff --git a/.github/workflows/features.yml b/.github/workflows/features.yml index ffef3d537..e069bd120 100644 --- a/.github/workflows/features.yml +++ b/.github/workflows/features.yml @@ -33,9 +33,6 @@ jobs: - name: Install dependencies run: | - # FIXME: patched crytic-compile is used to support Windows. - # Install from pip once branch is merged and crytic-compile released - pip install "crytic-compile@https://github.com/crytic/crytic-compile/archive/refs/heads/dev-windows-long-paths.zip" python setup.py install pip install deepdiff diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 2fb81477b..c1b31a1c4 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -36,7 +36,7 @@ jobs: cp pyproject.toml .github/linters - name: Lint everything else - uses: github/super-linter/slim@v4 + uses: github/super-linter/slim@v4.9.2 if: always() env: # run linter on everything to catch preexisting problems diff --git a/.github/workflows/parser.yml b/.github/workflows/parser.yml index dbe10bac2..4b50a0ca7 100644 --- a/.github/workflows/parser.yml +++ b/.github/workflows/parser.yml @@ -33,9 +33,6 @@ jobs: - name: Install dependencies run: | - # FIXME: patched crytic-compile is used to support Windows. - # Install from pip once branch is merged and crytic-compile released - pip install "crytic-compile@https://github.com/crytic/crytic-compile/archive/refs/heads/dev-windows-long-paths.zip" python setup.py install pip install deepdiff diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml index b5e5b25b0..692a981ab 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/pylint.yml @@ -36,7 +36,7 @@ jobs: cp pyproject.toml .github/linters - name: Pylint - uses: github/super-linter/slim@v4 + uses: github/super-linter/slim@v4.9.2 if: always() env: # run linter on everything to catch preexisting problems diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5270dafac..e93b2557c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,7 +37,8 @@ To run them locally in the root dir of the repository: - `pylint slither tests --rcfile pyproject.toml` - `black . --config pyproject.toml` -We use pylint `2.12.2` black `21.10b0`. +We use pylint `2.13.4`, black `22.3.0`. + ### Detectors tests For each new detector, at least one regression tests must be present. diff --git a/setup.py b/setup.py index 762f4cd08..52084528e 100644 --- a/setup.py +++ b/setup.py @@ -14,10 +14,10 @@ setup( install_requires=[ "prettytable>=0.7.2", "pysha3>=1.0.2", - "crytic-compile>=0.2.2", - # "crytic-compile", + # "crytic-compile>=0.2.2", + "crytic-compile", ], - # dependency_links=["git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile"], + dependency_links=["git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile"], license="AGPL-3.0", long_description=long_description, entry_points={ diff --git a/slither/core/solidity_types/elementary_type.py b/slither/core/solidity_types/elementary_type.py index 59d592807..cac864142 100644 --- a/slither/core/solidity_types/elementary_type.py +++ b/slither/core/solidity_types/elementary_type.py @@ -43,8 +43,8 @@ Int = [ "int256", ] -Max_Int = {k: 2 ** (8 * i - 1) - 1 if i > 0 else 2 ** 255 - 1 for i, k in enumerate(Int)} -Min_Int = {k: -(2 ** (8 * i - 1)) if i > 0 else -(2 ** 255) for i, k in enumerate(Int)} +Max_Int = {k: 2 ** (8 * i - 1) - 1 if i > 0 else 2**255 - 1 for i, k in enumerate(Int)} +Min_Int = {k: -(2 ** (8 * i - 1)) if i > 0 else -(2**255) for i, k in enumerate(Int)} Uint = [ "uint", @@ -82,7 +82,7 @@ Uint = [ "uint256", ] -Max_Uint = {k: 2 ** (8 * i) - 1 if i > 0 else 2 ** 256 - 1 for i, k in enumerate(Uint)} +Max_Uint = {k: 2 ** (8 * i) - 1 if i > 0 else 2**256 - 1 for i, k in enumerate(Uint)} Min_Uint = {k: 0 for k in Uint} diff --git a/slither/detectors/attributes/unimplemented_interface.py b/slither/detectors/attributes/unimplemented_interface.py index 47e3f7013..c5cf5d321 100644 --- a/slither/detectors/attributes/unimplemented_interface.py +++ b/slither/detectors/attributes/unimplemented_interface.py @@ -87,7 +87,7 @@ contract Something { if not intended_interface_is_subset_parent: # Should not be a subset of an earlier determined intended_interface or derive from it intended_interface_is_subset_intended = False - for intended_interface in intended_interfaces: + for intended_interface in list(intended_interfaces): sigs_intended_interface = { f.full_name for f in intended_interface.functions_entry_points } diff --git a/slither/detectors/naming_convention/naming_convention.py b/slither/detectors/naming_convention/naming_convention.py index 63c419fd7..34aba8dc2 100644 --- a/slither/detectors/naming_convention/naming_convention.py +++ b/slither/detectors/naming_convention/naming_convention.py @@ -89,14 +89,10 @@ Solidity defines a [naming convention](https://solidity.readthedocs.io/en/v0.4.2 if func.is_constructor: continue if not self.is_mixed_case(func.name): - if ( - func.visibility - in [ - "internal", - "private", - ] - and self.is_mixed_case_with_underscore(func.name) - ): + if func.visibility in [ + "internal", + "private", + ] and self.is_mixed_case_with_underscore(func.name): continue if func.name.startswith("echidna_") or func.name.startswith("crytic_"): continue diff --git a/slither/detectors/source/rtlo.py b/slither/detectors/source/rtlo.py index df1f26595..ed73fdd4d 100644 --- a/slither/detectors/source/rtlo.py +++ b/slither/detectors/source/rtlo.py @@ -1,7 +1,7 @@ import re from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification - +# pylint: disable=bidirectional-unicode class RightToLeftOverride(AbstractDetector): """ Detect the usage of a Right-To-Left-Override (U+202E) character diff --git a/slither/detectors/statements/type_based_tautology.py b/slither/detectors/statements/type_based_tautology.py index efa814713..0129ad03f 100644 --- a/slither/detectors/statements/type_based_tautology.py +++ b/slither/detectors/statements/type_based_tautology.py @@ -11,7 +11,7 @@ from slither.core.solidity_types.elementary_type import Int, Uint def typeRange(t): bits = int(t.split("int")[1]) if t in Uint: - return 0, (2 ** bits) - 1 + return 0, (2**bits) - 1 if t in Int: v = (2 ** (bits - 1)) - 1 return -v, v diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index ef0adb015..319c25c76 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -170,10 +170,10 @@ def _fits_under_integer(val: int, can_be_int: bool, can_be_uint) -> List[str]: assert can_be_int | can_be_uint while n <= 256: if can_be_uint: - if val <= 2 ** n - 1: + if val <= 2**n - 1: ret.append(f"uint{n}") if can_be_int: - if val <= (2 ** n) / 2 - 1: + if val <= (2**n) / 2 - 1: ret.append(f"int{n}") n = n + 8 return ret diff --git a/slither/solc_parsing/yul/parse_yul.py b/slither/solc_parsing/yul/parse_yul.py index 0248145a0..0c7b48091 100644 --- a/slither/solc_parsing/yul/parse_yul.py +++ b/slither/solc_parsing/yul/parse_yul.py @@ -279,6 +279,7 @@ class YulBlock(YulScope): """ + # pylint: disable=redefined-slots-in-subclass __slots__ = ["_entrypoint", "_parent_func", "_nodes", "node_scope"] def __init__( diff --git a/slither/utils/integer_conversion.py b/slither/utils/integer_conversion.py index 9e0f62c2c..d4a3b4847 100644 --- a/slither/utils/integer_conversion.py +++ b/slither/utils/integer_conversion.py @@ -23,6 +23,6 @@ def convert_string_to_int(val: Union[str, int]) -> int: f"{base}e{expo} is too large to fit in any Solidity integer size" ) return 0 - return int(Decimal(base) * Decimal(10 ** expo)) + return int(Decimal(base) * Decimal(10**expo)) return int(Decimal(val)) diff --git a/slither/visitors/expression/constants_folding.py b/slither/visitors/expression/constants_folding.py index 1758c83dd..61c98d65f 100644 --- a/slither/visitors/expression/constants_folding.py +++ b/slither/visitors/expression/constants_folding.py @@ -43,7 +43,7 @@ class ConstantFolding(ExpressionVisitor): left = get_val(expression.expression_left) right = get_val(expression.expression_right) if expression.type == BinaryOperationType.POWER: - set_val(expression, left ** right) + set_val(expression, left**right) elif expression.type == BinaryOperationType.MULTIPLICATION: set_val(expression, left * right) elif expression.type == BinaryOperationType.DIVISION: From 3af6616281b5f94f3866956f5beff66099b0bf26 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Tue, 5 Apr 2022 15:32:31 +0200 Subject: [PATCH 029/101] Fix custom error signature lookback (#1156) --- slither/core/declarations/custom_error.py | 7 +++++- .../solc_parsing/expressions/find_variable.py | 24 ++++++++++++++----- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/slither/core/declarations/custom_error.py b/slither/core/declarations/custom_error.py index 9bd27ee0f..9ae6370ae 100644 --- a/slither/core/declarations/custom_error.py +++ b/slither/core/declarations/custom_error.py @@ -56,7 +56,12 @@ class CustomError(SourceMapping): Contract and converted into address :return: the solidity signature """ - assert self._solidity_signature is not None + # Ideally this should be an assert + # But due to a logic limitation in the solc parsing (find_variable) + # We need to raise an error if the custom error sig was not yet built + # (set_solidity_sig was not called before find_variable) + if self._solidity_signature is None: + raise ValueError("Custom Error not yet built") return self._solidity_signature def set_solidity_sig(self) -> None: diff --git a/slither/solc_parsing/expressions/find_variable.py b/slither/solc_parsing/expressions/find_variable.py index f3f9a2d99..d1236f78e 100644 --- a/slither/solc_parsing/expressions/find_variable.py +++ b/slither/solc_parsing/expressions/find_variable.py @@ -137,9 +137,15 @@ def _find_top_level( # For example, a top variable that use another top level variable # IF more top level objects are added to Solidity, we have to be careful with the order of the lookup # in this function - for custom_error in scope.custom_errors: - if custom_error.solidity_signature == var_name: - return custom_error, False + try: + for custom_error in scope.custom_errors: + if custom_error.solidity_signature == var_name: + return custom_error, False + except ValueError: + # This can happen as custom error sol signature might not have been built + # when find_variable was called + # TODO refactor find_variable to prevent this from happening + pass return None, False @@ -208,9 +214,15 @@ def _find_in_contract( # This is because when the dic is populated the underlying object is not yet parsed # As a result, we need to iterate over all the custom errors here instead of using the dict custom_errors = contract.custom_errors - for custom_error in custom_errors: - if var_name == custom_error.solidity_signature: - return custom_error + try: + for custom_error in custom_errors: + if var_name == custom_error.solidity_signature: + return custom_error + except ValueError: + # This can happen as custom error sol signature might not have been built + # when find_variable was called + # TODO refactor find_variable to prevent this from happening + pass # If the enum is refered as its name rather than its canonicalName enums = {e.name: e for e in contract.enums} From 644f5e59a920ef466a6b19e059700fea70756d03 Mon Sep 17 00:00:00 2001 From: Henrik Brodin <90325907+hbrodin@users.noreply.github.com> Date: Sun, 10 Apr 2022 15:53:21 +0200 Subject: [PATCH 030/101] Test cases for SSA IR (#1101) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Test cases for SSA IR generation Attempts to verify a few basic properties of the generated SSA IR. Currently these tests fail because of IR that seems to be incorrect. Co-authored-by: Emilio López <2642849+elopez@users.noreply.github.com> --- .github/workflows/IR.yml | 46 ++ tests/test_ssa_generation.py | 934 +++++++++++++++++++++++++++++++++++ 2 files changed, 980 insertions(+) create mode 100644 .github/workflows/IR.yml create mode 100644 tests/test_ssa_generation.py diff --git a/.github/workflows/IR.yml b/.github/workflows/IR.yml new file mode 100644 index 000000000..ba119c6db --- /dev/null +++ b/.github/workflows/IR.yml @@ -0,0 +1,46 @@ +--- +name: IR tests + +defaults: + run: + # To load bashrc + shell: bash -ieo pipefail {0} + +on: + pull_request: + branches: [master, dev] + schedule: + # run CI every day even if no PRs/merges occur + - cron: '0 12 * * *' + +jobs: + build: + name: IR tests + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-2022] + + steps: + - name: Checkout Code + uses: actions/checkout@v2 + + - name: Set up Python 3.6 + uses: actions/setup-python@v3 + with: + python-version: 3.6 + + - name: Install dependencies + run: | + python setup.py install + pip install deepdiff + pip install pytest + + pip install "solc-select>=v1.0.0b1" + solc-select install all + solc-select use 0.8.11 + + - name: Test with pytest + run: | + pytest tests/test_ssa_generation.py diff --git a/tests/test_ssa_generation.py b/tests/test_ssa_generation.py new file mode 100644 index 000000000..69bac2802 --- /dev/null +++ b/tests/test_ssa_generation.py @@ -0,0 +1,934 @@ +import os +import pathlib +from argparse import ArgumentTypeError +from collections import defaultdict +from contextlib import contextmanager +from inspect import getsourcefile +from tempfile import NamedTemporaryFile +from typing import Union, List, Optional + +import pytest +from solc_select import solc_select +from solc_select.solc_select import valid_version as solc_valid_version + +from slither import Slither +from slither.core.cfg.node import Node, NodeType +from slither.core.declarations import Function, Contract +from slither.core.variables.state_variable import StateVariable +from slither.slithir.operations import ( + OperationWithLValue, + Phi, + Assignment, + HighLevelCall, + Return, + Operation, + Binary, + BinaryType, + InternalCall, +) +from slither.slithir.utils.ssa import is_used_later +from slither.slithir.variables import Constant, ReferenceVariable, LocalIRVariable, StateIRVariable + + +# Directory of currently executing script. Will be used as basis for temporary file names. +SCRIPT_DIR = pathlib.Path(getsourcefile(lambda: 0)).parent + + +def valid_version(ver: str) -> bool: + """Wrapper function to check if the solc-version is valid + + The solc_select function raises and exception but for checks below, + only a bool is needed. + """ + try: + solc_valid_version(ver) + return True + except ArgumentTypeError: + return False + + +def have_ssa_if_ir(function: Function): + """Verifies that all nodes in a function that have IR also have SSA IR""" + for n in function.nodes: + if n.irs: + assert n.irs_ssa + + +# pylint: disable=too-many-branches +def ssa_basic_properties(function: Function): + """Verifies that basic properties of ssa holds + + 1. Every name is defined only once + 2. A l-value is never index zero - there is always a zero-value available for each var + 3. Every r-value is at least defined at some point + 4. The number of ssa defs is >= the number of assignments to var + 5. Function parameters SSA are stored in function.parameters_ssa + - if function parameter is_storage it refers to a fake variable + 6. Function returns SSA are stored in function.returns_ssa + - if function return is_storage it refers to a fake variable + """ + ssa_lvalues = set() + ssa_rvalues = set() + lvalue_assignments = {} + + for n in function.nodes: + for ir in n.irs: + if isinstance(ir, OperationWithLValue): + name = ir.lvalue.name + if name in lvalue_assignments: + lvalue_assignments[name] += 1 + else: + lvalue_assignments[name] = 1 + + for ssa in n.irs_ssa: + if isinstance(ssa, OperationWithLValue): + # 1 + assert ssa.lvalue not in ssa_lvalues + ssa_lvalues.add(ssa.lvalue) + + # 2 (if Local/State Var) + if isinstance(ssa.lvalue, (StateIRVariable, LocalIRVariable)): + assert ssa.lvalue.index > 0 + + for rvalue in filter( + lambda x: not isinstance(x, (StateIRVariable, Constant)), ssa.read + ): + ssa_rvalues.add(rvalue) + + # 3 + # Each var can have one non-defined value, the value initially held. Typically, + # var_0, i_0, state_0 or similar. + undef_vars = set() + for rvalue in ssa_rvalues: + if rvalue not in ssa_lvalues: + assert rvalue.non_ssa_version not in undef_vars + undef_vars.add(rvalue.non_ssa_version) + + # 4 + ssa_defs = defaultdict(int) + for v in ssa_lvalues: + ssa_defs[v.name] += 1 + + for (k, n) in lvalue_assignments.items(): + assert ssa_defs[k] >= n + + # Helper 5/6 + def check_property_5_and_6(variables, ssavars): + for var in filter(lambda x: x.name, variables): + ssa_vars = [x for x in ssavars if x.non_ssa_version == var] + assert len(ssa_vars) == 1 + ssa_var = ssa_vars[0] + assert var.is_storage == ssa_var.is_storage + if ssa_var.is_storage: + assert len(ssa_var.refers_to) == 1 + assert ssa_var.refers_to[0].location == "reference_to_storage" + + # 5 + check_property_5_and_6(function.parameters, function.parameters_ssa) + + # 6 + check_property_5_and_6(function.returns, function.returns_ssa) + + +def ssa_phi_node_properties(f: Function): + """Every phi-function should have as many args as predecessors + + This does not apply if the phi-node refers to state variables, + they make use os special phi-nodes for tracking potential values + a state variable can have + """ + for node in f.nodes: + for ssa in node.irs_ssa: + if isinstance(ssa, Phi): + n = len(ssa.read) + if not isinstance(ssa.lvalue, StateIRVariable): + assert len(node.fathers) == n + + +# TODO (hbrodin): This should probably go into another file, not specific to SSA +def dominance_properties(f: Function): + """Verifies properties related to dominators holds + + 1. Every node have an immediate dominator except entry_node which have none + 2. From every node immediate dominator there is a path via its successors to the node + """ + + def find_path(from_node: Node, to: Node) -> bool: + visited = set() + worklist = list(from_node.sons) + while worklist: + first, *worklist = worklist + if first == to: + return True + visited.add(first) + for successor in first.sons: + if successor not in visited: + worklist.append(successor) + return False + + for node in f.nodes: + if node is f.entry_point: + assert node.immediate_dominator is None + else: + assert node.immediate_dominator is not None + assert find_path(node.immediate_dominator, node) + + +def phi_values_inserted(f: Function): + """Verifies that phi-values are inserted at the right places + + For every node that has a dominance frontier, any def (including + phi) should be a phi function in its dominance frontier + """ + + def have_phi_for_var(node: Node, var): + """Checks if a node has a phi-instruction for var + + The ssa version would ideally be checked, but then + more data flow analysis would be needed, for cases + where a new def for var is introduced before reaching + DF + """ + non_ssa = var.non_ssa_version + for ssa in node.irs_ssa: + if isinstance(ssa, Phi): + if non_ssa in map(lambda ssa_var: ssa_var.non_ssa_version, ssa.read): + return True + return False + + for node in filter(lambda n: n.dominance_frontier, f.nodes): + for df in node.dominance_frontier: + for ssa in node.irs_ssa: + if isinstance(ssa, OperationWithLValue): + if is_used_later(node, ssa.lvalue): + assert have_phi_for_var(df, ssa.lvalue) + + +@contextmanager +def select_solc_version(version: Optional[str]): + """Selects solc version to use for running tests. + + If no version is provided, latest is used.""" + # If no solc_version selected just use the latest avail + if not version: + # This sorts the versions numerically + vers = sorted( + map( + lambda x: (int(x[0]), int(x[1]), int(x[2])), + map(lambda x: x.split(".", 3), solc_select.installed_versions()), + ) + ) + ver = list(vers)[-1] + version = ".".join(map(str, ver)) + env = dict(os.environ) + env_restore = dict(env) + env["SOLC_VERSION"] = version + os.environ.clear() + os.environ.update(env) + + yield version + + os.environ.clear() + os.environ.update(env_restore) + + +@contextmanager +def slither_from_source(source_code: str, solc_version: Optional[str] = None): + """Yields a Slither instance using source_code string and solc_version + + Creates a temporary file and changes the solc-version temporary to solc_version. + """ + + fname = "" + try: + with NamedTemporaryFile(dir=SCRIPT_DIR, mode="w", suffix=".sol", delete=False) as f: + fname = f.name + f.write(source_code) + with select_solc_version(solc_version): + yield Slither(fname) + finally: + pathlib.Path(fname).unlink() + + +def verify_properties_hold(source_code_or_slither: Union[str, Slither]): + """Ensures that basic properties of SSA hold true""" + + def verify_func(func: Function): + have_ssa_if_ir(func) + phi_values_inserted(func) + ssa_basic_properties(func) + ssa_phi_node_properties(func) + dominance_properties(func) + + def verify(slither): + for cu in slither.compilation_units: + for func in cu.functions_and_modifiers: + _dump_function(func) + verify_func(func) + for contract in cu.contracts: + for f in contract.functions: + if f.is_constructor or f.is_constructor_variables: + _dump_function(f) + verify_func(f) + + if isinstance(source_code_or_slither, Slither): + verify(source_code_or_slither) + else: + with slither_from_source(source_code_or_slither) as slither: + verify(slither) + + +def _dump_function(f: Function): + """Helper function to print nodes/ssa ir for a function or modifier""" + print(f"---- {f.name} ----") + for n in f.nodes: + print(n) + for ir in n.irs_ssa: + print(f"\t{ir}") + print("") + + +def _dump_functions(c: Contract): + """Helper function to print functions and modifiers of a contract""" + for f in c.functions_and_modifiers: + _dump_function(f) + + +def get_filtered_ssa(f: Union[Function, Node], flt) -> List[Operation]: + """Returns a list of all ssanodes filtered by filter for all nodes in function f""" + if isinstance(f, Function): + return [ssanode for node in f.nodes for ssanode in node.irs_ssa if flt(ssanode)] + + assert isinstance(f, Node) + return [ssanode for ssanode in f.irs_ssa if flt(ssanode)] + + +def get_ssa_of_type(f: Union[Function, Node], ssatype) -> List[Operation]: + """Returns a list of all ssanodes of a specific type for all nodes in function f""" + return get_filtered_ssa(f, lambda ssanode: isinstance(ssanode, ssatype)) + + +def test_multi_write(): + contract = """ + pragma solidity ^0.8.11; + contract Test { + function multi_write(uint val) external pure returns(uint) { + val = 1; + val = 2; + val = 3; + } + }""" + verify_properties_hold(contract) + + +def test_single_branch_phi(): + contract = """ + pragma solidity ^0.8.11; + contract Test { + function single_branch_phi(uint val) external pure returns(uint) { + if (val == 3) { + val = 9; + } + return val; + } + } + """ + verify_properties_hold(contract) + + +def test_basic_phi(): + contract = """ + pragma solidity ^0.8.11; + contract Test { + function basic_phi(uint val) external pure returns(uint) { + if (val == 3) { + val = 9; + } else { + val = 1; + } + return val; + } + } + """ + verify_properties_hold(contract) + + +def test_basic_loop_phi(): + contract = """ + pragma solidity ^0.8.11; + contract Test { + function basic_loop_phi(uint val) external pure returns(uint) { + for (uint i=0;i<128;i++) { + val = val + 1; + } + return val; + } + } + """ + verify_properties_hold(contract) + + +@pytest.mark.skip(reason="Fails in current slither version. Fix in #1102.") +def test_phi_propagation_loop(): + contract = """ + pragma solidity ^0.8.11; + contract Test { + function looping(uint v) external pure returns(uint) { + uint val = 0; + for (uint i=0;i i) { + val = i; + } else { + val = 3; + } + } + return val; + } + } + """ + verify_properties_hold(contract) + + +@pytest.mark.skip(reason="Fails in current slither version. Fix in #1102.") +def test_free_function_properties(): + contract = """ + pragma solidity ^0.8.11; + + function free_looping(uint v) returns(uint) { + uint val = 0; + for (uint i=0;i i) { + val = i; + } else { + val = 3; + } + } + return val; + } + + contract Test {} + """ + verify_properties_hold(contract) + + +def test_ssa_inter_transactional(): + source = """ + pragma solidity ^0.8.11; + contract A { + uint my_var_A; + uint my_var_B; + + function direct_set(uint i) public { + my_var_A = i; + } + + function direct_set_plus_one(uint i) public { + my_var_A = i + 1; + } + + function indirect_set() public { + my_var_B = my_var_A; + } + } + """ + with slither_from_source(source) as slither: + c = slither.contracts[0] + variables = c.variables_as_dict + funcs = c.available_functions_as_dict() + direct_set = funcs["direct_set(uint256)"] + # Skip entry point and go straight to assignment ir + assign1 = direct_set.nodes[1].irs_ssa[0] + assert isinstance(assign1, Assignment) + + assign2 = direct_set.nodes[1].irs_ssa[0] + assert isinstance(assign2, Assignment) + + indirect_set = funcs["indirect_set()"] + phi = indirect_set.entry_point.irs_ssa[0] + assert isinstance(phi, Phi) + # phi rvalues come from 1, initial value of my_var_a and 2, assignment in direct_set + assert len(phi.rvalues) == 3 + assert all(x.non_ssa_version == variables["my_var_A"] for x in phi.rvalues) + assert assign1.lvalue in phi.rvalues + assert assign2.lvalue in phi.rvalues + + +@pytest.mark.skip(reason="Fails in current slither version. Fix in #1102.") +def test_ssa_phi_callbacks(): + source = """ + pragma solidity ^0.8.11; + contract A { + uint my_var_A; + uint my_var_B; + + function direct_set(uint i) public { + my_var_A = i; + } + + function use_a() public { + // Expect a phi-node here + my_var_B = my_var_A; + B b = new B(); + my_var_A = 3; + b.do_stuff(); + // Expect a phi-node here + my_var_B = my_var_A; + } + } + + contract B { + function do_stuff() public returns (uint) { + // This could be calling back into A + } + } + """ + with slither_from_source(source) as slither: + c = slither.get_contract_from_name("A")[0] + _dump_functions(c) + f = [x for x in c.functions if x.name == "use_a"][0] + var_a = [x for x in c.variables if x.name == "my_var_A"][0] + + entry_phi = [ + x + for x in f.entry_point.irs_ssa + if isinstance(x, Phi) and x.lvalue.non_ssa_version == var_a + ][0] + # The four potential sources are: + # 1. initial value + # 2. my_var_A = i; + # 3. my_var_A = 3; + # 4. phi-value after call to b.do_stuff(), which could be reentrant. + assert len(entry_phi.rvalues) == 4 + + # Locate the first high-level call (should be b.do_stuff()) + call_node = [x for y in f.nodes for x in y.irs_ssa if isinstance(x, HighLevelCall)][0] + n = call_node.node + # Get phi-node after call + after_call_phi = n.irs_ssa[n.irs_ssa.index(call_node) + 1] + # The two sources for this phi node is + # 1. my_var_A = i; + # 2. my_var_A = 3; + assert isinstance(after_call_phi, Phi) + assert len(after_call_phi.rvalues) == 2 + + +@pytest.mark.skip(reason="Fails in current slither version. Fix in #1102.") +def test_storage_refers_to(): + """Test the storage aspects of the SSA IR + + When declaring a var as being storage, start tracking what storage it refers_to. + When a phi-node is created, ensure refers_to is propagated to the phi-node. + Assignments also propagate refers_to. + Whenever a ReferenceVariable is the destination of an assignment (e.g. s.v = 10) + below, create additional versions of the variables it refers to record that a a + write was made. In the current implementation, this is referenced by phis. + """ + source = """ + contract A{ + + struct St{ + int v; + } + + St state0; + St state1; + + function f() public{ + St storage s = state0; + if(true){ + s = state1; + } + s.v = 10; + } +} + """ + with slither_from_source(source) as slither: + c = slither.contracts[0] + f = c.functions[0] + + phinodes = get_ssa_of_type(f, Phi) + # Expect 2 in entrypoint (state0/state1 initial values), 1 at 'ENDIF' and two related to the + # ReferenceVariable write s.v = 10. + assert len(phinodes) == 5 + + # Assign s to state0, s to state1, s.v to 10 + assigns = get_ssa_of_type(f, Assignment) + assert len(assigns) == 3 + + # The IR variables have is_storage + assert all(x.lvalue.is_storage for x in assigns if isinstance(x, LocalIRVariable)) + + # s.v ReferenceVariable points to one of the phi vars... + ref0 = [x.lvalue for x in assigns if isinstance(x.lvalue, ReferenceVariable)][0] + sphis = [x for x in phinodes if x.lvalue == ref0.points_to] + assert len(sphis) == 1 + sphi = sphis[0] + + # ...and that phi refers to the two entry phi-values + entryphi = [x for x in phinodes if x.lvalue in sphi.lvalue.refers_to] + assert len(entryphi) == 2 + + # The remaining two phis are the ones recording that write through ReferenceVariable occured + for ephi in entryphi: + phinodes.remove(ephi) + phinodes.remove(sphi) + assert len(phinodes) == 2 + + # And they are recorded in one of the entry phis + assert phinodes[0].lvalue in entryphi[0].rvalues or entryphi[1].rvalues + assert phinodes[1].lvalue in entryphi[0].rvalues or entryphi[1].rvalues + + +@pytest.mark.skip(reason="Fails in current slither version. Fix in #1102.") +@pytest.mark.skipif( + not valid_version("0.4.0"), reason="Solidity version 0.4.0 not available on this platform" +) +def test_initial_version_exists_for_locals(): + """ + In solidity you can write statements such as + uint a = a + 1, this test ensures that can be handled for local variables. + """ + src = """ + contract C { + function func() internal { + uint a = a + 1; + } + } + """ + with slither_from_source(src, "0.4.0") as slither: + verify_properties_hold(slither) + c = slither.contracts[0] + f = c.functions[0] + + addition = get_ssa_of_type(f, Binary)[0] + assert addition.type == BinaryType.ADDITION + assert isinstance(addition.variable_right, Constant) + a_0 = addition.variable_left + assert a_0.index == 0 + assert a_0.name == "a" + + assignment = get_ssa_of_type(f, Assignment)[0] + a_1 = assignment.lvalue + assert a_1.index == 1 + assert a_1.name == "a" + assert assignment.rvalue == addition.lvalue + + assert a_0.non_ssa_version == a_1.non_ssa_version + + +@pytest.mark.skip(reason="Fails in current slither version. Fix in #1102.") +@pytest.mark.skipif( + not valid_version("0.4.0"), reason="Solidity version 0.4.0 not available on this platform" +) +def test_initial_version_exists_for_state_variables(): + """ + In solidity you can write statements such as + uint a = a + 1, this test ensures that can be handled for state variables. + """ + src = """ + contract C { + uint a = a + 1; + } + """ + with slither_from_source(src, "0.4.0") as slither: + verify_properties_hold(slither) + c = slither.contracts[0] + f = c.functions[0] # There will be one artificial ctor function for the state vars + + addition = get_ssa_of_type(f, Binary)[0] + assert addition.type == BinaryType.ADDITION + assert isinstance(addition.variable_right, Constant) + a_0 = addition.variable_left + assert isinstance(a_0, StateIRVariable) + assert a_0.name == "a" + + assignment = get_ssa_of_type(f, Assignment)[0] + a_1 = assignment.lvalue + assert isinstance(a_1, StateIRVariable) + assert a_1.index == a_0.index + 1 + assert a_1.name == "a" + assert assignment.rvalue == addition.lvalue + + assert a_0.non_ssa_version == a_1.non_ssa_version + assert isinstance(a_0.non_ssa_version, StateVariable) + + # No conditional/other function interaction so no phis + assert len(get_ssa_of_type(f, Phi)) == 0 + + +@pytest.mark.skip(reason="Fails in current slither version. Fix in #1102.") +def test_initial_version_exists_for_state_variables_function_assign(): + """ + In solidity you can write statements such as + uint a = a + 1, this test ensures that can be handled for local variables. + """ + # TODO (hbrodin): Could be a detector that a is not used in f + src = """ + contract C { + uint a = f(); + + function f() internal returns(uint) { + return a; + } + } + """ + with slither_from_source(src) as slither: + verify_properties_hold(slither) + c = slither.contracts[0] + f, ctor = c.functions + if f.is_constructor_variables: + f, ctor = ctor, f + + # ctor should have a single call to f that assigns to a + # temporary variable, that is then assigned to a + + call = get_ssa_of_type(ctor, InternalCall)[0] + assert call.function == f + assign = get_ssa_of_type(ctor, Assignment)[0] + assert assign.rvalue == call.lvalue + assert isinstance(assign.lvalue, StateIRVariable) + assert assign.lvalue.name == "a" + + # f should have a phi node on entry of a0, a1 and should return + # a2 + phi = get_ssa_of_type(f, Phi)[0] + assert len(phi.rvalues) == 2 + assert assign.lvalue in phi.rvalues + + +@pytest.mark.skipif( + not valid_version("0.4.0"), reason="Solidity version 0.4.0 not available on this platform" +) +def test_return_local_before_assign(): + src = """ + // this require solidity < 0.5 + // a variable can be returned before declared. Ensure it can be + // handled by Slither. + contract A { + function local(bool my_bool) internal returns(uint){ + if(my_bool){ + return a_local; + } + + uint a_local = 10; + } + } + """ + with slither_from_source(src, "0.4.0") as slither: + f = slither.contracts[0].functions[0] + + ret = get_ssa_of_type(f, Return)[0] + assert len(ret.values) == 1 + assert ret.values[0].index == 0 + + assign = get_ssa_of_type(f, Assignment)[0] + assert assign.lvalue.index == 1 + assert assign.lvalue.non_ssa_version == ret.values[0].non_ssa_version + + +@pytest.mark.skipif( + not valid_version("0.5.0"), reason="Solidity version 0.5.0 not available on this platform" +) +def test_shadow_local(): + src = """ + contract A { + // this require solidity 0.5 + function shadowing_local() internal{ + uint local = 0; + { + uint local = 1; + { + uint local = 2; + } + } + } + } + """ + with slither_from_source(src, "0.5.0") as slither: + _dump_functions(slither.contracts[0]) + f = slither.contracts[0].functions[0] + + # Ensure all assignments are to a variable of index 1 + # not using the same IR var. + assert all(map(lambda x: x.lvalue.index == 1, get_ssa_of_type(f, Assignment))) + + +@pytest.mark.skip(reason="Fails in current slither version. Fix in #1102.") +def test_multiple_named_args_returns(): + """Verifies that named arguments and return values have correct versions + + Each arg/ret have an initial version, version 0, and is written once and should + then have version 1. + """ + src = """ + contract A { + function multi(uint arg1, uint arg2) internal returns (uint ret1, uint ret2) { + arg1 = arg1 + 1; + arg2 = arg2 + 2; + ret1 = arg1 + 3; + ret2 = arg2 + 4; + } + }""" + with slither_from_source(src) as slither: + verify_properties_hold(slither) + f = slither.contracts[0].functions[0] + + # Ensure all LocalIRVariables (not TemporaryVariables) have index 1 + assert all( + map( + lambda x: x.lvalue.index == 1 or not isinstance(x.lvalue, LocalIRVariable), + get_ssa_of_type(f, OperationWithLValue), + ) + ) + + +@pytest.mark.skip(reason="Fails in current slither version. Fix in #1102.") +def test_issue_468(): + """ + Ensure issue 468 is corrected as per + https://github.com/crytic/slither/issues/468#issuecomment-620974151 + The one difference is that we allow the phi-function at entry of f to + hold exit state which contains init state and state from branch, which + is a bit redundant. This could be further simplified. + """ + source = """ + contract State { + int state = 0; + function f(int a) public returns (int) { + // phi-node here for state + if (a < 1) { + state += 1; + } + // phi-node here for state + return state; + } + } + """ + with slither_from_source(source) as slither: + c = slither.get_contract_from_name("State")[0] + f = [x for x in c.functions if x.name == "f"][0] + + # Check that there is an entry point phi values for each later value + # plus one additional which is the initial value + entry_ssa = f.entry_point.irs_ssa + assert len(entry_ssa) == 1 + phi_entry = entry_ssa[0] + assert isinstance(phi_entry, Phi) + + # Find the second phi function + endif_node = [x for x in f.nodes if x.type == NodeType.ENDIF][0] + assert len(endif_node.irs_ssa) == 1 + phi_endif = endif_node.irs_ssa[0] + assert isinstance(phi_endif, Phi) + + # Ensure second phi-function contains init-phi and one additional + assert len(phi_endif.rvalues) == 2 + assert phi_entry.lvalue in phi_endif.rvalues + + # Find return-statement and ensure it returns the phi_endif + return_node = [x for x in f.nodes if x.type == NodeType.RETURN][0] + assert len(return_node.irs_ssa) == 1 + ret = return_node.irs_ssa[0] + assert len(ret.values) == 1 + assert phi_endif.lvalue in ret.values + + # Ensure that the phi_endif (which is the end-state for function as well) is in the entry_phi + assert phi_endif.lvalue in phi_entry.rvalues + + +@pytest.mark.skip(reason="Fails in current slither version. Fix in #1102.") +def test_issue_434(): + source = """ + contract Contract { + int public a; + function f() public { + g(); + a += 1; + } + + function e() public { + a -= 1; + } + + function g() public { + e(); + } + } + """ + with slither_from_source(source) as slither: + c = slither.get_contract_from_name("Contract")[0] + + e = [x for x in c.functions if x.name == "e"][0] + f = [x for x in c.functions if x.name == "f"][0] + g = [x for x in c.functions if x.name == "g"][0] + + # Ensure there is a phi-node at the beginning of f and e + phi_entry_e = get_ssa_of_type(e.entry_point, Phi)[0] + phi_entry_f = get_ssa_of_type(f.entry_point, Phi)[0] + # But not at g + assert len(get_ssa_of_type(g, Phi)) == 0 + + # Ensure that the final states of f and e are in the entry-states + add_f = get_filtered_ssa( + f, lambda x: isinstance(x, Binary) and x.type == BinaryType.ADDITION + )[0] + sub_e = get_filtered_ssa( + e, lambda x: isinstance(x, Binary) and x.type == BinaryType.SUBTRACTION + )[0] + assert add_f.lvalue in phi_entry_f.rvalues + assert add_f.lvalue in phi_entry_e.rvalues + assert sub_e.lvalue in phi_entry_f.rvalues + assert sub_e.lvalue in phi_entry_e.rvalues + + # Ensure there is a phi-node after call to g + call = get_ssa_of_type(f, InternalCall)[0] + idx = call.node.irs_ssa.index(call) + aftercall_phi = call.node.irs_ssa[idx + 1] + assert isinstance(aftercall_phi, Phi) + + # Ensure that phi node ^ is used in the addition afterwards + assert aftercall_phi.lvalue in (add_f.variable_left, add_f.variable_right) + + +@pytest.mark.skip(reason="Fails in current slither version. Fix in #1102.") +def test_issue_473(): + source = """ + contract Contract { + function f() public returns (int) { + int a = 1; + if (a > 0) { + a = 2; + } + if (a == 3) { + a = 6; + } + return a; + } + } + """ + with slither_from_source(source) as slither: + c = slither.get_contract_from_name("Contract")[0] + f = c.functions[0] + + phis = get_ssa_of_type(f, Phi) + return_value = get_ssa_of_type(f, Return)[0] + + # There shall be two phi functions + assert len(phis) == 2 + first_phi = phis[0] + second_phi = phis[1] + + # The second phi is the one being returned, if it's the first swap them (iteration order) + if first_phi.lvalue in return_value.values: + first_phi, second_phi = second_phi, first_phi + + # First phi is for [a=1 or a=2] + assert len(first_phi.rvalues) == 2 + + # second is for [a=6 or first phi] + assert first_phi.lvalue in second_phi.rvalues + assert len(second_phi.rvalues) == 2 + + # return is for second phi + assert len(return_value.values) == 1 + assert second_phi.lvalue in return_value.values From 741fc06ea8f9b4f9a99790626d36f98773a131b4 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Sun, 10 Apr 2022 18:52:17 +0200 Subject: [PATCH 031/101] Improve function lookup for bytes (#1163) * Improve function lookup for bytes * Update dapp test * black --- scripts/ci_test_dapp.sh | 2 +- slither/slithir/convert.py | 2 +- tests/ast-parsing/bytes_call.sol | 17 +++++++++++++++++ .../compile/bytes_call.sol-0.8.12-compact.zip | Bin 0 -> 2804 bytes .../bytes_call.sol-0.8.12-compact.json | 9 +++++++++ tests/test_ast_parsing.py | 1 + 6 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 tests/ast-parsing/bytes_call.sol create mode 100644 tests/ast-parsing/compile/bytes_call.sol-0.8.12-compact.zip create mode 100644 tests/ast-parsing/expected/bytes_call.sol-0.8.12-compact.json diff --git a/scripts/ci_test_dapp.sh b/scripts/ci_test_dapp.sh index d353d8f23..c9d3f5a24 100755 --- a/scripts/ci_test_dapp.sh +++ b/scripts/ci_test_dapp.sh @@ -18,7 +18,7 @@ dapp init slither . --detect external-function # TODO: make more elaborate test -if [ $? -eq 3 ] +if [ $? -eq 4 ] then exit 0 fi diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index 319c25c76..663d96abe 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -196,7 +196,7 @@ def _fits_under_byte(val: Union[int, str]) -> List[str]: return [f"bytes{size}"] # val is a str length = len(val.encode("utf-8")) - return [f"bytes{f}" for f in range(length, 33)] + return [f"bytes{f}" for f in range(length, 33)] + ["bytes"] def _find_function_from_parameter(ir: Call, candidates: List[Function]) -> Optional[Function]: diff --git a/tests/ast-parsing/bytes_call.sol b/tests/ast-parsing/bytes_call.sol new file mode 100644 index 000000000..f1daebb3c --- /dev/null +++ b/tests/ast-parsing/bytes_call.sol @@ -0,0 +1,17 @@ +contract Log{ + // Check that we can parse string/bytes + function f(bytes calldata) external{ + } + + function f(bytes4) external{ + } +} + +contract A{ + + Log l; + function test() internal{ + l.f("TESTA"); + } +} + diff --git a/tests/ast-parsing/compile/bytes_call.sol-0.8.12-compact.zip b/tests/ast-parsing/compile/bytes_call.sol-0.8.12-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..8249f60422168568eed12a38a8c309436262c1df GIT binary patch literal 2804 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 yV~jVqTlsxPFJqz)q=C}@Z;$>V>31;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/test_ast_parsing.py b/tests/test_ast_parsing.py index 68e0aebca..eafe6a2f3 100644 --- a/tests/test_ast_parsing.py +++ b/tests/test_ast_parsing.py @@ -403,6 +403,7 @@ ALL_TESTS = [ Test("complex_imports/import_aliases/test.sol", VERSIONS_08), # 0.8.9 crashes on our testcase Test("user_defined_types.sol", ["0.8.8"] + make_version(8, 10, 12)), + Test("bytes_call.sol", ["0.8.12"]), ] # create the output folder if needed try: From 597ac46195c4783b2e51d89dfc0f4a0e920b397c Mon Sep 17 00:00:00 2001 From: Kevin Ingersoll Date: Fri, 15 Apr 2022 01:14:21 -0700 Subject: [PATCH 032/101] fix shell rendering in bug report template (#1167) The "Relevant log output" wasn't rendering as a code snippet due to some extra indentation --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index a7ebed1cf..e31d61512 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -37,7 +37,7 @@ body: description: | Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. - render: shell + render: shell label: "Relevant log output:" id: logs type: textarea From e3b75c003eccbacd5577278dfe2c92752a187b94 Mon Sep 17 00:00:00 2001 From: feliam Date: Fri, 15 Apr 2022 05:44:53 -0300 Subject: [PATCH 033/101] Print all entry points not reaching whenNotPaused. Fix - 1114 (#1128) New printer pausable: print what functions use whenNotPaused. Fix #1114 Co-authored-by: Josselin --- slither/printers/all_printers.py | 1 + slither/printers/summary/when_not_paused.py | 61 +++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 slither/printers/summary/when_not_paused.py diff --git a/slither/printers/all_printers.py b/slither/printers/all_printers.py index 833ff6494..eca7ec5b6 100644 --- a/slither/printers/all_printers.py +++ b/slither/printers/all_printers.py @@ -17,3 +17,4 @@ from .summary.require_calls import RequireOrAssert from .summary.constructor_calls import ConstructorPrinter from .guidance.echidna import Echidna from .summary.evm import PrinterEVM +from .summary.when_not_paused import PrinterWhenNotPaused diff --git a/slither/printers/summary/when_not_paused.py b/slither/printers/summary/when_not_paused.py new file mode 100644 index 000000000..d8a57b6c7 --- /dev/null +++ b/slither/printers/summary/when_not_paused.py @@ -0,0 +1,61 @@ +""" + Module printing summary of the contract +""" + +from slither.core.declarations import Function +from slither.core.declarations.function import SolidityFunction +from slither.printers.abstract_printer import AbstractPrinter +from slither.utils import output +from slither.utils.myprettytable import MyPrettyTable + + +def _use_modifier(function: Function, modifier_name: str = "whenNotPaused") -> bool: + if function.is_constructor or function.view or function.pure: + return False + + for internal_call in function.all_internal_calls(): + if isinstance(internal_call, SolidityFunction): + continue + if any(modifier.name == modifier_name for modifier in function.modifiers): + return True + return False + + +class PrinterWhenNotPaused(AbstractPrinter): + + ARGUMENT = "pausable" + HELP = "Print functions that do not use whenNotPaused" + + WIKI = "https://github.com/trailofbits/slither/wiki/Printer-documentation#when-not-paused" + + def output(self, _filename: str) -> output.Output: + """ + _filename is not used + Args: + _filename(string) + """ + + modifier_name: str = "whenNotPaused" + + txt = "" + txt += "Constructor and pure/view functions are not displayed\n" + all_tables = [] + for contract in self.slither.contracts: + + txt += f"\n{contract.name}:\n" + table = MyPrettyTable(["Name", "Use whenNotPaused"]) + + for function in contract.functions_entry_points: + status = "X" if _use_modifier(function, modifier_name) else "" + table.add_row([function.solidity_signature, status]) + + txt += str(table) + "\n" + all_tables.append((contract.name, table)) + + self.info(txt) + + res = self.generate_output(txt) + for name, table in all_tables: + res.add_pretty_table(table, name) + + return res From 75a9766c3532d72c1c52d0996c809d59fba07d2e Mon Sep 17 00:00:00 2001 From: Evan Sultanik Date: Fri, 15 Apr 2022 08:19:05 -0400 Subject: [PATCH 034/101] Return Function.name to handle special function types for which Function._name == None (#1170) (#1171) --- slither/core/declarations/function.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/core/declarations/function.py b/slither/core/declarations/function.py index cb21ff885..8983769cc 100644 --- a/slither/core/declarations/function.py +++ b/slither/core/declarations/function.py @@ -1724,6 +1724,6 @@ class Function(SourceMapping, metaclass=ABCMeta): # pylint: disable=too-many-pu ################################################################################### def __str__(self): - return self._name + return self.name # endregion From 9e9f0d9c26764076293cae57cc83b3adfc1ac4bb Mon Sep 17 00:00:00 2001 From: feliam Date: Tue, 19 Apr 2022 16:05:43 -0300 Subject: [PATCH 035/101] WIP/PoC type.isdynamic --- slither/core/solidity_types/array_type.py | 5 +++++ slither/core/solidity_types/elementary_type.py | 6 +++++- slither/core/solidity_types/function_type.py | 4 ++++ slither/core/solidity_types/mapping_type.py | 4 ++++ slither/core/solidity_types/type.py | 5 +++++ slither/core/solidity_types/type_alias.py | 3 +++ slither/core/solidity_types/user_defined_type.py | 5 +++++ 7 files changed, 31 insertions(+), 1 deletion(-) diff --git a/slither/core/solidity_types/array_type.py b/slither/core/solidity_types/array_type.py index a93a976b9..2f5a675f9 100644 --- a/slither/core/solidity_types/array_type.py +++ b/slither/core/solidity_types/array_type.py @@ -29,6 +29,11 @@ class ArrayType(Type): def type(self) -> Type: return self._type + + @property + def is_dynamic(self) -> bool: + return self.length is None + @property def length(self) -> Optional[Expression]: return self._length diff --git a/slither/core/solidity_types/elementary_type.py b/slither/core/solidity_types/elementary_type.py index cac864142..4d5d21896 100644 --- a/slither/core/solidity_types/elementary_type.py +++ b/slither/core/solidity_types/elementary_type.py @@ -163,6 +163,10 @@ class ElementaryType(Type): t = "bytes1" self._type = t + @property + def is_dynamic(self) -> bool: + return self._type in ("bytes", "string") + @property def type(self) -> str: return self._type @@ -188,7 +192,7 @@ class ElementaryType(Type): return int(8) if t == "address": return int(160) - if t.startswith("bytes"): + if t.startswith("bytes") and t != "bytes": return int(t[len("bytes") :]) return None diff --git a/slither/core/solidity_types/function_type.py b/slither/core/solidity_types/function_type.py index e808aa940..3146aa0bf 100644 --- a/slither/core/solidity_types/function_type.py +++ b/slither/core/solidity_types/function_type.py @@ -32,6 +32,10 @@ class FunctionType(Type): def storage_size(self) -> Tuple[int, bool]: return 24, False + @property + def is_dynamic(self) -> bool: + return False + def __str__(self): # Use x.type # x.name may be empty diff --git a/slither/core/solidity_types/mapping_type.py b/slither/core/solidity_types/mapping_type.py index ab1e976fb..fea5bdb7b 100644 --- a/slither/core/solidity_types/mapping_type.py +++ b/slither/core/solidity_types/mapping_type.py @@ -23,6 +23,10 @@ class MappingType(Type): def storage_size(self) -> Tuple[int, bool]: return 32, True + @property + def is_dynamic(self) -> bool: + return True + def __str__(self): return f"mapping({str(self._from)} => {str(self._to)})" diff --git a/slither/core/solidity_types/type.py b/slither/core/solidity_types/type.py index 8405578a9..bfec7d8bc 100644 --- a/slither/core/solidity_types/type.py +++ b/slither/core/solidity_types/type.py @@ -14,3 +14,8 @@ class Type(SourceMapping, metaclass=abc.ABCMeta): :return: (int, bool) - the number of bytes this type will require, and whether it must start in a new slot regardless of whether the current slot can still fit it """ + + @property + @abc.abstractmethod + def is_dynamic(self) -> bool: + """ True if the size of the type is dynamic""" diff --git a/slither/core/solidity_types/type_alias.py b/slither/core/solidity_types/type_alias.py index 06aa06a8b..cb2d43de1 100644 --- a/slither/core/solidity_types/type_alias.py +++ b/slither/core/solidity_types/type_alias.py @@ -22,6 +22,9 @@ class TypeAlias(Type): def __hash__(self): return hash(str(self)) + @property + def is_dynamic(self) -> bool: + return self.underlying_type.is_dynamic class TypeAliasTopLevel(TypeAlias, TopLevel): def __init__(self, underlying_type: Type, name: str, scope: "FileScope"): diff --git a/slither/core/solidity_types/user_defined_type.py b/slither/core/solidity_types/user_defined_type.py index cecbec449..21f9c0911 100644 --- a/slither/core/solidity_types/user_defined_type.py +++ b/slither/core/solidity_types/user_defined_type.py @@ -20,10 +20,15 @@ class UserDefinedType(Type): super().__init__() self._type = t + @property + def is_dynamic(self) -> bool: + raise NotImplemented + @property def type(self) -> Union["Contract", "Enum", "Structure"]: return self._type + @property def storage_size(self) -> Tuple[int, bool]: from slither.core.declarations.structure import Structure From a08dba0fb150845567d7aeb3a22aa5335e707b7e Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Thu, 21 Apr 2022 15:42:30 +0200 Subject: [PATCH 036/101] Use pytest 7.0.1 (#1177) * Use pytest 7.0.1 & update importlib_metadata typing_extensions in the CI --- .github/workflows/IR.yml | 4 +++- .github/workflows/ci.yml | 2 ++ .github/workflows/detectors.yml | 4 +++- .github/workflows/features.yml | 4 +++- .github/workflows/parser.yml | 4 +++- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/.github/workflows/IR.yml b/.github/workflows/IR.yml index ba119c6db..7b5d214a9 100644 --- a/.github/workflows/IR.yml +++ b/.github/workflows/IR.yml @@ -35,7 +35,9 @@ jobs: run: | python setup.py install pip install deepdiff - pip install pytest + pip install pytest==7.0.1 + pip install typing_extensions==4.1.1 + pip install importlib_metadata==4.8.3 pip install "solc-select>=v1.0.0b1" solc-select install all diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ea0234869..1252e385a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,6 +72,8 @@ jobs: pip install "solc-select>=v1.0.0b1" solc-select install all solc-select use 0.5.1 + pip install typing_extensions==4.1.1 + pip install importlib_metadata==4.8.3 - name: Set up nix if: matrix.type == 'dapp' diff --git a/.github/workflows/detectors.yml b/.github/workflows/detectors.yml index f2081d875..4d8109297 100644 --- a/.github/workflows/detectors.yml +++ b/.github/workflows/detectors.yml @@ -36,7 +36,9 @@ jobs: python setup.py install pip install deepdiff - pip install pytest + pip install pytest==7.0.1 + pip install typing_extensions==4.1.1 + pip install importlib_metadata==4.8.3 pip install "solc-select>=v1.0.0b1" solc-select install all diff --git a/.github/workflows/features.yml b/.github/workflows/features.yml index e069bd120..a8548c866 100644 --- a/.github/workflows/features.yml +++ b/.github/workflows/features.yml @@ -36,7 +36,9 @@ jobs: python setup.py install pip install deepdiff - pip install pytest + pip install pytest==7.0.1 + pip install typing_extensions==4.1.1 + pip install importlib_metadata==4.8.3 pip install "solc-select>=v1.0.0b1" solc-select install all diff --git a/.github/workflows/parser.yml b/.github/workflows/parser.yml index 4b50a0ca7..4c3566904 100644 --- a/.github/workflows/parser.yml +++ b/.github/workflows/parser.yml @@ -36,7 +36,9 @@ jobs: python setup.py install pip install deepdiff - pip install pytest + pip install pytest==7.0.1 + pip install typing_extensions==4.1.1 + pip install importlib_metadata==4.8.3 pip install "solc-select>=v1.0.0b1" - name: Install solc From ab53a0821fc66a5f05b39c7e2df20a6091c9b8ee Mon Sep 17 00:00:00 2001 From: feliam Date: Thu, 21 Apr 2022 10:46:47 -0300 Subject: [PATCH 037/101] linted --- slither/core/solidity_types/type_alias.py | 1 + 1 file changed, 1 insertion(+) diff --git a/slither/core/solidity_types/type_alias.py b/slither/core/solidity_types/type_alias.py index cb2d43de1..0a1f99d23 100644 --- a/slither/core/solidity_types/type_alias.py +++ b/slither/core/solidity_types/type_alias.py @@ -15,6 +15,7 @@ class TypeAlias(Type): self.name = name self.underlying_type = underlying_type + @property def storage_size(self) -> Tuple[int, bool]: return self.underlying_type.storage_size From e324c9087b7252ec40a4eb48651d43f28423eb4b Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 21 Apr 2022 08:49:22 -0500 Subject: [PATCH 038/101] WIP: feature to read contract storage data (#968) add slither-read-storage --- .github/workflows/read_storage.yml | 50 ++ setup.py | 1 + slither/core/compilation_unit.py | 2 +- slither/core/solidity_types/array_type.py | 10 +- .../core/solidity_types/elementary_type.py | 10 +- slither/tools/read_storage/README.md | 91 +++ slither/tools/read_storage/__init__.py | 1 + slither/tools/read_storage/__main__.py | 145 +++++ slither/tools/read_storage/read_storage.py | 551 ++++++++++++++++++ slither/tools/read_storage/utils/__init__.py | 11 + slither/tools/read_storage/utils/utils.py | 100 ++++ tests/storage-layout/StorageLayout.abi | 1 + tests/storage-layout/StorageLayout.bin | 1 + tests/storage-layout/TEST_storage_layout.json | 469 +++++++++++++++ .../storage-layout/storage_layout-0.8.10.sol | 74 +++ tests/test_read_storage.py | 139 +++++ tests/test_storage_layout.py | 39 ++ 17 files changed, 1688 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/read_storage.yml create mode 100644 slither/tools/read_storage/README.md create mode 100644 slither/tools/read_storage/__init__.py create mode 100644 slither/tools/read_storage/__main__.py create mode 100644 slither/tools/read_storage/read_storage.py create mode 100644 slither/tools/read_storage/utils/__init__.py create mode 100644 slither/tools/read_storage/utils/utils.py create mode 100644 tests/storage-layout/StorageLayout.abi create mode 100644 tests/storage-layout/StorageLayout.bin create mode 100644 tests/storage-layout/TEST_storage_layout.json create mode 100644 tests/storage-layout/storage_layout-0.8.10.sol create mode 100644 tests/test_read_storage.py create mode 100644 tests/test_storage_layout.py diff --git a/.github/workflows/read_storage.yml b/.github/workflows/read_storage.yml new file mode 100644 index 000000000..d16f8646b --- /dev/null +++ b/.github/workflows/read_storage.yml @@ -0,0 +1,50 @@ +--- +name: Test slither-read-storage + +defaults: + run: + # To load bashrc + shell: bash -ieo pipefail {0} + +on: + pull_request: + branches: [master, dev] + schedule: + # run CI every day even if no PRs/merges occur + - cron: '0 12 * * *' + +jobs: + build: + name: Test slither-read-storage + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v2 + with: + node-version: '14' + + - name: Install ganache + run: npm install --global ganache + + - name: Set up Python 3.6 + uses: actions/setup-python@v2 + with: + python-version: 3.6 + + - name: Install python dependencies + run: | + python3 setup.py install + pip install web3 pytest deepdiff solc-select + solc-select install 0.8.1 + solc-select install 0.8.10 + solc-select use 0.8.1 + + - name: Run slither-read-storage + run: | + pytest tests/test_read_storage.py + + - name: Run storage layout tests + run: | + pytest tests/test_storage_layout.py diff --git a/setup.py b/setup.py index 52084528e..d79287358 100644 --- a/setup.py +++ b/setup.py @@ -32,6 +32,7 @@ setup( "slither-check-kspec = slither.tools.kspec_coverage.__main__:main", "slither-prop = slither.tools.properties.__main__:main", "slither-mutate = slither.tools.mutator.__main__:main", + "slither-read-storage = slither.tools.read_storage.__main__:main", ] }, ) diff --git a/slither/core/compilation_unit.py b/slither/core/compilation_unit.py index d8582b31a..a2568a5de 100644 --- a/slither/core/compilation_unit.py +++ b/slither/core/compilation_unit.py @@ -251,7 +251,7 @@ class SlitherCompilationUnit(Context): slot = 0 offset = 0 for var in contract.state_variables_ordered: - if var.is_constant: + if var.is_constant or var.is_immutable: continue size, new_slot = var.type.storage_size diff --git a/slither/core/solidity_types/array_type.py b/slither/core/solidity_types/array_type.py index a93a976b9..bf464ca0d 100644 --- a/slither/core/solidity_types/array_type.py +++ b/slither/core/solidity_types/array_type.py @@ -34,9 +34,17 @@ class ArrayType(Type): return self._length @property - def lenght_value(self) -> Optional[Literal]: + def length_value(self) -> Optional[Literal]: return self._length_value + @property + def is_fixed_array(self) -> bool: + return bool(self.length) + + @property + def is_dynamic_array(self) -> bool: + return not self.is_fixed_array + @property def storage_size(self) -> Tuple[int, bool]: if self._length_value: diff --git a/slither/core/solidity_types/elementary_type.py b/slither/core/solidity_types/elementary_type.py index cac864142..ce782a5e6 100644 --- a/slither/core/solidity_types/elementary_type.py +++ b/slither/core/solidity_types/elementary_type.py @@ -127,10 +127,10 @@ Max_Byte = {k: 2 ** (8 * (i + 1)) - 1 for i, k in enumerate(Byte[2:])} Max_Byte["bytes"] = None Max_Byte["string"] = None Max_Byte["byte"] = 255 -Min_Byte = {k: 1 << (4 + 8 * i) for i, k in enumerate(Byte[2:])} +Min_Byte = {k: 0 for k in Byte} Min_Byte["bytes"] = 0x0 -Min_Byte["string"] = None -Min_Byte["byte"] = 0x10 +Min_Byte["string"] = 0x0 +Min_Byte["byte"] = 0x0 MaxValues = dict(dict(Max_Int, **Max_Uint), **Max_Byte) MinValues = dict(dict(Min_Int, **Min_Uint), **Min_Byte) @@ -188,8 +188,8 @@ class ElementaryType(Type): return int(8) if t == "address": return int(160) - if t.startswith("bytes"): - return int(t[len("bytes") :]) + if t.startswith("bytes") and t != "bytes": + return int(t[len("bytes") :]) * 8 return None @property diff --git a/slither/tools/read_storage/README.md b/slither/tools/read_storage/README.md new file mode 100644 index 000000000..8d9b70fcb --- /dev/null +++ b/slither/tools/read_storage/README.md @@ -0,0 +1,91 @@ +# Slither-read-storage + +Slither-read-storage is a tool to retrieve the storage slots and values of entire contracts or single variables. + +## Usage + +### CLI Interface + +```shell +positional arguments: + contract_source (DIR) ADDRESS The deployed contract address if verified on etherscan. Prepend project directory for unverified contracts. + +optional arguments: + --variable-name VARIABLE_NAME The name of the variable whose value will be returned. + --rpc-url RPC_URL An endpoint for web3 requests. + --key KEY The key/ index whose value will be returned from a mapping or array. + --deep-key DEEP_KEY The key/ index whose value will be returned from a deep mapping or multidimensional array. + --struct-var STRUCT_VAR The name of the variable whose value will be returned from a struct. + --storage-address STORAGE_ADDRESS The address of the storage contract (if a proxy pattern is used). + --contract-name CONTRACT_NAME The name of the logic contract. + --layout Toggle used to write a JSON file with the entire storage layout. + --value Toggle used to include values in output. + --max-depth MAX_DEPTH Max depth to search in data structure. +``` + +### Examples + +Retrieve the storage slots of a local contract: + +```shell +slither-read-storage file.sol 0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 --layout +``` + +Retrieve the storage slots of a contract verified on an Etherscan-like platform: + +```shell +slither-read-storage 0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 --layout +``` + +To retrieve the values as well, pass `--value` and `--rpc-url $RPC_URL`: + +```shell +slither-read-storage 0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 --layout --rpc-url $RPC_URL --value +``` + +To view only the slot of the `slot0` structure variable, pass `--variable-name slot0`: + +```shell +slither-read-storage 0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 --variable-name slot0 --rpc-url https://mainnet.infura.io/v3/04942f7970ef41cc847a147bc64e460e --value +``` + +To view a member of the `slot0` struct, pass `--struct-var tick` + +```shell +slither-read-storage 0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 --variable-name slot0 --rpc-url https://mainnet.infura.io/v3/04942f7970ef41cc847a147bc64e460e --value --struct-var tick +``` + +Retrieve the ERC20 balance slot of an account: + +```shell +slither-read-storage 0xa2327a938Febf5FEC13baCFb16Ae10EcBc4cbDCF --variable-name balances --key 0xab5801a7d398351b8be11c439e05c5b3259aec9b +``` + +To retrieve the actual balance, pass `--variable-name balances` and `--key 0xab5801a7d398351b8be11c439e05c5b3259aec9b`. (`balances` is a `mapping(address => uint)`) +Since this contract uses the delegatecall-proxy pattern, the proxy address must be passed as the `--storage-address`. Otherwise, it is not required. + +```shell +slither-read-storage 0xa2327a938Febf5FEC13baCFb16Ae10EcBc4cbDCF --variable-name balances --key 0xab5801a7d398351b8be11c439e05c5b3259aec9b --storage-address 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 --rpc-url $RPC_URL --value +``` + +## Troubleshooting/FAQ + +- If the storage slots or values of a contract verified Etherscan are wrong, try passing `--contract $CONTRACT_NAME` explicitly. Otherwise, the storage may be retrieved from storage slots based off an unrelated contract (Etherscan includes these). (Also, make sure that the RPC is for the correct network.) + +- If Etherscan fails to return a source code, try passing `--etherscan-apikey $API_KEY` to avoid hitting a rate-limit. + +- How do I use this tool on other chains? + If an EVM chain has an Etherscan-like platform the crytic-compile supports, this tool supports it by making the following modifications. + Take Avalanche, for instance: + + ```shell + slither-read-storage avax:0x0000000000000000000000000000000000000000 --layout --value --rpc-url $AVAX_RPC_URL + ``` + +## Limitations + +- Requires source code. +- Only works on Solidity contracts. +- Cannot find variables with unstructured storage. +- Does not support all data types (please open an issue or PR). +- Mappings cannot be completely enumerated since all keys used historically are not immediately available. diff --git a/slither/tools/read_storage/__init__.py b/slither/tools/read_storage/__init__.py new file mode 100644 index 000000000..dbc1e5bc0 --- /dev/null +++ b/slither/tools/read_storage/__init__.py @@ -0,0 +1 @@ +from .read_storage import SlitherReadStorage diff --git a/slither/tools/read_storage/__main__.py b/slither/tools/read_storage/__main__.py new file mode 100644 index 000000000..6bf5788db --- /dev/null +++ b/slither/tools/read_storage/__main__.py @@ -0,0 +1,145 @@ +""" +Tool to read on-chain storage from EVM +""" +import json +import argparse + +from crytic_compile import cryticparser + +from slither import Slither +from slither.tools.read_storage.read_storage import SlitherReadStorage + + +def parse_args() -> argparse.Namespace: + """Parse the underlying arguments for the program. + Returns: + The arguments for the program. + """ + parser = argparse.ArgumentParser( + description="Read a variable's value from storage for a deployed contract", + usage=( + "\nTo retrieve a single variable's value:\n" + + "\tslither-read-storage $TARGET address --variable-name $NAME\n" + + "To retrieve a contract's storage layout:\n" + + "\tslither-read-storage $TARGET address --contract-name $NAME --layout\n" + + "To retrieve a contract's storage layout and values:\n" + + "\tslither-read-storage $TARGET address --contract-name $NAME --layout --values\n" + + "TARGET can be a contract address or project directory" + ), + ) + + parser.add_argument( + "contract_source", + help="The deployed contract address if verified on etherscan. Prepend project directory for unverified contracts.", + nargs="+", + ) + + parser.add_argument( + "--variable-name", + help="The name of the variable whose value will be returned.", + default=None, + ) + + parser.add_argument("--rpc-url", help="An endpoint for web3 requests.") + + parser.add_argument( + "--key", + help="The key/ index whose value will be returned from a mapping or array.", + default=None, + ) + + parser.add_argument( + "--deep-key", + help="The key/ index whose value will be returned from a deep mapping or multidimensional array.", + default=None, + ) + + parser.add_argument( + "--struct-var", + help="The name of the variable whose value will be returned from a struct.", + default=None, + ) + + parser.add_argument( + "--storage-address", + help="The address of the storage contract (if a proxy pattern is used).", + default=None, + ) + + parser.add_argument( + "--contract-name", + help="The name of the logic contract.", + default=None, + ) + + parser.add_argument( + "--layout", + action="store_true", + help="Toggle used to write a JSON file with the entire storage layout.", + ) + + parser.add_argument( + "--value", + action="store_true", + help="Toggle used to include values in output.", + ) + + parser.add_argument("--max-depth", help="Max depth to search in data structure.", default=20) + + cryticparser.init(parser) + + return parser.parse_args() + + +def main() -> None: + args = parse_args() + + if len(args.contract_source) == 2: + # Source code is file.sol or project directory + source_code, target = args.contract_source + slither = Slither(source_code, **vars(args)) + else: + # Source code is published and retrieved via etherscan + target = args.contract_source[0] + slither = Slither(target, **vars(args)) + + if args.contract_name: + contracts = slither.get_contract_from_name(args.contract_name) + else: + contracts = slither.contracts + + srs = SlitherReadStorage(contracts, args.max_depth) + + if args.rpc_url: + # Remove target prefix e.g. rinkeby:0x0 -> 0x0. + address = target[target.find(":") + 1 :] + # Default to implementation address unless a storage address is given. + if not args.storage_address: + args.storage_address = address + srs.storage_address = args.storage_address + + srs.rpc = args.rpc_url + + if args.layout: + srs.get_all_storage_variables() + srs.get_storage_layout() + else: + assert args.variable_name + # Use a lambda func to only return variables that have same name as target. + # x is a tuple (`Contract`, `StateVariable`). + srs.get_all_storage_variables(lambda x: bool(x[1].name == args.variable_name)) + srs.get_target_variables(**vars(args)) + + # To retrieve slot values an rpc url is required. + if args.value: + assert args.rpc_url + srs.get_slot_values() + + # Only write file if storage layout is used. + if len(srs.slot_info) > 1: + with open("storage_layout.json", "w", encoding="utf-8") as file: + json.dump(srs.slot_info, file, indent=4) + + +if __name__ == "__main__": + main() diff --git a/slither/tools/read_storage/read_storage.py b/slither/tools/read_storage/read_storage.py new file mode 100644 index 000000000..dbdda7183 --- /dev/null +++ b/slither/tools/read_storage/read_storage.py @@ -0,0 +1,551 @@ +import sys +import logging +from math import floor + +from typing import Callable, Optional, Tuple, Union, List, Dict + +try: + from typing import TypedDict +except ImportError: + # < Python 3.8 + from typing_extensions import TypedDict + +try: + from web3 import Web3 + from eth_typing.evm import ChecksumAddress + from eth_abi import decode_single, encode_abi + from eth_utils import keccak + from hexbytes import HexBytes + from .utils import ( + is_elementary, + is_array, + is_mapping, + is_struct, + is_user_defined_type, + get_offset_value, + get_storage_data, + coerce_type, + ) +except ImportError: + print("ERROR: in order to use slither-read-storage, you need to install web3") + print("$ pip3 install web3 --user\n") + sys.exit(-1) + +from slither.core.solidity_types.type import Type +from slither.core.solidity_types import ArrayType +from slither.core.declarations import Contract, StructureContract +from slither.core.variables.state_variable import StateVariable +from slither.core.variables.structure_variable import StructureVariable + + +logging.basicConfig() +logger = logging.getLogger("Slither-read-storage") +logger.setLevel(logging.INFO) + + +class SlotInfo(TypedDict): + type_string: str + slot: int + size: int + offset: int + value: Optional[Union[int, bool, str, ChecksumAddress, hex]] + elems: Optional[TypedDict] # same types as SlotInfo + + +class SlitherReadStorageException(Exception): + pass + + +# pylint: disable=too-many-instance-attributes +class SlitherReadStorage: + def __init__(self, contracts, max_depth): + self._contracts: List[Contract] = contracts + self._max_depth: int = max_depth + self._log: str = "" + self._slot_info: SlotInfo = {} + self._target_variables = [] + self._web3: Optional[Web3] = None + self._checksum_address: Optional[ChecksumAddress] = None + self.storage_address: Optional[str] = None + self.rpc: Optional[str] = None + + @property + def contracts(self) -> List[Contract]: + return self._contracts + + @property + def max_depth(self) -> int: + return int(self._max_depth) + + @property + def log(self) -> str: + return self._log + + @log.setter + def log(self, log) -> str: + self._log = log + + @property + def web3(self) -> Web3: + if not self._web3: + self._web3 = Web3(Web3.HTTPProvider(self.rpc)) + return self._web3 + + @property + def checksum_address(self) -> ChecksumAddress: + if not self._checksum_address: + self._checksum_address = self.web3.toChecksumAddress(self.storage_address) + return self._checksum_address + + @property + def target_variables(self) -> List[Tuple[Contract, StateVariable]]: + """Storage variables (not constant or immutable) and their associated contract.""" + return self._target_variables + + @property + def slot_info(self) -> SlotInfo: + """Contains the location, type, size, offset, and value of contract slots.""" + return self._slot_info + + def get_storage_layout(self) -> None: + """Retrieves the storage layout of entire contract.""" + tmp = {} + for contract, var in self.target_variables: + type_ = var.type + info = self.get_storage_slot(var, contract) + tmp[var.name] = info + + if is_user_defined_type(type_) and is_struct(type_.type): + tmp[var.name]["elems"] = self._all_struct_slots(var, contract) + continue + + if is_array(type_): + elems = self._all_array_slots(var, contract, type_, info["slot"]) + tmp[var.name]["elems"] = elems + + self._slot_info = tmp + + def get_storage_slot( + self, + target_variable: StateVariable, + contract: Contract, + **kwargs, + ) -> Union[SlotInfo, None]: + """Finds the storage slot of a variable in a given contract. + Args: + target_variable (`StateVariable`): The variable to retrieve the slot for. + contracts (`Contract`): The contract that contains the given state variable. + **kwargs: + key (str): Key of a mapping or index position if an array. + deep_key (str): Key of a mapping embedded within another mapping or secondary index if array. + struct_var (str): Structure variable name. + Returns: + (`SlotInfo`) | None : A dictionary of the slot information. + """ + + key = kwargs.get("key", None) + deep_key = kwargs.get("deep_key", None) + struct_var = kwargs.get("struct_var", None) + info = "" + var_log_name = target_variable.name + try: + int_slot, size, offset, type_to = self.get_variable_info(contract, target_variable) + except KeyError: + # Only the child contract of a parent contract will show up in the storage layout when inheritance is used + logger.info( + f"\nContract {contract} not found in storage layout. It is possibly a parent contract\n" + ) + return None + + slot = int.to_bytes(int_slot, 32, byteorder="big") + + if is_elementary(target_variable.type): + type_to = target_variable.type.name + + elif is_array(target_variable.type) and key: + info, type_to, slot, size, offset = self._find_array_slot( + target_variable, slot, key, deep_key=deep_key, struct_var=struct_var + ) + self.log += info + + elif is_user_defined_type(target_variable.type) and struct_var: + var_log_name = struct_var + elems = target_variable.type.type.elems_ordered + info, type_to, slot, size, offset = self._find_struct_var_slot(elems, slot, struct_var) + self.log += info + + elif is_mapping(target_variable.type) and key: + info, type_to, slot, size, offset = self._find_mapping_slot( + target_variable, slot, key, struct_var=struct_var, deep_key=deep_key + ) + self.log += info + + int_slot = int.from_bytes(slot, byteorder="big") + self.log += f"\nName: {var_log_name}\nType: {type_to}\nSlot: {int_slot}\n" + logger.info(self.log) + self.log = "" + return { + "type_string": type_to, + "slot": int_slot, + "size": size, + "offset": offset, + } + + def get_target_variables(self, **kwargs) -> None: + """ + Retrieves every instance of a given variable in a list of contracts. + Should be called after setting `target_variables` with `get_all_storage_variables()`. + **kwargs: + key (str): Key of a mapping or index position if an array. + deep_key (str): Key of a mapping embedded within another mapping or secondary index if array. + struct_var (str): Structure variable name. + """ + for contract, var in self.target_variables: + self._slot_info[f"{contract.name}.{var.name}"] = self.get_storage_slot( + var, contract, **kwargs + ) + + def get_slot_values(self) -> SlotInfo: + """ + Fetches the slot values and inserts them in slot info dictionary. + Returns: + (`SlotInfo`): The dictionary of slot info. + """ + stack = list(self.slot_info.items()) + while stack: + _, v = stack.pop() + if isinstance(v, dict): + stack.extend(v.items()) + if "slot" in v: + hex_bytes = get_storage_data(self.web3, self.checksum_address, v["slot"]) + v["value"] = self.convert_value_to_type( + hex_bytes, v["size"], v["offset"], v["type_string"] + ) + logger.info(f"\nValue: {v['value']}\n") + return self.slot_info + + def get_all_storage_variables(self, func: Callable = None) -> None: + """Fetches all storage variables from a list of contracts. + kwargs: + func (Callable, optional): A criteria to filter functions e.g. name. + """ + for contract in self.contracts: + self._target_variables.extend( + filter( + func, + [ + (contract, var) + for var in contract.variables + if not var.is_constant and not var.is_immutable + ], + ) + ) + + @staticmethod + def _find_struct_var_slot( + elems: List[StructureVariable], slot: bytes, struct_var: str + ) -> Tuple[str, str, bytes, int, int]: + """Finds the slot of a structure variable. + Args: + elems (List[StructureVariable]): Ordered list of structure variables. + slot (bytes): The slot of the struct to begin searching at. + struct_var (str): The target structure variable. + Returns: + info (str): Info about the target variable to log. + type_to (str): The type of the target variable. + slot (bytes): The storage location of the target variable. + size (int): The size (in bits) of the target variable. + offset (int): The size of other variables that share the same slot. + """ + slot = int.from_bytes(slot, "big") + offset = 0 + for var in elems: + size = var.type.size + if offset >= 256: + slot += 1 + offset = 0 + if struct_var == var.name: + type_to = var.type.name + break # found struct var + offset += size + + slot = int.to_bytes(slot, 32, byteorder="big") + info = f"\nStruct Variable: {struct_var}" + return info, type_to, slot, size, offset + + # pylint: disable=too-many-branches + @staticmethod + def _find_array_slot( + target_variable: StateVariable, + slot: bytes, + key: int, + deep_key: int = None, + struct_var: str = None, + ) -> Tuple[str, str, bytes]: + """Finds the slot of array's index. + Args: + target_variable (`StateVariable`): The array that contains the target variable. + slot (bytes): The starting slot of the array. + key (int): The target variable's index position. + deep_key (int, optional): Secondary index if nested array. + struct_var (str, optional): Structure variable name. + Returns: + info (str): Info about the target variable to log. + type_to (str): The type of the target variable. + slot (bytes): The storage location of the target variable. + """ + info = f"\nKey: {key}" + offset = 0 + size = 256 + + if is_array( + target_variable.type.type + ): # multidimensional array uint[i][], , uint[][i], or uint[][] + size = target_variable.type.type.type.size + type_to = target_variable.type.type.type.name + + if target_variable.type.is_fixed_array: # uint[][i] + slot_int = int.from_bytes(slot, "big") + int(key) + else: + slot = keccak(slot) + key = int(key) + if target_variable.type.type.is_fixed_array: # arr[i][] + key *= int(str(target_variable.type.type.length)) + slot_int = int.from_bytes(slot, "big") + key + + if not deep_key: + return info, type_to, int.to_bytes(slot_int, 32, "big"), size, offset + + info += f"\nDeep Key: {deep_key}" + if target_variable.type.type.is_dynamic_array: # uint[][] + # keccak256(keccak256(slot) + index) + floor(j / floor(256 / size)) + slot = keccak(int.to_bytes(slot_int, 32, "big")) + slot_int = int.from_bytes(slot, "big") + + # keccak256(slot) + index + floor(j / floor(256 / size)) + slot_int += floor(int(deep_key) / floor(256 / size)) # uint[i][] + + elif target_variable.type.is_fixed_array: + slot_int = int.from_bytes(slot, "big") + int(key) + if is_user_defined_type(target_variable.type.type): # struct[i] + type_to = target_variable.type.type.type.name + if not struct_var: + return info, type_to, int.to_bytes(slot_int, 32, "big"), size, offset + elems = target_variable.type.type.type.elems_ordered + slot = int.to_bytes(slot_int, 32, byteorder="big") + info_tmp, type_to, slot, size, offset = SlitherReadStorage._find_struct_var_slot( + elems, slot, struct_var + ) + info += info_tmp + + else: + type_to = target_variable.type.type.name + size = target_variable.type.type.size # bits + + elif is_user_defined_type(target_variable.type.type): # struct[] + slot = keccak(slot) + slot_int = int.from_bytes(slot, "big") + int(key) + type_to = target_variable.type.type.type.name + if not struct_var: + return info, type_to, int.to_bytes(slot_int, 32, "big"), size, offset + elems = target_variable.type.type.type.elems_ordered + slot = int.to_bytes(slot_int, 32, byteorder="big") + info_tmp, type_to, slot, size, offset = SlitherReadStorage._find_struct_var_slot( + elems, slot, struct_var + ) + info += info_tmp + + else: + slot = keccak(slot) + slot_int = int.from_bytes(slot, "big") + int(key) + type_to = target_variable.type.type.name + size = target_variable.type.type.size # bits + + slot = int.to_bytes(slot_int, 32, byteorder="big") + + return info, type_to, slot, size, offset + + @staticmethod + def _find_mapping_slot( + target_variable: StateVariable, + slot: bytes, + key: Union[int, str], + deep_key: Union[int, str] = None, + struct_var: str = None, + ) -> Tuple[str, str, bytes, int, int]: + """Finds the data slot of a target variable within a mapping. + target_variable (`StateVariable`): The mapping that contains the target variable. + slot (bytes): The starting slot of the mapping. + key (Union[int, str]): The key the variable is stored at. + deep_key (int, optional): Key of a mapping embedded within another mapping. + struct_var (str, optional): Structure variable name. + :returns: + log (str): Info about the target variable to log. + type_to (bytes): The type of the target variable. + slot (bytes): The storage location of the target variable. + size (int): The size (in bits) of the target variable. + offset (int): The size of other variables that share the same slot. + + """ + info = "" + offset = 0 + if key: + info += f"\nKey: {key}" + if deep_key: + info += f"\nDeep Key: {deep_key}" + + key_type = target_variable.type.type_from.name + assert key + if "int" in key_type: # without this eth_utils encoding fails + key = int(key) + key = coerce_type(key_type, key) + slot = keccak(encode_abi([key_type, "uint256"], [key, decode_single("uint256", slot)])) + + if is_user_defined_type(target_variable.type.type_to) and is_struct( + target_variable.type.type_to.type + ): # mapping(elem => struct) + assert struct_var + elems = target_variable.type.type_to.type.elems_ordered + info_tmp, type_to, slot, size, offset = SlitherReadStorage._find_struct_var_slot( + elems, slot, struct_var + ) + info += info_tmp + + elif is_mapping(target_variable.type.type_to): # mapping(elem => mapping(elem => ???)) + assert deep_key + key_type = target_variable.type.type_to.type_from.name + if "int" in key_type: # without this eth_utils encoding fails + deep_key = int(deep_key) + + # If deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot))))) + slot = keccak(encode_abi([key_type, "bytes32"], [deep_key, slot])) + + # mapping(elem => mapping(elem => elem)) + type_to = target_variable.type.type_to.type_to.type + byte_size, _ = target_variable.type.type_to.type_to.storage_size + size = byte_size * 8 # bits + offset = 0 + + if is_user_defined_type(target_variable.type.type_to.type_to) and is_struct( + target_variable.type.type_to.type_to.type + ): # mapping(elem => mapping(elem => struct)) + assert struct_var + elems = target_variable.type.type_to.type_to.type.elems_ordered + # If map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth); + info_tmp, type_to, slot, size, offset = SlitherReadStorage._find_struct_var_slot( + elems, slot, struct_var + ) + info += info_tmp + + # TODO: suppory mapping with dynamic arrays + + else: # mapping(elem => elem) + type_to = target_variable.type.type_to.name # the value's elementary type + byte_size, _ = target_variable.type.type_to.storage_size + size = byte_size * 8 # bits + + return info, type_to, slot, size, offset + + @staticmethod + def get_variable_info( + contract: Contract, target_variable: StateVariable + ) -> Tuple[int, int, int, str]: + """Return slot, size, offset, and type.""" + type_to = str(target_variable.type) + byte_size, _ = target_variable.type.storage_size + size = byte_size * 8 # bits + (int_slot, offset) = contract.compilation_unit.storage_layout_of(contract, target_variable) + offset *= 8 # bits + logger.info( + f"\nContract '{contract.name}'\n{target_variable.canonical_name} with type {target_variable.type} is located at slot: {int_slot}\n" + ) + + return int_slot, size, offset, type_to + + @staticmethod + def convert_value_to_type( + hex_bytes: HexBytes, size: int, offset: int, type_to: str + ) -> Union[int, bool, str, ChecksumAddress, hex]: + """Convert slot data to type representation.""" + # Account for storage packing + offset_hex_bytes = get_offset_value(hex_bytes, offset, size) + try: + value = coerce_type(type_to, offset_hex_bytes) + except ValueError: + return coerce_type("int", offset_hex_bytes) + + return value + + def _all_struct_slots( + self, var: Union[StructureVariable, StructureContract], contract: Contract, key=None + ) -> Dict[str, SlotInfo]: + """Retrieves all members of a struct.""" + if isinstance(var.type.type, StructureContract): + struct_elems = var.type.type.elems_ordered + else: + struct_elems = var.type.type.type.elems_ordered + data = {} + for elem in struct_elems: + info = self.get_storage_slot( + var, + contract, + key=key, + struct_var=elem.name, + ) + data[elem.name] = info + + return data + + def _all_array_slots( + self, var: ArrayType, contract: Contract, type_: Type, slot: int + ) -> Dict[int, SlotInfo]: + """Retrieves all members of an array.""" + array_length = self._get_array_length(type_, slot) + elems = {} + if is_user_defined_type(type_.type): + for i in range(min(array_length, self.max_depth)): + elems[i] = self._all_struct_slots(var, contract, key=str(i)) + continue + + else: + for i in range(min(array_length, self.max_depth)): + info = self.get_storage_slot( + var, + contract, + key=str(i), + ) + elems[i] = info + + if is_array(type_.type): # multidimensional array + array_length = self._get_array_length(type_.type, info["slot"]) + + elems[i]["elems"] = {} + for j in range(min(array_length, self.max_depth)): + info = self.get_storage_slot( + var, + contract, + key=str(i), + deep_key=str(j), + ) + + elems[i]["elems"][j] = info + return elems + + def _get_array_length(self, type_: Type, slot: int = None) -> int: + """Gets the length of dynamic and fixed arrays. + Args: + type_ (`Type`): The array type. + slot (int, optional): Slot a dynamic array's length is stored at. + Returns: + (int): The length of the array. + """ + val = 0 + if self.rpc: + # The length of dynamic arrays is stored at the starting slot. + # Convert from hexadecimal to decimal. + val = int(get_storage_data(self.web3, self.checksum_address, slot).hex(), 16) + if is_array(type_): + if type_.is_fixed_array: + val = int(str(type_.length)) + + return val diff --git a/slither/tools/read_storage/utils/__init__.py b/slither/tools/read_storage/utils/__init__.py new file mode 100644 index 000000000..5d1cb0d74 --- /dev/null +++ b/slither/tools/read_storage/utils/__init__.py @@ -0,0 +1,11 @@ +from .utils import ( + is_elementary, + is_array, + is_enum, + is_mapping, + is_struct, + is_user_defined_type, + get_offset_value, + get_storage_data, + coerce_type, +) diff --git a/slither/tools/read_storage/utils/utils.py b/slither/tools/read_storage/utils/utils.py new file mode 100644 index 000000000..e14d763d8 --- /dev/null +++ b/slither/tools/read_storage/utils/utils.py @@ -0,0 +1,100 @@ +from typing import Union +from hexbytes import HexBytes +from eth_typing.evm import ChecksumAddress +from eth_utils import to_int, to_text, to_checksum_address + +from slither.core.declarations import Structure, Enum +from slither.core.solidity_types import ArrayType, MappingType, UserDefinedType, ElementaryType +from slither.core.variables.state_variable import StateVariable + + +def is_elementary(variable: StateVariable) -> bool: + """Returns whether variable is an elementary type.""" + return isinstance(variable, ElementaryType) + + +def is_array(variable: StateVariable) -> bool: + """Returns whether variable is an array.""" + return isinstance(variable, ArrayType) + + +def is_mapping(variable: StateVariable) -> bool: + """Returns whether variable is a mapping.""" + return isinstance(variable, MappingType) + + +def is_struct(variable: StateVariable) -> bool: + """Returns whether variable is a struct.""" + return isinstance(variable, Structure) + + +def is_enum(variable: StateVariable) -> bool: + """Returns whether variable is an enum.""" + return isinstance(variable, Enum) + + +def is_user_defined_type(variable: StateVariable) -> bool: + """Returns whether variable is a struct.""" + return isinstance(variable, UserDefinedType) + + +def get_offset_value(hex_bytes: HexBytes, offset: int, size: int) -> bytes: + """ + Trims slot data to only contain the target variable's. + Args: + hex_bytes (HexBytes): String representation of type + offset (int): The size (in bits) of other variables that share the same slot. + size (int): The size (in bits) of the target variable. + Returns: + (bytes): The target variable's trimmed data. + """ + size = int(size / 8) + offset = int(offset / 8) + if offset == 0: + value = hex_bytes[-size:] + else: + start = size + offset + value = hex_bytes[-start:-offset] + return value + + +def coerce_type(solidity_type: str, value: bytes) -> Union[int, bool, str, ChecksumAddress, hex]: + """ + Converts input to the indicated type. + Args: + solidity_type (str): String representation of type. + value (bytes): The value to be converted. + Returns: + (Union[int, bool, str, ChecksumAddress, hex]): The type representation of the value. + """ + if "int" in solidity_type: + converted_value = to_int(value) + elif "bool" in solidity_type: + converted_value = bool(to_int(value)) + elif "string" in solidity_type: + # length * 2 is stored in lower end bits + # TODO handle bytes and strings greater than 32 bytes + length = int(int.from_bytes(value[-2:], "big") / 2) + converted_value = to_text(value[:length]) + + elif "address" in solidity_type: + converted_value = to_checksum_address(value) + else: + converted_value = value.hex() + + return converted_value + + +def get_storage_data(web3, checksum_address: ChecksumAddress, slot: bytes) -> HexBytes: + """ + Retrieves the storage data from the blockchain at target address and slot. + Args: + web3: Web3 instance provider. + checksum_address (ChecksumAddress): The address to query. + slot (bytes): The slot to retrieve data from. + Returns: + (HexBytes): The slot's storage data. + """ + return bytes(web3.eth.get_storage_at(checksum_address, slot)).rjust( + 32, bytes(1) + ) # pad to 32 bytes diff --git a/tests/storage-layout/StorageLayout.abi b/tests/storage-layout/StorageLayout.abi new file mode 100644 index 000000000..a60ca0661 --- /dev/null +++ b/tests/storage-layout/StorageLayout.abi @@ -0,0 +1 @@ +[{"inputs":[],"name":"store","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/tests/storage-layout/StorageLayout.bin b/tests/storage-layout/StorageLayout.bin new file mode 100644 index 000000000..11163c2f0 --- /dev/null +++ b/tests/storage-layout/StorageLayout.bin @@ -0,0 +1 @@ +608060405260016000806101000a8154817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555060016000601f6101000a81548160ff02191690831515021790555060405180604001604052806000601f9054906101000a900460ff161515815260200160008054906101000a90047effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250600160008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050506040518060400160405280601481526020017f736c69746865722d726561642d73746f7261676500000000000000000000000081525060079080519060200190620001b6929190620002b2565b5060088060006101000a81548160ff021916908360ff1602179055507f6161616161616161000000000000000000000000000000000000000000000000600860016101000a81548167ffffffffffffffff021916908360c01c02179055506000600860096101000a81548160ff021916908360028111156200023d576200023c62000362565b5b021790555060016008600a6101000a81548160ff021916908360028111156200026b576200026a62000362565b5b021790555060026008600b6101000a81548160ff0219169083600281111562000299576200029862000362565b5b0217905550348015620002ab57600080fd5b50620003f6565b828054620002c090620003c0565b90600052602060002090601f016020900481019282620002e4576000855562000330565b82601f10620002ff57805160ff191683800117855562000330565b8280016001018555821562000330579182015b828111156200032f57825182559160200191906001019062000312565b5b5090506200033f919062000343565b5090565b5b808211156200035e57600081600090555060010162000344565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003d957607f821691505b60208210811415620003f057620003ef62000391565b5b50919050565b610fd780620004066000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063975057e714610030575b600080fd5b61003861003a565b005b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461009557600080fd5b33600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600260008060009054906101000a90047effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820160009054906101000a900460ff168160000160006101000a81548160ff0219169083151502179055506000820160019054906101000a90047effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff168160000160016101000a8154817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550905050600160036000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008060009054906101000a90047effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820160009054906101000a900460ff168160000160006101000a81548160ff0219169083151502179055506000820160019054906101000a90047effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff168160000160016101000a8154817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550905050600160046000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001815260200190815260200160002060006101000a81548160ff021916908315150217905550600160046000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002815260200190815260200160002060006101000a81548160ff0219169083151502179055506040518060600160405280600160ff168152602001600260ff168152602001600360ff1681525060099060036104b8929190610ddd565b50600c600990806001815401808255809150506001900390600052602060002090600302016000909190919091509060036104f4929190610e22565b50600c6040518060600160405280600460ff168152602001600560ff168152602001600660ff168152509080600181540180825580915050600190039060005260206000209060030201600090919091909150906003610555929190610ddd565b50600d60006003811061056b5761056a610f72565b5b0160079080600181540180825580915050600190039060005260206000200160009091909190915055600d6001600381106105a9576105a8610f72565b5b0160089080600181540180825580915050600190039060005260206000200160009091909190915055600d6001600381106105e7576105e6610f72565b5b0160099080600181540180825580915050600190039060005260206000200160009091909190915055600d60026003811061062557610624610f72565b5b01600a9080600181540180825580915050600190039060005260206000200160009091909190915055600d60026003811061066357610662610f72565b5b01600b9080600181540180825580915050600190039060005260206000200160009091909190915055600d6002600381106106a1576106a0610f72565b5b01600c908060018154018082558091505060019003906000526020600020016000909190919091505560106040518060200160405280600d60ff1681525090806001815401808255809150506001900390600052602060002001600090919091909150906001610712929190610e5f565b5060106040518060400160405280600e60ff168152602001600f60ff1681525090806001815401808255809150506001900390600052602060002001600090919091909150906002610765929190610eb1565b5060106040518060600160405280601060ff168152602001601160ff168152602001601260ff16815250908060018154018082558091505060019003906000526020600020016000909190919091509060036107c2929190610f03565b5060116001908060018154018082558091505060019003906000526020600020016000909190919091506000820160009054906101000a900460ff168160000160006101000a81548160ff0219169083151502179055506000820160019054906101000a90047effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff168160000160016101000a8154817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550505060116040518060400160405280600015158152602001600a7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050506001601260006003811061099a57610999610f72565b5b016000820160009054906101000a900460ff168160000160006101000a81548160ff0219169083151502179055506000820160019054906101000a90047effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff168160000160016101000a8154817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055509050506040518060400160405280600015158152602001600a7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152506012600160038110610aa257610aa1610f72565b5b0160008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555090505060056000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206011600081548110610b9957610b98610f72565b5b90600052602060002001908060018154018082558091505060019003906000526020600020016000909190919091506000820160009054906101000a900460ff168160000160006101000a81548160ff0219169083151502179055506000820160019054906101000a90047effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff168160000160016101000a8154817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550505060056000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206011600181548110610cf557610cf4610f72565b5b90600052602060002001908060018154018082558091505060019003906000526020600020016000909190919091506000820160009054906101000a900460ff168160000160006101000a81548160ff0219169083151502179055506000820160019054906101000a90047effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff168160000160016101000a8154817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055505050565b8260038101928215610e11579160200282015b82811115610e10578251829060ff16905591602001919060010190610df0565b5b509050610e1e9190610f55565b5090565b8260038101928215610e4e579182015b82811115610e4d578254825591600101919060010190610e32565b5b509050610e5b9190610f55565b5090565b828054828255906000526020600020908101928215610ea0579160200282015b82811115610e9f578251829060ff16905591602001919060010190610e7f565b5b509050610ead9190610f55565b5090565b828054828255906000526020600020908101928215610ef2579160200282015b82811115610ef1578251829060ff16905591602001919060010190610ed1565b5b509050610eff9190610f55565b5090565b828054828255906000526020600020908101928215610f44579160200282015b82811115610f43578251829060ff16905591602001919060010190610f23565b5b509050610f519190610f55565b5090565b5b80821115610f6e576000816000905550600101610f56565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212201cafaf685feba709fe5b26911b38f3251b1d43d43cec2d0d839fb6ff480488d164736f6c634300080a0033 \ No newline at end of file diff --git a/tests/storage-layout/TEST_storage_layout.json b/tests/storage-layout/TEST_storage_layout.json new file mode 100644 index 000000000..e981b1782 --- /dev/null +++ b/tests/storage-layout/TEST_storage_layout.json @@ -0,0 +1,469 @@ +{ + "packedUint": { + "type_string": "uint248", + "slot": 0, + "size": 248, + "offset": 0, + "value": 1 + }, + "packedBool": { + "type_string": "bool", + "slot": 0, + "size": 8, + "offset": 248, + "value": true + }, + "_packedStruct": { + "type_string": "StorageLayout.PackedStruct", + "slot": 1, + "size": 256, + "offset": 0, + "elems": { + "b": { + "type_string": "bool", + "slot": 1, + "size": 8, + "offset": 0, + "value": true + }, + "a": { + "type_string": "uint248", + "slot": 1, + "size": 248, + "offset": 8, + "value": 1 + } + }, + "value": "0000000000000000000000000000000000000000000000000000000000000101" + }, + "mappingPackedStruct": { + "type_string": "mapping(uint256 => StorageLayout.PackedStruct)", + "slot": 2, + "size": 256, + "offset": 0, + "value": 0 + }, + "deepMappingPackedStruct": { + "type_string": "mapping(address => mapping(uint256 => StorageLayout.PackedStruct))", + "slot": 3, + "size": 256, + "offset": 0, + "value": 0 + }, + "deepMappingElementaryTypes": { + "type_string": "mapping(address => mapping(uint256 => bool))", + "slot": 4, + "size": 256, + "offset": 0, + "value": 0 + }, + "mappingDynamicArrayOfStructs": { + "type_string": "mapping(address => StorageLayout.PackedStruct[])", + "slot": 5, + "size": 256, + "offset": 0, + "value": 0 + }, + "_address": { + "type_string": "address", + "slot": 6, + "size": 160, + "offset": 0, + "value": "0xae17D2dD99e07CA3bF2571CCAcEAA9e2Aefc2Dc6" + }, + "_string": { + "type_string": "string", + "slot": 7, + "size": 256, + "offset": 0, + "value": "slither-read-storage" + }, + "packedUint8": { + "type_string": "uint8", + "slot": 8, + "size": 8, + "offset": 0, + "value": 8 + }, + "packedBytes": { + "type_string": "bytes8", + "slot": 8, + "size": 64, + "offset": 8, + "value": "6161616161616161" + }, + "_enumA": { + "type_string": "StorageLayout.Enum", + "slot": 8, + "size": 8, + "offset": 72, + "value": "00" + }, + "_enumB": { + "type_string": "StorageLayout.Enum", + "slot": 8, + "size": 8, + "offset": 80, + "value": "01" + }, + "_enumC": { + "type_string": "StorageLayout.Enum", + "slot": 8, + "size": 8, + "offset": 88, + "value": "02" + }, + "fixedArray": { + "type_string": "uint256[3]", + "slot": 9, + "size": 768, + "offset": 0, + "elems": { + "0": { + "type_string": "uint256", + "slot": 9, + "size": 256, + "offset": 0, + "value": 1 + }, + "1": { + "type_string": "uint256", + "slot": 10, + "size": 256, + "offset": 0, + "value": 2 + }, + "2": { + "type_string": "uint256", + "slot": 11, + "size": 256, + "offset": 0, + "value": 3 + } + }, + "value": 1 + }, + "dynamicArrayOfFixedArrays": { + "type_string": "uint256[3][]", + "slot": 12, + "size": 256, + "offset": 0, + "elems": { + "0": { + "type_string": "uint256", + "slot": 101051993584849178915136821395265346177868384823507754984078593667947067386055, + "size": 256, + "offset": 0, + "elems": { + "0": { + "type_string": "uint256", + "slot": 101051993584849178915136821395265346177868384823507754984078593667947067386055, + "size": 256, + "offset": 0, + "value": 1 + }, + "1": { + "type_string": "uint256", + "slot": 101051993584849178915136821395265346177868384823507754984078593667947067386056, + "size": 256, + "offset": 0, + "value": 2 + }, + "2": { + "type_string": "uint256", + "slot": 101051993584849178915136821395265346177868384823507754984078593667947067386057, + "size": 256, + "offset": 0, + "value": 3 + } + }, + "value": 1 + }, + "1": { + "type_string": "uint256", + "slot": 101051993584849178915136821395265346177868384823507754984078593667947067386058, + "size": 256, + "offset": 0, + "elems": { + "0": { + "type_string": "uint256", + "slot": 101051993584849178915136821395265346177868384823507754984078593667947067386058, + "size": 256, + "offset": 0, + "value": 4 + }, + "1": { + "type_string": "uint256", + "slot": 101051993584849178915136821395265346177868384823507754984078593667947067386059, + "size": 256, + "offset": 0, + "value": 5 + }, + "2": { + "type_string": "uint256", + "slot": 101051993584849178915136821395265346177868384823507754984078593667947067386060, + "size": 256, + "offset": 0, + "value": 6 + } + }, + "value": 4 + } + }, + "value": 2 + }, + "fixedArrayofDynamicArrays": { + "type_string": "uint256[][3]", + "slot": 13, + "size": 768, + "offset": 0, + "elems": { + "0": { + "type_string": "uint256", + "slot": 13, + "size": 256, + "offset": 0, + "elems": { + "0": { + "type_string": "uint256", + "slot": 97569884605916225051403212656556507955018248777258318895762758024193532305077, + "size": 256, + "offset": 0, + "value": 7 + } + }, + "value": 1 + }, + "1": { + "type_string": "uint256", + "slot": 14, + "size": 256, + "offset": 0, + "elems": { + "0": { + "type_string": "uint256", + "slot": 84800337471693920904250232874319843718400766719524250287777680170677855896573, + "size": 256, + "offset": 0, + "value": 8 + }, + "1": { + "type_string": "uint256", + "slot": 84800337471693920904250232874319843718400766719524250287777680170677855896574, + "size": 256, + "offset": 0, + "value": 9 + } + }, + "value": 2 + }, + "2": { + "type_string": "uint256", + "slot": 15, + "size": 256, + "offset": 0, + "elems": { + "0": { + "type_string": "uint256", + "slot": 63806209331542711802848847270949280092855778197726125910674179583545433573378, + "size": 256, + "offset": 0, + "value": 10 + }, + "1": { + "type_string": "uint256", + "slot": 63806209331542711802848847270949280092855778197726125910674179583545433573379, + "size": 256, + "offset": 0, + "value": 11 + }, + "2": { + "type_string": "uint256", + "slot": 63806209331542711802848847270949280092855778197726125910674179583545433573380, + "size": 256, + "offset": 0, + "value": 12 + } + }, + "value": 3 + } + }, + "value": 1 + }, + "multidimensionalArray": { + "type_string": "uint256[][]", + "slot": 16, + "size": 256, + "offset": 0, + "elems": { + "0": { + "type_string": "uint256", + "slot": 12396694973890998440467380340983585058878106250672390494374587083972727727730, + "size": 256, + "offset": 0, + "elems": { + "0": { + "type_string": "uint256", + "slot": 93856215500098298973000561543003607329881518401177956003908346942307446808932, + "size": 256, + "offset": 0, + "value": 13 + } + }, + "value": 1 + }, + "1": { + "type_string": "uint256", + "slot": 12396694973890998440467380340983585058878106250672390494374587083972727727731, + "size": 256, + "offset": 0, + "elems": { + "0": { + "type_string": "uint256", + "slot": 48332168562525185806884758054388614910060623018875025120987491603435926351511, + "size": 256, + "offset": 0, + "value": 14 + }, + "1": { + "type_string": "uint256", + "slot": 48332168562525185806884758054388614910060623018875025120987491603435926351512, + "size": 256, + "offset": 0, + "value": 15 + } + }, + "value": 2 + }, + "2": { + "type_string": "uint256", + "slot": 12396694973890998440467380340983585058878106250672390494374587083972727727732, + "size": 256, + "offset": 0, + "elems": { + "0": { + "type_string": "uint256", + "slot": 69037578548663760355678879060995014288537668748590083357305779656188235687653, + "size": 256, + "offset": 0, + "value": 16 + }, + "1": { + "type_string": "uint256", + "slot": 69037578548663760355678879060995014288537668748590083357305779656188235687654, + "size": 256, + "offset": 0, + "value": 17 + }, + "2": { + "type_string": "uint256", + "slot": 69037578548663760355678879060995014288537668748590083357305779656188235687655, + "size": 256, + "offset": 0, + "value": 18 + } + }, + "value": 3 + } + }, + "value": 3 + }, + "dynamicArrayOfStructs": { + "type_string": "StorageLayout.PackedStruct[]", + "slot": 17, + "size": 256, + "offset": 0, + "elems": { + "0": { + "b": { + "type_string": "bool", + "slot": 22581645139872629890233439717971975110198959689450188087151966948260709403752, + "size": 8, + "offset": 0, + "value": true + }, + "a": { + "type_string": "uint248", + "slot": 22581645139872629890233439717971975110198959689450188087151966948260709403752, + "size": 248, + "offset": 8, + "value": 1 + } + }, + "1": { + "b": { + "type_string": "bool", + "slot": 22581645139872629890233439717971975110198959689450188087151966948260709403753, + "size": 8, + "offset": 0, + "value": false + }, + "a": { + "type_string": "uint248", + "slot": 22581645139872629890233439717971975110198959689450188087151966948260709403753, + "size": 248, + "offset": 8, + "value": 10 + } + } + }, + "value": "0000000000000000000000000000000000000000000000000000000000000002" + }, + "fixedArrayOfStructs": { + "type_string": "StorageLayout.PackedStruct[3]", + "slot": 18, + "size": 768, + "offset": 0, + "elems": { + "0": { + "b": { + "type_string": "bool", + "slot": 18, + "size": 8, + "offset": 0, + "value": true + }, + "a": { + "type_string": "uint248", + "slot": 18, + "size": 248, + "offset": 8, + "value": 1 + } + }, + "1": { + "b": { + "type_string": "bool", + "slot": 19, + "size": 8, + "offset": 0, + "value": false + }, + "a": { + "type_string": "uint248", + "slot": 19, + "size": 248, + "offset": 8, + "value": 10 + } + }, + "2": { + "b": { + "type_string": "bool", + "slot": 20, + "size": 8, + "offset": 0, + "value": false + }, + "a": { + "type_string": "uint248", + "slot": 20, + "size": 248, + "offset": 8, + "value": 0 + } + } + }, + "value": "0000000000000000000000000000000000000000000000000000000000000101" + } +} diff --git a/tests/storage-layout/storage_layout-0.8.10.sol b/tests/storage-layout/storage_layout-0.8.10.sol new file mode 100644 index 000000000..28d1428eb --- /dev/null +++ b/tests/storage-layout/storage_layout-0.8.10.sol @@ -0,0 +1,74 @@ +// overwrite abi and bin: +// solc tests/storage-layout/storage_layout-0.8.10.sol --abi --bin -o tests/storage-layout --overwrite +contract StorageLayout { + uint248 packedUint = 1; + bool packedBool = true; + + struct PackedStruct { + bool b; + uint248 a; + } + PackedStruct _packedStruct = PackedStruct(packedBool, packedUint); + + mapping (uint => PackedStruct) mappingPackedStruct; + mapping (address => mapping (uint => PackedStruct)) deepMappingPackedStruct; + mapping (address => mapping (uint => bool)) deepMappingElementaryTypes; + mapping (address => PackedStruct[]) mappingDynamicArrayOfStructs; + + address _address; + string _string = "slither-read-storage"; + uint8 packedUint8 = 8; + bytes8 packedBytes = "aaaaaaaa"; + + enum Enum { + a, + b, + c + } + Enum _enumA = Enum.a; + Enum _enumB = Enum.b; + Enum _enumC = Enum.c; + + uint256[3] fixedArray; + uint256[3][] dynamicArrayOfFixedArrays; + uint[][3] fixedArrayofDynamicArrays; + uint[][] multidimensionalArray; + PackedStruct[] dynamicArrayOfStructs; + PackedStruct[3] fixedArrayOfStructs; + + function store() external { + require(_address == address(0)); + _address = msg.sender; + + mappingPackedStruct[packedUint] = _packedStruct; + + deepMappingPackedStruct[_address][packedUint] = _packedStruct; + + deepMappingElementaryTypes[_address][1] = true; + deepMappingElementaryTypes[_address][2] = true; + + fixedArray = [1, 2, 3]; + + dynamicArrayOfFixedArrays.push(fixedArray); + dynamicArrayOfFixedArrays.push([4, 5, 6]); + + fixedArrayofDynamicArrays[0].push(7); + fixedArrayofDynamicArrays[1].push(8); + fixedArrayofDynamicArrays[1].push(9); + fixedArrayofDynamicArrays[2].push(10); + fixedArrayofDynamicArrays[2].push(11); + fixedArrayofDynamicArrays[2].push(12); + + multidimensionalArray.push([13]); + multidimensionalArray.push([14, 15]); + multidimensionalArray.push([16, 17, 18]); + + dynamicArrayOfStructs.push(_packedStruct); + dynamicArrayOfStructs.push(PackedStruct(false, 10)); + fixedArrayOfStructs[0] = _packedStruct; + fixedArrayOfStructs[1] = PackedStruct(false, 10); + + mappingDynamicArrayOfStructs[_address].push(dynamicArrayOfStructs[0]); + mappingDynamicArrayOfStructs[_address].push(dynamicArrayOfStructs[1]); + } +} diff --git a/tests/test_read_storage.py b/tests/test_read_storage.py new file mode 100644 index 000000000..0dbbb5bf2 --- /dev/null +++ b/tests/test_read_storage.py @@ -0,0 +1,139 @@ +import re +import os +import sys +import json +import shutil +import subprocess +from time import sleep +from typing import Generator + +import pytest +from deepdiff import DeepDiff +from slither import Slither +from slither.tools.read_storage import SlitherReadStorage + +try: + from web3 import Web3 +except ImportError: + print("ERROR: in order to use slither-read-storage, you need to install web3") + print("$ pip3 install web3 --user\n") + sys.exit(-1) + +SLITHER_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +STORAGE_TEST_ROOT = os.path.join(SLITHER_ROOT, "tests", "storage-layout") + +# pylint: disable=too-few-public-methods +class GanacheInstance: + def __init__(self, provider: str, eth_address: str, eth_privkey: str): + self.provider = provider + self.eth_address = eth_address + self.eth_privkey = eth_privkey + + +@pytest.fixture(scope="module", name="web3") +def fixture_web3(ganache: GanacheInstance): + w3 = Web3(Web3.HTTPProvider(ganache.provider, request_kwargs={"timeout": 30})) + return w3 + + +@pytest.fixture(scope="module", name="ganache") +def fixture_ganache() -> Generator[GanacheInstance, None, None]: + """Fixture that runs ganache""" + if not shutil.which("ganache"): + raise Exception( + "ganache was not found in PATH, you can install it with `npm install -g ganache`" + ) + + # Address #1 when ganache is run with `--wallet.seed test`, it starts with 1000 ETH + eth_address = "0xae17D2dD99e07CA3bF2571CCAcEAA9e2Aefc2Dc6" + eth_privkey = "0xe48ba530a63326818e116be262fd39ae6dcddd89da4b1f578be8afd4e8894b8d" + eth = int(1e18 * 1e6) + port = 8545 + with subprocess.Popen( + f"""ganache + --port {port} + --chain.networkId 1 + --chain.chainId 1 + --account {eth_privkey},{eth} + """.replace( + "\n", " " + ), + shell=True, + ) as p: + + sleep(3) + yield GanacheInstance(f"http://127.0.0.1:{port}", eth_address, eth_privkey) + p.kill() + p.wait() + + +def get_source_file(file_path): + with open(file_path, "r", encoding="utf8") as f: + source = f.read() + + return source + + +def deploy_contract(w3, ganache, contract_bin, contract_abi): + """Deploy contract to the local ganache network""" + signed_txn = w3.eth.account.sign_transaction( + dict( + nonce=w3.eth.get_transaction_count(ganache.eth_address), + maxFeePerGas=20000000000, + maxPriorityFeePerGas=1, + gas=15000000, + to=b"", + data="0x" + contract_bin, + chainId=1, + ), + ganache.eth_privkey, + ) + tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction) + address = w3.eth.get_transaction_receipt(tx_hash)["contractAddress"] + contract = w3.eth.contract(address, abi=contract_abi) + return contract + + +# pylint: disable=too-many-locals +@pytest.mark.usefixtures("web3", "ganache") +def test_read_storage(web3, ganache): + assert web3.isConnected() + bin_path = os.path.join(STORAGE_TEST_ROOT, "StorageLayout.bin") + abi_path = os.path.join(STORAGE_TEST_ROOT, "StorageLayout.abi") + bytecode = get_source_file(bin_path) + abi = get_source_file(abi_path) + contract = deploy_contract(web3, ganache, bytecode, abi) + contract.functions.store().transact({"from": ganache.eth_address}) + address = contract.address + + sl = Slither(os.path.join(STORAGE_TEST_ROOT, "storage_layout-0.8.10.sol")) + contracts = sl.contracts + + srs = SlitherReadStorage(contracts, 100) + srs.rpc = ganache.provider + srs.storage_address = address + srs.get_all_storage_variables() + srs.get_storage_layout() + srs.get_slot_values() + with open("storage_layout.json", "w", encoding="utf-8") as file: + json.dump(srs.slot_info, file, indent=4) + + expected_file = os.path.join(STORAGE_TEST_ROOT, "TEST_storage_layout.json") + actual_file = os.path.join(SLITHER_ROOT, "storage_layout.json") + + with open(expected_file, "r", encoding="utf8") as f: + expected = json.load(f) + with open(actual_file, "r", encoding="utf8") as f: + actual = json.load(f) + + diff = DeepDiff(expected, actual, ignore_order=True, verbose_level=2, view="tree") + if diff: + for change in diff.get("values_changed", []): + path_list = re.findall(r"\['(.*?)'\]", change.path()) + path = "_".join(path_list) + with open(f"{path}_expected.txt", "w", encoding="utf8") as f: + f.write(change.t1) + with open(f"{path}_actual.txt", "w", encoding="utf8") as f: + f.write(change.t2) + + assert not diff diff --git a/tests/test_storage_layout.py b/tests/test_storage_layout.py new file mode 100644 index 000000000..525cd3b47 --- /dev/null +++ b/tests/test_storage_layout.py @@ -0,0 +1,39 @@ +import json +import os +import subprocess +from subprocess import PIPE, Popen + +from slither import Slither + +SLITHER_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +STORAGE_TEST_ROOT = os.path.join(SLITHER_ROOT, "tests", "storage-layout") + +# the storage layout has not yet changed between solidity versions so we will test with one version of the compiler + + +def test_storage_layout(): + subprocess.run(["solc-select", "use", "0.8.10"], stdout=subprocess.PIPE, check=True) + + test_item = os.path.join(STORAGE_TEST_ROOT, "storage_layout-0.8.10.sol") + + sl = Slither(test_item, solc_force_legacy_json=False, disallow_partial=True) + + with Popen(["solc", test_item, "--storage-layout"], stdout=PIPE) as process: + for line in process.stdout: # parse solc output + if '{"storage":[{' in line.decode("utf-8"): # find the storage layout + layout = iter(json.loads(line)["storage"]) + while True: + try: + for contract in sl.contracts: + curr_var = next(layout) + var_name = curr_var["label"] + sl_name = contract.variables_as_dict[var_name] + slot, offset = contract.compilation_unit.storage_layout_of( + contract, sl_name + ) + assert slot == int(curr_var["slot"]) + assert offset == int(curr_var["offset"]) + except StopIteration: + break + except KeyError as e: + print(f"not found {e} ") From ac1cda784e0ac2fbf55f5e995c6c38674a47070f Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 21 Apr 2022 09:38:56 -0500 Subject: [PATCH 039/101] Support ternary operator in index access (#1162) * Support ternary operator in index access * Minor Co-authored-by: Josselin --- .github/workflows/features.yml | 1 + slither/utils/expression_manipulations.py | 71 ++++++++++++++++++----- tests/slithir/ternary_expressions.sol | 24 ++++++++ tests/slithir/test_ternary_expressions.py | 38 ++++++++++++ 4 files changed, 118 insertions(+), 16 deletions(-) create mode 100644 tests/slithir/ternary_expressions.sol create mode 100644 tests/slithir/test_ternary_expressions.py diff --git a/.github/workflows/features.yml b/.github/workflows/features.yml index a8548c866..3763faca0 100644 --- a/.github/workflows/features.yml +++ b/.github/workflows/features.yml @@ -52,3 +52,4 @@ jobs: run: | pytest tests/test_features.py pytest tests/test_constant_folding_unary.py + pytest tests/slithir/test_ternary_expressions.py diff --git a/slither/utils/expression_manipulations.py b/slither/utils/expression_manipulations.py index 7b14fa8a5..24d43299b 100644 --- a/slither/utils/expression_manipulations.py +++ b/slither/utils/expression_manipulations.py @@ -3,12 +3,13 @@ as they should be immutable """ import copy - +from typing import Union, Callable from slither.core.expressions import UnaryOperation from slither.core.expressions.assignment_operation import AssignmentOperation from slither.core.expressions.binary_operation import BinaryOperation from slither.core.expressions.call_expression import CallExpression from slither.core.expressions.conditional_expression import ConditionalExpression +from slither.core.expressions.expression import Expression from slither.core.expressions.identifier import Identifier from slither.core.expressions.index_access import IndexAccess from slither.core.expressions.literal import Literal @@ -20,7 +21,9 @@ from slither.core.expressions.type_conversion import TypeConversion from slither.all_exceptions import SlitherException # pylint: disable=protected-access -def f_expressions(e, x): +def f_expressions( + e: AssignmentOperation, x: Union[Identifier, Literal, MemberAccess, IndexAccess] +) -> None: e._expressions.append(x) @@ -37,7 +40,7 @@ def f_called(e, x): class SplitTernaryExpression: - def __init__(self, expression): + def __init__(self, expression: Union[AssignmentOperation, ConditionalExpression]) -> None: if isinstance(expression, ConditionalExpression): self.true_expression = copy.copy(expression.then_expression) @@ -49,7 +52,13 @@ class SplitTernaryExpression: self.condition = None self.copy_expression(expression, self.true_expression, self.false_expression) - def apply_copy(self, next_expr, true_expression, false_expression, f): + def apply_copy( + self, + next_expr: Expression, + true_expression: Union[AssignmentOperation, MemberAccess], + false_expression: Union[AssignmentOperation, MemberAccess], + f: Callable, + ) -> bool: if isinstance(next_expr, ConditionalExpression): f(true_expression, copy.copy(next_expr.then_expression)) @@ -61,9 +70,10 @@ class SplitTernaryExpression: f(false_expression, copy.copy(next_expr)) return True + # pylint: disable=too-many-branches def copy_expression( - self, expression, true_expression, false_expression - ): # pylint: disable=too-many-branches + self, expression: Expression, true_expression: Expression, false_expression: Expression + ) -> None: if self.condition: return @@ -87,6 +97,12 @@ class SplitTernaryExpression: false_expression._expressions = [] for next_expr in expression.expressions: + if isinstance(next_expr, IndexAccess): + # create an index access for each branch + if isinstance(next_expr.expression_right, ConditionalExpression): + next_expr = _handle_ternary_access( + next_expr, true_expression, false_expression + ) if self.apply_copy(next_expr, true_expression, false_expression, f_expressions): # always on last arguments added self.copy_expression( @@ -115,16 +131,7 @@ class SplitTernaryExpression: false_expression.arguments[-1], ) - elif isinstance(expression, TypeConversion): - next_expr = expression.expression - if self.apply_copy(next_expr, true_expression, false_expression, f_expression): - self.copy_expression( - expression.expression, - true_expression.expression, - false_expression.expression, - ) - - elif isinstance(expression, UnaryOperation): + elif isinstance(expression, (TypeConversion, UnaryOperation)): next_expr = expression.expression if self.apply_copy(next_expr, true_expression, false_expression, f_expression): self.copy_expression( @@ -137,3 +144,35 @@ class SplitTernaryExpression: raise SlitherException( f"Ternary operation not handled {expression}({type(expression)})" ) + + +def _handle_ternary_access( + next_expr: IndexAccess, + true_expression: AssignmentOperation, + false_expression: AssignmentOperation, +): + """ + Conditional ternary accesses are split into two accesses, one true and one false + E.g. x[if cond ? 1 : 2] -> if cond { x[1] } else { x[2] } + """ + true_index_access = IndexAccess( + next_expr.expression_left, + next_expr.expression_right.then_expression, + next_expr.type, + ) + false_index_access = IndexAccess( + next_expr.expression_left, + next_expr.expression_right.else_expression, + next_expr.type, + ) + + f_expressions( + true_expression, + true_index_access, + ) + f_expressions( + false_expression, + false_index_access, + ) + + return next_expr.expression_right diff --git a/tests/slithir/ternary_expressions.sol b/tests/slithir/ternary_expressions.sol new file mode 100644 index 000000000..c2e50b719 --- /dev/null +++ b/tests/slithir/ternary_expressions.sol @@ -0,0 +1,24 @@ +contract C { + // TODO + // 1) support variable declarations + //uint min = 1 > 0 ? 1 : 2; + // 2) suppory ternary index range access + // function e(bool cond, bytes calldata x) external { + // bytes memory a = x[cond ? 1 : 2 :]; + // } + function a(uint a, uint b) external { + (uint min, uint max) = a < b ? (a, b) : (b, a); + } + function b( address a, address b) external { + (address tokenA, address tokenB) = a < b ? (a, b) : (b, a); + } + + bytes char; + function c(bytes memory strAddress, uint i, uint padding, uint length) external { + char[0] = strAddress[i < padding + 2 ? i : 42 + i - length]; + } + + function d(bool cond, bytes calldata x) external { + bytes1 a = x[cond ? 1 : 2]; + } +} diff --git a/tests/slithir/test_ternary_expressions.py b/tests/slithir/test_ternary_expressions.py new file mode 100644 index 000000000..db5658787 --- /dev/null +++ b/tests/slithir/test_ternary_expressions.py @@ -0,0 +1,38 @@ +from slither import Slither +from slither.core.cfg.node import NodeType +from slither.slithir.operations import Assignment +from slither.core.expressions import AssignmentOperation, TupleExpression + +# pylint: disable=too-many-nested-blocks +def test_ternary_conversions() -> None: + """This tests that true and false sons define the same number of variables that the father node declares""" + slither = Slither("./tests/slithir/ternary_expressions.sol") + for contract in slither.contracts: + for function in contract.functions: + for node in function.nodes: + if node.type in [NodeType.IF, NodeType.IFLOOP]: + vars_declared = 0 + vars_assigned = 0 + + # Iterate over true and false son + for inner_node in node.sons: + # Count all variables declared + expression = inner_node.expression + if isinstance(expression, AssignmentOperation): + var_expr = expression.expression_left + # Only tuples declare more than one var + if isinstance(var_expr, TupleExpression): + vars_declared += len(var_expr.expressions) + else: + vars_declared += 1 + + for ir in inner_node.irs: + # Count all variables defined + if isinstance(ir, Assignment): + vars_assigned += 1 + + assert vars_declared == vars_assigned + + +if __name__ == "__main__": + test_ternary_conversions() From e5c35def93b7642f0fc57be4530de2493af2dda8 Mon Sep 17 00:00:00 2001 From: Josselin Date: Thu, 21 Apr 2022 16:42:42 +0200 Subject: [PATCH 040/101] Update to crytic-compile 0.2.3 --- setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index d79287358..fb2744abc 100644 --- a/setup.py +++ b/setup.py @@ -14,10 +14,10 @@ setup( install_requires=[ "prettytable>=0.7.2", "pysha3>=1.0.2", - # "crytic-compile>=0.2.2", - "crytic-compile", + "crytic-compile>=0.2.3", + # "crytic-compile", ], - dependency_links=["git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile"], + # dependency_links=["git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile"], license="AGPL-3.0", long_description=long_description, entry_points={ From e94e02e32ddfdeffb1eda94c908ce52024385097 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Thu, 21 Apr 2022 17:29:55 +0200 Subject: [PATCH 041/101] Update to crytic-compile 0.2.3 (#1179) * Update to crytic-compile 0.2.3 --- .github/workflows/read_storage.yml | 3 +++ setup.py | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/read_storage.yml b/.github/workflows/read_storage.yml index d16f8646b..2ca618a19 100644 --- a/.github/workflows/read_storage.yml +++ b/.github/workflows/read_storage.yml @@ -37,6 +37,9 @@ jobs: run: | python3 setup.py install pip install web3 pytest deepdiff solc-select + pip install pytest==7.0.1 + pip install typing_extensions==4.1.1 + pip install importlib_metadata==4.8.3 solc-select install 0.8.1 solc-select install 0.8.10 solc-select use 0.8.1 diff --git a/setup.py b/setup.py index d79287358..fb2744abc 100644 --- a/setup.py +++ b/setup.py @@ -14,10 +14,10 @@ setup( install_requires=[ "prettytable>=0.7.2", "pysha3>=1.0.2", - # "crytic-compile>=0.2.2", - "crytic-compile", + "crytic-compile>=0.2.3", + # "crytic-compile", ], - dependency_links=["git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile"], + # dependency_links=["git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile"], license="AGPL-3.0", long_description=long_description, entry_points={ From f962d6c4eefcd4d5038a781875b826948f222b31 Mon Sep 17 00:00:00 2001 From: Josselin Date: Thu, 21 Apr 2022 18:57:52 +0200 Subject: [PATCH 042/101] 0.8.3 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index fb2744abc..3b5e24209 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ setup( description="Slither is a Solidity static analysis framework written in Python 3.", url="https://github.com/crytic/slither", author="Trail of Bits", - version="0.8.2", + version="0.8.3", packages=find_packages(), python_requires=">=3.6", install_requires=[ From 4d1bcc6a5b8fed5dd37acf02a39e47615ef16947 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 27 Apr 2022 02:40:03 -0500 Subject: [PATCH 043/101] fix variable order printer by excluding immutables (#1184) --- setup.py | 6 +++--- slither/printers/summary/variable_order.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index fb2744abc..c7473f24e 100644 --- a/setup.py +++ b/setup.py @@ -14,10 +14,10 @@ setup( install_requires=[ "prettytable>=0.7.2", "pysha3>=1.0.2", - "crytic-compile>=0.2.3", - # "crytic-compile", + # "crytic-compile>=0.2.3", + "crytic-compile", ], - # dependency_links=["git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile"], + dependency_links=["git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile"], license="AGPL-3.0", long_description=long_description, entry_points={ diff --git a/slither/printers/summary/variable_order.py b/slither/printers/summary/variable_order.py index f976441e3..9dc9e77c2 100644 --- a/slither/printers/summary/variable_order.py +++ b/slither/printers/summary/variable_order.py @@ -28,7 +28,7 @@ class VariableOrder(AbstractPrinter): txt += f"\n{contract.name}:\n" table = MyPrettyTable(["Name", "Type", "Slot", "Offset"]) for variable in contract.state_variables_ordered: - if not variable.is_constant: + if not variable.is_constant and not variable.is_immutable: slot, offset = contract.compilation_unit.storage_layout_of(contract, variable) table.add_row([variable.canonical_name, str(variable.type), slot, offset]) From 2c463abdb043564ac739883032964edec0b0e149 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 27 Apr 2022 02:43:04 -0500 Subject: [PATCH 044/101] feat: add arbitrary-send-erc20 and arbitrary-send-erc20-permit detectors (#1025) Add arbitrary-send-erc20 and arbitrary-send-erc20-permit detectors --- slither/detectors/all_detectors.py | 6 +- slither/detectors/erc/erc20/__init__.py | 0 .../erc/erc20/arbitrary_send_erc20.py | 95 +++ .../erc20/arbitrary_send_erc20_no_permit.py | 45 + .../erc/erc20/arbitrary_send_erc20_permit.py | 53 ++ .../{ => erc20}/incorrect_erc20_interface.py | 0 ...rbitrary_send.py => arbitrary_send_eth.py} | 6 +- .../0.4.25/arbitrary_send_erc20_permit.sol | 57 ++ ...t.sol.0.4.25.ArbitrarySendErc20Permit.json | 768 ++++++++++++++++++ .../0.5.16/arbitrary_send_erc20_permit.sol | 57 ++ ...t.sol.0.5.16.ArbitrarySendErc20Permit.json | 768 ++++++++++++++++++ .../0.6.11/arbitrary_send_erc20_permit.sol | 57 ++ ...t.sol.0.6.11.ArbitrarySendErc20Permit.json | 768 ++++++++++++++++++ .../0.7.6/arbitrary_send_erc20_permit.sol | 57 ++ ...it.sol.0.7.6.ArbitrarySendErc20Permit.json | 768 ++++++++++++++++++ .../0.8.0/arbitrary_send_erc20_permit.sol | 57 ++ ...it.sol.0.8.0.ArbitrarySendErc20Permit.json | 768 ++++++++++++++++++ .../0.4.25/arbitrary_send_erc20.sol | 77 ++ ...sol.0.4.25.ArbitrarySendErc20NoPermit.json | 703 ++++++++++++++++ .../0.5.16/arbitrary_send_erc20.sol | 77 ++ ...sol.0.5.16.ArbitrarySendErc20NoPermit.json | 703 ++++++++++++++++ .../0.6.11/arbitrary_send_erc20.sol | 77 ++ ...sol.0.6.11.ArbitrarySendErc20NoPermit.json | 703 ++++++++++++++++ .../0.7.6/arbitrary_send_erc20.sol | 77 ++ ....sol.0.7.6.ArbitrarySendErc20NoPermit.json | 703 ++++++++++++++++ .../0.8.0/arbitrary_send_erc20.sol | 77 ++ ....sol.0.8.0.ArbitrarySendErc20NoPermit.json | 703 ++++++++++++++++ .../arbitrary_send_erc20_inheritance.sol | 16 + ....sol.0.8.0.ArbitrarySendErc20NoPermit.json | 131 +++ .../0.4.25/arbitrary_send_eth.sol} | 0 ...send_eth.sol.0.4.25.ArbitrarySendEth.json} | 136 ++-- .../0.5.16/arbitrary_send_eth.sol} | 0 ...send_eth.sol.0.5.16.ArbitrarySendEth.json} | 60 +- .../0.6.11/arbitrary_send_eth.sol} | 0 ...send_eth.sol.0.6.11.ArbitrarySendEth.json} | 60 +- .../0.7.6/arbitrary_send_eth.sol} | 0 ..._send_eth.sol.0.7.6.ArbitrarySendEth.json} | 136 ++-- tests/test_detectors.py | 71 +- 38 files changed, 8631 insertions(+), 209 deletions(-) create mode 100644 slither/detectors/erc/erc20/__init__.py create mode 100644 slither/detectors/erc/erc20/arbitrary_send_erc20.py create mode 100644 slither/detectors/erc/erc20/arbitrary_send_erc20_no_permit.py create mode 100644 slither/detectors/erc/erc20/arbitrary_send_erc20_permit.py rename slither/detectors/erc/{ => erc20}/incorrect_erc20_interface.py (100%) rename slither/detectors/functions/{arbitrary_send.py => arbitrary_send_eth.py} (97%) create mode 100644 tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol create mode 100644 tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol.0.4.25.ArbitrarySendErc20Permit.json create mode 100644 tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol create mode 100644 tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol.0.5.16.ArbitrarySendErc20Permit.json create mode 100644 tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol create mode 100644 tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol.0.6.11.ArbitrarySendErc20Permit.json create mode 100644 tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol create mode 100644 tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol.0.7.6.ArbitrarySendErc20Permit.json create mode 100644 tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol create mode 100644 tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol.0.8.0.ArbitrarySendErc20Permit.json create mode 100644 tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol create mode 100644 tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol.0.4.25.ArbitrarySendErc20NoPermit.json create mode 100644 tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol create mode 100644 tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol.0.5.16.ArbitrarySendErc20NoPermit.json create mode 100644 tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol create mode 100644 tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol.0.6.11.ArbitrarySendErc20NoPermit.json create mode 100644 tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol create mode 100644 tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol.0.7.6.ArbitrarySendErc20NoPermit.json create mode 100644 tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol create mode 100644 tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol.0.8.0.ArbitrarySendErc20NoPermit.json create mode 100644 tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol create mode 100644 tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol.0.8.0.ArbitrarySendErc20NoPermit.json rename tests/detectors/{arbitrary-send/0.4.25/arbitrary_send.sol => arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol} (100%) rename tests/detectors/{arbitrary-send/0.4.25/arbitrary_send.sol.0.4.25.ArbitrarySend.json => arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol.0.4.25.ArbitrarySendEth.json} (88%) rename tests/detectors/{arbitrary-send/0.5.16/arbitrary_send.sol => arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol} (100%) rename tests/detectors/{arbitrary-send/0.5.16/arbitrary_send.sol.0.5.16.ArbitrarySend.json => arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol.0.5.16.ArbitrarySendEth.json} (88%) rename tests/detectors/{arbitrary-send/0.6.11/arbitrary_send.sol => arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol} (100%) rename tests/detectors/{arbitrary-send/0.6.11/arbitrary_send.sol.0.6.11.ArbitrarySend.json => arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol.0.6.11.ArbitrarySendEth.json} (88%) rename tests/detectors/{arbitrary-send/0.7.6/arbitrary_send.sol => arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol} (100%) rename tests/detectors/{arbitrary-send/0.7.6/arbitrary_send.sol.0.7.6.ArbitrarySend.json => arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol.0.7.6.ArbitrarySendEth.json} (88%) diff --git a/slither/detectors/all_detectors.py b/slither/detectors/all_detectors.py index e287c258f..a79dcaf51 100644 --- a/slither/detectors/all_detectors.py +++ b/slither/detectors/all_detectors.py @@ -6,7 +6,9 @@ from .variables.uninitialized_local_variables import UninitializedLocalVars from .attributes.constant_pragma import ConstantPragma from .attributes.incorrect_solc import IncorrectSolc from .attributes.locked_ether import LockedEther -from .functions.arbitrary_send import ArbitrarySend +from .functions.arbitrary_send_eth import ArbitrarySendEth +from .erc.erc20.arbitrary_send_erc20_no_permit import ArbitrarySendErc20NoPermit +from .erc.erc20.arbitrary_send_erc20_permit import ArbitrarySendErc20Permit from .functions.suicidal import Suicidal # from .functions.complex_function import ComplexFunction @@ -34,7 +36,7 @@ from .shadowing.builtin_symbols import BuiltinSymbolShadowing from .operations.block_timestamp import Timestamp from .statements.calls_in_loop import MultipleCallsInLoop from .statements.incorrect_strict_equality import IncorrectStrictEquality -from .erc.incorrect_erc20_interface import IncorrectERC20InterfaceDetection +from .erc.erc20.incorrect_erc20_interface import IncorrectERC20InterfaceDetection from .erc.incorrect_erc721_interface import IncorrectERC721InterfaceDetection from .erc.unindexed_event_parameters import UnindexedERC20EventParameters from .statements.deprecated_calls import DeprecatedStandards diff --git a/slither/detectors/erc/erc20/__init__.py b/slither/detectors/erc/erc20/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/slither/detectors/erc/erc20/arbitrary_send_erc20.py b/slither/detectors/erc/erc20/arbitrary_send_erc20.py new file mode 100644 index 000000000..7aeaa1139 --- /dev/null +++ b/slither/detectors/erc/erc20/arbitrary_send_erc20.py @@ -0,0 +1,95 @@ +from typing import List +from slither.core.cfg.node import Node +from slither.core.declarations.solidity_variables import SolidityVariable +from slither.slithir.operations import HighLevelCall, LibraryCall +from slither.core.declarations import Contract, Function, SolidityVariableComposed +from slither.analyses.data_dependency.data_dependency import is_dependent +from slither.core.compilation_unit import SlitherCompilationUnit + + +class ArbitrarySendErc20: + """Detects instances where ERC20 can be sent from an arbitrary from address.""" + + def __init__(self, compilation_unit: SlitherCompilationUnit): + self._compilation_unit = compilation_unit + self._no_permit_results: List[Node] = [] + self._permit_results: List[Node] = [] + + @property + def compilation_unit(self) -> SlitherCompilationUnit: + return self._compilation_unit + + @property + def no_permit_results(self) -> List[Node]: + return self._no_permit_results + + @property + def permit_results(self) -> List[Node]: + return self._permit_results + + def _detect_arbitrary_from(self, contract: Contract): + for f in contract.functions: + all_high_level_calls = [ + f_called[1].solidity_signature + for f_called in f.high_level_calls + if isinstance(f_called[1], Function) + ] + all_library_calls = [f_called[1].solidity_signature for f_called in f.library_calls] + if ( + "transferFrom(address,address,uint256)" in all_high_level_calls + or "safeTransferFrom(address,address,address,uint256)" in all_library_calls + ): + if ( + "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)" + in all_high_level_calls + ): + ArbitrarySendErc20._arbitrary_from(f.nodes, self._permit_results) + else: + ArbitrarySendErc20._arbitrary_from(f.nodes, self._no_permit_results) + + @staticmethod + def _arbitrary_from(nodes: List[Node], results: List[Node]): + """Finds instances of (safe)transferFrom that do not use msg.sender or address(this) as from parameter.""" + for node in nodes: + for ir in node.irs: + if ( + isinstance(ir, HighLevelCall) + and isinstance(ir.function, Function) + and ir.function.solidity_signature == "transferFrom(address,address,uint256)" + and not ( + is_dependent( + ir.arguments[0], + SolidityVariableComposed("msg.sender"), + node.function.contract, + ) + or is_dependent( + ir.arguments[0], + SolidityVariable("this"), + node.function.contract, + ) + ) + ): + results.append(ir.node) + elif ( + isinstance(ir, LibraryCall) + and ir.function.solidity_signature + == "safeTransferFrom(address,address,address,uint256)" + and not ( + is_dependent( + ir.arguments[1], + SolidityVariableComposed("msg.sender"), + node.function.contract, + ) + or is_dependent( + ir.arguments[1], + SolidityVariable("this"), + node.function.contract, + ) + ) + ): + results.append(ir.node) + + def detect(self): + """Detect transfers that use arbitrary `from` parameter.""" + for c in self.compilation_unit.contracts_derived: + self._detect_arbitrary_from(c) diff --git a/slither/detectors/erc/erc20/arbitrary_send_erc20_no_permit.py b/slither/detectors/erc/erc20/arbitrary_send_erc20_no_permit.py new file mode 100644 index 000000000..8e29ecbef --- /dev/null +++ b/slither/detectors/erc/erc20/arbitrary_send_erc20_no_permit.py @@ -0,0 +1,45 @@ +from typing import List +from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification +from slither.utils.output import Output +from .arbitrary_send_erc20 import ArbitrarySendErc20 + + +class ArbitrarySendErc20NoPermit(AbstractDetector): + """ + Detect when `msg.sender` is not used as `from` in transferFrom + """ + + ARGUMENT = "arbitrary-send-erc20" + HELP = "transferFrom uses arbitrary `from`" + IMPACT = DetectorClassification.HIGH + CONFIDENCE = DetectorClassification.HIGH + + WIKI = "https://github.com/trailofbits/slither/wiki/Detector-Documentation#arbitrary-send-erc20" + + WIKI_TITLE = "Arbitrary `from` in transferFrom" + WIKI_DESCRIPTION = "Detect when `msg.sender` is not used as `from` in transferFrom." + WIKI_EXPLOIT_SCENARIO = """ +```solidity + function a(address from, address to, uint256 amount) public { + erc20.transferFrom(from, to, am); + } +``` +Alice approves this contract to spend her ERC20 tokens. Bob can call `a` and specify Alice's address as the `from` parameter in `transferFrom`, allowing him to transfer Alice's tokens to himself.""" + + WIKI_RECOMMENDATION = """ +Use `msg.sender` as `from` in transferFrom. +""" + + def _detect(self) -> List[Output]: + """""" + results: List[Output] = [] + + arbitrary_sends = ArbitrarySendErc20(self.compilation_unit) + arbitrary_sends.detect() + for node in arbitrary_sends.no_permit_results: + func = node.function + info = [func, " uses arbitrary from in transferFrom: ", node, "\n"] + res = self.generate_result(info) + results.append(res) + + return results diff --git a/slither/detectors/erc/erc20/arbitrary_send_erc20_permit.py b/slither/detectors/erc/erc20/arbitrary_send_erc20_permit.py new file mode 100644 index 000000000..48e80772b --- /dev/null +++ b/slither/detectors/erc/erc20/arbitrary_send_erc20_permit.py @@ -0,0 +1,53 @@ +from typing import List +from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification +from slither.utils.output import Output +from .arbitrary_send_erc20 import ArbitrarySendErc20 + + +class ArbitrarySendErc20Permit(AbstractDetector): + """ + Detect when `msg.sender` is not used as `from` in transferFrom along with the use of permit. + """ + + ARGUMENT = "arbitrary-send-erc20-permit" + HELP = "transferFrom uses arbitrary from with permit" + IMPACT = DetectorClassification.HIGH + CONFIDENCE = DetectorClassification.MEDIUM + + WIKI = "https://github.com/trailofbits/slither/wiki/Detector-Documentation#arbitrary-send-erc20-permit" + + WIKI_TITLE = "Arbitrary `from` in transferFrom used with permit" + WIKI_DESCRIPTION = ( + "Detect when `msg.sender` is not used as `from` in transferFrom and permit is used." + ) + WIKI_EXPLOIT_SCENARIO = """ +```solidity + function bad(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) public { + erc20.permit(from, address(this), value, deadline, v, r, s); + erc20.transferFrom(from, to, value); + } +``` +If an ERC20 token does not implement permit and has a fallback function e.g. WETH, transferFrom allows an attacker to transfer all tokens approved for this contract.""" + + WIKI_RECOMMENDATION = """ +Ensure that the underlying ERC20 token correctly implements a permit function. +""" + + def _detect(self) -> List[Output]: + """""" + results: List[Output] = [] + + arbitrary_sends = ArbitrarySendErc20(self.compilation_unit) + arbitrary_sends.detect() + for node in arbitrary_sends.permit_results: + func = node.function + info = [ + func, + " uses arbitrary from in transferFrom in combination with permit: ", + node, + "\n", + ] + res = self.generate_result(info) + results.append(res) + + return results diff --git a/slither/detectors/erc/incorrect_erc20_interface.py b/slither/detectors/erc/erc20/incorrect_erc20_interface.py similarity index 100% rename from slither/detectors/erc/incorrect_erc20_interface.py rename to slither/detectors/erc/erc20/incorrect_erc20_interface.py diff --git a/slither/detectors/functions/arbitrary_send.py b/slither/detectors/functions/arbitrary_send_eth.py similarity index 97% rename from slither/detectors/functions/arbitrary_send.py rename to slither/detectors/functions/arbitrary_send_eth.py index 3a7118bbf..e1752bbdb 100644 --- a/slither/detectors/functions/arbitrary_send.py +++ b/slither/detectors/functions/arbitrary_send_eth.py @@ -90,8 +90,8 @@ def detect_arbitrary_send(contract: Contract): return ret -class ArbitrarySend(AbstractDetector): - ARGUMENT = "arbitrary-send" +class ArbitrarySendEth(AbstractDetector): + ARGUMENT = "arbitrary-send-eth" HELP = "Functions that send Ether to arbitrary destinations" IMPACT = DetectorClassification.HIGH CONFIDENCE = DetectorClassification.MEDIUM @@ -104,7 +104,7 @@ class ArbitrarySend(AbstractDetector): # region wiki_exploit_scenario WIKI_EXPLOIT_SCENARIO = """ ```solidity -contract ArbitrarySend{ +contract ArbitrarySendEth{ address destination; function setDestination(){ destination = msg.sender; diff --git a/tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol b/tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol new file mode 100644 index 000000000..4cc6bbe55 --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol @@ -0,0 +1,57 @@ +pragma solidity 0.4.25; + +library SafeERC20 { + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {} +} + +interface IERC20 { + function transferFrom(address, address, uint256) external returns(bool); + function permit(address, address, uint256, uint256, uint8, bytes32, bytes32) external; +} + +contract ERC20 is IERC20 { + function transferFrom(address from, address to, uint256 amount) external returns(bool) { + return true; + } + function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {} +} + +contract C { + using SafeERC20 for IERC20; + + IERC20 erc20; + address notsend; + address send; + + constructor() public { + erc20 = new ERC20(); + notsend = address(0x3); + send = msg.sender; + } + + function bad1(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) public { + erc20.permit(from, address(this), value, deadline, v, r, s); + erc20.transferFrom(from, to, value); + } + + // This is not detected + function bad2(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) public { + int_transferFrom(from,value, deadline, v, r, s, to); + } + + function int_transferFrom(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) internal { + erc20.permit(from, address(this), value, deadline, v, r, s); + erc20.transferFrom(from, to, value); + } + + function bad3(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) external { + erc20.permit(from, address(this), value, deadline, v, r, s); + erc20.safeTransferFrom(from, to, value); + } + + function bad4(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) external { + erc20.permit(from, address(this), value, deadline, v, r, s); + SafeERC20.safeTransferFrom(erc20, from, to, value); + } + +} diff --git a/tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol.0.4.25.ArbitrarySendErc20Permit.json b/tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol.0.4.25.ArbitrarySendErc20Permit.json new file mode 100644 index 000000000..e8486f5e1 --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol.0.4.25.ArbitrarySendErc20Permit.json @@ -0,0 +1,768 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1794, + "length": 249, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 52, + 53, + 54, + 55 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 613, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransferFrom(erc20,from,to,value)", + "source_mapping": { + "start": 1986, + "length": 50, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 54 + ], + "starting_column": 9, + "ending_column": 59 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1794, + "length": 249, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 52, + 53, + 54, + 55 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 613, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.bad4(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#52-55) uses arbitrary from in transferFrom in combination with permit: SafeERC20.safeTransferFrom(erc20,from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#54)\n", + "markdown": "[C.bad4(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#L52-L55) uses arbitrary from in transferFrom in combination with permit: [SafeERC20.safeTransferFrom(erc20,from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#L54)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#L52-L55", + "id": "22de0efa869fce1767af15469c8bcc95616478aec05625ab72283df0ad9fae55", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "int_transferFrom", + "source_mapping": { + "start": 1294, + "length": 246, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 42, + 43, + 44, + 45 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 613, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "erc20.transferFrom(from,to,value)", + "source_mapping": { + "start": 1498, + "length": 35, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 44 + ], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "int_transferFrom", + "source_mapping": { + "start": 1294, + "length": 246, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 42, + 43, + 44, + 45 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 613, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#42-45) uses arbitrary from in transferFrom in combination with permit: erc20.transferFrom(from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#44)\n", + "markdown": "[C.int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#L42-L45) uses arbitrary from in transferFrom in combination with permit: [erc20.transferFrom(from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#L44)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#L42-L45", + "id": "408ea319adfb46be330fd7775c13abf56f9d106eebcbcfe6574760309d93927e", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 843, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 32, + 33, + 34, + 35 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 613, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "erc20.transferFrom(from,to,value)", + "source_mapping": { + "start": 1033, + "length": 35, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 34 + ], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 843, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 32, + 33, + 34, + 35 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 613, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.bad1(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#32-35) uses arbitrary from in transferFrom in combination with permit: erc20.transferFrom(from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#34)\n", + "markdown": "[C.bad1(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#L32-L35) uses arbitrary from in transferFrom in combination with permit: [erc20.transferFrom(from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#L34)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#L32-L35", + "id": "82a43f5bf554d897b270abaac0ee62650383fe341adeff0d9c1c95b0040548a2", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1546, + "length": 238, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 47, + 48, + 49, + 50 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 613, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "erc20.safeTransferFrom(from,to,value)", + "source_mapping": { + "start": 1738, + "length": 39, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 49 + ], + "starting_column": 9, + "ending_column": 48 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1546, + "length": 238, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 47, + 48, + 49, + 50 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 613, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.bad3(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#47-50) uses arbitrary from in transferFrom in combination with permit: erc20.safeTransferFrom(from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#49)\n", + "markdown": "[C.bad3(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#L47-L50) uses arbitrary from in transferFrom in combination with permit: [erc20.safeTransferFrom(from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#L49)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.4.25/arbitrary_send_erc20_permit.sol#L47-L50", + "id": "f7695706feb3a8409e367a88028dfad8c64e1000f1f71d6e55074d0dcfbc2305", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol b/tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol new file mode 100644 index 000000000..4a020d262 --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol @@ -0,0 +1,57 @@ +pragma solidity 0.5.16; + +library SafeERC20 { + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {} +} + +interface IERC20 { + function transferFrom(address, address, uint256) external returns(bool); + function permit(address, address, uint256, uint256, uint8, bytes32, bytes32) external; +} + +contract ERC20 is IERC20 { + function transferFrom(address from, address to, uint256 amount) external returns(bool) { + return true; + } + function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {} +} + +contract C { + using SafeERC20 for IERC20; + + IERC20 erc20; + address notsend; + address send; + + constructor() public { + erc20 = new ERC20(); + notsend = address(0x3); + send = msg.sender; + } + + function bad1(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) public { + erc20.permit(from, address(this), value, deadline, v, r, s); + erc20.transferFrom(from, to, value); + } + + // This is not detected + function bad2(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) public { + int_transferFrom(from,value, deadline, v, r, s, to); + } + + function int_transferFrom(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) internal { + erc20.permit(from, address(this), value, deadline, v, r, s); + erc20.transferFrom(from, to, value); + } + + function bad3(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) external { + erc20.permit(from, address(this), value, deadline, v, r, s); + erc20.safeTransferFrom(from, to, value); + } + + function bad4(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) external { + erc20.permit(from, address(this), value, deadline, v, r, s); + SafeERC20.safeTransferFrom(erc20, from, to, value); + } + +} diff --git a/tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol.0.5.16.ArbitrarySendErc20Permit.json b/tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol.0.5.16.ArbitrarySendErc20Permit.json new file mode 100644 index 000000000..6452e06f9 --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol.0.5.16.ArbitrarySendErc20Permit.json @@ -0,0 +1,768 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1794, + "length": 249, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 52, + 53, + 54, + 55 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 613, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransferFrom(erc20,from,to,value)", + "source_mapping": { + "start": 1986, + "length": 50, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 54 + ], + "starting_column": 9, + "ending_column": 59 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1794, + "length": 249, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 52, + 53, + 54, + 55 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 613, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.bad4(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#52-55) uses arbitrary from in transferFrom in combination with permit: SafeERC20.safeTransferFrom(erc20,from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#54)\n", + "markdown": "[C.bad4(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#L52-L55) uses arbitrary from in transferFrom in combination with permit: [SafeERC20.safeTransferFrom(erc20,from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#L54)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#L52-L55", + "id": "57068db07fd7e67d0b63035936fad5a373fcb8f84bb6a58aa463278143db43fa", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 843, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 32, + 33, + 34, + 35 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 613, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "erc20.transferFrom(from,to,value)", + "source_mapping": { + "start": 1033, + "length": 35, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 34 + ], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 843, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 32, + 33, + 34, + 35 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 613, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.bad1(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#32-35) uses arbitrary from in transferFrom in combination with permit: erc20.transferFrom(from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#34)\n", + "markdown": "[C.bad1(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#L32-L35) uses arbitrary from in transferFrom in combination with permit: [erc20.transferFrom(from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#L34)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#L32-L35", + "id": "5983458eee02cf7d5484a82e17422dcdbd7b990305579e17d1252c0bb31e1cac", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1546, + "length": 238, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 47, + 48, + 49, + 50 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 613, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "erc20.safeTransferFrom(from,to,value)", + "source_mapping": { + "start": 1738, + "length": 39, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 49 + ], + "starting_column": 9, + "ending_column": 48 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1546, + "length": 238, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 47, + 48, + 49, + 50 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 613, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.bad3(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#47-50) uses arbitrary from in transferFrom in combination with permit: erc20.safeTransferFrom(from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#49)\n", + "markdown": "[C.bad3(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#L47-L50) uses arbitrary from in transferFrom in combination with permit: [erc20.safeTransferFrom(from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#L49)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#L47-L50", + "id": "a8f319ba65d6c81726b72d7593eb089ce9819d22856387250e009a43a98cf1c3", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "int_transferFrom", + "source_mapping": { + "start": 1294, + "length": 246, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 42, + 43, + 44, + 45 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 613, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "erc20.transferFrom(from,to,value)", + "source_mapping": { + "start": 1498, + "length": 35, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 44 + ], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "int_transferFrom", + "source_mapping": { + "start": 1294, + "length": 246, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 42, + 43, + 44, + 45 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 613, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#42-45) uses arbitrary from in transferFrom in combination with permit: erc20.transferFrom(from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#44)\n", + "markdown": "[C.int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#L42-L45) uses arbitrary from in transferFrom in combination with permit: [erc20.transferFrom(from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#L44)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.5.16/arbitrary_send_erc20_permit.sol#L42-L45", + "id": "e3ed372c52b219322ca290ecfa79be96d7ea1b019af329a515c6c10b7a1cf03b", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol b/tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol new file mode 100644 index 000000000..0a9f80e7d --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol @@ -0,0 +1,57 @@ +pragma solidity 0.6.11; + +library SafeERC20 { + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {} +} + +interface IERC20 { + function transferFrom(address, address, uint256) external returns(bool); + function permit(address, address, uint256, uint256, uint8, bytes32, bytes32) external; +} + +contract ERC20 is IERC20 { + function transferFrom(address from, address to, uint256 amount) external override returns(bool) { + return true; + } + function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external override {} +} + +contract C { + using SafeERC20 for IERC20; + + IERC20 erc20; + address notsend; + address send; + + constructor() public { + erc20 = new ERC20(); + notsend = address(0x3); + send = msg.sender; + } + + function bad1(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) public { + erc20.permit(from, address(this), value, deadline, v, r, s); + erc20.transferFrom(from, to, value); + } + + // This is not detected + function bad2(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) public { + int_transferFrom(from,value, deadline, v, r, s, to); + } + + function int_transferFrom(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) internal { + erc20.permit(from, address(this), value, deadline, v, r, s); + erc20.transferFrom(from, to, value); + } + + function bad3(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) external { + erc20.permit(from, address(this), value, deadline, v, r, s); + erc20.safeTransferFrom(from, to, value); + } + + function bad4(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) external { + erc20.permit(from, address(this), value, deadline, v, r, s); + SafeERC20.safeTransferFrom(erc20, from, to, value); + } + +} diff --git a/tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol.0.6.11.ArbitrarySendErc20Permit.json b/tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol.0.6.11.ArbitrarySendErc20Permit.json new file mode 100644 index 000000000..911573c67 --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol.0.6.11.ArbitrarySendErc20Permit.json @@ -0,0 +1,768 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1564, + "length": 238, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 47, + 48, + 49, + 50 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 631, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "erc20.safeTransferFrom(from,to,value)", + "source_mapping": { + "start": 1756, + "length": 39, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 49 + ], + "starting_column": 9, + "ending_column": 48 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1564, + "length": 238, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 47, + 48, + 49, + 50 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 631, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.bad3(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#47-50) uses arbitrary from in transferFrom in combination with permit: erc20.safeTransferFrom(from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#49)\n", + "markdown": "[C.bad3(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#L47-L50) uses arbitrary from in transferFrom in combination with permit: [erc20.safeTransferFrom(from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#L49)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#L47-L50", + "id": "1caf8efb7dd42f74884b4ee8d8b44585eeaa5758776ef8ac1e31b8aa749eac26", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1812, + "length": 249, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 52, + 53, + 54, + 55 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 631, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransferFrom(erc20,from,to,value)", + "source_mapping": { + "start": 2004, + "length": 50, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 54 + ], + "starting_column": 9, + "ending_column": 59 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1812, + "length": 249, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 52, + 53, + 54, + 55 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 631, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.bad4(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#52-55) uses arbitrary from in transferFrom in combination with permit: SafeERC20.safeTransferFrom(erc20,from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#54)\n", + "markdown": "[C.bad4(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#L52-L55) uses arbitrary from in transferFrom in combination with permit: [SafeERC20.safeTransferFrom(erc20,from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#L54)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#L52-L55", + "id": "cc58852f92580ac18db192412ec7e50667bf56d986349ae8fe6990f0b04f9f62", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "int_transferFrom", + "source_mapping": { + "start": 1312, + "length": 246, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 42, + 43, + 44, + 45 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 631, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "erc20.transferFrom(from,to,value)", + "source_mapping": { + "start": 1516, + "length": 35, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 44 + ], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "int_transferFrom", + "source_mapping": { + "start": 1312, + "length": 246, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 42, + 43, + 44, + 45 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 631, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#42-45) uses arbitrary from in transferFrom in combination with permit: erc20.transferFrom(from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#44)\n", + "markdown": "[C.int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#L42-L45) uses arbitrary from in transferFrom in combination with permit: [erc20.transferFrom(from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#L44)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#L42-L45", + "id": "f75bec4e068adbca017ad00b355347aa0c337b30a807fa8e1b80577b031e68fd", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 861, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 32, + 33, + 34, + 35 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 631, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "erc20.transferFrom(from,to,value)", + "source_mapping": { + "start": 1051, + "length": 35, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 34 + ], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 861, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 32, + 33, + 34, + 35 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 631, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.bad1(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#32-35) uses arbitrary from in transferFrom in combination with permit: erc20.transferFrom(from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#34)\n", + "markdown": "[C.bad1(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#L32-L35) uses arbitrary from in transferFrom in combination with permit: [erc20.transferFrom(from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#L34)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.6.11/arbitrary_send_erc20_permit.sol#L32-L35", + "id": "f90e97c676187cd6d727064001123d8537f5d8253d0a66ab6798b4a1c250a425", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol b/tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol new file mode 100644 index 000000000..48e4e348c --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol @@ -0,0 +1,57 @@ +pragma solidity 0.7.6; + +library SafeERC20 { + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {} +} + +interface IERC20 { + function transferFrom(address, address, uint256) external returns(bool); + function permit(address, address, uint256, uint256, uint8, bytes32, bytes32) external; +} + +contract ERC20 is IERC20 { + function transferFrom(address from, address to, uint256 amount) external override returns(bool) { + return true; + } + function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external override {} +} + +contract C { + using SafeERC20 for IERC20; + + IERC20 erc20; + address notsend; + address send; + + constructor() public { + erc20 = new ERC20(); + notsend = address(0x3); + send = msg.sender; + } + + function bad1(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) public { + erc20.permit(from, address(this), value, deadline, v, r, s); + erc20.transferFrom(from, to, value); + } + + // This is not detected + function bad2(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) public { + int_transferFrom(from,value, deadline, v, r, s, to); + } + + function int_transferFrom(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) internal { + erc20.permit(from, address(this), value, deadline, v, r, s); + erc20.transferFrom(from, to, value); + } + + function bad3(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) external { + erc20.permit(from, address(this), value, deadline, v, r, s); + erc20.safeTransferFrom(from, to, value); + } + + function bad4(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) external { + erc20.permit(from, address(this), value, deadline, v, r, s); + SafeERC20.safeTransferFrom(erc20, from, to, value); + } + +} diff --git a/tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol.0.7.6.ArbitrarySendErc20Permit.json b/tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol.0.7.6.ArbitrarySendErc20Permit.json new file mode 100644 index 000000000..f31ee33e1 --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol.0.7.6.ArbitrarySendErc20Permit.json @@ -0,0 +1,768 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1563, + "length": 238, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 47, + 48, + 49, + 50 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 630, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "erc20.safeTransferFrom(from,to,value)", + "source_mapping": { + "start": 1755, + "length": 39, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 49 + ], + "starting_column": 9, + "ending_column": 48 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1563, + "length": 238, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 47, + 48, + 49, + 50 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 630, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.bad3(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#47-50) uses arbitrary from in transferFrom in combination with permit: erc20.safeTransferFrom(from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#49)\n", + "markdown": "[C.bad3(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#L47-L50) uses arbitrary from in transferFrom in combination with permit: [erc20.safeTransferFrom(from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#L49)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#L47-L50", + "id": "63dc39bd9025d9fa7d39e07342e5652c010ff424e6d31ed9d1559f225c417956", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1811, + "length": 249, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 52, + 53, + 54, + 55 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 630, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransferFrom(erc20,from,to,value)", + "source_mapping": { + "start": 2003, + "length": 50, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 54 + ], + "starting_column": 9, + "ending_column": 59 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1811, + "length": 249, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 52, + 53, + 54, + 55 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 630, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.bad4(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#52-55) uses arbitrary from in transferFrom in combination with permit: SafeERC20.safeTransferFrom(erc20,from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#54)\n", + "markdown": "[C.bad4(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#L52-L55) uses arbitrary from in transferFrom in combination with permit: [SafeERC20.safeTransferFrom(erc20,from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#L54)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#L52-L55", + "id": "7ebee7b534acb9d9502df84ba56fd0e90223cd262964c77cb9bee798eabd674b", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 860, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 32, + 33, + 34, + 35 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 630, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "erc20.transferFrom(from,to,value)", + "source_mapping": { + "start": 1050, + "length": 35, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 34 + ], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 860, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 32, + 33, + 34, + 35 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 630, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.bad1(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#32-35) uses arbitrary from in transferFrom in combination with permit: erc20.transferFrom(from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#34)\n", + "markdown": "[C.bad1(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#L32-L35) uses arbitrary from in transferFrom in combination with permit: [erc20.transferFrom(from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#L34)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#L32-L35", + "id": "ba2c627103717a52a46b52714313000eb4f9d96f57dfac874854a3747ace5a13", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "int_transferFrom", + "source_mapping": { + "start": 1311, + "length": 246, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 42, + 43, + 44, + 45 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 630, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "erc20.transferFrom(from,to,value)", + "source_mapping": { + "start": 1515, + "length": 35, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 44 + ], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "int_transferFrom", + "source_mapping": { + "start": 1311, + "length": 246, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 42, + 43, + 44, + 45 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 630, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#42-45) uses arbitrary from in transferFrom in combination with permit: erc20.transferFrom(from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#44)\n", + "markdown": "[C.int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#L42-L45) uses arbitrary from in transferFrom in combination with permit: [erc20.transferFrom(from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#L44)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.7.6/arbitrary_send_erc20_permit.sol#L42-L45", + "id": "d56199ce2b7249389dffba8e53278f5ae32fbdda8a51cae8b5eb1cf2c09a0578", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol b/tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol new file mode 100644 index 000000000..99ecbe488 --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol @@ -0,0 +1,57 @@ +pragma solidity 0.8.0; + +library SafeERC20 { + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {} +} + +interface IERC20 { + function transferFrom(address, address, uint256) external returns(bool); + function permit(address, address, uint256, uint256, uint8, bytes32, bytes32) external; +} + +contract ERC20 is IERC20 { + function transferFrom(address from, address to, uint256 amount) external override returns(bool) { + return true; + } + function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external override {} +} + +contract C { + using SafeERC20 for IERC20; + + IERC20 erc20; + address notsend; + address send; + + constructor() public { + erc20 = new ERC20(); + notsend = address(0x3); + send = msg.sender; + } + + function bad1(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) public { + erc20.permit(from, address(this), value, deadline, v, r, s); + erc20.transferFrom(from, to, value); + } + + // This is not detected + function bad2(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) public { + int_transferFrom(from,value, deadline, v, r, s, to); + } + + function int_transferFrom(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) internal { + erc20.permit(from, address(this), value, deadline, v, r, s); + erc20.transferFrom(from, to, value); + } + + function bad3(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) external { + erc20.permit(from, address(this), value, deadline, v, r, s); + erc20.safeTransferFrom(from, to, value); + } + + function bad4(address from, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) external { + erc20.permit(from, address(this), value, deadline, v, r, s); + SafeERC20.safeTransferFrom(erc20, from, to, value); + } + +} diff --git a/tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol.0.8.0.ArbitrarySendErc20Permit.json b/tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol.0.8.0.ArbitrarySendErc20Permit.json new file mode 100644 index 000000000..8adf73c17 --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol.0.8.0.ArbitrarySendErc20Permit.json @@ -0,0 +1,768 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1811, + "length": 249, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 52, + 53, + 54, + 55 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 630, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransferFrom(erc20,from,to,value)", + "source_mapping": { + "start": 2003, + "length": 50, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 54 + ], + "starting_column": 9, + "ending_column": 59 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1811, + "length": 249, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 52, + 53, + 54, + 55 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 630, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.bad4(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#52-55) uses arbitrary from in transferFrom in combination with permit: SafeERC20.safeTransferFrom(erc20,from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#54)\n", + "markdown": "[C.bad4(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#L52-L55) uses arbitrary from in transferFrom in combination with permit: [SafeERC20.safeTransferFrom(erc20,from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#L54)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#L52-L55", + "id": "136a1b6c001d3ca4b1aab662556139786307e1bf4cb929f4c507d592eb38cb72", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "int_transferFrom", + "source_mapping": { + "start": 1311, + "length": 246, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 42, + 43, + 44, + 45 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 630, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "erc20.transferFrom(from,to,value)", + "source_mapping": { + "start": 1515, + "length": 35, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 44 + ], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "int_transferFrom", + "source_mapping": { + "start": 1311, + "length": 246, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 42, + 43, + 44, + 45 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 630, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#42-45) uses arbitrary from in transferFrom in combination with permit: erc20.transferFrom(from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#44)\n", + "markdown": "[C.int_transferFrom(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#L42-L45) uses arbitrary from in transferFrom in combination with permit: [erc20.transferFrom(from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#L44)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#L42-L45", + "id": "398cc3de119232bd6688c797ddfb4f84d7587dbf9f72f3056898bfc442a5fd85", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 860, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 32, + 33, + 34, + 35 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 630, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "erc20.transferFrom(from,to,value)", + "source_mapping": { + "start": 1050, + "length": 35, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 34 + ], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 860, + "length": 232, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 32, + 33, + 34, + 35 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 630, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.bad1(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#32-35) uses arbitrary from in transferFrom in combination with permit: erc20.transferFrom(from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#34)\n", + "markdown": "[C.bad1(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#L32-L35) uses arbitrary from in transferFrom in combination with permit: [erc20.transferFrom(from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#L34)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#L32-L35", + "id": "429dd8afad02f0e6869b1de2a82bf36ab35aaf74ba5909de5facd767f4642f32", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1563, + "length": 238, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 47, + 48, + 49, + 50 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 630, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + }, + { + "type": "node", + "name": "erc20.safeTransferFrom(from,to,value)", + "source_mapping": { + "start": 1755, + "length": 39, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 49 + ], + "starting_column": 9, + "ending_column": 48 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1563, + "length": 238, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 47, + 48, + 49, + 50 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 630, + "length": 1433, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol", + "is_dependency": false, + "lines": [ + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,uint256,uint256,uint8,bytes32,bytes32,address)" + } + } + } + } + ], + "description": "C.bad3(address,uint256,uint256,uint8,bytes32,bytes32,address) (tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#47-50) uses arbitrary from in transferFrom in combination with permit: erc20.safeTransferFrom(from,to,value) (tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#49)\n", + "markdown": "[C.bad3(address,uint256,uint256,uint8,bytes32,bytes32,address)](tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#L47-L50) uses arbitrary from in transferFrom in combination with permit: [erc20.safeTransferFrom(from,to,value)](tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#L49)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20-permit/0.8.0/arbitrary_send_erc20_permit.sol#L47-L50", + "id": "7841a86248d8345520e98b963d59de36814b25e5fa3cef9e031c61d05a7feb2a", + "check": "arbitrary-send-erc20-permit", + "impact": "High", + "confidence": "Medium" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol b/tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol new file mode 100644 index 000000000..8695d2de8 --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol @@ -0,0 +1,77 @@ +pragma solidity 0.4.25; + +library SafeERC20 { + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {} +} + +interface IERC20 { + function transferFrom(address, address, uint256) external returns(bool); +} + +contract ERC20 is IERC20 { + function transferFrom(address from, address to, uint256 amount) external returns(bool) { + return true; + } +} + +contract C { + using SafeERC20 for IERC20; + + IERC20 erc20; + address notsend; + address send; + + constructor() public { + erc20 = new ERC20(); + notsend = address(0x3); + send = msg.sender; + } + + function good1(address to, uint256 am) public { + address from_msgsender = msg.sender; + erc20.transferFrom(from_msgsender, to, am); + } + + function bad1(address to, uint256 am) public { + erc20.transferFrom(notsend, to, am); + } + + function good2(address to, uint256 am) public { + address from_msgsender = msg.sender; + int_transferFrom(from_msgsender, to, am); + } + + // This is not detected + function bad2(address from, address to, uint256 am) public { + int_transferFrom(from, to, am); + } + + function int_transferFrom(address from, address to, uint256 amount) internal { + erc20.transferFrom(from, to, amount); + } + + function good3(address to, uint256 amount) external { + erc20.safeTransferFrom(msg.sender, to, amount); + } + + function bad3(address from, address to, uint256 amount) external { + erc20.safeTransferFrom(from, to, amount); + } + + function good4(address to, uint256 amount) external { + SafeERC20.safeTransferFrom(erc20, msg.sender, to, amount); + } + + function bad4(address from, address to, uint256 amount) external { + SafeERC20.safeTransferFrom(erc20, from, to, amount); + } + + function good5(address to, uint256 amount) external { + SafeERC20.safeTransferFrom(erc20, address(this), to, amount); + } + + function good6(address from, address to, uint256 amount) external { + erc20.safeTransferFrom(address(this), to, amount); + } + +} diff --git a/tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol.0.4.25.ArbitrarySendErc20NoPermit.json b/tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol.0.4.25.ArbitrarySendErc20NoPermit.json new file mode 100644 index 000000000..cf6feaa5a --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol.0.4.25.ArbitrarySendErc20NoPermit.json @@ -0,0 +1,703 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 780, + "length": 97, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 35, + 36, + 37 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 394, + "length": 1717, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256)" + } + }, + { + "type": "node", + "name": "erc20.transferFrom(notsend,to,am)", + "source_mapping": { + "start": 835, + "length": 35, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 36 + ], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 780, + "length": 97, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 35, + 36, + 37 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 394, + "length": 1717, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256)" + } + } + } + } + ], + "description": "C.bad1(address,uint256) (tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol#35-37) uses arbitrary from in transferFrom: erc20.transferFrom(notsend,to,am) (tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol#36)\n", + "markdown": "[C.bad1(address,uint256)](tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol#L35-L37) uses arbitrary from in transferFrom: [erc20.transferFrom(notsend,to,am)](tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol#L36)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol#L35-L37", + "id": "430afa4e7855d25b1262162894fa21d58eea2571578d45de5399baf3eb438038", + "check": "arbitrary-send-erc20", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1702, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 65, + 66, + 67 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 394, + "length": 1717, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,address,uint256)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransferFrom(erc20,from,to,amount)", + "source_mapping": { + "start": 1777, + "length": 51, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 66 + ], + "starting_column": 9, + "ending_column": 60 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1702, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 65, + 66, + 67 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 394, + "length": 1717, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,address,uint256)" + } + } + } + } + ], + "description": "C.bad4(address,address,uint256) (tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol#65-67) uses arbitrary from in transferFrom: SafeERC20.safeTransferFrom(erc20,from,to,amount) (tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol#66)\n", + "markdown": "[C.bad4(address,address,uint256)](tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol#L65-L67) uses arbitrary from in transferFrom: [SafeERC20.safeTransferFrom(erc20,from,to,amount)](tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol#L66)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol#L65-L67", + "id": "b2557d6385585034271b9873559de9cde4972e3207c43f260663f3d0e2a4d4a0", + "check": "arbitrary-send-erc20", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1434, + "length": 122, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 57, + 58, + 59 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 394, + "length": 1717, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,address,uint256)" + } + }, + { + "type": "node", + "name": "erc20.safeTransferFrom(from,to,amount)", + "source_mapping": { + "start": 1509, + "length": 40, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 58 + ], + "starting_column": 9, + "ending_column": 49 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1434, + "length": 122, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 57, + 58, + 59 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 394, + "length": 1717, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,address,uint256)" + } + } + } + } + ], + "description": "C.bad3(address,address,uint256) (tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol#57-59) uses arbitrary from in transferFrom: erc20.safeTransferFrom(from,to,amount) (tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol#58)\n", + "markdown": "[C.bad3(address,address,uint256)](tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol#L57-L59) uses arbitrary from in transferFrom: [erc20.safeTransferFrom(from,to,amount)](tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol#L58)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20/0.4.25/arbitrary_send_erc20.sol#L57-L59", + "id": "e7271d3fa958d20a025419c070ea1010431487e98e30fa2db65db9bf54a13665", + "check": "arbitrary-send-erc20", + "impact": "High", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol b/tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol new file mode 100644 index 000000000..6cf214805 --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol @@ -0,0 +1,77 @@ +pragma solidity 0.5.16; + +library SafeERC20 { + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {} +} + +interface IERC20 { + function transferFrom(address, address, uint256) external returns(bool); +} + +contract ERC20 is IERC20 { + function transferFrom(address from, address to, uint256 amount) external returns(bool) { + return true; + } +} + +contract C { + using SafeERC20 for IERC20; + + IERC20 erc20; + address notsend; + address send; + + constructor() public { + erc20 = new ERC20(); + notsend = address(0x3); + send = msg.sender; + } + + function good1(address to, uint256 am) public { + address from_msgsender = msg.sender; + erc20.transferFrom(from_msgsender, to, am); + } + + function bad1(address to, uint256 am) public { + erc20.transferFrom(notsend, to, am); + } + + function good2(address to, uint256 am) public { + address from_msgsender = msg.sender; + int_transferFrom(from_msgsender, to, am); + } + + // This is not detected + function bad2(address from, address to, uint256 am) public { + int_transferFrom(from, to, am); + } + + function int_transferFrom(address from, address to, uint256 amount) internal { + erc20.transferFrom(from, to, amount); + } + + function good3(address to, uint256 amount) external { + erc20.safeTransferFrom(msg.sender, to, amount); + } + + function bad3(address from, address to, uint256 amount) external { + erc20.safeTransferFrom(from, to, amount); + } + + function good4(address to, uint256 amount) external { + SafeERC20.safeTransferFrom(erc20, msg.sender, to, amount); + } + + function bad4(address from, address to, uint256 amount) external { + SafeERC20.safeTransferFrom(erc20, from, to, amount); + } + + function good5(address to, uint256 amount) external { + SafeERC20.safeTransferFrom(erc20, address(this), to, amount); + } + + function good6(address from, address to, uint256 amount) external { + erc20.safeTransferFrom(address(this), to, amount); + } + +} diff --git a/tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol.0.5.16.ArbitrarySendErc20NoPermit.json b/tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol.0.5.16.ArbitrarySendErc20NoPermit.json new file mode 100644 index 000000000..18a210262 --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol.0.5.16.ArbitrarySendErc20NoPermit.json @@ -0,0 +1,703 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1702, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 65, + 66, + 67 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 394, + "length": 1717, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,address,uint256)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransferFrom(erc20,from,to,amount)", + "source_mapping": { + "start": 1777, + "length": 51, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 66 + ], + "starting_column": 9, + "ending_column": 60 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1702, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 65, + 66, + 67 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 394, + "length": 1717, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,address,uint256)" + } + } + } + } + ], + "description": "C.bad4(address,address,uint256) (tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol#65-67) uses arbitrary from in transferFrom: SafeERC20.safeTransferFrom(erc20,from,to,amount) (tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol#66)\n", + "markdown": "[C.bad4(address,address,uint256)](tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol#L65-L67) uses arbitrary from in transferFrom: [SafeERC20.safeTransferFrom(erc20,from,to,amount)](tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol#L66)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol#L65-L67", + "id": "15a810d738734100851211c7e6bff65724d553eb693869575ec3d9c9bf47081c", + "check": "arbitrary-send-erc20", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 780, + "length": 97, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 35, + 36, + 37 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 394, + "length": 1717, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256)" + } + }, + { + "type": "node", + "name": "erc20.transferFrom(notsend,to,am)", + "source_mapping": { + "start": 835, + "length": 35, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 36 + ], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 780, + "length": 97, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 35, + 36, + 37 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 394, + "length": 1717, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256)" + } + } + } + } + ], + "description": "C.bad1(address,uint256) (tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol#35-37) uses arbitrary from in transferFrom: erc20.transferFrom(notsend,to,am) (tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol#36)\n", + "markdown": "[C.bad1(address,uint256)](tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol#L35-L37) uses arbitrary from in transferFrom: [erc20.transferFrom(notsend,to,am)](tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol#L36)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol#L35-L37", + "id": "6ca6aea5c4506ac7fa421c049e0bd41faa74317e303b94721bc64c2fc6e8f128", + "check": "arbitrary-send-erc20", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1434, + "length": 122, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 57, + 58, + 59 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 394, + "length": 1717, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,address,uint256)" + } + }, + { + "type": "node", + "name": "erc20.safeTransferFrom(from,to,amount)", + "source_mapping": { + "start": 1509, + "length": 40, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 58 + ], + "starting_column": 9, + "ending_column": 49 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1434, + "length": 122, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 57, + 58, + 59 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 394, + "length": 1717, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,address,uint256)" + } + } + } + } + ], + "description": "C.bad3(address,address,uint256) (tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol#57-59) uses arbitrary from in transferFrom: erc20.safeTransferFrom(from,to,amount) (tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol#58)\n", + "markdown": "[C.bad3(address,address,uint256)](tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol#L57-L59) uses arbitrary from in transferFrom: [erc20.safeTransferFrom(from,to,amount)](tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol#L58)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20/0.5.16/arbitrary_send_erc20.sol#L57-L59", + "id": "773c84f15f90123743b54aca858695d11603109f4da52c487ee4ae161f09411b", + "check": "arbitrary-send-erc20", + "impact": "High", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol b/tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol new file mode 100644 index 000000000..a61e4f8ab --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol @@ -0,0 +1,77 @@ +pragma solidity 0.6.11; + +library SafeERC20 { + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {} +} + +interface IERC20 { + function transferFrom(address, address, uint256) external returns(bool); +} + +contract ERC20 is IERC20 { + function transferFrom(address from, address to, uint256 amount) external override returns(bool) { + return true; + } +} + +contract C { + using SafeERC20 for IERC20; + + IERC20 erc20; + address notsend; + address send; + + constructor() public { + erc20 = new ERC20(); + notsend = address(0x3); + send = msg.sender; + } + + function good1(address to, uint256 am) public { + address from_msgsender = msg.sender; + erc20.transferFrom(from_msgsender, to, am); + } + + function bad1(address to, uint256 am) public { + erc20.transferFrom(notsend, to, am); + } + + function good2(address to, uint256 am) public { + address from_msgsender = msg.sender; + int_transferFrom(from_msgsender, to, am); + } + + // This is not detected + function bad2(address from, address to, uint256 am) public { + int_transferFrom(from, to, am); + } + + function int_transferFrom(address from, address to, uint256 amount) internal { + erc20.transferFrom(from, to, amount); + } + + function good3(address to, uint256 amount) external { + erc20.safeTransferFrom(msg.sender, to, amount); + } + + function bad3(address from, address to, uint256 amount) external { + erc20.safeTransferFrom(from, to, amount); + } + + function good4(address to, uint256 amount) external { + SafeERC20.safeTransferFrom(erc20, msg.sender, to, amount); + } + + function bad4(address from, address to, uint256 amount) external { + SafeERC20.safeTransferFrom(erc20, from, to, amount); + } + + function good5(address to, uint256 amount) external { + SafeERC20.safeTransferFrom(erc20, address(this), to, amount); + } + + function good6(address from, address to, uint256 amount) external { + erc20.safeTransferFrom(address(this), to, amount); + } + +} diff --git a/tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol.0.6.11.ArbitrarySendErc20NoPermit.json b/tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol.0.6.11.ArbitrarySendErc20NoPermit.json new file mode 100644 index 000000000..8d6b2a67d --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol.0.6.11.ArbitrarySendErc20NoPermit.json @@ -0,0 +1,703 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 789, + "length": 97, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 35, + 36, + 37 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 403, + "length": 1721, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256)" + } + }, + { + "type": "node", + "name": "erc20.transferFrom(notsend,to,am)", + "source_mapping": { + "start": 844, + "length": 35, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 36 + ], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 789, + "length": 97, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 35, + 36, + 37 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 403, + "length": 1721, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256)" + } + } + } + } + ], + "description": "C.bad1(address,uint256) (tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol#35-37) uses arbitrary from in transferFrom: erc20.transferFrom(notsend,to,am) (tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol#36)\n", + "markdown": "[C.bad1(address,uint256)](tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol#L35-L37) uses arbitrary from in transferFrom: [erc20.transferFrom(notsend,to,am)](tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol#L36)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol#L35-L37", + "id": "040cf50981f6e1dea1f7a19f0115811be1347e0637f0ca85d789ae612a509322", + "check": "arbitrary-send-erc20", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1711, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 65, + 66, + 67 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 403, + "length": 1721, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,address,uint256)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransferFrom(erc20,from,to,amount)", + "source_mapping": { + "start": 1786, + "length": 51, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 66 + ], + "starting_column": 9, + "ending_column": 60 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1711, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 65, + 66, + 67 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 403, + "length": 1721, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,address,uint256)" + } + } + } + } + ], + "description": "C.bad4(address,address,uint256) (tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol#65-67) uses arbitrary from in transferFrom: SafeERC20.safeTransferFrom(erc20,from,to,amount) (tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol#66)\n", + "markdown": "[C.bad4(address,address,uint256)](tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol#L65-L67) uses arbitrary from in transferFrom: [SafeERC20.safeTransferFrom(erc20,from,to,amount)](tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol#L66)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol#L65-L67", + "id": "61438092d2da6c23ecfa13e5e55c489e538249e47bddd9335b533d28a242aea1", + "check": "arbitrary-send-erc20", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1443, + "length": 122, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 57, + 58, + 59 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 403, + "length": 1721, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,address,uint256)" + } + }, + { + "type": "node", + "name": "erc20.safeTransferFrom(from,to,amount)", + "source_mapping": { + "start": 1518, + "length": 40, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 58 + ], + "starting_column": 9, + "ending_column": 49 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1443, + "length": 122, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 57, + 58, + 59 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 403, + "length": 1721, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,address,uint256)" + } + } + } + } + ], + "description": "C.bad3(address,address,uint256) (tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol#57-59) uses arbitrary from in transferFrom: erc20.safeTransferFrom(from,to,amount) (tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol#58)\n", + "markdown": "[C.bad3(address,address,uint256)](tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol#L57-L59) uses arbitrary from in transferFrom: [erc20.safeTransferFrom(from,to,amount)](tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol#L58)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20/0.6.11/arbitrary_send_erc20.sol#L57-L59", + "id": "8551e9d33fdd4f73f1eb7776480b2e8cd2cf9c897b52285c3a287caab6822ce3", + "check": "arbitrary-send-erc20", + "impact": "High", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol b/tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol new file mode 100644 index 000000000..0ceff0f66 --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol @@ -0,0 +1,77 @@ +pragma solidity 0.7.6; + +library SafeERC20 { + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {} +} + +interface IERC20 { + function transferFrom(address, address, uint256) external returns(bool); +} + +contract ERC20 is IERC20 { + function transferFrom(address from, address to, uint256 amount) external override returns(bool) { + return true; + } +} + +contract C { + using SafeERC20 for IERC20; + + IERC20 erc20; + address notsend; + address send; + + constructor() { + erc20 = new ERC20(); + notsend = address(0x3); + send = msg.sender; + } + + function good1(address to, uint256 am) public { + address from_msgsender = msg.sender; + erc20.transferFrom(from_msgsender, to, am); + } + + function bad1(address to, uint256 am) public { + erc20.transferFrom(notsend, to, am); + } + + function good2(address to, uint256 am) public { + address from_msgsender = msg.sender; + int_transferFrom(from_msgsender, to, am); + } + + // This is not detected + function bad2(address from, address to, uint256 am) public { + int_transferFrom(from, to, am); + } + + function int_transferFrom(address from, address to, uint256 amount) internal { + erc20.transferFrom(from, to, amount); + } + + function good3(address to, uint256 amount) external { + erc20.safeTransferFrom(msg.sender, to, amount); + } + + function bad3(address from, address to, uint256 amount) external { + erc20.safeTransferFrom(from, to, amount); + } + + function good4(address to, uint256 amount) external { + SafeERC20.safeTransferFrom(erc20, msg.sender, to, amount); + } + + function bad4(address from, address to, uint256 amount) external { + SafeERC20.safeTransferFrom(erc20, from, to, amount); + } + + function good5(address to, uint256 amount) external { + SafeERC20.safeTransferFrom(erc20, address(this), to, amount); + } + + function good6(address from, address to, uint256 amount) external { + erc20.safeTransferFrom(address(this), to, amount); + } + +} diff --git a/tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol.0.7.6.ArbitrarySendErc20NoPermit.json b/tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol.0.7.6.ArbitrarySendErc20NoPermit.json new file mode 100644 index 000000000..72b78d67a --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol.0.7.6.ArbitrarySendErc20NoPermit.json @@ -0,0 +1,703 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1435, + "length": 122, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 57, + 58, + 59 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 402, + "length": 1710, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,address,uint256)" + } + }, + { + "type": "node", + "name": "erc20.safeTransferFrom(from,to,amount)", + "source_mapping": { + "start": 1510, + "length": 40, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 58 + ], + "starting_column": 9, + "ending_column": 49 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1435, + "length": 122, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 57, + 58, + 59 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 402, + "length": 1710, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,address,uint256)" + } + } + } + } + ], + "description": "C.bad3(address,address,uint256) (tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol#57-59) uses arbitrary from in transferFrom: erc20.safeTransferFrom(from,to,amount) (tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol#58)\n", + "markdown": "[C.bad3(address,address,uint256)](tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol#L57-L59) uses arbitrary from in transferFrom: [erc20.safeTransferFrom(from,to,amount)](tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol#L58)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol#L57-L59", + "id": "27c4a0e1a038beb0c01c86e07f1aef592f96907d330bcf899bde6632a9022327", + "check": "arbitrary-send-erc20", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 781, + "length": 97, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 35, + 36, + 37 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 402, + "length": 1710, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256)" + } + }, + { + "type": "node", + "name": "erc20.transferFrom(notsend,to,am)", + "source_mapping": { + "start": 836, + "length": 35, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 36 + ], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 781, + "length": 97, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 35, + 36, + 37 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 402, + "length": 1710, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256)" + } + } + } + } + ], + "description": "C.bad1(address,uint256) (tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol#35-37) uses arbitrary from in transferFrom: erc20.transferFrom(notsend,to,am) (tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol#36)\n", + "markdown": "[C.bad1(address,uint256)](tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol#L35-L37) uses arbitrary from in transferFrom: [erc20.transferFrom(notsend,to,am)](tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol#L36)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol#L35-L37", + "id": "820841ccd8aee0469f9719d62ad01054b71a758a1d6924ed6a19ea078ff8350a", + "check": "arbitrary-send-erc20", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1703, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 65, + 66, + 67 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 402, + "length": 1710, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,address,uint256)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransferFrom(erc20,from,to,amount)", + "source_mapping": { + "start": 1778, + "length": 51, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 66 + ], + "starting_column": 9, + "ending_column": 60 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1703, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 65, + 66, + 67 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 402, + "length": 1710, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,address,uint256)" + } + } + } + } + ], + "description": "C.bad4(address,address,uint256) (tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol#65-67) uses arbitrary from in transferFrom: SafeERC20.safeTransferFrom(erc20,from,to,amount) (tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol#66)\n", + "markdown": "[C.bad4(address,address,uint256)](tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol#L65-L67) uses arbitrary from in transferFrom: [SafeERC20.safeTransferFrom(erc20,from,to,amount)](tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol#L66)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20/0.7.6/arbitrary_send_erc20.sol#L65-L67", + "id": "9ecb2b9df9554b9ebdbcfd058eb44ba4f1524b285b676063432d5ede48aee5ad", + "check": "arbitrary-send-erc20", + "impact": "High", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol b/tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol new file mode 100644 index 000000000..19dcf3f15 --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol @@ -0,0 +1,77 @@ +pragma solidity 0.8.0; + +library SafeERC20 { + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {} +} + +interface IERC20 { + function transferFrom(address, address, uint256) external returns(bool); +} + +contract ERC20 is IERC20 { + function transferFrom(address from, address to, uint256 amount) external override returns(bool) { + return true; + } +} + +contract C { + using SafeERC20 for IERC20; + + IERC20 erc20; + address notsend; + address send; + + constructor() { + erc20 = new ERC20(); + notsend = address(0x3); + send = msg.sender; + } + + function good1(address to, uint256 am) public { + address from_msgsender = msg.sender; + erc20.transferFrom(from_msgsender, to, am); + } + + function bad1(address to, uint256 am) public { + erc20.transferFrom(notsend, to, am); + } + + function good2(address to, uint256 am) public { + address from_msgsender = msg.sender; + int_transferFrom(from_msgsender, to, am); + } + + // This is not detected + function bad2(address from, address to, uint256 am) public { + int_transferFrom(from, to, am); + } + + function int_transferFrom(address from, address to, uint256 amount) internal { + erc20.transferFrom(from, to, amount); + } + + function good3(address to, uint256 amount) external { + erc20.safeTransferFrom(msg.sender, to, amount); + } + + function bad3(address from, address to, uint256 amount) external { + erc20.safeTransferFrom(from, to, amount); + } + + function good4(address to, uint256 amount) external { + SafeERC20.safeTransferFrom(erc20, msg.sender, to, amount); + } + + function bad4(address from, address to, uint256 amount) external { + SafeERC20.safeTransferFrom(erc20, from, to, amount); + } + + function good5(address to, uint256 amount) external { + SafeERC20.safeTransferFrom(erc20, address(this), to, amount); + } + + function good6(address from, address to, uint256 amount) external { + erc20.safeTransferFrom(address(this), to, amount); + } + +} diff --git a/tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol.0.8.0.ArbitrarySendErc20NoPermit.json b/tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol.0.8.0.ArbitrarySendErc20NoPermit.json new file mode 100644 index 000000000..de242ae4e --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol.0.8.0.ArbitrarySendErc20NoPermit.json @@ -0,0 +1,703 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1435, + "length": 122, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 57, + 58, + 59 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 402, + "length": 1710, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,address,uint256)" + } + }, + { + "type": "node", + "name": "erc20.safeTransferFrom(from,to,amount)", + "source_mapping": { + "start": 1510, + "length": 40, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 58 + ], + "starting_column": 9, + "ending_column": 49 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad3", + "source_mapping": { + "start": 1435, + "length": 122, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 57, + 58, + 59 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 402, + "length": 1710, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad3(address,address,uint256)" + } + } + } + } + ], + "description": "C.bad3(address,address,uint256) (tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol#57-59) uses arbitrary from in transferFrom: erc20.safeTransferFrom(from,to,amount) (tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol#58)\n", + "markdown": "[C.bad3(address,address,uint256)](tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol#L57-L59) uses arbitrary from in transferFrom: [erc20.safeTransferFrom(from,to,amount)](tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol#L58)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol#L57-L59", + "id": "196b46419f55696599f4a533ea4915c3b1c39be679d8e2ab15a60b7a0238d52c", + "check": "arbitrary-send-erc20", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1703, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 65, + 66, + 67 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 402, + "length": 1710, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,address,uint256)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransferFrom(erc20,from,to,amount)", + "source_mapping": { + "start": 1778, + "length": 51, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 66 + ], + "starting_column": 9, + "ending_column": 60 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad4", + "source_mapping": { + "start": 1703, + "length": 133, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 65, + 66, + 67 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 402, + "length": 1710, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad4(address,address,uint256)" + } + } + } + } + ], + "description": "C.bad4(address,address,uint256) (tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol#65-67) uses arbitrary from in transferFrom: SafeERC20.safeTransferFrom(erc20,from,to,amount) (tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol#66)\n", + "markdown": "[C.bad4(address,address,uint256)](tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol#L65-L67) uses arbitrary from in transferFrom: [SafeERC20.safeTransferFrom(erc20,from,to,amount)](tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol#L66)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol#L65-L67", + "id": "6ba2ac6eeef603310a4b4f7931ab44fadb3a242517096e17c5f1e39f0f4b83cf", + "check": "arbitrary-send-erc20", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 781, + "length": 97, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 35, + 36, + 37 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 402, + "length": 1710, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256)" + } + }, + { + "type": "node", + "name": "erc20.transferFrom(notsend,to,am)", + "source_mapping": { + "start": 836, + "length": 35, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 36 + ], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad1", + "source_mapping": { + "start": 781, + "length": 97, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 35, + 36, + 37 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "C", + "source_mapping": { + "start": 402, + "length": 1710, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol", + "is_dependency": false, + "lines": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad1(address,uint256)" + } + } + } + } + ], + "description": "C.bad1(address,uint256) (tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol#35-37) uses arbitrary from in transferFrom: erc20.transferFrom(notsend,to,am) (tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol#36)\n", + "markdown": "[C.bad1(address,uint256)](tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol#L35-L37) uses arbitrary from in transferFrom: [erc20.transferFrom(notsend,to,am)](tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol#L36)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20.sol#L35-L37", + "id": "8972d014c645b3a3783400fb2a6a38b20ea38973481025b6f99b3c15c9e63868", + "check": "arbitrary-send-erc20", + "impact": "High", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol b/tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol new file mode 100644 index 000000000..c74ab0fa0 --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol @@ -0,0 +1,16 @@ +pragma solidity 0.8.0; + +library Safe { + function safeTransferFrom(address token, address from, address to, uint256 amount) internal {} +} + +contract T { + using Safe for address; + address erc20; + + function bad(address from) public { + erc20.safeTransferFrom(from, address(0x1), 90); + } +} + +contract A is T {} diff --git a/tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol.0.8.0.ArbitrarySendErc20NoPermit.json b/tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol.0.8.0.ArbitrarySendErc20NoPermit.json new file mode 100644 index 000000000..e89b664bb --- /dev/null +++ b/tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol.0.8.0.ArbitrarySendErc20NoPermit.json @@ -0,0 +1,131 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "bad", + "source_mapping": { + "start": 196, + "length": 88, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol", + "is_dependency": false, + "lines": [ + 11, + 12, + 13 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "T", + "source_mapping": { + "start": 138, + "length": 149, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol", + "is_dependency": false, + "lines": [ + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad(address)" + } + }, + { + "type": "node", + "name": "erc20.safeTransferFrom(from,address(0x1),90)", + "source_mapping": { + "start": 234, + "length": 46, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol", + "is_dependency": false, + "lines": [ + 12 + ], + "starting_column": 3, + "ending_column": 49 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bad", + "source_mapping": { + "start": 196, + "length": 88, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol", + "is_dependency": false, + "lines": [ + 11, + 12, + 13 + ], + "starting_column": 2, + "ending_column": 3 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "T", + "source_mapping": { + "start": 138, + "length": 149, + "filename_used": "/GENERIC_PATH", + "filename_relative": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol", + "is_dependency": false, + "lines": [ + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "bad(address)" + } + } + } + } + ], + "description": "T.bad(address) (tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol#11-13) uses arbitrary from in transferFrom: erc20.safeTransferFrom(from,address(0x1),90) (tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol#12)\n", + "markdown": "[T.bad(address)](tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol#L11-L13) uses arbitrary from in transferFrom: [erc20.safeTransferFrom(from,address(0x1),90)](tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol#L12)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-erc20/0.8.0/arbitrary_send_erc20_inheritance.sol#L11-L13", + "id": "51845f69be45c4d9b97ff3e01cbc5bf55d1c1cddcc4776f39e22dd803a241e46", + "check": "arbitrary-send-erc20", + "impact": "High", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol b/tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol similarity index 100% rename from tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol rename to tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol diff --git a/tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol.0.4.25.ArbitrarySend.json b/tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol.0.4.25.ArbitrarySendEth.json similarity index 88% rename from tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol.0.4.25.ArbitrarySend.json rename to tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol.0.4.25.ArbitrarySendEth.json index b215f0e96..15685f8fc 100644 --- a/tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol.0.4.25.ArbitrarySend.json +++ b/tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol.0.4.25.ArbitrarySendEth.json @@ -4,19 +4,19 @@ "elements": [ { "type": "function", - "name": "indirect", + "name": "direct", "source_mapping": { - "start": 301, - "length": 82, + "start": 147, + "length": 79, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ - 19, - 20, - 21 + 11, + 12, + 13 ], "starting_column": 5, "ending_column": 6 @@ -29,9 +29,9 @@ "start": 0, "length": 869, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 1, @@ -80,42 +80,42 @@ "ending_column": 2 } }, - "signature": "indirect()" + "signature": "direct()" } }, { "type": "node", - "name": "destination.send(address(this).balance)", + "name": "msg.sender.send(address(this).balance)", "source_mapping": { - "start": 337, - "length": 39, + "start": 181, + "length": 38, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ - 20 + 12 ], "starting_column": 9, - "ending_column": 48 + "ending_column": 47 }, "type_specific_fields": { "parent": { "type": "function", - "name": "indirect", + "name": "direct", "source_mapping": { - "start": 301, - "length": 82, + "start": 147, + "length": 79, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ - 19, - 20, - 21 + 11, + 12, + 13 ], "starting_column": 5, "ending_column": 6 @@ -128,9 +128,9 @@ "start": 0, "length": 869, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 1, @@ -179,17 +179,17 @@ "ending_column": 2 } }, - "signature": "indirect()" + "signature": "direct()" } } } } ], - "description": "Test.indirect() (tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol#19-21) sends eth to arbitrary user\n\tDangerous calls:\n\t- destination.send(address(this).balance) (tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol#20)\n", - "markdown": "[Test.indirect()](tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol#L19-L21) sends eth to arbitrary user\n\tDangerous calls:\n\t- [destination.send(address(this).balance)](tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol#L20)\n", - "first_markdown_element": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol#L19-L21", - "id": "4759805615df746a3d8a6c068ce885d2c18c46edf411f83ae004593958caafe7", - "check": "arbitrary-send", + "description": "Test.direct() (tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol#11-13) sends eth to arbitrary user\n\tDangerous calls:\n\t- msg.sender.send(address(this).balance) (tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol#12)\n", + "markdown": "[Test.direct()](tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol#L11-L13) sends eth to arbitrary user\n\tDangerous calls:\n\t- [msg.sender.send(address(this).balance)](tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol#L12)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol#L11-L13", + "id": "672bdccd2e85fb88deee03d312d533259b73ca932965ae09e5b24a3b546c4ad2", + "check": "arbitrary-send-eth", "impact": "High", "confidence": "Medium" }, @@ -197,19 +197,19 @@ "elements": [ { "type": "function", - "name": "direct", + "name": "indirect", "source_mapping": { - "start": 147, - "length": 79, + "start": 301, + "length": 82, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ - 11, - 12, - 13 + 19, + 20, + 21 ], "starting_column": 5, "ending_column": 6 @@ -222,9 +222,9 @@ "start": 0, "length": 869, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 1, @@ -273,42 +273,42 @@ "ending_column": 2 } }, - "signature": "direct()" + "signature": "indirect()" } }, { "type": "node", - "name": "msg.sender.send(address(this).balance)", + "name": "destination.send(address(this).balance)", "source_mapping": { - "start": 181, - "length": 38, + "start": 337, + "length": 39, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ - 12 + 20 ], "starting_column": 9, - "ending_column": 47 + "ending_column": 48 }, "type_specific_fields": { "parent": { "type": "function", - "name": "direct", + "name": "indirect", "source_mapping": { - "start": 147, - "length": 79, + "start": 301, + "length": 82, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ - 11, - 12, - 13 + 19, + 20, + 21 ], "starting_column": 5, "ending_column": 6 @@ -321,9 +321,9 @@ "start": 0, "length": 869, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 1, @@ -372,17 +372,17 @@ "ending_column": 2 } }, - "signature": "direct()" + "signature": "indirect()" } } } } ], - "description": "Test.direct() (tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol#11-13) sends eth to arbitrary user\n\tDangerous calls:\n\t- msg.sender.send(address(this).balance) (tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol#12)\n", - "markdown": "[Test.direct()](tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol#L11-L13) sends eth to arbitrary user\n\tDangerous calls:\n\t- [msg.sender.send(address(this).balance)](tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol#L12)\n", - "first_markdown_element": "tests/detectors/arbitrary-send/0.4.25/arbitrary_send.sol#L11-L13", - "id": "477cc1ab9fa3d2263400e47d09146eaed3e478f5eecf7856b59d49a2a5093a1c", - "check": "arbitrary-send", + "description": "Test.indirect() (tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol#19-21) sends eth to arbitrary user\n\tDangerous calls:\n\t- destination.send(address(this).balance) (tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol#20)\n", + "markdown": "[Test.indirect()](tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol#L19-L21) sends eth to arbitrary user\n\tDangerous calls:\n\t- [destination.send(address(this).balance)](tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol#L20)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-eth/0.4.25/arbitrary_send_eth.sol#L19-L21", + "id": "9d50facc8382e844e7381f8ca9e389061bd0302345047de2407e0ad7b046687d", + "check": "arbitrary-send-eth", "impact": "High", "confidence": "Medium" } diff --git a/tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol b/tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol similarity index 100% rename from tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol rename to tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol diff --git a/tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol.0.5.16.ArbitrarySend.json b/tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol.0.5.16.ArbitrarySendEth.json similarity index 88% rename from tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol.0.5.16.ArbitrarySend.json rename to tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol.0.5.16.ArbitrarySendEth.json index cfb1bcc13..814e44e93 100644 --- a/tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol.0.5.16.ArbitrarySend.json +++ b/tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol.0.5.16.ArbitrarySendEth.json @@ -9,9 +9,9 @@ "start": 162, "length": 79, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 11, @@ -29,9 +29,9 @@ "start": 0, "length": 884, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 1, @@ -90,9 +90,9 @@ "start": 196, "length": 38, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 12 @@ -108,9 +108,9 @@ "start": 162, "length": 79, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 11, @@ -128,9 +128,9 @@ "start": 0, "length": 884, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 1, @@ -185,11 +185,11 @@ } } ], - "description": "Test.direct() (tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol#11-13) sends eth to arbitrary user\n\tDangerous calls:\n\t- msg.sender.send(address(this).balance) (tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol#12)\n", - "markdown": "[Test.direct()](tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol#L11-L13) sends eth to arbitrary user\n\tDangerous calls:\n\t- [msg.sender.send(address(this).balance)](tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol#L12)\n", - "first_markdown_element": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol#L11-L13", - "id": "9531cafd91af4d7b54f22fa933dae983077df1c51bd855c2516ffee812911f43", - "check": "arbitrary-send", + "description": "Test.direct() (tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol#11-13) sends eth to arbitrary user\n\tDangerous calls:\n\t- msg.sender.send(address(this).balance) (tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol#12)\n", + "markdown": "[Test.direct()](tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol#L11-L13) sends eth to arbitrary user\n\tDangerous calls:\n\t- [msg.sender.send(address(this).balance)](tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol#L12)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol#L11-L13", + "id": "7ded1859293ad51d129850d2f19669c7d38f4687a6e2afa8d93534d5f2a9a0ad", + "check": "arbitrary-send-eth", "impact": "High", "confidence": "Medium" }, @@ -202,9 +202,9 @@ "start": 316, "length": 82, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 19, @@ -222,9 +222,9 @@ "start": 0, "length": 884, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 1, @@ -283,9 +283,9 @@ "start": 352, "length": 39, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 20 @@ -301,9 +301,9 @@ "start": 316, "length": 82, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 19, @@ -321,9 +321,9 @@ "start": 0, "length": 884, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 1, @@ -378,11 +378,11 @@ } } ], - "description": "Test.indirect() (tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol#19-21) sends eth to arbitrary user\n\tDangerous calls:\n\t- destination.send(address(this).balance) (tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol#20)\n", - "markdown": "[Test.indirect()](tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol#L19-L21) sends eth to arbitrary user\n\tDangerous calls:\n\t- [destination.send(address(this).balance)](tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol#L20)\n", - "first_markdown_element": "tests/detectors/arbitrary-send/0.5.16/arbitrary_send.sol#L19-L21", - "id": "f1395ebf21de9f8fb2c5d254c5990cce55b239c05a6a5e074813f58c6cd32834", - "check": "arbitrary-send", + "description": "Test.indirect() (tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol#19-21) sends eth to arbitrary user\n\tDangerous calls:\n\t- destination.send(address(this).balance) (tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol#20)\n", + "markdown": "[Test.indirect()](tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol#L19-L21) sends eth to arbitrary user\n\tDangerous calls:\n\t- [destination.send(address(this).balance)](tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol#L20)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-eth/0.5.16/arbitrary_send_eth.sol#L19-L21", + "id": "d27379ff48eebb6c568308104d444dc8f6b5ed5eae53f6c937aec9fb15cf6464", + "check": "arbitrary-send-eth", "impact": "High", "confidence": "Medium" } diff --git a/tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol b/tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol similarity index 100% rename from tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol rename to tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol diff --git a/tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol.0.6.11.ArbitrarySend.json b/tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol.0.6.11.ArbitrarySendEth.json similarity index 88% rename from tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol.0.6.11.ArbitrarySend.json rename to tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol.0.6.11.ArbitrarySendEth.json index cde2f95aa..af4d54ece 100644 --- a/tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol.0.6.11.ArbitrarySend.json +++ b/tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol.0.6.11.ArbitrarySendEth.json @@ -9,9 +9,9 @@ "start": 162, "length": 79, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 11, @@ -29,9 +29,9 @@ "start": 0, "length": 884, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 1, @@ -90,9 +90,9 @@ "start": 196, "length": 38, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 12 @@ -108,9 +108,9 @@ "start": 162, "length": 79, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 11, @@ -128,9 +128,9 @@ "start": 0, "length": 884, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 1, @@ -185,11 +185,11 @@ } } ], - "description": "Test.direct() (tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol#11-13) sends eth to arbitrary user\n\tDangerous calls:\n\t- msg.sender.send(address(this).balance) (tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol#12)\n", - "markdown": "[Test.direct()](tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol#L11-L13) sends eth to arbitrary user\n\tDangerous calls:\n\t- [msg.sender.send(address(this).balance)](tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol#L12)\n", - "first_markdown_element": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol#L11-L13", - "id": "8a1de239f630f10fef9ef6a9c439fc10aad2f6caba7ee43d1a7f7bacf6028f1e", - "check": "arbitrary-send", + "description": "Test.direct() (tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#11-13) sends eth to arbitrary user\n\tDangerous calls:\n\t- msg.sender.send(address(this).balance) (tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#12)\n", + "markdown": "[Test.direct()](tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#L11-L13) sends eth to arbitrary user\n\tDangerous calls:\n\t- [msg.sender.send(address(this).balance)](tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#L12)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#L11-L13", + "id": "51e87e03fc48363e666bb99c1d15beccb50464e1c170eeea5b76ec6fcde643e7", + "check": "arbitrary-send-eth", "impact": "High", "confidence": "Medium" }, @@ -202,9 +202,9 @@ "start": 316, "length": 82, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 19, @@ -222,9 +222,9 @@ "start": 0, "length": 884, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 1, @@ -283,9 +283,9 @@ "start": 352, "length": 39, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 20 @@ -301,9 +301,9 @@ "start": 316, "length": 82, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 19, @@ -321,9 +321,9 @@ "start": 0, "length": 884, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 1, @@ -378,11 +378,11 @@ } } ], - "description": "Test.indirect() (tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol#19-21) sends eth to arbitrary user\n\tDangerous calls:\n\t- destination.send(address(this).balance) (tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol#20)\n", - "markdown": "[Test.indirect()](tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol#L19-L21) sends eth to arbitrary user\n\tDangerous calls:\n\t- [destination.send(address(this).balance)](tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol#L20)\n", - "first_markdown_element": "tests/detectors/arbitrary-send/0.6.11/arbitrary_send.sol#L19-L21", - "id": "f272e05d9741895fc22051ed09afa6ce4af8ad4cd74b3452224dfb29eb4b9df6", - "check": "arbitrary-send", + "description": "Test.indirect() (tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#19-21) sends eth to arbitrary user\n\tDangerous calls:\n\t- destination.send(address(this).balance) (tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#20)\n", + "markdown": "[Test.indirect()](tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#L19-L21) sends eth to arbitrary user\n\tDangerous calls:\n\t- [destination.send(address(this).balance)](tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#L20)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-eth/0.6.11/arbitrary_send_eth.sol#L19-L21", + "id": "0ec491130aac4e23e6d47193bff49ed6029330bca373454b4e34ffba0a2baea6", + "check": "arbitrary-send-eth", "impact": "High", "confidence": "Medium" } diff --git a/tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol b/tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol similarity index 100% rename from tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol rename to tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol diff --git a/tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol.0.7.6.ArbitrarySend.json b/tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol.0.7.6.ArbitrarySendEth.json similarity index 88% rename from tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol.0.7.6.ArbitrarySend.json rename to tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol.0.7.6.ArbitrarySendEth.json index 0f0fe4d57..56afe8cb5 100644 --- a/tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol.0.7.6.ArbitrarySend.json +++ b/tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol.0.7.6.ArbitrarySendEth.json @@ -4,19 +4,19 @@ "elements": [ { "type": "function", - "name": "indirect", + "name": "direct", "source_mapping": { - "start": 316, - "length": 82, + "start": 162, + "length": 79, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ - 19, - 20, - 21 + 11, + 12, + 13 ], "starting_column": 5, "ending_column": 6 @@ -29,9 +29,9 @@ "start": 0, "length": 884, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 1, @@ -80,42 +80,42 @@ "ending_column": 2 } }, - "signature": "indirect()" + "signature": "direct()" } }, { "type": "node", - "name": "destination.send(address(this).balance)", + "name": "msg.sender.send(address(this).balance)", "source_mapping": { - "start": 352, - "length": 39, + "start": 196, + "length": 38, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ - 20 + 12 ], "starting_column": 9, - "ending_column": 48 + "ending_column": 47 }, "type_specific_fields": { "parent": { "type": "function", - "name": "indirect", + "name": "direct", "source_mapping": { - "start": 316, - "length": 82, + "start": 162, + "length": 79, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ - 19, - 20, - 21 + 11, + 12, + 13 ], "starting_column": 5, "ending_column": 6 @@ -128,9 +128,9 @@ "start": 0, "length": 884, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 1, @@ -179,17 +179,17 @@ "ending_column": 2 } }, - "signature": "indirect()" + "signature": "direct()" } } } } ], - "description": "Test.indirect() (tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol#19-21) sends eth to arbitrary user\n\tDangerous calls:\n\t- destination.send(address(this).balance) (tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol#20)\n", - "markdown": "[Test.indirect()](tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol#L19-L21) sends eth to arbitrary user\n\tDangerous calls:\n\t- [destination.send(address(this).balance)](tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol#L20)\n", - "first_markdown_element": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol#L19-L21", - "id": "3bf41470de6f5fec21d1da5741e7d63ee1d3b63cfd2646d697274f4495e3f1a9", - "check": "arbitrary-send", + "description": "Test.direct() (tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#11-13) sends eth to arbitrary user\n\tDangerous calls:\n\t- msg.sender.send(address(this).balance) (tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#12)\n", + "markdown": "[Test.direct()](tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#L11-L13) sends eth to arbitrary user\n\tDangerous calls:\n\t- [msg.sender.send(address(this).balance)](tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#L12)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#L11-L13", + "id": "76af03df5e6d33df8978a2cc00dfe944236aca69ad1b7f107580da1b76121082", + "check": "arbitrary-send-eth", "impact": "High", "confidence": "Medium" }, @@ -197,19 +197,19 @@ "elements": [ { "type": "function", - "name": "direct", + "name": "indirect", "source_mapping": { - "start": 162, - "length": 79, + "start": 316, + "length": 82, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ - 11, - 12, - 13 + 19, + 20, + 21 ], "starting_column": 5, "ending_column": 6 @@ -222,9 +222,9 @@ "start": 0, "length": 884, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 1, @@ -273,42 +273,42 @@ "ending_column": 2 } }, - "signature": "direct()" + "signature": "indirect()" } }, { "type": "node", - "name": "msg.sender.send(address(this).balance)", + "name": "destination.send(address(this).balance)", "source_mapping": { - "start": 196, - "length": 38, + "start": 352, + "length": 39, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ - 12 + 20 ], "starting_column": 9, - "ending_column": 47 + "ending_column": 48 }, "type_specific_fields": { "parent": { "type": "function", - "name": "direct", + "name": "indirect", "source_mapping": { - "start": 162, - "length": 79, + "start": 316, + "length": 82, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ - 11, - 12, - 13 + 19, + 20, + 21 ], "starting_column": 5, "ending_column": 6 @@ -321,9 +321,9 @@ "start": 0, "length": 884, "filename_used": "/GENERIC_PATH", - "filename_relative": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_relative": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "filename_absolute": "/GENERIC_PATH", - "filename_short": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol", + "filename_short": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol", "is_dependency": false, "lines": [ 1, @@ -372,17 +372,17 @@ "ending_column": 2 } }, - "signature": "direct()" + "signature": "indirect()" } } } } ], - "description": "Test.direct() (tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol#11-13) sends eth to arbitrary user\n\tDangerous calls:\n\t- msg.sender.send(address(this).balance) (tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol#12)\n", - "markdown": "[Test.direct()](tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol#L11-L13) sends eth to arbitrary user\n\tDangerous calls:\n\t- [msg.sender.send(address(this).balance)](tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol#L12)\n", - "first_markdown_element": "tests/detectors/arbitrary-send/0.7.6/arbitrary_send.sol#L11-L13", - "id": "90d9178119fb586af18c2298136d7f1af4d33a9b702b94d2ca0fcdbe6ee783c6", - "check": "arbitrary-send", + "description": "Test.indirect() (tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#19-21) sends eth to arbitrary user\n\tDangerous calls:\n\t- destination.send(address(this).balance) (tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#20)\n", + "markdown": "[Test.indirect()](tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#L19-L21) sends eth to arbitrary user\n\tDangerous calls:\n\t- [destination.send(address(this).balance)](tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#L20)\n", + "first_markdown_element": "tests/detectors/arbitrary-send-eth/0.7.6/arbitrary_send_eth.sol#L19-L21", + "id": "2e1bd6d1260cf35450734eb2027a2d964f61858a3aabd0cb459c22cb4da9956b", + "check": "arbitrary-send-eth", "impact": "High", "confidence": "Medium" } diff --git a/tests/test_detectors.py b/tests/test_detectors.py index 30999389c..c01594f5f 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -396,23 +396,23 @@ ALL_TEST_OBJECTS = [ Test(all_detectors.LockedEther, "locked_ether.sol", "0.6.11"), Test(all_detectors.LockedEther, "locked_ether.sol", "0.7.6"), Test( - all_detectors.ArbitrarySend, - "arbitrary_send.sol", + all_detectors.ArbitrarySendEth, + "arbitrary_send_eth.sol", "0.4.25", ), Test( - all_detectors.ArbitrarySend, - "arbitrary_send.sol", + all_detectors.ArbitrarySendEth, + "arbitrary_send_eth.sol", "0.5.16", ), Test( - all_detectors.ArbitrarySend, - "arbitrary_send.sol", + all_detectors.ArbitrarySendEth, + "arbitrary_send_eth.sol", "0.6.11", ), Test( - all_detectors.ArbitrarySend, - "arbitrary_send.sol", + all_detectors.ArbitrarySendEth, + "arbitrary_send_eth.sol", "0.7.6", ), Test( @@ -1272,6 +1272,61 @@ ALL_TEST_OBJECTS = [ "comment.sol", "0.8.2", ), + Test( + all_detectors.ArbitrarySendErc20NoPermit, + "arbitrary_send_erc20.sol", + "0.4.25", + ), + Test( + all_detectors.ArbitrarySendErc20NoPermit, + "arbitrary_send_erc20.sol", + "0.5.16", + ), + Test( + all_detectors.ArbitrarySendErc20NoPermit, + "arbitrary_send_erc20.sol", + "0.6.11", + ), + Test( + all_detectors.ArbitrarySendErc20NoPermit, + "arbitrary_send_erc20.sol", + "0.7.6", + ), + Test( + all_detectors.ArbitrarySendErc20NoPermit, + "arbitrary_send_erc20.sol", + "0.8.0", + ), + Test( + all_detectors.ArbitrarySendErc20NoPermit, + "arbitrary_send_erc20_inheritance.sol", + "0.8.0", + ), + Test( + all_detectors.ArbitrarySendErc20Permit, + "arbitrary_send_erc20_permit.sol", + "0.4.25", + ), + Test( + all_detectors.ArbitrarySendErc20Permit, + "arbitrary_send_erc20_permit.sol", + "0.5.16", + ), + Test( + all_detectors.ArbitrarySendErc20Permit, + "arbitrary_send_erc20_permit.sol", + "0.6.11", + ), + Test( + all_detectors.ArbitrarySendErc20Permit, + "arbitrary_send_erc20_permit.sol", + "0.7.6", + ), + Test( + all_detectors.ArbitrarySendErc20Permit, + "arbitrary_send_erc20_permit.sol", + "0.8.0", + ), ] From f131242fb2b87abd1e3a8f096a93e68d77bb91ca Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 27 Apr 2022 02:43:37 -0500 Subject: [PATCH 045/101] Update README.md (#1181) * Update README.md --- slither/tools/read_storage/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/slither/tools/read_storage/README.md b/slither/tools/read_storage/README.md index 8d9b70fcb..91491a364 100644 --- a/slither/tools/read_storage/README.md +++ b/slither/tools/read_storage/README.md @@ -46,13 +46,13 @@ slither-read-storage 0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 --layout --rpc-u To view only the slot of the `slot0` structure variable, pass `--variable-name slot0`: ```shell -slither-read-storage 0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 --variable-name slot0 --rpc-url https://mainnet.infura.io/v3/04942f7970ef41cc847a147bc64e460e --value +slither-read-storage 0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 --variable-name slot0 --rpc-url $RPC_URL --value ``` To view a member of the `slot0` struct, pass `--struct-var tick` ```shell -slither-read-storage 0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 --variable-name slot0 --rpc-url https://mainnet.infura.io/v3/04942f7970ef41cc847a147bc64e460e --value --struct-var tick +slither-read-storage 0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 --variable-name slot0 --rpc-url $RPC_URL --value --struct-var tick ``` Retrieve the ERC20 balance slot of an account: From 8dfa8033a10c48abe5c5bb9d1ebca9aec29374ff Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Wed, 27 Apr 2022 11:13:50 +0200 Subject: [PATCH 046/101] Document --checklist flag (#1190) Make the --checklist flag public Improve documentation of the related flags --- README.md | 7 +++++-- slither/__main__.py | 39 +++++++++++++++++++++++++-------------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index b160cd9be..4010448be 100644 --- a/README.md +++ b/README.md @@ -40,9 +40,12 @@ Run Slither on a single file: slither tests/uninitialized.sol ``` -For GitHub action integration, see [slither-action](https://github.com/marketplace/actions/slither-action). For additional configuration, see the [usage](https://github.com/trailofbits/slither/wiki/Usage) documentation. +### Integration +- For GitHub action integration, use [slither-action](https://github.com/marketplace/actions/slither-action). +- To generate a Markdown report, use `slither [target] --checklist`. +- To generate a Markdown with GitHub source code highlighting, use `slither [target] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/` (replace `ORG`, `REPO`, `COMMIT`) -Use [solc-select](https://github.com/crytic/solc-select) if your contracts require older versions of solc. +Use [solc-select](https://github.com/crytic/solc-select) if your contracts require older versions of solc. For additional configuration, see the [usage](https://github.com/trailofbits/slither/wiki/Usage) documentation. ### Detectors diff --git a/slither/__main__.py b/slither/__main__.py index bc34e7081..dd195b65b 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -299,6 +299,9 @@ def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-s group_detector = parser.add_argument_group("Detectors") group_printer = parser.add_argument_group("Printers") + group_checklist = parser.add_argument_group( + "Checklist (consider using https://github.com/crytic/slither-action)" + ) group_misc = parser.add_argument_group("Additional options") group_detector.add_argument( @@ -392,6 +395,28 @@ def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-s default=defaults_flag_in_config["show_ignored_findings"], ) + group_checklist.add_argument( + "--checklist", + help="Generate a markdown page with the detector results", + action="store_true", + default=False, + ) + + group_checklist.add_argument( + "--checklist-limit", + help="Limite the number of results per detector in the markdown file", + action="store", + default="", + ) + + group_checklist.add_argument( + "--markdown-root", + type=check_and_sanitize_markdown_root, + help="URL for markdown generation", + action="store", + default="", + ) + group_misc.add_argument( "--json", help='Export the results as a JSON file ("--json -" to export to stdout)', @@ -429,14 +454,6 @@ def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-s default=defaults_flag_in_config["zip_type"], ) - group_misc.add_argument( - "--markdown-root", - type=check_and_sanitize_markdown_root, - help="URL for markdown generation", - action="store", - default="", - ) - group_misc.add_argument( "--disable-color", help="Disable output colorization", @@ -487,12 +504,6 @@ def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-s parser.add_argument("--markdown", help=argparse.SUPPRESS, action=OutputMarkdown, default=False) - group_misc.add_argument( - "--checklist", help=argparse.SUPPRESS, action="store_true", default=False - ) - - group_misc.add_argument("--checklist-limit", help=argparse.SUPPRESS, action="store", default="") - parser.add_argument( "--wiki-detectors", help=argparse.SUPPRESS, action=OutputWiki, default=False ) From 1414de08d8f629a93ae695629bf46c0fab9321ed Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Wed, 27 Apr 2022 11:13:50 +0200 Subject: [PATCH 047/101] Document --checklist flag (#1190) Make the --checklist flag public Improve documentation of the related flags --- .github/workflows/IR.yml | 8 +----- .github/workflows/black.yml | 4 +-- .github/workflows/ci.yml | 5 +--- .github/workflows/detectors.yml | 8 +----- .github/workflows/features.yml | 8 +----- .github/workflows/linter.yml | 3 --- .github/workflows/parser.yml | 8 +----- .github/workflows/pylint.yml | 4 +-- .github/workflows/read_storage.yml | 7 ++---- CONTRIBUTING.md | 5 +--- README.md | 7 ++++-- setup.py | 12 +++++++++ slither/__main__.py | 39 +++++++++++++++++++----------- 13 files changed, 54 insertions(+), 64 deletions(-) diff --git a/.github/workflows/IR.yml b/.github/workflows/IR.yml index 7b5d214a9..0471cb876 100644 --- a/.github/workflows/IR.yml +++ b/.github/workflows/IR.yml @@ -33,13 +33,7 @@ jobs: - name: Install dependencies run: | - python setup.py install - pip install deepdiff - pip install pytest==7.0.1 - pip install typing_extensions==4.1.1 - pip install importlib_metadata==4.8.3 - - pip install "solc-select>=v1.0.0b1" + pip install ".[dev]" solc-select install all solc-select use 0.8.11 diff --git a/.github/workflows/black.yml b/.github/workflows/black.yml index c1a999b80..5292c1b57 100644 --- a/.github/workflows/black.yml +++ b/.github/workflows/black.yml @@ -29,8 +29,8 @@ jobs: - name: Install dependencies run: | - pip install . - pip install deepdiff numpy + pip install ".[dev]" + pip install numpy mkdir -p .github/linters cp pyproject.toml .github/linters diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1252e385a..5add68130 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,11 +65,8 @@ jobs: - name: Install dependencies run: | - python setup.py install - # Used by ci_test.sh - pip install deepdiff + pip install ".[dev]" - pip install "solc-select>=v1.0.0b1" solc-select install all solc-select use 0.5.1 pip install typing_extensions==4.1.1 diff --git a/.github/workflows/detectors.yml b/.github/workflows/detectors.yml index 4d8109297..0745de802 100644 --- a/.github/workflows/detectors.yml +++ b/.github/workflows/detectors.yml @@ -33,14 +33,8 @@ jobs: - name: Install dependencies run: | + pip install ".[dev]" - python setup.py install - pip install deepdiff - pip install pytest==7.0.1 - pip install typing_extensions==4.1.1 - pip install importlib_metadata==4.8.3 - - pip install "solc-select>=v1.0.0b1" solc-select install all solc-select use 0.7.3 - name: Test with pytest diff --git a/.github/workflows/features.yml b/.github/workflows/features.yml index 3763faca0..d26a68980 100644 --- a/.github/workflows/features.yml +++ b/.github/workflows/features.yml @@ -33,14 +33,8 @@ jobs: - name: Install dependencies run: | + pip install ".[dev]" - python setup.py install - pip install deepdiff - pip install pytest==7.0.1 - pip install typing_extensions==4.1.1 - pip install importlib_metadata==4.8.3 - - pip install "solc-select>=v1.0.0b1" solc-select install all solc-select use 0.8.0 diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index c1b31a1c4..f3a66063e 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -29,9 +29,6 @@ jobs: - name: Install dependencies run: | - pip install . - pip install deepdiff numpy - mkdir -p .github/linters cp pyproject.toml .github/linters diff --git a/.github/workflows/parser.yml b/.github/workflows/parser.yml index 4c3566904..d3facfc79 100644 --- a/.github/workflows/parser.yml +++ b/.github/workflows/parser.yml @@ -33,13 +33,7 @@ jobs: - name: Install dependencies run: | - - python setup.py install - pip install deepdiff - pip install pytest==7.0.1 - pip install typing_extensions==4.1.1 - pip install importlib_metadata==4.8.3 - pip install "solc-select>=v1.0.0b1" + pip install ".[dev]" - name: Install solc run: | diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml index 692a981ab..199d1bea4 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/pylint.yml @@ -29,8 +29,8 @@ jobs: - name: Install dependencies run: | - pip install . - pip install deepdiff numpy + pip install ".[dev]" + pip install numpy mkdir -p .github/linters cp pyproject.toml .github/linters diff --git a/.github/workflows/read_storage.yml b/.github/workflows/read_storage.yml index 2ca618a19..b4c1d545d 100644 --- a/.github/workflows/read_storage.yml +++ b/.github/workflows/read_storage.yml @@ -35,11 +35,8 @@ jobs: - name: Install python dependencies run: | - python3 setup.py install - pip install web3 pytest deepdiff solc-select - pip install pytest==7.0.1 - pip install typing_extensions==4.1.1 - pip install importlib_metadata==4.8.3 + pip install ".[dev]" + pip install web3 solc-select install 0.8.1 solc-select install 0.8.10 solc-select use 0.8.1 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e93b2557c..75c470456 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,10 +23,7 @@ Some pull request guidelines: ## Development Environment Instructions for installing a development version of Slither can be found in our [wiki](https://github.com/crytic/slither/wiki/Developer-installation). -To run the unit tests, you need -- `deepdiff` installed (`pip install deepdiff`). -- `pycov` installed (`pip install pytest-cov`). -- [`solc-select`](https://github.com/crytic/solc-select) installed. +To run the unit tests, you need clone this repo and run `pip install ".[dev]"`. ### Linters diff --git a/README.md b/README.md index b160cd9be..4010448be 100644 --- a/README.md +++ b/README.md @@ -40,9 +40,12 @@ Run Slither on a single file: slither tests/uninitialized.sol ``` -For GitHub action integration, see [slither-action](https://github.com/marketplace/actions/slither-action). For additional configuration, see the [usage](https://github.com/trailofbits/slither/wiki/Usage) documentation. +### Integration +- For GitHub action integration, use [slither-action](https://github.com/marketplace/actions/slither-action). +- To generate a Markdown report, use `slither [target] --checklist`. +- To generate a Markdown with GitHub source code highlighting, use `slither [target] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/` (replace `ORG`, `REPO`, `COMMIT`) -Use [solc-select](https://github.com/crytic/solc-select) if your contracts require older versions of solc. +Use [solc-select](https://github.com/crytic/solc-select) if your contracts require older versions of solc. For additional configuration, see the [usage](https://github.com/trailofbits/slither/wiki/Usage) documentation. ### Detectors diff --git a/setup.py b/setup.py index 1069f8aef..5a0548a24 100644 --- a/setup.py +++ b/setup.py @@ -17,6 +17,18 @@ setup( # "crytic-compile>=0.2.3", "crytic-compile", ], + extras_require={ + "dev": [ + "black>=22.3.0", + "pylint>=2.13.4", + "pytest==7.0.1", + "pytest-cov", + "deepdiff", + "typing_extensions==4.1.1", + "importlib_metadata==4.8.3", + "solc-select>=v1.0.0b1", + ] + }, dependency_links=["git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile"], license="AGPL-3.0", long_description=long_description, diff --git a/slither/__main__.py b/slither/__main__.py index bc34e7081..dd195b65b 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -299,6 +299,9 @@ def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-s group_detector = parser.add_argument_group("Detectors") group_printer = parser.add_argument_group("Printers") + group_checklist = parser.add_argument_group( + "Checklist (consider using https://github.com/crytic/slither-action)" + ) group_misc = parser.add_argument_group("Additional options") group_detector.add_argument( @@ -392,6 +395,28 @@ def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-s default=defaults_flag_in_config["show_ignored_findings"], ) + group_checklist.add_argument( + "--checklist", + help="Generate a markdown page with the detector results", + action="store_true", + default=False, + ) + + group_checklist.add_argument( + "--checklist-limit", + help="Limite the number of results per detector in the markdown file", + action="store", + default="", + ) + + group_checklist.add_argument( + "--markdown-root", + type=check_and_sanitize_markdown_root, + help="URL for markdown generation", + action="store", + default="", + ) + group_misc.add_argument( "--json", help='Export the results as a JSON file ("--json -" to export to stdout)', @@ -429,14 +454,6 @@ def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-s default=defaults_flag_in_config["zip_type"], ) - group_misc.add_argument( - "--markdown-root", - type=check_and_sanitize_markdown_root, - help="URL for markdown generation", - action="store", - default="", - ) - group_misc.add_argument( "--disable-color", help="Disable output colorization", @@ -487,12 +504,6 @@ def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-s parser.add_argument("--markdown", help=argparse.SUPPRESS, action=OutputMarkdown, default=False) - group_misc.add_argument( - "--checklist", help=argparse.SUPPRESS, action="store_true", default=False - ) - - group_misc.add_argument("--checklist-limit", help=argparse.SUPPRESS, action="store", default="") - parser.add_argument( "--wiki-detectors", help=argparse.SUPPRESS, action=OutputWiki, default=False ) From aca172b6d7a4f397a61f5c7be90b22e3edf2fd39 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 21 Apr 2022 09:18:34 -0500 Subject: [PATCH 048/101] fix language and pin linter versions --- CONTRIBUTING.md | 2 +- setup.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 75c470456..75cf4ecdc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,7 +23,7 @@ Some pull request guidelines: ## Development Environment Instructions for installing a development version of Slither can be found in our [wiki](https://github.com/crytic/slither/wiki/Developer-installation). -To run the unit tests, you need clone this repo and run `pip install ".[dev]"`. +To run the unit tests, you need clone this repository and run `pip install ".[dev]"`. ### Linters diff --git a/setup.py b/setup.py index 5a0548a24..d21934d51 100644 --- a/setup.py +++ b/setup.py @@ -19,8 +19,8 @@ setup( ], extras_require={ "dev": [ - "black>=22.3.0", - "pylint>=2.13.4", + "black==22.3.0", + "pylint==2.13.4", "pytest==7.0.1", "pytest-cov", "deepdiff", From 21d5dba4020836dc874534b789ef72cb9abcd1d7 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 29 Apr 2022 00:21:20 -0500 Subject: [PATCH 049/101] remove dependencies in lints --- .github/workflows/black.yml | 3 --- .github/workflows/ci.yml | 2 -- .github/workflows/pylint.yml | 3 --- 3 files changed, 8 deletions(-) diff --git a/.github/workflows/black.yml b/.github/workflows/black.yml index 5292c1b57..94eafffeb 100644 --- a/.github/workflows/black.yml +++ b/.github/workflows/black.yml @@ -29,9 +29,6 @@ jobs: - name: Install dependencies run: | - pip install ".[dev]" - pip install numpy - mkdir -p .github/linters cp pyproject.toml .github/linters diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5add68130..831f205dc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -64,9 +64,7 @@ jobs: python-version: 3.6 - name: Install dependencies run: | - pip install ".[dev]" - solc-select install all solc-select use 0.5.1 pip install typing_extensions==4.1.1 diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml index 199d1bea4..2fe575c79 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/pylint.yml @@ -29,9 +29,6 @@ jobs: - name: Install dependencies run: | - pip install ".[dev]" - pip install numpy - mkdir -p .github/linters cp pyproject.toml .github/linters From 562af10616d450f53fa60563f18e1cefb4208f00 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Wed, 4 May 2022 09:58:57 +0200 Subject: [PATCH 050/101] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b160cd9be..106df1baf 100644 --- a/README.md +++ b/README.md @@ -225,5 +225,7 @@ Title | Usage | Authors | Venue [Smart Contract Repair](https://arxiv.org/pdf/1912.05823.pdf) | Rely on Slither’s vulnerabilities detectors | Xiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik Roychoudhury | TOSEM 20 [Demystifying Loops in Smart Contracts](https://www.microsoft.com/en-us/research/uploads/prod/2020/08/loops_solidity__camera_ready-5f3fec3f15c69.pdf) | Leverage data dependency through Slither | Ben Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil Dillig | ASE 20 [Trace-Based Dynamic Gas Estimation of Loops in Smart Contracts](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9268144) | Use Slither’s CFG to detect loops | Chunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang Hu | IEEE Open J. Comput. Soc. 1 (2020) +[SAILFISH: Vetting Smart Contract State-Inconsistency Bugs in Seconds](https://arxiv.org/pdf/2104.08638.pdf) | Rely on SlithIR to build a *storage dependency graph* | Priyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel, and Giovanni Vigna | S&P 22 +[SolType: Refinement Types for Arithmetic Overflow in Solidity](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9268144) | Use Slither as front end to build refinement type system | Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 If you are using Slither on an academic work, consider applying to the [Crytic $10k Research Prize](https://blog.trailofbits.com/2019/11/13/announcing-the-crytic-10k-research-prize/). From c1b5a1ee5092631ce2acb8fe9980d1eb1d4aba7d Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Wed, 4 May 2022 09:59:57 +0200 Subject: [PATCH 051/101] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 106df1baf..dd48ce7dd 100644 --- a/README.md +++ b/README.md @@ -226,6 +226,6 @@ Title | Usage | Authors | Venue [Demystifying Loops in Smart Contracts](https://www.microsoft.com/en-us/research/uploads/prod/2020/08/loops_solidity__camera_ready-5f3fec3f15c69.pdf) | Leverage data dependency through Slither | Ben Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil Dillig | ASE 20 [Trace-Based Dynamic Gas Estimation of Loops in Smart Contracts](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9268144) | Use Slither’s CFG to detect loops | Chunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang Hu | IEEE Open J. Comput. Soc. 1 (2020) [SAILFISH: Vetting Smart Contract State-Inconsistency Bugs in Seconds](https://arxiv.org/pdf/2104.08638.pdf) | Rely on SlithIR to build a *storage dependency graph* | Priyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel, and Giovanni Vigna | S&P 22 -[SolType: Refinement Types for Arithmetic Overflow in Solidity](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9268144) | Use Slither as front end to build refinement type system | Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 +[SolType: Refinement Types for Arithmetic Overflow in Solidity](https://arxiv.org/abs/2110.00677) | Use Slither as front end to build refinement type system | Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 If you are using Slither on an academic work, consider applying to the [Crytic $10k Research Prize](https://blog.trailofbits.com/2019/11/13/announcing-the-crytic-10k-research-prize/). From 488dbaec1e91e922646374bd30e07c8a025df293 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Wed, 4 May 2022 10:23:30 +0200 Subject: [PATCH 052/101] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index dd48ce7dd..bf59e7bf3 100644 --- a/README.md +++ b/README.md @@ -227,5 +227,6 @@ Title | Usage | Authors | Venue [Trace-Based Dynamic Gas Estimation of Loops in Smart Contracts](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9268144) | Use Slither’s CFG to detect loops | Chunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang Hu | IEEE Open J. Comput. Soc. 1 (2020) [SAILFISH: Vetting Smart Contract State-Inconsistency Bugs in Seconds](https://arxiv.org/pdf/2104.08638.pdf) | Rely on SlithIR to build a *storage dependency graph* | Priyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel, and Giovanni Vigna | S&P 22 [SolType: Refinement Types for Arithmetic Overflow in Solidity](https://arxiv.org/abs/2110.00677) | Use Slither as front end to build refinement type system | Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 +[Do Not Rug on Me: Leveraging Machine Learning Techniques for Automated Scam Detection](https://www.mdpi.com/2227-7390/10/6/949) | Use Slither to extract tokens' features (mintable, pausable, ..) | Mazorra, Bruno, Victor Adan, and Vanesa Daza | Mathematics 10.6 (2022) If you are using Slither on an academic work, consider applying to the [Crytic $10k Research Prize](https://blog.trailofbits.com/2019/11/13/announcing-the-crytic-10k-research-prize/). From d5d95feee3810dec07ea4886535232512326a033 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 4 May 2022 07:21:19 -0500 Subject: [PATCH 053/101] do not warn of digit count if checksummed address (#1193) --- .../detectors/statements/too_many_digits.py | 12 +- .../0.4.25/too_many_digits.sol | 3 + ..._many_digits.sol.0.4.25.TooManyDigits.json | 70 +++++++--- .../0.5.16/too_many_digits.sol | 3 + ..._many_digits.sol.0.5.16.TooManyDigits.json | 70 +++++++--- .../0.6.11/too_many_digits.sol | 4 + ..._many_digits.sol.0.6.11.TooManyDigits.json | 80 +++++++++--- .../too-many-digits/0.7.6/too_many_digits.sol | 5 +- ...o_many_digits.sol.0.7.6.TooManyDigits.json | 120 +++++++++++------- 9 files changed, 260 insertions(+), 107 deletions(-) diff --git a/slither/detectors/statements/too_many_digits.py b/slither/detectors/statements/too_many_digits.py index 734bc4e30..a6387db78 100644 --- a/slither/detectors/statements/too_many_digits.py +++ b/slither/detectors/statements/too_many_digits.py @@ -2,9 +2,19 @@ Module detecting numbers with too many digits. """ +import re from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification from slither.slithir.variables import Constant +_HEX_ADDRESS_REGEXP = re.compile("(0x)?[0-9a-f]{40}", re.IGNORECASE | re.ASCII) + + +def is_hex_address(value) -> bool: + """ + Checks if the given string of text type is an address in hexadecimal encoded form. + """ + return _HEX_ADDRESS_REGEXP.fullmatch(value) is not None + class TooManyDigits(AbstractDetector): """ @@ -58,7 +68,7 @@ Use: if isinstance(read, Constant): # read.value can return an int or a str. Convert it to str value_as_str = read.original_value - if "00000" in value_as_str: + if "00000" in value_as_str and not is_hex_address(value_as_str): # Info to be printed ret.append(node) return ret diff --git a/tests/detectors/too-many-digits/0.4.25/too_many_digits.sol b/tests/detectors/too-many-digits/0.4.25/too_many_digits.sol index cd35366a9..523be3490 100644 --- a/tests/detectors/too-many-digits/0.4.25/too_many_digits.sol +++ b/tests/detectors/too-many-digits/0.4.25/too_many_digits.sol @@ -37,4 +37,7 @@ contract C { uint x = 1 ether; } + function good2() external { + address x = 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e; + } } diff --git a/tests/detectors/too-many-digits/0.4.25/too_many_digits.sol.0.4.25.TooManyDigits.json b/tests/detectors/too-many-digits/0.4.25/too_many_digits.sol.0.4.25.TooManyDigits.json index 1ece15736..00a01bfab 100644 --- a/tests/detectors/too-many-digits/0.4.25/too_many_digits.sol.0.4.25.TooManyDigits.json +++ b/tests/detectors/too-many-digits/0.4.25/too_many_digits.sol.0.4.25.TooManyDigits.json @@ -31,7 +31,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.4.25/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -75,7 +75,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -131,7 +134,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.4.25/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -175,7 +178,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -224,7 +230,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.4.25/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -268,7 +274,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -322,7 +331,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.4.25/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -366,7 +375,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -417,7 +429,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.4.25/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -461,7 +473,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -517,7 +532,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.4.25/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -561,7 +576,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -612,7 +630,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.4.25/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -656,7 +674,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -712,7 +733,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.4.25/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -756,7 +777,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -807,7 +831,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.4.25/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -851,7 +875,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -907,7 +934,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.4.25/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -951,7 +978,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 diff --git a/tests/detectors/too-many-digits/0.5.16/too_many_digits.sol b/tests/detectors/too-many-digits/0.5.16/too_many_digits.sol index cd35366a9..523be3490 100644 --- a/tests/detectors/too-many-digits/0.5.16/too_many_digits.sol +++ b/tests/detectors/too-many-digits/0.5.16/too_many_digits.sol @@ -37,4 +37,7 @@ contract C { uint x = 1 ether; } + function good2() external { + address x = 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e; + } } diff --git a/tests/detectors/too-many-digits/0.5.16/too_many_digits.sol.0.5.16.TooManyDigits.json b/tests/detectors/too-many-digits/0.5.16/too_many_digits.sol.0.5.16.TooManyDigits.json index 012c9cb75..abd400cb4 100644 --- a/tests/detectors/too-many-digits/0.5.16/too_many_digits.sol.0.5.16.TooManyDigits.json +++ b/tests/detectors/too-many-digits/0.5.16/too_many_digits.sol.0.5.16.TooManyDigits.json @@ -31,7 +31,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.5.16/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -75,7 +75,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -131,7 +134,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.5.16/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -175,7 +178,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -224,7 +230,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.5.16/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -268,7 +274,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -322,7 +331,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.5.16/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -366,7 +375,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -417,7 +429,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.5.16/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -461,7 +473,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -517,7 +532,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.5.16/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -561,7 +576,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -612,7 +630,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.5.16/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -656,7 +674,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -712,7 +733,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.5.16/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -756,7 +777,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -807,7 +831,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.5.16/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -851,7 +875,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 @@ -907,7 +934,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 999, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.5.16/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -951,7 +978,10 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43 ], "starting_column": 1, "ending_column": 2 diff --git a/tests/detectors/too-many-digits/0.6.11/too_many_digits.sol b/tests/detectors/too-many-digits/0.6.11/too_many_digits.sol index cd35366a9..315212c81 100644 --- a/tests/detectors/too-many-digits/0.6.11/too_many_digits.sol +++ b/tests/detectors/too-many-digits/0.6.11/too_many_digits.sol @@ -36,5 +36,9 @@ contract C { uint x = 1 ether; } + + function good2() external { + address x = 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e; + } } diff --git a/tests/detectors/too-many-digits/0.6.11/too_many_digits.sol.0.6.11.TooManyDigits.json b/tests/detectors/too-many-digits/0.6.11/too_many_digits.sol.0.6.11.TooManyDigits.json index 4e96d8149..1a97ebd7b 100644 --- a/tests/detectors/too-many-digits/0.6.11/too_many_digits.sol.0.6.11.TooManyDigits.json +++ b/tests/detectors/too-many-digits/0.6.11/too_many_digits.sol.0.6.11.TooManyDigits.json @@ -31,7 +31,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 1000, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.6.11/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -75,7 +75,11 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43, + 44 ], "starting_column": 1, "ending_column": 2 @@ -131,7 +135,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 1000, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.6.11/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -175,7 +179,11 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43, + 44 ], "starting_column": 1, "ending_column": 2 @@ -224,7 +232,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 1000, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.6.11/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -268,7 +276,11 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43, + 44 ], "starting_column": 1, "ending_column": 2 @@ -322,7 +334,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 1000, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.6.11/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -366,7 +378,11 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43, + 44 ], "starting_column": 1, "ending_column": 2 @@ -417,7 +433,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 1000, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.6.11/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -461,7 +477,11 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43, + 44 ], "starting_column": 1, "ending_column": 2 @@ -517,7 +537,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 1000, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.6.11/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -561,7 +581,11 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43, + 44 ], "starting_column": 1, "ending_column": 2 @@ -612,7 +636,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 1000, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.6.11/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -656,7 +680,11 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43, + 44 ], "starting_column": 1, "ending_column": 2 @@ -712,7 +740,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 1000, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.6.11/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -756,7 +784,11 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43, + 44 ], "starting_column": 1, "ending_column": 2 @@ -807,7 +839,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 1000, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.6.11/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -851,7 +883,11 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43, + 44 ], "starting_column": 1, "ending_column": 2 @@ -907,7 +943,7 @@ "name": "C", "source_mapping": { "start": 28, - "length": 897, + "length": 1000, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.6.11/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -951,7 +987,11 @@ 37, 38, 39, - 40 + 40, + 41, + 42, + 43, + 44 ], "starting_column": 1, "ending_column": 2 diff --git a/tests/detectors/too-many-digits/0.7.6/too_many_digits.sol b/tests/detectors/too-many-digits/0.7.6/too_many_digits.sol index 48cbfdb55..dfd4979b7 100644 --- a/tests/detectors/too-many-digits/0.7.6/too_many_digits.sol +++ b/tests/detectors/too-many-digits/0.7.6/too_many_digits.sol @@ -1,4 +1,4 @@ -// pragma solidity ^0.5.1; + contract C { uint balance; @@ -36,4 +36,7 @@ contract C { uint x = 1 ether; } + function good2() external { + address x = 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e; + } } diff --git a/tests/detectors/too-many-digits/0.7.6/too_many_digits.sol.0.7.6.TooManyDigits.json b/tests/detectors/too-many-digits/0.7.6/too_many_digits.sol.0.7.6.TooManyDigits.json index eb97dc505..372b28886 100644 --- a/tests/detectors/too-many-digits/0.7.6/too_many_digits.sol.0.7.6.TooManyDigits.json +++ b/tests/detectors/too-many-digits/0.7.6/too_many_digits.sol.0.7.6.TooManyDigits.json @@ -6,7 +6,7 @@ "type": "function", "name": "f", "source_mapping": { - "start": 177, + "start": 151, "length": 195, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", @@ -30,8 +30,8 @@ "type": "contract", "name": "C", "source_mapping": { - "start": 28, - "length": 815, + "start": 2, + "length": 917, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -74,7 +74,10 @@ 36, 37, 38, - 39 + 39, + 40, + 41, + 42 ], "starting_column": 1, "ending_column": 2 @@ -87,7 +90,7 @@ "type": "node", "name": "x2 = 0x0000000000001", "source_mapping": { - "start": 237, + "start": 211, "length": 25, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", @@ -105,7 +108,7 @@ "type": "function", "name": "f", "source_mapping": { - "start": 177, + "start": 151, "length": 195, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", @@ -129,8 +132,8 @@ "type": "contract", "name": "C", "source_mapping": { - "start": 28, - "length": 815, + "start": 2, + "length": 917, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -173,7 +176,10 @@ 36, 37, 38, - 39 + 39, + 40, + 41, + 42 ], "starting_column": 1, "ending_column": 2 @@ -199,7 +205,7 @@ "type": "function", "name": "f", "source_mapping": { - "start": 177, + "start": 151, "length": 195, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", @@ -223,8 +229,8 @@ "type": "contract", "name": "C", "source_mapping": { - "start": 28, - "length": 815, + "start": 2, + "length": 917, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -267,7 +273,10 @@ 36, 37, 38, - 39 + 39, + 40, + 41, + 42 ], "starting_column": 1, "ending_column": 2 @@ -280,7 +289,7 @@ "type": "node", "name": "x3 = 1000000000000000000", "source_mapping": { - "start": 272, + "start": 246, "length": 29, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", @@ -298,7 +307,7 @@ "type": "function", "name": "f", "source_mapping": { - "start": 177, + "start": 151, "length": 195, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", @@ -322,8 +331,8 @@ "type": "contract", "name": "C", "source_mapping": { - "start": 28, - "length": 815, + "start": 2, + "length": 917, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -366,7 +375,10 @@ 36, 37, 38, - 39 + 39, + 40, + 41, + 42 ], "starting_column": 1, "ending_column": 2 @@ -392,7 +404,7 @@ "type": "function", "name": "f", "source_mapping": { - "start": 177, + "start": 151, "length": 195, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", @@ -416,8 +428,8 @@ "type": "contract", "name": "C", "source_mapping": { - "start": 28, - "length": 815, + "start": 2, + "length": 917, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -460,7 +472,10 @@ 36, 37, 38, - 39 + 39, + 40, + 41, + 42 ], "starting_column": 1, "ending_column": 2 @@ -473,7 +488,7 @@ "type": "node", "name": "x1 = 0x000001", "source_mapping": { - "start": 209, + "start": 183, "length": 18, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", @@ -491,7 +506,7 @@ "type": "function", "name": "f", "source_mapping": { - "start": 177, + "start": 151, "length": 195, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", @@ -515,8 +530,8 @@ "type": "contract", "name": "C", "source_mapping": { - "start": 28, - "length": 815, + "start": 2, + "length": 917, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -559,7 +574,10 @@ 36, 37, 38, - 39 + 39, + 40, + 41, + 42 ], "starting_column": 1, "ending_column": 2 @@ -585,7 +603,7 @@ "type": "function", "name": "f", "source_mapping": { - "start": 177, + "start": 151, "length": 195, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", @@ -609,8 +627,8 @@ "type": "contract", "name": "C", "source_mapping": { - "start": 28, - "length": 815, + "start": 2, + "length": 917, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -653,7 +671,10 @@ 36, 37, 38, - 39 + 39, + 40, + 41, + 42 ], "starting_column": 1, "ending_column": 2 @@ -666,7 +687,7 @@ "type": "node", "name": "x4 = 100000", "source_mapping": { - "start": 311, + "start": 285, "length": 16, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", @@ -684,7 +705,7 @@ "type": "function", "name": "f", "source_mapping": { - "start": 177, + "start": 151, "length": 195, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", @@ -708,8 +729,8 @@ "type": "contract", "name": "C", "source_mapping": { - "start": 28, - "length": 815, + "start": 2, + "length": 917, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -752,7 +773,10 @@ 36, 37, 38, - 39 + 39, + 40, + 41, + 42 ], "starting_column": 1, "ending_column": 2 @@ -778,7 +802,7 @@ "type": "function", "name": "h", "source_mapping": { - "start": 456, + "start": 430, "length": 113, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", @@ -800,8 +824,8 @@ "type": "contract", "name": "C", "source_mapping": { - "start": 28, - "length": 815, + "start": 2, + "length": 917, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -844,7 +868,10 @@ 36, 37, 38, - 39 + 39, + 40, + 41, + 42 ], "starting_column": 1, "ending_column": 2 @@ -857,7 +884,7 @@ "type": "node", "name": "x2 = 100000", "source_mapping": { - "start": 512, + "start": 486, "length": 16, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", @@ -875,7 +902,7 @@ "type": "function", "name": "h", "source_mapping": { - "start": 456, + "start": 430, "length": 113, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", @@ -897,8 +924,8 @@ "type": "contract", "name": "C", "source_mapping": { - "start": 28, - "length": 815, + "start": 2, + "length": 917, "filename_used": "/GENERIC_PATH", "filename_relative": "tests/detectors/too-many-digits/0.7.6/too_many_digits.sol", "filename_absolute": "/GENERIC_PATH", @@ -941,7 +968,10 @@ 36, 37, 38, - 39 + 39, + 40, + 41, + 42 ], "starting_column": 1, "ending_column": 2 From 39f558504aa13ca486b3159867840d2ab61cc4ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Schoentgen?= Date: Wed, 4 May 2022 14:22:25 +0200 Subject: [PATCH 054/101] Optimization: use `str.startswith(tuple)`, and `str.endswith(tuple)`, when revelant (#1186) --- slither/core/declarations/solidity_variables.py | 2 +- slither/detectors/naming_convention/naming_convention.py | 2 +- slither/solc_parsing/yul/parse_yul.py | 4 ++-- slither/utils/integer_conversion.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/slither/core/declarations/solidity_variables.py b/slither/core/declarations/solidity_variables.py index 08ff0c7bc..f57e2a787 100644 --- a/slither/core/declarations/solidity_variables.py +++ b/slither/core/declarations/solidity_variables.py @@ -104,7 +104,7 @@ class SolidityVariable(Context): # dev function, will be removed once the code is stable def _check_name(self, name: str): # pylint: disable=no-self-use - assert name in SOLIDITY_VARIABLES or name.endswith("_slot") or name.endswith("_offset") + assert name in SOLIDITY_VARIABLES or name.endswith(("_slot", "_offset")) @property def state_variable(self): diff --git a/slither/detectors/naming_convention/naming_convention.py b/slither/detectors/naming_convention/naming_convention.py index 34aba8dc2..706f4ae6c 100644 --- a/slither/detectors/naming_convention/naming_convention.py +++ b/slither/detectors/naming_convention/naming_convention.py @@ -94,7 +94,7 @@ Solidity defines a [naming convention](https://solidity.readthedocs.io/en/v0.4.2 "private", ] and self.is_mixed_case_with_underscore(func.name): continue - if func.name.startswith("echidna_") or func.name.startswith("crytic_"): + if func.name.startswith(("echidna_", "crytic_")): continue info = ["Function ", func, " is not in mixedCase\n"] diff --git a/slither/solc_parsing/yul/parse_yul.py b/slither/solc_parsing/yul/parse_yul.py index 0c7b48091..31c74795d 100644 --- a/slither/solc_parsing/yul/parse_yul.py +++ b/slither/solc_parsing/yul/parse_yul.py @@ -737,7 +737,7 @@ def _parse_yul_magic_suffixes(name: str, root: YulScope) -> Optional[Expression] # Currently SlithIR doesnt support raw access to memory # So things like .offset/.slot will return the variable # Instaed of the actual offset/slot - if name.endswith("_slot") or name.endswith(".slot"): + if name.endswith(("_slot", ".slot")): potential_name = name[:-5] variable_found = _check_for_state_variable_name(root, potential_name) if variable_found: @@ -745,7 +745,7 @@ def _parse_yul_magic_suffixes(name: str, root: YulScope) -> Optional[Expression] var = root.function.get_local_variable_from_name(potential_name) if var and var.is_storage: return Identifier(var) - if name.endswith("_offset") or name.endswith(".offset"): + if name.endswith(("_offset", ".offset")): potential_name = name[:-7] variable_found = _check_for_state_variable_name(root, potential_name) if variable_found: diff --git a/slither/utils/integer_conversion.py b/slither/utils/integer_conversion.py index d4a3b4847..8481e8641 100644 --- a/slither/utils/integer_conversion.py +++ b/slither/utils/integer_conversion.py @@ -7,7 +7,7 @@ from slither.exceptions import SlitherError def convert_string_to_int(val: Union[str, int]) -> int: if isinstance(val, int): return val - if val.startswith("0x") or val.startswith("0X"): + if val.startswith(("0x", "0X")): return int(val, 16) if "e" in val or "E" in val: From 33922541bbdb5bc3bda97acbbfc08e7ec1d40a15 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Wed, 11 May 2022 09:37:25 +0200 Subject: [PATCH 055/101] Update README (#1207) * Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 4010448be..f1e491103 100644 --- a/README.md +++ b/README.md @@ -228,5 +228,8 @@ Title | Usage | Authors | Venue [Smart Contract Repair](https://arxiv.org/pdf/1912.05823.pdf) | Rely on Slither’s vulnerabilities detectors | Xiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik Roychoudhury | TOSEM 20 [Demystifying Loops in Smart Contracts](https://www.microsoft.com/en-us/research/uploads/prod/2020/08/loops_solidity__camera_ready-5f3fec3f15c69.pdf) | Leverage data dependency through Slither | Ben Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil Dillig | ASE 20 [Trace-Based Dynamic Gas Estimation of Loops in Smart Contracts](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9268144) | Use Slither’s CFG to detect loops | Chunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang Hu | IEEE Open J. Comput. Soc. 1 (2020) +[SAILFISH: Vetting Smart Contract State-Inconsistency Bugs in Seconds](https://arxiv.org/pdf/2104.08638.pdf) | Rely on SlithIR to build a *storage dependency graph* | Priyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel, and Giovanni Vigna | S&P 22 +[SolType: Refinement Types for Arithmetic Overflow in Solidity](https://arxiv.org/abs/2110.00677) | Use Slither as frontend to build refinement type system | Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 +[Do Not Rug on Me: Leveraging Machine Learning Techniques for Automated Scam Detection](https://www.mdpi.com/2227-7390/10/6/949) | Use Slither to extract tokens' features (mintable, pausable, ..) | Mazorra, Bruno, Victor Adan, and Vanesa Daza | Mathematics 10.6 (2022) If you are using Slither on an academic work, consider applying to the [Crytic $10k Research Prize](https://blog.trailofbits.com/2019/11/13/announcing-the-crytic-10k-research-prize/). From fdf346f530e712476dcd86a4b63f5503c3c9352a Mon Sep 17 00:00:00 2001 From: Henrik Brodin <90325907+hbrodin@users.noreply.github.com> Date: Thu, 12 May 2022 12:37:35 +0200 Subject: [PATCH 056/101] Hbrodin/ssa array tests (#1205) * Initial array test cases. Not asserting anything yet. * Test cases for SSA IR related to arrays --- tests/test_ssa_generation.py | 131 ++++++++++++++++++++++++++++++++++- 1 file changed, 129 insertions(+), 2 deletions(-) diff --git a/tests/test_ssa_generation.py b/tests/test_ssa_generation.py index 69bac2802..f002ec4e1 100644 --- a/tests/test_ssa_generation.py +++ b/tests/test_ssa_generation.py @@ -1,3 +1,4 @@ +# pylint: disable=too-many-lines import os import pathlib from argparse import ArgumentTypeError @@ -25,10 +26,15 @@ from slither.slithir.operations import ( Binary, BinaryType, InternalCall, + Index, ) from slither.slithir.utils.ssa import is_used_later -from slither.slithir.variables import Constant, ReferenceVariable, LocalIRVariable, StateIRVariable - +from slither.slithir.variables import ( + Constant, + ReferenceVariable, + LocalIRVariable, + StateIRVariable, +) # Directory of currently executing script. Will be used as basis for temporary file names. SCRIPT_DIR = pathlib.Path(getsourcefile(lambda: 0)).parent @@ -782,6 +788,127 @@ def test_multiple_named_args_returns(): ) +@pytest.mark.xfail(reason="Tests for wanted state of SSA IR, not current.") +def test_memory_array(): + src = """ + contract MemArray { + struct A { + uint val1; + uint val2; + } + + function test_array() internal { + A[] memory a= new A[](4); + // Create REF_0 -> a_1[2] + accept_array_entry(a[2]); + + // Create REF_1 -> a_1[3] + accept_array_entry(a[3]); + + A memory alocal; + accept_array_entry(alocal); + + } + + // val_1 = ϕ(val_0, REF_0, REF_1, alocal_1) + // val_0 is an unknown external value + function accept_array_entry(A memory val) public returns (uint) { + uint zero = 0; + b(zero); + // Create REF_2 -> val_1.val1 + return b(val.val1); + } + + function b(uint arg) public returns (uint){ + // arg_1 = ϕ(arg_0, zero_1, REF_2) + return arg + 1; + } + }""" + with slither_from_source(src) as slither: + c = slither.contracts[0] + + ftest_array, faccept, fb = c.functions + + # Locate REF_0/REF_1/alocal (they are all args to the call) + accept_args = [x.arguments[0] for x in get_ssa_of_type(ftest_array, InternalCall)] + + # Check entrypoint of accept_array_entry, it should contain a phi-node + # of expected rvalues + [phi_entry_accept] = get_ssa_of_type(faccept.entry_point, Phi) + for arg in accept_args: + assert arg in phi_entry_accept.rvalues + # NOTE(hbrodin): There should be an additional val_0 in the phi-node. + # That additional val_0 indicates an external caller of this function. + assert len(phi_entry_accept.rvalues) == len(accept_args) + 1 + + # Args used to invoke b + b_args = [x.arguments[0] for x in get_ssa_of_type(faccept, InternalCall)] + + # Check entrypoint of B, it should contain a phi-node of expected + # rvalues + [phi_entry_b] = get_ssa_of_type(fb.entry_point, Phi) + for arg in b_args: + assert arg in phi_entry_b.rvalues + + # NOTE(hbrodin): There should be an additional arg_0 (see comment about phi_entry_accept). + assert len(phi_entry_b.rvalues) == len(b_args) + 1 + + +@pytest.mark.xfail(reason="Tests for wanted state of SSA IR, not current.") +def test_storage_array(): + src = """ + contract StorageArray { + struct A { + uint val1; + uint val2; + } + + // NOTE(hbrodin): a is never written, should only become a_0. Same for astorage (astorage_0). Phi-nodes at entry + // should only add new versions of a state variable if it is actually written. + A[] a; + A astorage; + + function test_array() internal { + accept_array_entry(a[2]); + accept_array_entry(a[3]); + accept_array_entry(astorage); + } + + function accept_array_entry(A storage val) internal returns (uint) { + // val is either a[2], a[3] or astorage_0. Ideally this could be identified. + uint five = 5; + + // NOTE(hbrodin): If the following line is enabled, there would ideally be a phi-node representing writes + // to either a or astorage. + //val.val2 = 4; + b(five); + return b(val.val1); + } + + function b(uint value) public returns (uint){ + // Expect a phi-node at the entrypoint + // value_1 = ϕ(value_0, five_0, REF_x), where REF_x is the reference to val.val1 in accept_array_entry. + return value + 1; + } + }""" + with slither_from_source(src) as slither: + c = slither.contracts[0] + _dump_functions(c) + ftest, faccept, fb = c.functions + + # None of a/astorage is written so expect that there are no phi-nodes at entrypoint. + assert len(get_ssa_of_type(ftest.entry_point, Phi)) == 0 + + # Expect all references to start from index 0 (no writes) + assert all(x.variable_left.index == 0 for x in get_ssa_of_type(ftest, Index)) + + [phi_entry_accept] = get_ssa_of_type(faccept.entry_point, Phi) + assert len(phi_entry_accept.rvalues) == 3 # See comment in b above + + [phi_entry_b] = get_ssa_of_type(fb.entry_point, Phi) + assert len(phi_entry_b.rvalues) == 3 # See comment in b above + + @pytest.mark.skip(reason="Fails in current slither version. Fix in #1102.") def test_issue_468(): """ From 75f858d4bf588fe4370be2c6e81734dc31511ba0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Schoentgen?= Date: Thu, 12 May 2022 12:38:33 +0200 Subject: [PATCH 057/101] Optimization: use a more efficient regexp for hexadecimal check (#1200) Optimization: use a more efficient regexp for hexadecimal check --- slither/detectors/statements/too_many_digits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/detectors/statements/too_many_digits.py b/slither/detectors/statements/too_many_digits.py index a6387db78..6e4cc4cd9 100644 --- a/slither/detectors/statements/too_many_digits.py +++ b/slither/detectors/statements/too_many_digits.py @@ -6,7 +6,7 @@ import re from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification from slither.slithir.variables import Constant -_HEX_ADDRESS_REGEXP = re.compile("(0x)?[0-9a-f]{40}", re.IGNORECASE | re.ASCII) +_HEX_ADDRESS_REGEXP = re.compile("(0[xX])?[0-9a-fA-F]{40}") def is_hex_address(value) -> bool: From d3eea7b64e3cf28d5f1aff3812b6c47d66411177 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 25 May 2022 16:05:27 -0500 Subject: [PATCH 058/101] bump to python 3.8 --- .github/workflows/IR.yml | 4 ++-- .github/workflows/black.yml | 4 ++-- .github/workflows/ci.yml | 4 ++-- .github/workflows/detectors.yml | 4 ++-- .github/workflows/features.yml | 4 ++-- .github/workflows/linter.yml | 4 ++-- .github/workflows/parser.yml | 4 ++-- .github/workflows/pylint.yml | 4 ++-- .github/workflows/read_storage.yml | 4 ++-- README.md | 2 +- plugin_example/setup.py | 2 +- scripts/ci_test_simil.sh | 4 ++-- setup.py | 7 +++---- 13 files changed, 25 insertions(+), 26 deletions(-) diff --git a/.github/workflows/IR.yml b/.github/workflows/IR.yml index 0471cb876..434cef75b 100644 --- a/.github/workflows/IR.yml +++ b/.github/workflows/IR.yml @@ -26,10 +26,10 @@ jobs: - name: Checkout Code uses: actions/checkout@v2 - - name: Set up Python 3.6 + - name: Set up Python 3.8 uses: actions/setup-python@v3 with: - python-version: 3.6 + python-version: 3.8 - name: Install dependencies run: | diff --git a/.github/workflows/black.yml b/.github/workflows/black.yml index 94eafffeb..b805c4d9d 100644 --- a/.github/workflows/black.yml +++ b/.github/workflows/black.yml @@ -22,10 +22,10 @@ jobs: - name: Checkout Code uses: actions/checkout@v2 - - name: Set up Python 3.6 + - name: Set up Python 3.8 uses: actions/setup-python@v3 with: - python-version: 3.6 + python-version: 3.8 - name: Install dependencies run: | diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 831f205dc..097f83914 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,10 +58,10 @@ jobs: echo 'C:\msys64\mingw64\bin' >> "$GITHUB_PATH" echo 'C:\msys64\usr\bin' >> "$GITHUB_PATH" - - name: Set up Python 3.6 + - name: Set up Python 3.8 uses: actions/setup-python@v3 with: - python-version: 3.6 + python-version: 3.8 - name: Install dependencies run: | pip install ".[dev]" diff --git a/.github/workflows/detectors.yml b/.github/workflows/detectors.yml index 0745de802..8f3b45d15 100644 --- a/.github/workflows/detectors.yml +++ b/.github/workflows/detectors.yml @@ -26,10 +26,10 @@ jobs: - name: Checkout Code uses: actions/checkout@v2 - - name: Set up Python 3.6 + - name: Set up Python 3.8 uses: actions/setup-python@v3 with: - python-version: 3.6 + python-version: 3.8 - name: Install dependencies run: | diff --git a/.github/workflows/features.yml b/.github/workflows/features.yml index d26a68980..8757d654a 100644 --- a/.github/workflows/features.yml +++ b/.github/workflows/features.yml @@ -26,10 +26,10 @@ jobs: - name: Checkout Code uses: actions/checkout@v2 - - name: Set up Python 3.6 + - name: Set up Python 3.8 uses: actions/setup-python@v3 with: - python-version: 3.6 + python-version: 3.8 - name: Install dependencies run: | diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index f3a66063e..5d9ff9017 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -22,10 +22,10 @@ jobs: - name: Checkout Code uses: actions/checkout@v2 - - name: Set up Python 3.6 + - name: Set up Python 3.8 uses: actions/setup-python@v3 with: - python-version: 3.6 + python-version: 3.8 - name: Install dependencies run: | diff --git a/.github/workflows/parser.yml b/.github/workflows/parser.yml index d3facfc79..5e11420cf 100644 --- a/.github/workflows/parser.yml +++ b/.github/workflows/parser.yml @@ -26,10 +26,10 @@ jobs: - name: Checkout Code uses: actions/checkout@v2 - - name: Set up Python 3.6 + - name: Set up Python 3.8 uses: actions/setup-python@v3 with: - python-version: 3.6 + python-version: 3.8 - name: Install dependencies run: | diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml index 2fe575c79..04334a2d5 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/pylint.yml @@ -22,10 +22,10 @@ jobs: - name: Checkout Code uses: actions/checkout@v2 - - name: Set up Python 3.6 + - name: Set up Python 3.8 uses: actions/setup-python@v3 with: - python-version: 3.6 + python-version: 3.8 - name: Install dependencies run: | diff --git a/.github/workflows/read_storage.yml b/.github/workflows/read_storage.yml index b4c1d545d..8a423d6c2 100644 --- a/.github/workflows/read_storage.yml +++ b/.github/workflows/read_storage.yml @@ -28,10 +28,10 @@ jobs: - name: Install ganache run: npm install --global ganache - - name: Set up Python 3.6 + - name: Set up Python 3.8 uses: actions/setup-python@v2 with: - python-version: 3.6 + python-version: 3.8 - name: Install python dependencies run: | diff --git a/README.md b/README.md index 4010448be..a7b30f9ae 100644 --- a/README.md +++ b/README.md @@ -165,7 +165,7 @@ See the [Tool documentation](https://github.com/crytic/slither/wiki/Tool-Documen ## How to install -Slither requires Python 3.6+ and [solc](https://github.com/ethereum/solidity/), the Solidity compiler. +Slither requires Python 3.8+ and [solc](https://github.com/ethereum/solidity/), the Solidity compiler. ### Using Pip diff --git a/plugin_example/setup.py b/plugin_example/setup.py index 9cef2aaf9..1bc065394 100644 --- a/plugin_example/setup.py +++ b/plugin_example/setup.py @@ -7,7 +7,7 @@ setup( author="Trail of Bits", version="0.0", packages=find_packages(), - python_requires=">=3.6", + python_requires=">=3.8", install_requires=["slither-analyzer==0.1"], entry_points={ "slither_analyzer.plugin": "slither my-plugin=slither_my_plugin:make_plugin", diff --git a/scripts/ci_test_simil.sh b/scripts/ci_test_simil.sh index bad5fd067..7ef511759 100755 --- a/scripts/ci_test_simil.sh +++ b/scripts/ci_test_simil.sh @@ -2,8 +2,8 @@ ### Install requisites -pip3.6 install pybind11 -pip3.6 install https://github.com/facebookresearch/fastText/archive/0.2.0.zip +pip3.8 install pybind11 +pip3.8 install https://github.com/facebookresearch/fastText/archive/0.2.0.zip ### Test slither-simil diff --git a/setup.py b/setup.py index d21934d51..993862f03 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ setup( author="Trail of Bits", version="0.8.3", packages=find_packages(), - python_requires=">=3.6", + python_requires=">=3.8", install_requires=[ "prettytable>=0.7.2", "pysha3>=1.0.2", @@ -21,11 +21,10 @@ setup( "dev": [ "black==22.3.0", "pylint==2.13.4", - "pytest==7.0.1", + "pytest", "pytest-cov", "deepdiff", - "typing_extensions==4.1.1", - "importlib_metadata==4.8.3", + "numpy", "solc-select>=v1.0.0b1", ] }, From cc886a2f76ee3ddc2a7e06a925e97412d4e69934 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 25 May 2022 16:19:28 -0500 Subject: [PATCH 059/101] fix sentence --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 75cf4ecdc..35ff46b97 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,7 +23,7 @@ Some pull request guidelines: ## Development Environment Instructions for installing a development version of Slither can be found in our [wiki](https://github.com/crytic/slither/wiki/Developer-installation). -To run the unit tests, you need clone this repository and run `pip install ".[dev]"`. +To run the unit tests, you need to clone this repository and run `pip install ".[dev]"`. ### Linters From 61bb6d1dde8581285c5d599e3791b8b90cec2518 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 25 May 2022 17:17:07 -0500 Subject: [PATCH 060/101] set pythonutf8 for windows --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 097f83914..6a6f2f38d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -84,5 +84,6 @@ jobs: env: TEST_TYPE: ${{ matrix.type }} GITHUB_ETHERSCAN: ${{ secrets.GITHUB_ETHERSCAN }} + PYTHONUTF8: 1 run: | bash "scripts/ci_test_${TEST_TYPE}.sh" From 3416d05d16d4966ecc8c30405cd497869df63317 Mon Sep 17 00:00:00 2001 From: Cosmos <42707185+CharesFang@users.noreply.github.com> Date: Fri, 17 Jun 2022 23:40:12 +0800 Subject: [PATCH 061/101] fix wrong argument annotation (#1233) --- slither/slither.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/slither.py b/slither/slither.py index 6c4caaa99..4ad9bda19 100644 --- a/slither/slither.py +++ b/slither/slither.py @@ -53,7 +53,7 @@ class Slither(SlitherCore): # pylint: disable=too-many-instance-attributes Keyword Args: solc (str): solc binary location (default 'solc') disable_solc_warnings (bool): True to disable solc warnings (default false) - solc_arguments (str): solc arguments (default '') + solc_args (str): solc arguments (default '') ast_format (str): ast format (default '--ast-compact-json') filter_paths (list(str)): list of path to filter (default []) triage_mode (bool): if true, switch to triage mode (default false) From 6a2e1e0819f0dde932484b20bb0e0d3e39293adf Mon Sep 17 00:00:00 2001 From: Mathis Date: Fri, 17 Jun 2022 08:40:42 -0700 Subject: [PATCH 062/101] Do not fail with no results and sarif output (#1229) Close #1228 --- slither/utils/output.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/utils/output.py b/slither/utils/output.py index 16c9f5bbf..6ee59b4c6 100644 --- a/slither/utils/output.py +++ b/slither/utils/output.py @@ -160,7 +160,7 @@ def output_to_sarif( ], } - for detector in results["detectors"]: + for detector in results.get("detectors", []): _output_result_to_sarif(detector, detectors_classes, sarif) if filename == "-": From 793c4c4ee4580f2df91b0a7778691b0b1c192999 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 24 Jun 2022 14:31:30 -0500 Subject: [PATCH 063/101] add failing test cases for user defined types --- .../user_defined_value_type/argument.sol | 17 +++ .../user_defined_value_type/constant.sol | 7 ++ .../user_defined_value_type/erc20.sol | 107 ++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 tests/ast-parsing/user_defined_value_type/argument.sol create mode 100644 tests/ast-parsing/user_defined_value_type/constant.sol create mode 100644 tests/ast-parsing/user_defined_value_type/erc20.sol diff --git a/tests/ast-parsing/user_defined_value_type/argument.sol b/tests/ast-parsing/user_defined_value_type/argument.sol new file mode 100644 index 000000000..7bdc7d560 --- /dev/null +++ b/tests/ast-parsing/user_defined_value_type/argument.sol @@ -0,0 +1,17 @@ +pragma solidity ^0.8.9; + +type Fix is int192; + + +contract FixLib { + function div(uint256 numerator, uint256 divisor) public pure returns (uint256) { + return numerator / divisor; + } + function works(Fix x) external pure returns (uint256) { + uint256 y = uint192(Fix.unwrap(x)); + return div(y, 1e18); + } + function broken(Fix x) external pure returns (uint256) { + return div(uint192(Fix.unwrap(x)), 1e18); + } +} diff --git a/tests/ast-parsing/user_defined_value_type/constant.sol b/tests/ast-parsing/user_defined_value_type/constant.sol new file mode 100644 index 000000000..0cab2a6f3 --- /dev/null +++ b/tests/ast-parsing/user_defined_value_type/constant.sol @@ -0,0 +1,7 @@ +type T is int224; +pragma solidity >= 0.8.12; +contract C { + T constant public s = T.wrap(int224(165521356710917456517261742455526507355687727119203895813322792776)); + T constant public t = s; + int224 constant public u = T.unwrap(t); +} diff --git a/tests/ast-parsing/user_defined_value_type/erc20.sol b/tests/ast-parsing/user_defined_value_type/erc20.sol new file mode 100644 index 000000000..29f315d5d --- /dev/null +++ b/tests/ast-parsing/user_defined_value_type/erc20.sol @@ -0,0 +1,107 @@ +type UFixed18 is uint256; + +library FixedMath +{ + function add(UFixed18 a, UFixed18 b) internal pure returns (UFixed18 c) { + return UFixed18.wrap(UFixed18.unwrap(a) + UFixed18.unwrap(b)); + } + function sub(UFixed18 a, UFixed18 b) internal pure returns (UFixed18 c) { + return UFixed18.wrap(UFixed18.unwrap(a) - UFixed18.unwrap(b)); + } +} + +contract ERC20 { + using FixedMath for UFixed18; + + event Transfer(address indexed from, address indexed to, UFixed18 value); + event Approval(address indexed owner, address indexed spender, UFixed18 value); + + mapping (address => UFixed18) private _balances; + mapping (address => mapping (address => UFixed18)) private _allowances; + UFixed18 private _totalSupply; + + constructor() { + _mint(msg.sender, UFixed18.wrap(20)); + } + + function totalSupply() public view returns (UFixed18) { + return _totalSupply; + } + + function balanceOf(address owner) public view returns (UFixed18) { + return _balances[owner]; + } + + function allowance(address owner, address spender) public view returns (UFixed18) { + return _allowances[owner][spender]; + } + + function transfer(address to, UFixed18 value) public returns (bool) { + _transfer(msg.sender, to, value); + return true; + } + + function approve(address spender, UFixed18 value) public returns (bool) { + _approve(msg.sender, spender, value); + return true; + } + + function transferFrom(address from, address to, UFixed18 value) public returns (bool) { + _transfer(from, to, value); + // The subtraction here will revert on overflow. + _approve(from, msg.sender, _allowances[from][msg.sender].sub(value)); + return true; + } + + function increaseAllowance(address spender, UFixed18 addedValue) public returns (bool) { + // The addition here will revert on overflow. + _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue)); + return true; + } + + function decreaseAllowance(address spender, UFixed18 subtractedValue) public returns (bool) { + // The subtraction here will revert on overflow. + _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue)); + return true; + } + + function _transfer(address from, address to, UFixed18 value) internal { + require(to != address(0), "ERC20: transfer to the zero address"); + + // The subtraction and addition here will revert on overflow. + _balances[from] = _balances[from].sub(value); + _balances[to] = _balances[to].add(value); + emit Transfer(from, to, value); + } + + function _mint(address account, UFixed18 value) internal { + require(account != address(0), "ERC20: mint to the zero address"); + + // The additions here will revert on overflow. + _totalSupply = _totalSupply.add(value); + _balances[account] = _balances[account].add(value); + emit Transfer(address(0), account, value); + } + + function _burn(address account, UFixed18 value) internal { + require(account != address(0), "ERC20: burn from the zero address"); + + // The subtractions here will revert on overflow. + _totalSupply = _totalSupply.sub(value); + _balances[account] = _balances[account].sub(value); + emit Transfer(account, address(0), value); + } + + function _approve(address owner, address spender, UFixed18 value) internal { + require(owner != address(0), "ERC20: approve from the zero address"); + require(spender != address(0), "ERC20: approve to the zero address"); + + _allowances[owner][spender] = value; + emit Approval(owner, spender, value); + } + + function _burnFrom(address account, UFixed18 value) internal { + _burn(account, value); + _approve(account, msg.sender, _allowances[account][msg.sender].sub(value)); + } +} From 809a24260e773064e0f7c4ab9849b655ebc14bac Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 24 Jun 2022 14:36:12 -0500 Subject: [PATCH 064/101] additional edge cases --- .../user_defined_value_type/calldata.sol | 49 +++++++++++++++++++ .../in_parenthesis.sol | 9 ++++ 2 files changed, 58 insertions(+) create mode 100644 tests/ast-parsing/user_defined_value_type/calldata.sol create mode 100644 tests/ast-parsing/user_defined_value_type/in_parenthesis.sol diff --git a/tests/ast-parsing/user_defined_value_type/calldata.sol b/tests/ast-parsing/user_defined_value_type/calldata.sol new file mode 100644 index 000000000..feb2d8ac3 --- /dev/null +++ b/tests/ast-parsing/user_defined_value_type/calldata.sol @@ -0,0 +1,49 @@ +pragma abicoder v2; +type MyAddress is address; + +contract C { + MyAddress[] public addresses; + function f(MyAddress[] calldata _addresses) external { + for (uint i = 0; i < _addresses.length; i++) { + MyAddress.unwrap(_addresses[i]).call(""); + } + addresses = _addresses; + } + function g(MyAddress[] memory _addresses) external { + for (uint i = 0; i < _addresses.length; i++) { + MyAddress.unwrap(_addresses[i]).call(""); + } + addresses = _addresses; + } + function test_f() external returns (bool) { + clean(); + MyAddress[] memory test = new MyAddress[](3); + test[0] = MyAddress.wrap(address(21)); + test[1] = MyAddress.wrap(address(22)); + test[2] = MyAddress.wrap(address(23)); + this.f(test); + test_equality(test); + return true; + } + function test_g() external returns (bool) { + clean(); + MyAddress[] memory test = new MyAddress[](5); + test[0] = MyAddress.wrap(address(24)); + test[1] = MyAddress.wrap(address(25)); + test[2] = MyAddress.wrap(address(26)); + test[3] = MyAddress.wrap(address(27)); + test[4] = MyAddress.wrap(address(28)); + this.g(test); + test_equality(test); + return true; + } + function clean() internal { + delete addresses; + } + function test_equality(MyAddress[] memory _addresses) internal view { + require (_addresses.length == addresses.length); + for (uint i = 0; i < _addresses.length; i++) { + require(MyAddress.unwrap(_addresses[i]) == MyAddress.unwrap(addresses[i])); + } + } +} diff --git a/tests/ast-parsing/user_defined_value_type/in_parenthesis.sol b/tests/ast-parsing/user_defined_value_type/in_parenthesis.sol new file mode 100644 index 000000000..d45dacb4f --- /dev/null +++ b/tests/ast-parsing/user_defined_value_type/in_parenthesis.sol @@ -0,0 +1,9 @@ +type MyInt is int; +contract C { + function f() public returns (MyInt a, int b) { + (MyInt).wrap; + a = (MyInt).wrap(5); + (MyInt).unwrap; + b = (MyInt).unwrap((MyInt).wrap(10)); + } +} From d0a4f5595d7177b3b7d4bd35e1384bf35ebc22d4 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 6 Jul 2022 13:30:11 -0500 Subject: [PATCH 065/101] add up to 0.8.15 for ast tests (#1268) --- .../assembly-all.sol-0.8.13-compact.zip | Bin 0 -> 1340 bytes .../assembly-all.sol-0.8.14-compact.zip | Bin 0 -> 1336 bytes .../assembly-all.sol-0.8.15-compact.zip | Bin 0 -> 1341 bytes .../assignment-0.4.7.sol-0.8.13-compact.zip | Bin 0 -> 2555 bytes .../assignment-0.4.7.sol-0.8.14-compact.zip | Bin 0 -> 2557 bytes .../assignment-0.4.7.sol-0.8.15-compact.zip | Bin 0 -> 2558 bytes .../compile/break-all.sol-0.8.13-compact.zip | Bin 0 -> 2826 bytes .../compile/break-all.sol-0.8.14-compact.zip | Bin 0 -> 2820 bytes .../compile/break-all.sol-0.8.15-compact.zip | Bin 0 -> 2823 bytes ...all_to_variable-all.sol-0.8.13-compact.zip | Bin 0 -> 2638 bytes ...all_to_variable-all.sol-0.8.14-compact.zip | Bin 0 -> 2636 bytes ...all_to_variable-all.sol-0.8.15-compact.zip | Bin 0 -> 2637 bytes .../comment-all.sol-0.8.13-compact.zip | Bin 0 -> 1270 bytes .../comment-all.sol-0.8.14-compact.zip | Bin 0 -> 1268 bytes .../comment-all.sol-0.8.15-compact.zip | Bin 0 -> 1268 bytes .../test.sol-0.8.13-compact.zip | Bin 0 -> 2482 bytes .../test.sol-0.8.14-compact.zip | Bin 0 -> 2479 bytes .../test.sol-0.8.15-compact.zip | Bin 0 -> 2480 bytes .../conditional-all.sol-0.8.13-compact.zip | Bin 0 -> 2565 bytes .../conditional-all.sol-0.8.14-compact.zip | Bin 0 -> 2566 bytes .../conditional-all.sol-0.8.15-compact.zip | Bin 0 -> 2565 bytes .../continue-all.sol-0.8.13-compact.zip | Bin 0 -> 2823 bytes .../continue-all.sol-0.8.14-compact.zip | Bin 0 -> 2827 bytes .../continue-all.sol-0.8.15-compact.zip | Bin 0 -> 2825 bytes .../contract-0.6.0.sol-0.8.13-compact.zip | Bin 0 -> 2572 bytes .../contract-0.6.0.sol-0.8.14-compact.zip | Bin 0 -> 2571 bytes .../contract-0.6.0.sol-0.8.15-compact.zip | Bin 0 -> 2573 bytes .../custom_error-0.4.0.sol-0.8.13-compact.zip | Bin 0 -> 551 bytes .../custom_error-0.4.0.sol-0.8.14-compact.zip | Bin 0 -> 551 bytes .../custom_error-0.4.0.sol-0.8.15-compact.zip | Bin 0 -> 551 bytes .../dowhile-0.4.5.sol-0.8.13-compact.zip | Bin 0 -> 1766 bytes .../dowhile-0.4.5.sol-0.8.14-compact.zip | Bin 0 -> 1770 bytes .../dowhile-0.4.5.sol-0.8.15-compact.zip | Bin 0 -> 1767 bytes .../compile/emit-0.5.0.sol-0.8.13-compact.zip | Bin 0 -> 2100 bytes .../compile/emit-0.5.0.sol-0.8.14-compact.zip | Bin 0 -> 2096 bytes .../compile/emit-0.5.0.sol-0.8.15-compact.zip | Bin 0 -> 2098 bytes .../compile/enum-0.8.0.sol-0.8.13-compact.zip | Bin 0 -> 996 bytes .../compile/enum-0.8.0.sol-0.8.14-compact.zip | Bin 0 -> 997 bytes .../compile/enum-0.8.0.sol-0.8.15-compact.zip | Bin 0 -> 995 bytes .../compile/event-all.sol-0.8.13-compact.zip | Bin 0 -> 1537 bytes .../compile/event-all.sol-0.8.14-compact.zip | Bin 0 -> 1536 bytes .../compile/event-all.sol-0.8.15-compact.zip | Bin 0 -> 1535 bytes .../compile/for-all.sol-0.8.13-compact.zip | Bin 0 -> 4806 bytes .../compile/for-all.sol-0.8.14-compact.zip | Bin 0 -> 4807 bytes .../compile/for-all.sol-0.8.15-compact.zip | Bin 0 -> 4808 bytes .../function-0.7.1.sol-0.8.13-compact.zip | Bin 0 -> 4431 bytes .../function-0.7.1.sol-0.8.14-compact.zip | Bin 0 -> 4427 bytes .../function-0.7.1.sol-0.8.15-compact.zip | Bin 0 -> 4428 bytes .../functioncall-0.8.0.sol-0.8.13-compact.zip | Bin 0 -> 7103 bytes .../functioncall-0.8.0.sol-0.8.14-compact.zip | Bin 0 -> 7097 bytes .../functioncall-0.8.0.sol-0.8.15-compact.zip | Bin 0 -> 7089 bytes .../compile/if-all.sol-0.8.13-compact.zip | Bin 0 -> 3355 bytes .../compile/if-all.sol-0.8.14-compact.zip | Bin 0 -> 3356 bytes .../compile/if-all.sol-0.8.15-compact.zip | Bin 0 -> 3356 bytes ...rom_top_level-0.7.6.sol-0.8.13-compact.zip | Bin 0 -> 1354 bytes ...rom_top_level-0.7.6.sol-0.8.14-compact.zip | Bin 0 -> 1354 bytes ...rom_top_level-0.7.6.sol-0.8.15-compact.zip | Bin 0 -> 1354 bytes .../indexaccess-all.sol-0.8.13-compact.zip | Bin 0 -> 1689 bytes .../indexaccess-all.sol-0.8.14-compact.zip | Bin 0 -> 1687 bytes .../indexaccess-all.sol-0.8.15-compact.zip | Bin 0 -> 1683 bytes ...exrangeaccess-0.6.1.sol-0.8.13-compact.zip | Bin 0 -> 2352 bytes ...exrangeaccess-0.6.1.sol-0.8.14-compact.zip | Bin 0 -> 2351 bytes ...exrangeaccess-0.6.1.sol-0.8.15-compact.zip | Bin 0 -> 2349 bytes ...it_conversion-0.5.0.sol-0.8.13-compact.zip | Bin 0 -> 4223 bytes ...it_conversion-0.5.0.sol-0.8.14-compact.zip | Bin 0 -> 4226 bytes ...it_conversion-0.5.0.sol-0.8.15-compact.zip | Bin 0 -> 4226 bytes .../memberaccess-0.5.3.sol-0.8.13-compact.zip | Bin 0 -> 2594 bytes .../memberaccess-0.5.3.sol-0.8.14-compact.zip | Bin 0 -> 2593 bytes .../memberaccess-0.5.3.sol-0.8.15-compact.zip | Bin 0 -> 2591 bytes .../minmax-0.6.8.sol-0.8.13-compact.zip | Bin 0 -> 1611 bytes .../minmax-0.6.8.sol-0.8.14-compact.zip | Bin 0 -> 1611 bytes .../minmax-0.6.8.sol-0.8.15-compact.zip | Bin 0 -> 1612 bytes .../modifier-all.sol-0.8.13-compact.zip | Bin 0 -> 1350 bytes .../modifier-all.sol-0.8.14-compact.zip | Bin 0 -> 1350 bytes .../modifier-all.sol-0.8.15-compact.zip | Bin 0 -> 1349 bytes ...newexpression-0.5.0.sol-0.8.13-compact.zip | Bin 0 -> 1821 bytes ...newexpression-0.5.0.sol-0.8.14-compact.zip | Bin 0 -> 1816 bytes ...newexpression-0.5.0.sol-0.8.15-compact.zip | Bin 0 -> 1817 bytes .../pragma-0.8.0.sol-0.8.13-compact.zip | Bin 0 -> 1023 bytes .../pragma-0.8.0.sol-0.8.14-compact.zip | Bin 0 -> 1022 bytes .../pragma-0.8.0.sol-0.8.15-compact.zip | Bin 0 -> 1021 bytes .../compile/push-all.sol-0.8.13-compact.zip | Bin 0 -> 1961 bytes .../compile/push-all.sol-0.8.14-compact.zip | Bin 0 -> 1963 bytes .../compile/push-all.sol-0.8.15-compact.zip | Bin 0 -> 1955 bytes .../compile/return-all.sol-0.8.13-compact.zip | Bin 0 -> 3063 bytes .../compile/return-all.sol-0.8.14-compact.zip | Bin 0 -> 3064 bytes .../compile/return-all.sol-0.8.15-compact.zip | Bin 0 -> 3059 bytes .../scope-0.5.0.sol-0.8.13-compact.zip | Bin 0 -> 2557 bytes .../scope-0.5.0.sol-0.8.14-compact.zip | Bin 0 -> 2551 bytes .../scope-0.5.0.sol-0.8.15-compact.zip | Bin 0 -> 2555 bytes .../struct-0.6.0.sol-0.8.13-compact.zip | Bin 0 -> 1425 bytes .../struct-0.6.0.sol-0.8.14-compact.zip | Bin 0 -> 1419 bytes .../struct-0.6.0.sol-0.8.15-compact.zip | Bin 0 -> 1420 bytes .../throw-0.5.0.sol-0.8.13-compact.zip | Bin 0 -> 888 bytes .../throw-0.5.0.sol-0.8.14-compact.zip | Bin 0 -> 888 bytes .../throw-0.5.0.sol-0.8.15-compact.zip | Bin 0 -> 890 bytes .../top-level-0.7.4.sol-0.8.13-compact.zip | Bin 0 -> 1617 bytes .../top-level-0.7.4.sol-0.8.14-compact.zip | Bin 0 -> 1617 bytes .../top-level-0.7.4.sol-0.8.15-compact.zip | Bin 0 -> 1617 bytes ...-level-import-0.7.1.sol-0.8.13-compact.zip | Bin 0 -> 2839 bytes ...-level-import-0.7.1.sol-0.8.14-compact.zip | Bin 0 -> 2837 bytes ...-level-import-0.7.1.sol-0.8.15-compact.zip | Bin 0 -> 2834 bytes ...el-import-bis-0.7.1.sol-0.8.13-compact.zip | Bin 0 -> 2409 bytes ...el-import-bis-0.7.1.sol-0.8.14-compact.zip | Bin 0 -> 2407 bytes ...el-import-bis-0.7.1.sol-0.8.15-compact.zip | Bin 0 -> 2410 bytes ...nested-import-0.7.1.sol-0.8.13-compact.zip | Bin 0 -> 2277 bytes ...nested-import-0.7.1.sol-0.8.14-compact.zip | Bin 0 -> 2278 bytes ...nested-import-0.7.1.sol-0.8.15-compact.zip | Bin 0 -> 2276 bytes ...evel_variable-0.8.0.sol-0.8.13-compact.zip | Bin 0 -> 1946 bytes ...evel_variable-0.8.0.sol-0.8.14-compact.zip | Bin 0 -> 1947 bytes ...evel_variable-0.8.0.sol-0.8.15-compact.zip | Bin 0 -> 1949 bytes ...vel_variable2-0.8.0.sol-0.8.13-compact.zip | Bin 0 -> 3374 bytes ...vel_variable2-0.8.0.sol-0.8.14-compact.zip | Bin 0 -> 3372 bytes ...vel_variable2-0.8.0.sol-0.8.15-compact.zip | Bin 0 -> 3368 bytes .../trycatch-0.6.0.sol-0.8.13-compact.zip | Bin 0 -> 6479 bytes .../trycatch-0.6.0.sol-0.8.14-compact.zip | Bin 0 -> 6477 bytes .../trycatch-0.6.0.sol-0.8.15-compact.zip | Bin 0 -> 6482 bytes ...pleexpression-0.5.3.sol-0.8.13-compact.zip | Bin 0 -> 1743 bytes ...pleexpression-0.5.3.sol-0.8.14-compact.zip | Bin 0 -> 1742 bytes ...pleexpression-0.5.3.sol-0.8.15-compact.zip | Bin 0 -> 1737 bytes ...aryexpression-0.5.0.sol-0.8.13-compact.zip | Bin 0 -> 2478 bytes ...aryexpression-0.5.0.sol-0.8.14-compact.zip | Bin 0 -> 2471 bytes ...aryexpression-0.5.0.sol-0.8.15-compact.zip | Bin 0 -> 2470 bytes .../unchecked-0.8.0.sol-0.8.13-compact.zip | Bin 0 -> 2460 bytes .../unchecked-0.8.0.sol-0.8.14-compact.zip | Bin 0 -> 2461 bytes .../unchecked-0.8.0.sol-0.8.15-compact.zip | Bin 0 -> 2461 bytes ...bal_variables-0.8.0.sol-0.8.13-compact.zip | Bin 0 -> 9657 bytes ...bal_variables-0.8.0.sol-0.8.14-compact.zip | Bin 0 -> 9667 bytes ...bal_variables-0.8.0.sol-0.8.15-compact.zip | Bin 0 -> 9666 bytes .../using-for-0.4.1.sol-0.8.13-compact.zip | Bin 0 -> 2364 bytes .../using-for-0.4.1.sol-0.8.14-compact.zip | Bin 0 -> 2366 bytes .../using-for-0.4.1.sol-0.8.15-compact.zip | Bin 0 -> 2361 bytes .../variable-0.8.0.sol-0.8.13-compact.zip | Bin 0 -> 4293 bytes .../variable-0.8.0.sol-0.8.14-compact.zip | Bin 0 -> 4292 bytes .../variable-0.8.0.sol-0.8.15-compact.zip | Bin 0 -> 4291 bytes ...ledeclaration-0.5.0.sol-0.8.13-compact.zip | Bin 0 -> 2891 bytes ...ledeclaration-0.5.0.sol-0.8.14-compact.zip | Bin 0 -> 2893 bytes ...ledeclaration-0.5.0.sol-0.8.15-compact.zip | Bin 0 -> 2888 bytes .../compile/while-all.sol-0.8.13-compact.zip | Bin 0 -> 1764 bytes .../compile/while-all.sol-0.8.14-compact.zip | Bin 0 -> 1766 bytes .../compile/while-all.sol-0.8.15-compact.zip | Bin 0 -> 1766 bytes .../compile/yul-0.8.0.sol-0.8.13-compact.zip | Bin 0 -> 5771 bytes .../compile/yul-0.8.0.sol-0.8.14-compact.zip | Bin 0 -> 5768 bytes .../compile/yul-0.8.0.sol-0.8.15-compact.zip | Bin 0 -> 5773 bytes .../assembly-all.sol-0.8.13-compact.json | 5 ++ .../assembly-all.sol-0.8.14-compact.json | 5 ++ .../assembly-all.sol-0.8.15-compact.json | 5 ++ .../assignment-0.4.7.sol-0.8.13-compact.json | 5 ++ .../assignment-0.4.7.sol-0.8.14-compact.json | 5 ++ .../assignment-0.4.7.sol-0.8.15-compact.json | 5 ++ .../break-all.sol-0.8.13-compact.json | 5 ++ .../break-all.sol-0.8.14-compact.json | 5 ++ .../break-all.sol-0.8.15-compact.json | 5 ++ ...ll_to_variable-all.sol-0.8.13-compact.json | 6 ++ ...ll_to_variable-all.sol-0.8.14-compact.json | 6 ++ ...ll_to_variable-all.sol-0.8.15-compact.json | 6 ++ .../comment-all.sol-0.8.13-compact.json | 5 ++ .../comment-all.sol-0.8.14-compact.json | 5 ++ .../comment-all.sol-0.8.15-compact.json | 5 ++ .../test.sol-0.8.13-compact.json | 7 +++ .../test.sol-0.8.14-compact.json | 7 +++ .../test.sol-0.8.15-compact.json | 7 +++ .../conditional-all.sol-0.8.13-compact.json | 5 ++ .../conditional-all.sol-0.8.14-compact.json | 5 ++ .../conditional-all.sol-0.8.15-compact.json | 5 ++ .../continue-all.sol-0.8.13-compact.json | 5 ++ .../continue-all.sol-0.8.14-compact.json | 5 ++ .../continue-all.sol-0.8.15-compact.json | 5 ++ .../contract-0.6.0.sol-0.8.13-compact.json | 19 +++++++ .../contract-0.6.0.sol-0.8.14-compact.json | 19 +++++++ .../contract-0.6.0.sol-0.8.15-compact.json | 19 +++++++ ...custom_error-0.4.0.sol-0.8.13-compact.json | 1 + ...custom_error-0.4.0.sol-0.8.14-compact.json | 1 + ...custom_error-0.4.0.sol-0.8.15-compact.json | 1 + .../dowhile-0.4.5.sol-0.8.13-compact.json | 5 ++ .../dowhile-0.4.5.sol-0.8.14-compact.json | 5 ++ .../dowhile-0.4.5.sol-0.8.15-compact.json | 5 ++ .../emit-0.5.0.sol-0.8.13-compact.json | 5 ++ .../emit-0.5.0.sol-0.8.14-compact.json | 5 ++ .../emit-0.5.0.sol-0.8.15-compact.json | 5 ++ .../enum-0.8.0.sol-0.8.13-compact.json | 3 + .../enum-0.8.0.sol-0.8.14-compact.json | 3 + .../enum-0.8.0.sol-0.8.15-compact.json | 3 + .../event-all.sol-0.8.13-compact.json | 3 + .../event-all.sol-0.8.14-compact.json | 3 + .../event-all.sol-0.8.15-compact.json | 3 + .../expected/for-all.sol-0.8.13-compact.json | 15 +++++ .../expected/for-all.sol-0.8.14-compact.json | 15 +++++ .../expected/for-all.sol-0.8.15-compact.json | 15 +++++ .../function-0.7.1.sol-0.8.13-compact.json | 52 ++++++++++++++++++ .../function-0.7.1.sol-0.8.14-compact.json | 52 ++++++++++++++++++ .../function-0.7.1.sol-0.8.15-compact.json | 52 ++++++++++++++++++ ...functioncall-0.8.0.sol-0.8.13-compact.json | 10 ++++ ...functioncall-0.8.0.sol-0.8.14-compact.json | 10 ++++ ...functioncall-0.8.0.sol-0.8.15-compact.json | 10 ++++ .../expected/if-all.sol-0.8.13-compact.json | 8 +++ .../expected/if-all.sol-0.8.14-compact.json | 8 +++ .../expected/if-all.sol-0.8.15-compact.json | 8 +++ ...om_top_level-0.7.6.sol-0.8.13-compact.json | 3 + ...om_top_level-0.7.6.sol-0.8.14-compact.json | 3 + ...om_top_level-0.7.6.sol-0.8.15-compact.json | 3 + .../indexaccess-all.sol-0.8.13-compact.json | 5 ++ .../indexaccess-all.sol-0.8.14-compact.json | 5 ++ .../indexaccess-all.sol-0.8.15-compact.json | 5 ++ ...xrangeaccess-0.6.1.sol-0.8.13-compact.json | 5 ++ ...xrangeaccess-0.6.1.sol-0.8.14-compact.json | 5 ++ ...xrangeaccess-0.6.1.sol-0.8.15-compact.json | 5 ++ ...t_conversion-0.5.0.sol-0.8.13-compact.json | 23 ++++++++ ...t_conversion-0.5.0.sol-0.8.14-compact.json | 23 ++++++++ ...t_conversion-0.5.0.sol-0.8.15-compact.json | 23 ++++++++ ...memberaccess-0.5.3.sol-0.8.13-compact.json | 6 ++ ...memberaccess-0.5.3.sol-0.8.14-compact.json | 6 ++ ...memberaccess-0.5.3.sol-0.8.15-compact.json | 6 ++ .../minmax-0.6.8.sol-0.8.13-compact.json | 5 ++ .../minmax-0.6.8.sol-0.8.14-compact.json | 5 ++ .../minmax-0.6.8.sol-0.8.15-compact.json | 5 ++ .../modifier-all.sol-0.8.13-compact.json | 8 +++ .../modifier-all.sol-0.8.14-compact.json | 8 +++ .../modifier-all.sol-0.8.15-compact.json | 8 +++ ...ewexpression-0.5.0.sol-0.8.13-compact.json | 8 +++ ...ewexpression-0.5.0.sol-0.8.14-compact.json | 8 +++ ...ewexpression-0.5.0.sol-0.8.15-compact.json | 8 +++ .../pragma-0.8.0.sol-0.8.13-compact.json | 3 + .../pragma-0.8.0.sol-0.8.14-compact.json | 3 + .../pragma-0.8.0.sol-0.8.15-compact.json | 3 + .../expected/push-all.sol-0.8.13-compact.json | 5 ++ .../expected/push-all.sol-0.8.14-compact.json | 5 ++ .../expected/push-all.sol-0.8.15-compact.json | 5 ++ .../return-all.sol-0.8.13-compact.json | 9 +++ .../return-all.sol-0.8.14-compact.json | 9 +++ .../return-all.sol-0.8.15-compact.json | 9 +++ .../scope-0.5.0.sol-0.8.13-compact.json | 8 +++ .../scope-0.5.0.sol-0.8.14-compact.json | 8 +++ .../scope-0.5.0.sol-0.8.15-compact.json | 8 +++ .../struct-0.6.0.sol-0.8.13-compact.json | 3 + .../struct-0.6.0.sol-0.8.14-compact.json | 3 + .../struct-0.6.0.sol-0.8.15-compact.json | 3 + .../throw-0.5.0.sol-0.8.13-compact.json | 3 + .../throw-0.5.0.sol-0.8.14-compact.json | 3 + .../throw-0.5.0.sol-0.8.15-compact.json | 3 + .../top-level-0.7.4.sol-0.8.13-compact.json | 1 + .../top-level-0.7.4.sol-0.8.14-compact.json | 1 + .../top-level-0.7.4.sol-0.8.15-compact.json | 1 + ...level-import-0.7.1.sol-0.8.13-compact.json | 5 ++ ...level-import-0.7.1.sol-0.8.14-compact.json | 5 ++ ...level-import-0.7.1.sol-0.8.15-compact.json | 5 ++ ...l-import-bis-0.7.1.sol-0.8.13-compact.json | 5 ++ ...l-import-bis-0.7.1.sol-0.8.14-compact.json | 5 ++ ...l-import-bis-0.7.1.sol-0.8.15-compact.json | 5 ++ ...ested-import-0.7.1.sol-0.8.13-compact.json | 5 ++ ...ested-import-0.7.1.sol-0.8.14-compact.json | 5 ++ ...ested-import-0.7.1.sol-0.8.15-compact.json | 5 ++ ...vel_variable-0.8.0.sol-0.8.13-compact.json | 5 ++ ...vel_variable-0.8.0.sol-0.8.14-compact.json | 5 ++ ...vel_variable-0.8.0.sol-0.8.15-compact.json | 5 ++ ...el_variable2-0.8.0.sol-0.8.13-compact.json | 8 +++ ...el_variable2-0.8.0.sol-0.8.14-compact.json | 8 +++ ...el_variable2-0.8.0.sol-0.8.15-compact.json | 8 +++ .../trycatch-0.6.0.sol-0.8.13-compact.json | 9 +++ .../trycatch-0.6.0.sol-0.8.14-compact.json | 9 +++ .../trycatch-0.6.0.sol-0.8.15-compact.json | 9 +++ ...leexpression-0.5.3.sol-0.8.13-compact.json | 5 ++ ...leexpression-0.5.3.sol-0.8.14-compact.json | 5 ++ ...leexpression-0.5.3.sol-0.8.15-compact.json | 5 ++ ...ryexpression-0.5.0.sol-0.8.13-compact.json | 5 ++ ...ryexpression-0.5.0.sol-0.8.14-compact.json | 5 ++ ...ryexpression-0.5.0.sol-0.8.15-compact.json | 5 ++ .../unchecked-0.8.0.sol-0.8.13-compact.json | 6 ++ .../unchecked-0.8.0.sol-0.8.14-compact.json | 6 ++ .../unchecked-0.8.0.sol-0.8.15-compact.json | 6 ++ ...al_variables-0.8.0.sol-0.8.13-compact.json | 17 ++++++ ...al_variables-0.8.0.sol-0.8.14-compact.json | 17 ++++++ ...al_variables-0.8.0.sol-0.8.15-compact.json | 17 ++++++ .../using-for-0.4.1.sol-0.8.13-compact.json | 9 +++ .../using-for-0.4.1.sol-0.8.14-compact.json | 9 +++ .../using-for-0.4.1.sol-0.8.15-compact.json | 9 +++ .../variable-0.8.0.sol-0.8.13-compact.json | 5 ++ .../variable-0.8.0.sol-0.8.14-compact.json | 5 ++ .../variable-0.8.0.sol-0.8.15-compact.json | 5 ++ ...edeclaration-0.5.0.sol-0.8.13-compact.json | 5 ++ ...edeclaration-0.5.0.sol-0.8.14-compact.json | 5 ++ ...edeclaration-0.5.0.sol-0.8.15-compact.json | 5 ++ .../while-all.sol-0.8.13-compact.json | 5 ++ .../while-all.sol-0.8.14-compact.json | 5 ++ .../while-all.sol-0.8.15-compact.json | 5 ++ .../yul-0.8.0.sol-0.8.13-compact.json | 7 +++ .../yul-0.8.0.sol-0.8.14-compact.json | 7 +++ .../yul-0.8.0.sol-0.8.15-compact.json | 7 +++ tests/test_ast_parsing.py | 2 +- 289 files changed, 1081 insertions(+), 1 deletion(-) create mode 100644 tests/ast-parsing/compile/assembly-all.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/assembly-all.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/assembly-all.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/assignment-0.4.7.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/assignment-0.4.7.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/assignment-0.4.7.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/break-all.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/break-all.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/break-all.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/call_to_variable-all.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/call_to_variable-all.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/call_to_variable-all.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/comment-all.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/comment-all.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/comment-all.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/conditional-all.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/conditional-all.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/conditional-all.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/continue-all.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/continue-all.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/continue-all.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/contract-0.6.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/contract-0.6.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/contract-0.6.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/custom_error-0.4.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/custom_error-0.4.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/custom_error-0.4.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/dowhile-0.4.5.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/dowhile-0.4.5.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/dowhile-0.4.5.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/emit-0.5.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/emit-0.5.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/emit-0.5.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/enum-0.8.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/enum-0.8.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/enum-0.8.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/event-all.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/event-all.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/event-all.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/for-all.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/for-all.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/for-all.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/function-0.7.1.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/function-0.7.1.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/function-0.7.1.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/functioncall-0.8.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/functioncall-0.8.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/functioncall-0.8.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/if-all.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/if-all.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/if-all.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/indexaccess-all.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/indexaccess-all.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/indexaccess-all.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/indexrangeaccess-0.6.1.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/indexrangeaccess-0.6.1.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/indexrangeaccess-0.6.1.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/library_implicit_conversion-0.5.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/library_implicit_conversion-0.5.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/library_implicit_conversion-0.5.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/memberaccess-0.5.3.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/memberaccess-0.5.3.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/memberaccess-0.5.3.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/newexpression-0.5.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/newexpression-0.5.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/newexpression-0.5.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/pragma-0.8.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/pragma-0.8.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/pragma-0.8.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/push-all.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/push-all.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/push-all.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/return-all.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/return-all.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/return-all.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/scope-0.5.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/scope-0.5.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/scope-0.5.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/struct-0.6.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/struct-0.6.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/struct-0.6.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/throw-0.5.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/throw-0.5.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/throw-0.5.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/top-level-0.7.4.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/top-level-0.7.4.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/top-level-0.7.4.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/top-level-import-0.7.1.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/top-level-import-0.7.1.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/top-level-import-0.7.1.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/top-level-import-bis-0.7.1.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/top-level-import-bis-0.7.1.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/top-level-import-bis-0.7.1.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/top-level-nested-import-0.7.1.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/top-level-nested-import-0.7.1.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/top-level-nested-import-0.7.1.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/top_level_variable-0.8.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/top_level_variable-0.8.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/top_level_variable-0.8.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/top_level_variable2-0.8.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/top_level_variable2-0.8.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/top_level_variable2-0.8.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/trycatch-0.6.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/trycatch-0.6.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/trycatch-0.6.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/tupleexpression-0.5.3.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/tupleexpression-0.5.3.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/tupleexpression-0.5.3.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/unaryexpression-0.5.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/unaryexpression-0.5.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/unaryexpression-0.5.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/unchecked-0.8.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/unchecked-0.8.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/unchecked-0.8.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/units_and_global_variables-0.8.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/units_and_global_variables-0.8.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/units_and_global_variables-0.8.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/using-for-0.4.1.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/using-for-0.4.1.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/using-for-0.4.1.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/variable-0.8.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/variable-0.8.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/variable-0.8.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/variabledeclaration-0.5.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/variabledeclaration-0.5.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/variabledeclaration-0.5.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/while-all.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/while-all.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/while-all.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/yul-0.8.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/yul-0.8.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/yul-0.8.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/expected/assembly-all.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/assembly-all.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/assembly-all.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/assignment-0.4.7.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/assignment-0.4.7.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/assignment-0.4.7.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/break-all.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/break-all.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/break-all.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/call_to_variable-all.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/call_to_variable-all.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/call_to_variable-all.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/comment-all.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/comment-all.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/comment-all.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/conditional-all.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/conditional-all.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/conditional-all.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/continue-all.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/continue-all.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/continue-all.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/contract-0.6.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/contract-0.6.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/contract-0.6.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/custom_error-0.4.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/custom_error-0.4.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/custom_error-0.4.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/dowhile-0.4.5.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/dowhile-0.4.5.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/dowhile-0.4.5.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/emit-0.5.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/emit-0.5.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/emit-0.5.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/enum-0.8.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/enum-0.8.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/enum-0.8.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/event-all.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/event-all.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/event-all.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/for-all.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/for-all.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/for-all.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/function-0.7.1.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/function-0.7.1.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/function-0.7.1.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/functioncall-0.8.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/functioncall-0.8.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/functioncall-0.8.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/if-all.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/if-all.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/if-all.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/indexaccess-all.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/indexaccess-all.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/indexaccess-all.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/indexrangeaccess-0.6.1.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/indexrangeaccess-0.6.1.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/indexrangeaccess-0.6.1.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/library_implicit_conversion-0.5.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/library_implicit_conversion-0.5.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/library_implicit_conversion-0.5.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/memberaccess-0.5.3.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/memberaccess-0.5.3.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/memberaccess-0.5.3.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/modifier-all.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/modifier-all.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/modifier-all.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/newexpression-0.5.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/newexpression-0.5.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/newexpression-0.5.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/pragma-0.8.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/pragma-0.8.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/pragma-0.8.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/push-all.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/push-all.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/push-all.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/return-all.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/return-all.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/return-all.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/scope-0.5.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/scope-0.5.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/scope-0.5.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/struct-0.6.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/struct-0.6.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/struct-0.6.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/throw-0.5.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/throw-0.5.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/throw-0.5.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/top-level-0.7.4.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/top-level-0.7.4.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/top-level-0.7.4.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/top-level-import-0.7.1.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/top-level-import-0.7.1.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/top-level-import-0.7.1.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/top-level-import-bis-0.7.1.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/top-level-import-bis-0.7.1.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/top-level-import-bis-0.7.1.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/top-level-nested-import-0.7.1.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/top-level-nested-import-0.7.1.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/top-level-nested-import-0.7.1.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/top_level_variable-0.8.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/top_level_variable-0.8.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/top_level_variable-0.8.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/top_level_variable2-0.8.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/top_level_variable2-0.8.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/top_level_variable2-0.8.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/trycatch-0.6.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/trycatch-0.6.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/trycatch-0.6.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/tupleexpression-0.5.3.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/tupleexpression-0.5.3.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/tupleexpression-0.5.3.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/unaryexpression-0.5.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/unaryexpression-0.5.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/unaryexpression-0.5.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/unchecked-0.8.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/unchecked-0.8.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/unchecked-0.8.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/units_and_global_variables-0.8.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/units_and_global_variables-0.8.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/units_and_global_variables-0.8.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/using-for-0.4.1.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/using-for-0.4.1.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/using-for-0.4.1.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/variable-0.8.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/variable-0.8.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/variable-0.8.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/variabledeclaration-0.5.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/variabledeclaration-0.5.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/variabledeclaration-0.5.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/while-all.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/while-all.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/while-all.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/yul-0.8.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/yul-0.8.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/yul-0.8.0.sol-0.8.15-compact.json diff --git a/tests/ast-parsing/compile/assembly-all.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/assembly-all.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..87ef389a3d86cbc0466e717c5453f681e49ca98a GIT binary patch literal 1340 zcma*nYdF&j00!{CVOnm@I+jg0_xm-e6yljn>R2;%T*tBvXDA!Fge6T_Na<$LFcNa# zTD9Ce%2CG}5}~DWD&^W-+8mwl=XuWiet5sUpMPjCc?Bl`1gHTyVPY&SSxs7?001%S z0H6l|Kq!Smh{BT-%|pp#3rY+bM@Tpw6HCQ~#-0j~h$mP?QevVZ3W`7w0MG#7(4|Wx z+aI=PSb~=v2UTWwbcBBEj*FKu2*;g66uzd-&W5)ce~eD2OcA=4$v4vw9U+JMmpZJY zm0Iet)MJGYc*|j9KHaJ6L+Nsr6c-SVw>I3l@OCp)TZzbBkya+XD-nH;y3l>+%2!8H z@wGaM-%#>i>3-6~47=r$3qJbIjDvDEb_F30eC}WAgdw59c3APdptEtZm8lO>cK6tQ zcHjYJL^K3eoit(|sABXUF7>^=Jnbj;DCpM84wsDF^&g0k)EP97&V%|B@Lnm#Rg*^w zIF+*uQDnBR>7%&3;15%$8c2%v5NAVhI(_Z{YQRonW}Fi6TDZCg6mCph&+8-S{%z|0 z(M$o|h+&GVV$!H9cB{#j`n{AI{f4iRpZPLIIn^Px1cY>8pFk}Zj3E(MTX)Pbh!O5k z#lr+}>9Y6+?$`1-JWG%XtuYu$cl5^nvJcJ46*NaW9oZs=0K?<`qkY*bg+h7ckkd*Z z4U}`}i~GzD1gXRcMx`yPqkfb5`qOKXTe)oEcr`D!D?%CwhK-uZ@6z2o(eWrQzDe8* zZ(H zBB3>!(7TJ*#Hz#@no4Kt6)Qw%EnSUTJ4q8hY&j2)Rce0Kyxrq4#8Wt24T2=ix51d} zGMp=<_?(%)$~dV<@XQawu`bg2NFRH#mS9_oLAC$>jpfm9ahc^-K9{%8^LV&dpzKQ! z48=Ng-iWpU<}&W-!-?AME@hMGdC8TQ*C*WEO+NH7jxvZ(8TI=b!BJ+I#IurJG7`LtC6(^W)T5ZC*( zcKeucH}OKhEY%u?zUxVguZ90<7HHTpZ=apy!G_p|vsL%A(?h43?x$+(7}RwLxRg2( z^8n-`l_&&Zo&bU*zGIr}mg_2D+NX>9Cq|jc8iU_&QE!q9)p}g-9+jl^YI4F-tr(ZS z+N@l+R{nH^-=>)kAIz+=3kL66Qq`i^=6S2)YzD>F`Nq810A79>dd}W_%O)(#T~nilQ0iPTV=ZTzcJ8rN=Gl@bllD_u*yX|s#@#7R6T&opw`EZXhaKh_j^CD9 zanA$EsR=mvLl4!OS*f*l|J=;68?%PWq8E$GxigwS2#n0Nfra+O__kM_f~;*-?>#|} z;Yvf-Sb3|etX@A!nJ-G0Gr^Bv2!Xc5uU8~QPErLeB9();k(QW5*K1{-F2@EPx^Vr@ z)s;5(SSBQ~&lS1)Icsju^I_GTdOX>ryb*>SF^9@z2930?i7r!^Z*WW-t2owo`fggaZh#55Vz6t3v z6ac7t0ALOPKsb$tC!ZuGS%;HIHZ&>;i$8Ok8XJcVkHwveOu*Yj(WsO)Pz~TX0Hgqb zYeojq;j2Ro`{|PwXI)kgCGw|xo0&N%Q#bf1t;5J3&X=b5%4X>by!bPzIN4PAo9o~Q z;ckjnb3HmPps-f(IbtHXhoLu`3gXf{z*xbTG0}o_t^P(WLhIr(_w0Dd)EjbI&#gR_ z8?j`tXuE^s0nGEsJJqBdPh3>1ok6qk&o~hz8d;2OjPCO;H*EH$(M?Oh8;jVA(eUBtdahU%0C#{DLb5eFT z5$I#WBP;v#JdhUgg4(}>>*mIGi|JTLnAt8WJK1&DL`TR6df%DHb>OOMStBNDi`UYn z`|lQF_Pd>GKW8=HrC3NjU#%5#>qma8x2Imbv2jQ~!C4b0ncBv~L8}_7@p))&dum;; z8G9XWkkWHF8af*(t>;mJD&vOC+eX_Cg}PsmSDvs;svIX=2h5dFt2V}IU3!rF+9cDX zxnT=&yuH=hu&nD27@KYbAvitbtAU}8r!;iYh&xcIYduweXM?ERJ1XCPOM|URs^Dtt zUD4f3ZxrkJ7CwFFVL|XT1mhbfHi5dvJBMjmf3G|AB`!M#*X!=I0m6SJd_TR>O;t$T zR4gCJRymP}TvgJEJlDeF?rY>gzL_M~xL7Q?S&|>RK?R-K6{+j6qNdDxOg z@A_FZ5um!7RfIkx_jQCxglJtPfnaRlD;->c$9W#Z#)aV#QG2JYi3pP7N@OCpR2y>c zWBejHhh0(GEgtD<^7|uZz=0$0e!b(yO5=Q;$%x{%ooW9?>R3NNe^|1FI#n4s?w(z9W5Wd^DBoK)J@Y)Z$-R@BktGC1v(EV zkHh?~4rms&JPWLFneo4P@b&{AC|HP7hb>2j#=5PTi6~XCJ7PpOW52ZH0N)u*d^$`)Q47Ku*q~DMwvbS$E`$aSs z;&ypSX^ezd+8DrLS{A1g#?_93Z8F&i7v_Xcw|kLYdza{C?mvXN(fPaTk{Rjk&j#CE-Cm}&e;{keJzE=c{P95%=4bE5TcJ*eK< zL+Ob7$TzefZXyS=HgK%gcO}l-R+Ia{Jb{ZpiJ>=x?ACr(b~Y06ZnpUggEKd-B$fgw z<-EU3SYe-w1+D>wY%f->11NZ1P5;<~U6(;>ML}4aSG4p3r|*lLk-DP3b}=u|4+KU+ h{#&$F)c#Eh===O1-va$KG{1jAt3|Euz^ab`@DI&>cRc_A literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/assembly-all.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/assembly-all.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..30420079bc327ce36f0e13ad2b64b41a17d8d3e2 GIT binary patch literal 1341 zcma*neK^wz00;1&*=$Xb8l9KClw3tP7Rk%l$r1CqP;S^UT5a<(Z#iyb{{3-xmIb2#5TF2L1kYi6Wt0(j zzyJ`Y2mrbO0N|-q0{I8ht#f!1$&eaG3LwOVhebvO;3I>s6JrR5H>hEh17HY%0{}Vz zShHB6raPt)oPn1D%R>)3D8y4OnkiYHYBpLU)IU^Av>uN!yCn08?+EQ%q+e)it%274 z8?E0^pigVCQJB1H;a2clua2J-N0McDR5U0+xINmoJ_c9PfQHn6mh$4?6i+RY86AbW z?`=XkFx1zkNV}`!la-H1Su#xz!N%Uq(TFKQ4UGqqI>b;tkc~d+KHjzCdnhEF3Rq#@}UX*LR9SCizs#6jZU()?;mCiY|kR)`|ncW6zN20R%N^@OE z;%KYeo`oVBrKi?Baq}EQVF>jY*c;r<5s)u<@oeYL{8nO=Hf+*D)N7t`mG~w#Mv{~h zb}wCHHC5TM<`T|!Zssh4 zSnpr9k@B4+5Ua$+%t8CC?6hsT8vH{_k>l~dd-1=z_lnJMciWU;FRIO!-)tp1`&KLK zWU3}je8=sRF7gXF5SOOyoa$};v27Iq+xHH))aB55u%eiqZo4TNrsD!1f^CorKdu07 zt#}i^H4llNa^c&#X`Jrut4>D3f@3cDvYndsDqN}^Nj4~oK&yPRoiPCcY4xY7WW^Zd zu4rA5_aPnPEw=Df2cprb^-s^-wJxV1rEX2nEMb-CKKQuMTd}f_qF?e(J4l00cbgoK zeqDRud3X5wUl-6sI!tNv=Dg_7WkJtGwCJg)gpu7AIbR~0HW&fbb%9Ju`)NC>Jq zZv@R$4?)(cU+HdEKxov9y$Z$VE0%e=jaVI@6TSEAK->h2gOX3+)z4GhVDez4CVtlr z$=6F>En}QnRHtQ5eKLQpKUGfLP%>L^yB0|-@E@hpb`fqd9v4}6D!?ob4}r3}9gEpI z!C-ki+05oVxy8+~#GFhyrg#7HP)$*iz@jQ2>zxhjcHm|$9AQ4r^D|2oF&EUFN*W4{ z%0x(*{Pl@a`pGoZHqyc0__%z$Q$OhJ9KqyJ#ev=Bz zew-!Q>9&n*e&)&^&ftrw!B-?`VR&8WG-D=T6?)D6^nmyK(xaCVW~!b;W>!b`h)+0x nyR!@kCHvp3?aTIW=rUjC{~+h?43YctmD#W7{toRU2>|~9O?Pr{ literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/assignment-0.4.7.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/assignment-0.4.7.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..56a56a4aaa59a25f88ce86f8fbd6f67420d1460b GIT binary patch literal 2555 zcma);S2!Dt0)}IYz4xk>s#&42LW{Qcs8OXABUTZ$wJ5bhl~6H?@Y^X>BPy|Km*1?K zMM*_dqsCu*=JY@J=XuWeUA#Bn<#+K~nbOee0jL3N02G{T>*YqE7y|)-j9UP}RR93s z8XWB7h4A-4gea;gsVPB}f&=_u9uZFhft< zfzQE#C11vxwOI@M5k4}VVu@+@gmlGcgFEB&1BYP5pn3Ahc&t21^^*Us+2(NXXVdF(RD`Hn* zT+iay%h5&)NUWv?zf*%Fz|t}!WO)Wjj$X*u*#0-a7wLoyv#=*lwVm^KgK+)x1J$4f zN&CY*)@>-;j$WKNqi0Wf&_!D>=G$+bTk;WMu0CvMj-|6IaoAu6M6Ug?dyj64WNn|1 zt=<;JchP&|GeyWb;GfxHFgEr}Aw)FM@zt%2qs#ecxKHkH? z^o_MEd)=mFv=rRZE2#~nULb|NTPpt+{U|#4Ni6Uej;dRYV|%+ zAl1LLUJxsI3rZ92T!5UnToV;6=`&c}^7#1Jdck?{!7r(?nP(m)V>UBDD{5OjeX^mkmc%^toFOx^7K*lxN7oD{LrO#7iih zCi*r#1k{;wxF|ufN0y&G(xq%5fkJJrZ+NbxOWYkvQ0lOu<)XAMI~n~s`5f#tlpL`g zSe8ERtucS7du~D)8035K9x}TcAF$pf5;nI_;x%jbV%kZddRZnOg2v0b0CPE$Td&rA z*TFmAx#~h_VdwD2xhmfC*+nU=gt$y!2$x}R-l4gL=IWb72eU~WwC{GKPXPe1--XP5{6z2O@Z z3VL7Vu7|G#%#ac-n#!-@xHy93rQ_ zb`)UHQm6evzWooD0xa)r<}``ydF2%F@obsix%QAtp>|K4xDb1rxNw&EvUZy}-PVvc zlEXZ0*#9HQ=QO|RizZ&gz2C~!k%c05H6s$a5}q+TvDk)tqWh~sG5kV;TzB#bpIkyZ zWF?u52X#Ys!Yx@0Zdm@jt|qJq>hk+3vk6VhUbLx!?@O%;j2}@i!xLXasr}yV6U&)Z zBCSUA^x~dvm_EQSiIC6LUx`@+=329W4jn9itSn>uy{CPG@8ne*i<4WK{Y__266#)+ zzH(6HK)_et6lGJ4o^yaPO!&%$2Y~V%jDn7YTxveO4Z7KrpBI~E8Xn27SmCwa@cHkJ zQt)8B-pe$jvx3EM6>6jY(n*Xg)B5pNlj^_{wt1wJ-L0xd(xW&A!jPP$o=^Rt9bB(7 zNkL>VQt0-cAG?EN2kevDXW~r`fNP%K)~ZzJC-%fRUze zK3vOlt|ByDW4xYAYgcUM3*uSJy&_QzatkIA!v z+;O?+&|$t)QgtCgpdpHPo=nVKuSd_6pi95DtX@*>)(>~`GE_Ui92Bvd>K;YV9lUAk z7#d0S%77!X;0wLsqDZTs`y@Ov)panxf17pUa-)G|oMkUCWw#LEYmrAyqN7u-9mOdcZmpGn&Y2(|()hy!Wn3e}TzhT1~a7rg9bfB}~b#iSD6Htx?FfD#fz~q{+M1eMD?P#AhBsntZ8c&tGV{I=6u9zX+&x zLCxyNunU)-y>*(azgp;%>^FiTWid`9H)addjGJqKFYdG=3-N#D zuk~pV?(bzkzp+HB@!gCtqiT;FV>x=oUS+Z+R1{U$T0T&C{BI%q<7EF$EY-jGfA!4Dl#c%2J=LGu{~_v+;sF5v E0UeaqivR!s literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/assignment-0.4.7.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/assignment-0.4.7.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..fe97cd4979271a1484fe657ab4b6c51168f5099d GIT binary patch literal 2557 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/break-all.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/break-all.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..a627f5cc4676d0a7a32d4c4681ff2ea1819ad7cd GIT binary patch literal 2826 zcmajh_dgU40|)T4_sWcHCtsYA6tVPuHTUFH z+ofWWg!io9G+IUeTp<{C_55sj+-9p$#DeBoXxdJ5wg?CW7xJ;_f$L6l*y9R3vef1W*i zBs09>#kxxu9sR z%edS>nbDWP;QKep!Rp$;lVLucG!>W_;O_2=^YF{5;oggIKr<+5Us7wj2}4-X2C@Jpn*%vqi8+Mbrl?=vCz?I{>yexN*UuJ=h-Y?(E5JbJ4d0UdO7Ce7y}IR zfKlRem-Uj760sYsM?Xq(eI3!g9-1>9=R4}SDs;~D+EQ#`N`c#!j***Ow-OoN^-{bc zo!=Z@Uxuo^bVb(mA{+=q9~N31=j27AcQ{BJVvSAg0hedL8(E5?XN@xiG>^R}RKUvhkuy~0S zt|h6U)_8|UAb>M5s1TXgT-r=5J$>@)qj6!B|7y9}&u(*^f)RQm%pNOFX2WB$b@M;} zrl0m0f>(Kq*!s&lhcyxKAe)4Aoj@r^yQ`~U!X?I=Dla?&^{5FC>D6*N1EQ4$lMBdQ z=DpR&INr-B3B!5z<*gdsLzvB6lCQNs1B+-7g6&RiP2y-=YFlcV@vK{x;%z$6%!_Ce zOx!4AC|9lgIGZ0qM~w`y>xyqPhc=J1Dl^;J44c)zHDA4LDmCzGfH&EnVsa%XfvW?7 z*SXl_d6hV7gJfQXk4?QL$YF)K!cuthZuK$VlpN2NjZyxSOVk?s# zBl7U63P;fHp(NwhQg67yFHi!|fiKoN1!@rW{pq2bMg4-%L%l-aG(-%qKx~z*V*^)B z>q^50FckY?dVzkMhHkKOn4!(~ZaLn)(u?$n(g|B=U;Mmh<^;4j#!88WDjzzC%7c-d zKPQib#1HNcPb%x-XQ7*Ouj`Ek(%n6I1rM0femEazT2ZEiVb5G8%RF2?Va!2$A+Cz4 zX`dsO*A2x`-;k>TAY|w-s`;%4snz-au<{>c%QJUpwsNAOym@J=kx=P%cGQ26!e zFr7rcu4rShpoIlj$In}7U#Rz&gQNX7O8%!vS;@4iExJVt52(Z zT8gG0<(~=PJ=gu<2sqD|b-t)b>Nob+2 zTP&T&8rp5xJpWA*yv|pzYP2)W?TgGXP^wYvO6!Gs`}gp!V%2pFsOm;I%p8G!8KHFD zCIy+7^3hbAOsyrxGu~v=_M~9LkjhZel8CO8y2b8$nC%rOXa)b1dEo;ca6IcrZqH<^ zAi;(F_t~zho|V8y38kUNC?T)5VsuwiwEo5Dlaqh?)UA|-ooeq8Eq~FiZNJC~r8z48 z=KI!SF(M+dU@3K?p%0_MCu0!vsyN{fAeoPoXK_|E@o3Adu$BF(TbLvt5>;N;5vFmGW$jhdpT)x?yx7wEqoto#Hfoe? zL({l@@pR+moB(G`V6lmi%$+kR@>mtqm>fQJKHie0!zN|N)!=nGq~G(ViGj!HJN5U>taVs%e4@U$lg7IHukHYn`8?MlR29S8AE;2TCH=nc zp1AZAHycRZQsK%JPfD@2Bx<+|$ho^{J=JV%mh61VDD+TvK}>dDrj}1H$4!GtBg@p~ zy2LiS3qRY-&_A}^Y4g`&iaxPQa>0(`>rv8Pap&D%LegCs+{=m=5^A(%pT*Mh?>)GG z^#*m92SUy1T*Th~KHdI|QTpAcH|uq|3ydhIuOG>RmwxvQti9<-kw%*lPbK&B)Xi?n zzB*ViQp=vH;s*dm2MSv6D{>4tty0O{!Y6R2PB^0Kn%1q;^@{fM4NtbWb%SPtQJB|m zFXhvJFv*{CZuD|2lhsXJmKdgKU=^P$UKQPvGFeRrN4I4(q z+|ptZM|8Gm?`n=vnmgRItcV0l>&))0^LC^|w{1?^yLeL`?(U|B0)u78N4`U!$eJBA zu_8JuTz5h|bkFl(ufhGegL~Xnory6uOrIj0>VK0&_wW2)wAxuQ TG5>p{`&-+;`}nVT0f7Gi)@Mw5 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/break-all.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/break-all.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..9f2efe6fac5b7006c903115b0c77cd3e6fa46d31 GIT binary patch literal 2820 zcmajh_dgU40|)T4A{{eyA)da^@6YS`e17=+^7#Ya#(GrL$^c3L6CloM)if}kq0gQk0GKcY0PX<*00)#a z(o-1et*L0?B|OLutTC8-P{A6MLhg{eXdf|01yBG1^`fui*uDcmwfzYe56SM znAhv$&PTWto&1PXiF?Yw?WP2G?Q~TCEcxl0bI*wv7R}jZuQ+ztCGJDpSYsMskcsGS_3!uA+ValhgP!zkuok<%`Zub!!2!jaaALV zX(%d_wt%D8sA2Nk6xKbKNkHuJbx8e3n)?Wz=39}N!6kTg)Pv0@^ZJh!xDdr=gf zC9dP&h_KMm-!T7lKs ziZOSndOzE@WUk|Mc6eN#hh^Yo&Ac${GWf|x7g1Q)AAE6*KTBkIJCT|0c}KnmqDMAy zJ3jGejo^qQm4;N7D!+D*tx2>4!MmfevCwEiO{9A1P(!oOI4aw0!htSLvBly*yW4#5 zUh(ayfMOc3{4vU9(+vl6wYI4e8C)@fiFP~Ju8(w!t4v8HKp1WzU(W*%%_x`*N)2t{ zffbSCrX|8!Lak4Si`VI}%->BUuiS6l%V*@Xvs#Qw>ArY>chgAl!YcgiL}@pK8WKQQ z-#C_;cft%zO^aaeK&4srI`JTKny%)hHJB8TyVrSL>?yED<~V0Q0wFShE39u<=q4i+eR%K>4EkG^o;T4)T==#I~Iazm*(~X+Kq@GKQ(VOU;rGYln1Tjl!dDEe{J!2A~-#TDiVf zjv0i`CiUGU<@j~PMpA4pQFquCS1!Y}l8oM$C2RO$Gy3Jd3McQ^FO0jQPOP3SA=})4 zE$HeI-LgtXQG^KQ=J!ENL{5?2Fz=SR1v$6sNSb&WsH7|`paY&9+wO~f!_e3l`}3zt z{8g3!cKm97-Y=KmZ(&oi64BJ!Td4qa2;!TgONa%wf_}cm)1PuuGh;UgzfMp6QXRMa zQfkaz=-{S(5N%*HET}FfiP?Zb4I?P-9!3Snx>zb;6D9t_R&=LTDF+S4dedI zWH4G(9|&g5RyvtZ5MJCZ)-COJ$b1Z+;aOEBV>H_*tW%Nke$TCkejyXnqmCYDt$`L) zX+t`9aw(^e6=lPmn+BsIrl98=U21Vvox)F~R3nmf^rN{JxjAS^wdeqrvK@*FRPUkNn|YSOe}x?K!++_d1t>e)8>NXh5vm)(qhgGT)79V zcO69e5qitzu!%a@V~Ygbyc{_t-S@)-2aFkk{-IRDRON);0Wivl1IE>pz}7 zlQ?RKo<_{3S-Cs8)4+J)Swypqtjz~k8(+{>HE3>KZwjgu19`nlKF%noP7dDG*CRc$ zbe9Jc5>Xv!FUahK_97Q~+zDDEv@Ey9#Wx6-E<(_my;E&p6}+%atO0NB=1uwDGaeIw z0VONtl9b+xD!Y%*gtl{)^HW3cKG#l%o_pYh4+^u#baan}k|5luS_WEQp1Y~;XGBAS zz5;K|#&wqU!Q9BAug0;xk+KW%zIujnl*9?qqMNloUtvU8b8 z_Jn0oT1&J<;5OWrTdM&a%nVm`-a_jw0f&%($7e-H3(e`TSOP@QuzCrPE!|#S{`LNfjZ-ZYp;8LuJLS+@TmR_MvQCRH+;}k#ejx+fY|e-@75ZB)*w& z;}0c+mg?x@c?r?G!Z|+qxAG{4!TOR$ z4qk1z=8)ZyAFf1UCnQ%vkwjSYRnd!Uq7pmIw(=OI`+`cZQxb>N`2+tA3M-Ugfm`})A28}IC{ zD8-l!b_be_QpIJz;h8&nH74!1?pWC{${xCC3wVp_^m)v;w}<1A2`P8wl+!eJ-#{04o;SU2%hMWx^w11GTBBi(x7)&SL) zq1eaSqSOMe#8sFZ;t_uTMm_mZtka-Mp|UK&%j8_cR=Hra{nOGH?46HcQ$S&1B}{EG z-R4W^@NUvSp9@pAJ}0OJ&+$g?b7vbGS#5+9u8X!5QHP)lK^6!!2 OZ;k$L!C&hF0RI7%Ygm5( literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/break-all.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/break-all.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..33b07f2ec3a85320f6227c3935e751223ed55c13 GIT binary patch literal 2823 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 O|J3l$=KtX?0Pr7px?GI_ literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/call_to_variable-all.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/call_to_variable-all.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..b7b06e7039d622d16a4253543f97a98af6e26b2b GIT binary patch literal 2638 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 bGyIGH$M&qvSXlr4F#IjzFDZYm5dioPH0DuSp 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 b)4%wCWDf>qJN55}>2GcSa`vw@0s#L3V_g9g literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/comment-all.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/comment-all.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..69aa742a296645ca6a57a8270a6cfb3e9f3f504d GIT binary patch literal 1270 zcma*neK^wz00;2jhP9GCD0Cz1LS)O!Otd90U1=1fUGo0AEi=QmG)c#!*AK)!PcD*Yt zmh>If4~VRDxzf7zFnJy+8+xVcG>P7zM&G~>rP&VjK*%+{l@8qy7Rj`$cQ$J1=Kz1p zV{v|`qy4&Ay740P+`dhUy5Yi_FE1d0HLo#8#LFOfxbS8w2kpJ2$ND>KW`35d>coKt zOD65oQsBE2$X>+73y+0!zV_ve#&3^M2cy}yJi6R}`f+T*r~2#fak%F zrqnzN%Q2WrJC}ixDRV@71Wobh<3F0g9KMlf&DeO_Wl;e~$GpLNNil}Q*77N^iMbDk zdtXH$-foq>*rEg?p?9?`sp5fQS?h+|$=gRk%&eCYP07>kS|{s1_~$sUN2wsaHmW{j zoXbmNmX#}qdQ?jU>s@`h_)P_F^4Wk;os72-6zCVcr?~92Nz(g^cxWZ10wouq5_L6O zu>95HM_z*z{^vKWWsl#LtYxViwAIb|q#1=t-l#%Xvo?do6|DB9up3OQEV>MInmyW1 zg|PW|a-ogw^`!*9JyItRbSA4C*0MYvXLz=w+ei2vR%5OQq-gG8G}^#AxH^?>h_~Ew z9{Y=CgGRrzqvIPZW>m+g_ha@ zssY0}y6HK3LaisQmn$5>#`DQCvcD;xZcyi_U3|^-m{h;`6KKBni_jsnQcImjh z@;KVB_%=PP8RnXf^L(dvmroCc%h17jP;Ci<#I{TX>|n|k_MX|E5-r;edl z3M$&Q+q$zpR&KA3gmm<%o~KEw+9s${n>aaXQDgubOv*3%bktM@JmN0JxjXJd+-4BFt)##i;-sEjThtEI$f?zSjb&EO$~Xk%O{{MO^^^MOd)YMlPwyd z^4ZRb9q7?K#jN>*#eS6I5(j>3xvX{Tm!q5r7ppJw6AC`T6$G|d`frf7P5L*9ps({k Vcp|u}K)zl<+x6Jq%x&EO;2-EQNy7jD literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/comment-all.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/comment-all.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..44cbee76c1f6ec8bc73e9e32bf11fb05b5a2ac34 GIT binary patch literal 1268 zcmWIWW@fQxU}E57=udeT^0wbT-G_yN!Gf28L79PpAvr%cH#M(BH!&wiuQ)#^KDDAC zzo;ZWu_!qsvn*9Ft2jT8lZBNbmVu#xfx)(;Bi;CqapA&C=eAk%&N-Twsk&dTwKqu0 zPX2oFUNIy2jkj8k-+58{JoU(roEh~}hZ1Zrem!KE$G&w#NQv*%bvu8g+?<{|iKBe8 zTWa1O-n`$Q*SjsQUSLbxc5$u48McyCt(Uw_=d<8ngVo$28$ksDtx{qW;F z_cHtQGFAnTd%~T+Jj+taDtLJGWu!=Cefg|4pa0~ax;p7@@C3fdmZ^KxAM$zr%|BUb z{*GJdCG6Kk|4D&9D?WX0cAo2FJSD=B%eO&x7E_JV!vixVs;}g$r>e-e zxYg~oGTq9X7|eBX>PDWkjX&BpGQStww|>*Y8QH-)k?IwuKd#T#Y>RbvuU@%*SA3oF zgPe-Sq8H6Vc}p+&o}95){r-0+4qHy{>#L^Ovc^P7xs)B`6>@&fY2Uxex z*OB?2Wm(7QaOYV2!5{e(nGcAtUVN|jeEt5{1@F4&8*=`?e=(8w_{q-5LqYeWEN$Y_ z%ES6IlDAZLzr1u}+onmcwr)DTE9CoBXX|?PDee^pb2fk0kh;<8o9U^s@j>qA>j&eW z|9bdDYL(q*)n%JfuK!To`99l^u`&Eh*PAK#p8fcI=Tf5el)t`HFI;(7a8G`-llV{L zz4{;jUoy$M2EI8)+;N~$P zD=#IR{u6S#^2iS5}_aQ@blkCrz0KP^OwClyf?v2 z+GN!fzFKupF;Sgb&PO$Gw!bMjn=MM zua-27!a?zCGp8hj(cC#cFpsCtx{)O{GD@s+WM7(6W`12myXRim98P@pEw~V z>P{%@@m+i;SBrG;{MB>{;XJ?YO)_WMa_tSXxPO1KW%rtwJh3r)c@u{Lk3*0Cy{Xgx zZMfujXFF?8bkVQ3r7Z07!ILsJ&w2Og!2jKkyk-P=GcwsT<1UVXB@!4kFoGx|3a0>X TRyL4QMj#9X(!Id4je!9GsKQI6 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/comment-all.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/comment-all.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..1424b07d8d471a90656755c2cd6c363881e9e27d GIT binary patch literal 1268 zcmWIWW@fQxU}E57=udeTlKXbHoev8Gg9R@GgE9jHLvns@ZfahMZemW3UU7a-d}>8O zeo;w$Vo`ENW?8CUR&jnFCkrb>ECWLW1A}cxN4oJJvsM~xj8*`5=Z%F zx755nym`MpuXkHqy}*{X?c!R8Gi)WPTBk2Q&A+}pF4oX;rpp1d#D_ntFJEcaJm(>s zAbMWV;#T(8j>0tEklA-aA07O$EK6+3w7ZvHee8aDef@C*kIM;dcczE4L~eY&^uv$y z+{^6G%UBgW?g@AP@+?awtKi|$mysfo_2skHeEySv>guGs!4vo*Tc++&f5_+gH~(a% z`BS!rw>C`5ze6}9E-q@hc=TKIC8r(Xt%~xCKK(ROmRQxXE>63$Oz4s39=n{?jE{u) zeP17G`=PtLV`k`;matzF{U-(btoZb~*?F#y@stQhF5d>(Sxhxb4-d?gsJ@b~o~k0> z;#RlU%5*DlVldamsT+CDHvVYa$oyVx-}+4pXJiNKM5O~oChN59yp`7wyeCcH`uQT4jU7`fJQ5g8vUj;j zifZJHw-*Y1XwT2M<5F>YbJTwS=jtlejLf&o>z6ZjUyrm~5FPSO zZt2l0D`y+zzH+jBv|e5^j9=+d{5_fJZvQI75r5YJ^uGY_CtjVsY4D|0``XI{}bq3zUi0H|5RSb*)QxC zEl<&pZvKCt?Xtbxl1=HuUENtoA$~pJPlvm1T2xjpn(xY5m7h= Uc(byBlrjQgAdv0_mTe3S02$I!82|tP literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/complex_imports/import_aliases/test.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..7358784481d91dca77d0e75111c7f02b227c9b5e GIT binary patch literal 2482 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/conditional-all.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/conditional-all.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..b421fef9f690496c08bfe14367fb4ea51beed5f4 GIT binary patch literal 2565 zcma*pe_=E0nF*PI>ygR{}|nt2gr1 zNw00YaGLwBNoH3$12mm-g-DXe?ty58)Xc(>>)@6HqzXNPhF`~R^9}Lomr~K7*6RGW zdfGt0JOl+@ooGIB#>!10o$c9&bEg8a4zh4n=-xdA8v}=TLL`@RZ*4?2cv*T({1gxD zToB+{0OiwWY}?#(Mv3vq3dd70Qp6K(hr%x!bW=7dmt(eM3j-o)9&YI+&=VytlFkqh z-Q{V-+%~Ho(-eK|$HA-XuA(YMMOK{~9HHPgdq`BX#Z5ZBcXm{SUhQ~Ku}qS^YmyLy zn3!xkUsn}F$XP!bNLrUT!yqeONq;5C>Y3PIbmSYo@fhRTNh$8hd#$h%{rx2wxL#)9 z4f+Y@&?C}uAhiLsAh)SX>!>zt{M_-L&An$a{6Y}%ymTE!%Wu%9rCvl9A8xrTb*^aW zq5yJ?x3hBLl(i7O-$n5`C>EPYdiY{D`C1&zkeR=k}8MZ1!;Nt0q({WvUxsZ@2fgE{={9%ef@9w6R zlt^t9NYs6Jkg9!`uq+WQ@lSE%oV`+hn#FCj{#D`QT8}2#v{{PmgSneOYuM-A_*_pD z-r4R$a)Z`5G&e=zNVD}}-@s#=`u-Nl7Tc%??f97s(zzH6PJ`{?`&n|zt=>5H4p~pa zgdUT|n_#6V|#1f1$y)#RDQ$(Dnh>``SKr}=giCnJ;W`Q!PK>o-Zg&c~mI z>UZS!(ZYn~dM%R@e|gKbwDRJc!CoX*w#oJ9z19$CmFYhw(~Z_Vyxz{dYCp@5m%`PiFXgoAN3LcN|vQ_r!?O9gOeMjwiWv1=L=H7aRDxS zV1%bh(%mW5I8Y$D>Bpr$c;5DWVTK1#bx6>TE@}^lR-$yS}w=7XwEwU-#3*ZT8e#=ut2rXr#z?pp=-zENH#qI_#JJYH6F*$3f zCR%-F`X>-iZ4ky>F!|ijpp0%~*0AlG=&BRmM&C}NE>OVPqwzH<|AIwX#y1h+6@V@g zEi9fs0eW}?Jl=LuKNAkK4DX;Q6%w+8ync`D=!|u~oCInSKlfksOZR9oOuZGtB<_nn zpJHY@&csD}c5+~Nqppv;1oD9v?Y0WtR;-i_!to1m%{4s1v+lnCia@IZKD1}DV&zwJ z(QU461~sPEiB&NwC@e@Z?ZM1D>kOAw6wbiUXnVb!u_mu}hnH}&e$gVqcH`asNpSv# z1M3PiMgzrHv!)X-sN_3$R+)OnW6OHM)lhfo;AqE0KS5BrPe+Y&QT>Bf^BFMCWC2Fh z%Q{Uu(bq@N88V7L075p#=S=u+Ol z^(Gd0RQ%g@U?lwYs{7jQTlkd=sWftDFK(vfwStXXnQ!R)(r)r9Mm|5sv)dei}wI6D% zJzwg}#i8f|z1IpPGDK*;i^6`1KI*A|Yf9)65z-8GqI_*~989*xodaGRmYTun^ym2F5SXyXf=d+WA<=AV0sp zPL&ypWgxLY*O)pzWN(huo73u8*bZw1h8z_g`}Y9l|O&acIgLbWR~>-WXi z7r)hHuH;$j5(8~U^TP~YO?esL@ikqbXHsj?UU^j>FNU}iTXpa8ykG!`EhSL;>k;eV znXtQO$h*wO?fAq645$3s5oG<2u)hxm1Ft>Hf^fL^C_I|o{%hX!`w#g*x$71!=K{0V z%LEfl%y%1>F8`t&RX+7w{M$&!8v};wyKcLASJ>R!M61SSM`mTqtQ~G@c^Z7#>&+QG zHkGj~ix^c~8GiE1N2oDn-4#hO>!Ij)@eFG%KlWbs$?7=WyMAE9`_hHg$e=L$($rdZ z*603Lxq)$CoF^G}p#hoT#`Srql*Da@VRyKpa)Y_Fn2qW8$g9YUT?3m5RL5p zT#eXbdgv7}x8%Xf)s7baSAa`Yl0FPbqC)z=ZT6dI|4kV1-}yhKrVk^#^Y0z_yT-pa K=Qs8Mfd2rLRnS%d literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/conditional-all.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/conditional-all.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..53fac4b2bec8b5959754d45ec15156d7dcd42f7b GIT binary patch literal 2566 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 L?`Hkg9suwk&a&I% literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/conditional-all.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/conditional-all.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..e3e2adef65eed4683bfafb1eb8bac9514f0afe70 GIT binary patch literal 2565 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 Q?<~KI`MvjkV-EoM4>VK7mH+?% literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/continue-all.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/continue-all.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..c34c7794e8002161454052f111827e83f6816cf6 GIT binary patch literal 2823 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/continue-all.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/continue-all.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..fe086dd31fad0ae3f3a4e0e6147ca37f5c468513 GIT binary patch literal 2827 zcma*p_dgU40|)T4DLX4WGn~Cws3h~uLgUPE$%!-b<+#eoJlT7lJ&wqpWyD>^afq|G zLkXAp^nHGRUa#l#`Qh`+=MQ+B8&go~0LTH10Hn*hbq;}=#_<{ea0>(ghyVZpXQ&s< z!^_WA+R@Wf#uw@db`A7~`oO@BKF;nQ{;o0*U#J%yB^BTq000L7w49&88fKbO z(?W8Y+B9TMxuuZ2djp0}0Gg0LR>;&cVO?2yfIi8SWq&!poPtP`*#elnJorlc5nOgN zMVR#@v%OXzacS#6YfYrz5Bw2$U{&fC zx1^`o)hrnfbwV5NZBCu+;675bh{>KeDofM3s=T@6?mc8~geg2(cxxK?n0+Ww!(9xlaE1bV*>< z=M%S|Tt+8GDzJOsY)fiWtuI24gCf z4E`X|O8Duyd_WN*c-7k`p@#R~=DVGl!RIl?E_)P;@g~Q+=Fk`;n$*%*Or-q;htPL@ zj?Tm%<)dErrac$4%#&z+nek5#&t6sA6{l(C+a2sHSm_1ElP%&j@h4)k-aZ5lk70#! zW%A-D?3Gnf!<_ht{4w7JG@B6HT8A7noC4!(n%11-(<|(k$5*@ zb5hiTrkKjOZbON1`o}`a&4)~zgnw4n>FRmi0THVq20YQYmIv$6yXAkt@Dza=k11L{ZmIZLr=D?IGEV!4>p++@God!(9GO12*jJxOJEY||Si zv3VCdrkc7)?8|TSv4+s_D$+Mhyv0lm+_&6A2r1w*|J7KB(r46BUcz?*o?N#T_D?8Y z+*AZ(Ds^M1&_?T`T6K3!tEy!v%=BTO*wo-Zn5%Ubw?53wG_9@j&o^DA>j54FRkH$i zU3bWij_bB*kT>1rZJ5^l-i*YCSWhXsoi><-wNe7o`?~B+S3V^Z+UZ}T=i>Glug|I><}3+0d6m{!TEh%%K6<1*dQd*f;&Tk zu%IxWl?G}L+0HC1wLpH;0dW;|);H|BlImWxzhz^uxA zh=0Y4FUZJG^cr<`Ba%-qm;kiF%q3-dqUf0)~eLUUj{m%Az8f~+-2EjHzT;y#euHneB^Q4M3 z8>p9U!Bum#-k5i39Y6ZpK-xp3$>K+z)<79xw^ik2;ky|{mt>y}NxI+gx~OLY0e(50 z;SJZOu$HJFMn4X>-rpGXPrFS4n^V!!ui%96RX{+biU-{1FDCZhyZ)MyE$0MweE(A7 z;OEDAk%l?w`Mz@UVrU;CIx>+&8{XWJnM8oi_b#+2my|B*axg#~-2Lg_be0Eglo^!> zNv)Bd&L&07lr%8QLu@5I(=H3+>ysx-<@TgtCQJU4y)s3rpAtQgcuIy zh=`>!Itv)Dhb2~9h?0N)CD;ptKfIDP&RnKSjF2t9>$dztkted=Ac!%vS&AMZ zSuY#dkt4xCIm9dikFy%=fe^S49ybZ5A0qVYh!(%p?$epK(?1cnH|&8L@YUhYHpPu7 zN~#DG`GwbqaXh}(-oKPtttlT^hlZ4J-qAV^4NBn;hm7}Mt`2>7GEdr9q|e_zPHy3Pu*FPrC z-jXdJpp)N&bS^^XhiNJDADsIy@vZS{iw>CW)*9Ridqd1n3Sjk5UXt-4`!xypKvQm|q?s1TW8| z%;dQ)#&nKNn z=!8ze@lxZ3n&ac(szCc07TvLJz6a}71!<*%ymdlaQ_xXU|Y?V zq0Jg!HM?L?;*kN41Po+>FvP#8T@fg@e)v7cqcx!*&dMUWAwv0J{b7X3t1DLBt0e!j z`*Q_lC1AV0nj6DJaVhGH?hLV&R%|meqn0`oUf2+>0~Rc^o-5dOiw?Jm-%9lIkw8sZ zPQ+#-&pmn>{2Pw?6hJZ(RB)%3wp-RK=l0_;b7L}c9g6>r)W1&sZ{TGA&i_MJb7Ly% Rf4^jZYx#GJ{*o5}_z!RSWW4|Y literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/continue-all.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/continue-all.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..03b7d5b7dab2ee3239b52a75150933ccebfd554e GIT binary patch literal 2825 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 Q3;f#$f4Ar_cmaU_02SL+MgRZ+ literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/contract-0.6.0.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/contract-0.6.0.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..b3397b955c8f70443664aa59e5ada2c5328ea3d5 GIT binary patch literal 2572 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 P&hMK2-qPRX0|5R54o}o- literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/contract-0.6.0.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/contract-0.6.0.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..5fc388cc653b31339a7b11492fe03fe09a9af26d GIT binary patch literal 2573 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/custom_error-0.4.0.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/custom_error-0.4.0.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..15f1623ccd9b3f7ec9381099237fd67ffb53d85d GIT binary patch literal 551 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/dowhile-0.4.5.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/dowhile-0.4.5.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..273da3edb33130339af6d7ed302db9f293aa60e5 GIT binary patch literal 1770 zcma)-={wtr0)>CEPA!%8j-@EIbKRgNmS%(zs+86eH4|H^QL#oX5hj*UwMJ_zV((RJ zEkSCha+OhIt)K|eb_liBuEe->WB>(_0xKON@uLnd+Lq`Lu5rp$~^B@G^0)yQi1U|%i;XO3GgK+*Acz6L90Eh+v z!-ND+?Gx?CCF8?yV8Z$D{JoUAW#Y(ol5p9npiZ$HvecO;{d4SyWslxN-<&8(I@)k- zkAB^spH`0yw$7?;J;Y3|<OQu9VmhA7lm%c7e9CtL?Ui!hgo z$_jOpF)-?v=g4c$ynQ5L5jOQJ5Iy3B$Qaapwr@*ID@#srK9wmw?BTN-bqA*=1gapn zdUw9kGHSndM`2b{_V(jk+ISw4M-<88$^9(9@hrki^V}U(==JdeK;=V_W=T&qqd-ho#1?wBgR$@` zm=$jp)ERm3w28PU^NJnZ5EeBgrlkp9QVBD}xH+!SQjJwhn(-k%DY)(VXY1LIko$@^ zA}jAI#;;~uzP_3P+8i>=$+2Je|Z7gaofGOxv7uBSKWCwmgHOvik-uEXgN!+UfebvTb-tw ztk1*lb-WnJ^3}Tch^{uwWXr>ES#Bk)CcL@Ej%tD4>NTQq30{pR6Q@>adC;@A8lu+OA$*qEN78yf@z8}(r@y}q3P9P&r&#av8p^g6+wD%kxVx0p_!}__C8jt{%G-+3eMG^i zsyDC~Q%_v}xUb6P&0Y8!740pAkGs+}oIr>D!Ke*e}LdR+=n1N~{*w|kVM<7qILSVs>lM^566v>x+Rz z4*GX9|Ll>s%iBcu$Hm4YGeb}s_KzeIoM{)=?l8pv=IL-=qJ>0*QiJ=NC1hD{oWZRI zjpfn4p6L1vVL49@^M{NJjYG+0oLQ;|RSPWOv8)7qL2Cf7gW$ z(&WPuJ{f0*tZjy_1=w)n@=P`=8>JdvIX?RJ>?+f;dH=Le_vS%=lXkkm6LVzaZ&Igw zLvXJq8PC~ri~#OYwT5fDT)+PbVSgpT0*T6Tc@gG-|5)*t!+?IB^Xgv z#M+6L1`VY&2x-Nd>X0$se1GS>dq4cn{R8g#A>iCR<^Ui-7*OK7?rN%6qiB2%0Ki=U z02BcLfNxj~IxyHzLkp${(}zWd1>f?E4G+U$Z{5b+K?g?r!Ga>gLIrqu0bT&WLjb@u zJv~78L^q;tn$l$~R7nmERD1OlPH{yLS%=oq~3!*$olUOs$KAT?Au-9(+yP>mt#>v89sL!c|Exs?YW7Eyj=hMcO#AW6Ts|eY0@O zP#-H{{=UpOdG$H(H%!F=BU+aVTPq-goL1*2Q+assJ@yGosC724kKVV>yG4qK)s-Oc z!rPlJmJ&@0WKp@d<;|ZdJOS~@7^z=`a?h^$U4^;C?)5zP-*7r0e0v+!rIj+y+NCgb zZjS#*nh&}srWf^iq)CRY@x3|aL3Fl-B~^d1BGXo&D|>G195qY0v0rCdn#en)l8jn; zzkMwoSMK!rzJU^1in(S&rJE+KjYu2tWKKK7c)=>$BJ=^*bfT-2O+~~)$_jl{@S&45r<#AO?e@iEc|I|EC{nleASrFG5U|DV9 zwbR|;KJNz|qD|i@i|^g6_7-$Vp}!ksK=C19)?&i-F9iAz^%FfgkBjAYhhUq)KgC=u z$E@VddKu@XSdxu2u@kw*&KR{g8hqjx*xO`fA9~F5IVhpyw^jmoclbdOwD}mhT4s;0 z%4AELh-1cJR4n#Ly53;4hdNw!rBSbVBn_Fi#L8`X(d*z=@os zS6RK^rp@b&;b(4}dF0M!v})5aIor`Kk1oaAg*$zjG_cMR`$4k%GcX~`7}Syos-8&& zqkBpi(2>M8Tf|Q4X-(O6K4HSF>rHJT*fTDbobd4wH-6K+F2)|t4=oyWFN4;>Ja3JF z=64tQGczSV4h#GzoiI5w9ep}(Klrp<0vM5k9!p~8Xy1cap|^GHNc5`t^Lb-Hm1i+# zhUBK#V}hTZAKPSpn!fASDR&%O@j~*d%)n+z37jhBJFy(}^w8Z}SieTV2ABP)O;ANc zUlPM2RT(%y&~0B+onwC+Yffg{(x@jMZ`Qu9E9AF2hH-DA47q6UO7($1Mm%3t4N;<(XvaP}IP^pBzq4cBw$^AL~P{f|YwEK5Drx?wf2cU&AlRx(B>}vtjA~4y|1d*AcLTe~od6 zYG4afMZ2=`UD&=P1V8!Zn5;D;PO?^dAg~GOs^o)_v8RFn8}1zq$tfI6u&4P#NgVir za?vYHnHZ=E+b8n-GHJ%tx~Ki&fzJvSy~US=KT$U*kUZk_2ak>deI3b%KH$Ho+04I1 z8@m_$>#$sMQf+sVz0)LIL#IN^T2QRC=Vifj4c6pe3@@3^H&8akI6XU){cKMb5iiU$ z)PAo9l-FxDMD%RAki2qi74G;(td%J$HXGqJRj=Yv%VVx}a~QWpaUa&sV}K>FT)R$4 z0u7XQ*&+U9hC9nZ))_>sRlflW+SmX{C*L(QtbQw6q#JWHSJ$lY^*IrNCy*sGx>c=) zx{bIO4#L*r=NtTF2TZjdWIgNw5MQNkL)@h;S*2GVo)lZd$r5JgyB+W{2W*>xd zs+Xu*UXi_bg|i7zK=O+eeoK#5Q@Gf<6tb~6M?6``&OlX?%xnu6yF0c$SeBv%v8U7W xA~Yq#2d5t($N3027toyhfBWZ5LI36<*MISU*$4sWJrfuJz;#xaGd}ot{R8>vP-y@F literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/emit-0.5.0.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/emit-0.5.0.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..c2847ecbc8e5b17520cdabdd071dc94d0f81df13 GIT binary patch literal 2100 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 Q$?((WKXdTsF93l50JbC96951J literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/emit-0.5.0.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/emit-0.5.0.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..511c40b94569834f56bf7b225539c643e2d4d699 GIT binary patch literal 2098 zcmai$S3DaE1H~h@Hi=D*prx%9O5L`I-A1c4G_4i0wTTsb?{QHsSB=z&BDh6r2elJo z)^1g8L4$H{QS&ck^*59jTFkOquQngAdG3`lvojsnR@M5M3+09;T2;3@zB zaPV-!$}7TDV2UtbPj?%KKrc@ptc{(|3uhO92bim`Cx)Gg8DIqfL;?Wt#6&0MQ)Tbs z@sUO~5Uvm7BGmznOEnSF5S#IB=T{OVevYMl*$AUK^d7nALVdbc+9OuXNrXF(hx5F51p&6B-A4YH#>HR0gq-{K9V#kz!R zLfY;jxVD(TX>2d?2Dp(nQ(pknzw%FXdDETGRU|U}?S&8HwBgEij1BKowGce~^ar>$-l(b}X#+iafrK;txs-5dOnp47q86c@qS@ z6p%~WmI*TpFAQV6`>Bkq*23SQLS9Y=j4F#gOcN-gj1U2yGW40W4N!Qou#G7pIgv^JJr?bZ&I57{FndW_Q?=nu4J{1BPal9|caW4)C zPV%xWGe2Ot>932AV|SlB6zOV|(>n})d3ka>_Tuj3S*yj}E^@V}!d-|t``d6fnut}yC0Gr5%V#AiPdx<| zBz_IW(R7H?R3o+%Y_C+q^U8DOdlD!~DGgl)@pBk9Wct$^mki#bpQ{l3)sB%CaO_l25GA)4oY}L5N|*((#V7Edxtgy?jtG*d>$;Th(VXdikDT$3hvX&S zyZwgKPDI4-1k_g&J}`*?KyO6L6V&z!`)|h&zw1C19#Ej0_+1nw{2#Dm@qyjhf$9u^c_II=H8oRj?mDe+{CLJNdw+oy zIoqggw=6>!q2`)|54DSWO&)zO3Xpr6N23rMlZST07Oe#W#0A6RxUUmhFYJ((imqm< z1dDDur?=Nb!O``tPJ~a?5aP+D_gy=~dXH+^IgO7@GH?ZmB}Q1T z&8EY`4HJBdA>G$3_}Umw2o^VPY-sVj=e0e}D_P3Y;c@gK#0TI-uES8qFZfQz!!cv$ zd+VMo77^k5ta%ZYm^&f88x&C?Hr7UuckY>p5Oq%qeX6Udy+M5yH-~P%cwBk!GX2)u z>nYwzZXVFJmhXB_gF0E{&Q*H^cYB`MX-G|t(5UKhFkBs?C2pA%KH4L@T9kNT&1V~t zfs?jkHjhW-86QD2qH;P;a3G~VeU3i*TN(T8SUH`CytA~0)%@2No{T?ZqLyzN?7-MW zqZc5d&l``TT9#5#=**_1-fy(rJ*2Qy_y#Z%#@!@kd>f3vig{%|=Y#kl-h6;DQx!$% zMQ*jy?{QQTD;R0X)6%wz;vS-$LQZm=J@p`*(euv~q@X7T_4#$@^?emk@N9kOSC7a` z`okPhtO;~!vhLVH2?lvj34{~CUHsEl$!PTS6TxRxYu62hQ+oAB*)E`ONnewevw6(^ z&vrp7^#*a5-xSUcdK0Ol63Uccot!DOU7PaU#z3#fON3YTI1;g@05zX06u5f2vBw1) zUMwhS2LBZPTrMv|*b1J1eLG2u*i-kUH|A-6w5H<+_SMlCAms@Q!$G+&w?n^;cQQ3( znTg-h|3$p^IxkOFDItz(V3M7wW&UVSS>{|8s*5yW0BSP+Z<_xC`hOM4@NfKowj&Lg TS^jM@{4(-a4*hxt0Kk6$?dRkK literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/enum-0.8.0.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/enum-0.8.0.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..0535039b05ff06d748905f0bcc42e8e2d0712a56 GIT binary patch literal 996 zcmWIWW@fQxU}E57Sdj88WU`0L2Rmj4hI^b03`z_P45@jgxw-~=7J3GH#rZk$sTBqJ zMJ4fxMadbNWvO~u#rb)hEUXN%3=9nn47ME|>BfJI3m0BGx6PV&&e6O~)%|jmkED_N^O2N_?lT+xa8q+J{4C{DN!l zCEwP+zs|ud!F-pYSH7s!61`~;U;V4T@^Y_gP!aoScZT0?CinK}GgU>!CkkFzpe?gk zl<9VvuSi?L)MZ%_`S+jZHt9^&2Ut+Fa|r%(y=HMdM|uel|rhxsqBy6!mZYF_kV z;iNUj%VsT#NqH)E@{PIB9SPBXmnEIb*(_6Q)lK+UwU#*gre5)U$$j{gEla+`5iMJ# z>WLiDJIVy_F5$Ye^R(-;Yd1{~JoK0&e^;gXdi-*M4xe8P%6v=BGlJ|)Ls`o0(k{uA zz54Bwko8nok~4YfEB&uiR%=wseLve?{X_J~%&jt)uHN`~tMmEP*Ae}x;U0Ln>*f^SyoS4<;>UY~250P5^gh!-=-y*XvF$ui1BX&xZBu%m4l^U$!s{_miWAhPOsQM%WF|z&#nw3;qVU+R~N5PiTScA#`?JF0lTBs0{iB$n`Au_ zF*v;AZPFa&hF0eG`C=0f-ctHgc_rn)DztPOr^v)BQygf8W`a zv?XC0-_*?p;s5kkYVJ2<-?OD^oix*>f=bJ(=JQ2;?K2j#{l3-qujXsNbW+x%?xrCA zN5*f(u7A;9U=huoo|h@2x!>#loE;C$4DSD`I)C`<^zbKUjBf8euTSg^@Hoh^$>PT$ zDbGuGtN!rVf3`ZkvaI|>c9TZVpBH5oGuGdcyY;m-+xMOE+V7Vt9yl&Zcz9GdThNC) z>&rRzU#r+}>qU8p?>G>6+O>E=?fJuMg{z;hw9G%nr6zUV+-&FFix+?NtYb9&vt{OS v&Y*uk4H6Focr!BDGvm&Gz$^#`4U8a)aBd9nW@Q7ZWCX$hAYBK{%M1(v27Jc| literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/enum-0.8.0.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/enum-0.8.0.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..7b9bf9990be4aa605619d97ef3bc0569cf863a12 GIT binary patch literal 997 zcmWIWW@fQxU}E57Sdj88q~}VPlsz*8!#z$01|$TwMb_3q1q9;{2TW)QW=q zqLTQ;qU4OsvQ)jS;`}^L7FLE>28IR(2HTE~bmKq9g$pm8+h)x>=V)H0>VCP_-XJME z`Rm1d#f;=P-fB61=SA)F)FVG~X4Fd^O0d27^^jp6`_>I1CB9SF?fj8)?ZY86e!(^O zl5gwZU*}+!V7|-HD_>MN^X*JUD=H`Fir zlTdH^uypnn_PT(&j}jKQ?(*N_n4M92`9|Gst&?GvUv(XB=7_j&Sl{)y?$Aer^&59; zOF14aJojMZxp$p6JPX&^E@GJa!{^Ip>4#D$Szn0cGtA4KnBEy9yH8bVvpb)`&&d8+ z+qx56SJt#%vkLBB5iD1}x^Bf&&AaN?Z${p~Z`QQ5Bt7TAthGi8-4!!`sjg#t7WePz z`*YRlC{N@GjR%pb2qP; zY>0oQv?t=l42jA>jXEb*#OygW@6+!sy#B1L_jMG*;g8==1}B}U@t(KmPS3+jlN4Ld zJec|5ZR?@jBi3uQxn95Hcm7>^m+z+V$62>u2&|iwsrhmKi6yM>e*O8jDmYyyzHV0g zv>jJt_FXyU;j~tNSqgu)%kPPP|3dv{^QA2>5?DBs;fj*_)>+R)%X>`ie_xs`(R%;q ztCc%Vj_}MnTz2@^C9d_4J}=b~na+QEQ;1@}0%Oz*d84TwdMB><-E>_ocPM3@-IUOM zZ=VFNj1TbGF10?lho{qDVE61WDFwz^7LvzLXtviKJr*1JbyHqP#tgNeug!Y)|KQ%S zv`>42fI9O(pB!N=?>{MBl?QIF$u6%tSlG4jjQ^Ph4<|cJEk7jQB5romxh2h1aI31> zKX$*kGiT<1a2smo9YUZrTTb=U+le038o{o7ce1_0@LU}k1u001FS$-Dpn literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/enum-0.8.0.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/enum-0.8.0.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..5604850051a5124048aa35a3c9888b7036a072f6 GIT binary patch literal 995 zcmWIWW@fQxU}E57Sdj88WQqD0D_dp;hI^b03`z_P45@jgxw-~=7J3GH#rZk$sTBqJ zMJ4fxMadbNWvO~u#rb)hEUXN%3=9nn47ME|>BfJI3m0BGx6PV&&e6O~)%|jmkED_N^O2N_?lT+xa8q+J{4C{DN!l zCEwP+zs|ud!F-pYSH7s!61`~;U;V4T@^Y_gP!aoScgBN@POOO%*?p=?o89>gen$4s z+SZ-my0WJAnpJT3ieS0&)paYLYTi}9elzm^eY2*eCFwZ_X00_+=&qRgOLZOFv$%gx z-!7i`e@E>0J+XC*FGU1Jw6jco>D(Mxk!9=|c>lu0C3EI^%}ny&Qh4EQFyD43g{=X% zPhB`$^lHwVwpiBgw6wjcH@(aFHDl6Nu939c@LY zx1M;OV?yO?Eizfyujs4o?tJm>Qar0;H`ktuJKyX~rv44^*;@09W&ZPnX+Cz1Vio=aGlZmh^{APEvf< zyBGbwxvhQX+tVzfEDQc>n*6!w-9AmKDtWfTDz*fcy;IWOo-dxcDw$#FThj+u)*o{a z%~O(mZ+-oeXyu=(rYe)z69Th?uD*?w4of!TPumZPtdkju-hBAM&G z{MfGXf6y(BVOhO)h40P>r>uut*B zLB+sZQaA4;xIE*{Y_)2-<~c3>!VBhCU59U**@|Di&@Fm$(bC8~r*a2o`HxCxw=pa_ zsB-9oMbPZoWhFYr?&}LChFdHQI72X585im;=F}fe}Oz&Wr)xtZX2aj6fIwq-%j$nSlWSAg0FL literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/event-all.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/event-all.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..8df293c031e537583c90e0860951d30c1a8114a7 GIT binary patch literal 1537 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/for-all.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/for-all.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..a0f36910fdcf064f6c0be67f618e46b9a425768f GIT binary patch literal 4806 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/for-all.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/for-all.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..be8cabc87f0f8246b549e2484521d4d0b03bfcae GIT binary patch literal 4807 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 Z{|B8kAvn1Iyi=1*|9BMu@ISdSKMMc= literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/function-0.7.1.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/function-0.7.1.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..d49dc3e3e90e98ab71ea1c181228c0bb3575d512 GIT binary patch literal 4431 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 EKS4xV{{R30 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/function-0.7.1.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/function-0.7.1.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..546cb8f3f1db8c6dff918ee0c2d648435fccddce GIT binary patch literal 4427 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 Yz^0`NK>wcv@_#b=&$a)b3U9; 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 EA7W;K#{d8T literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/if-all.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/if-all.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..309ebec222a5b7514657d9149170357e5e90e89f GIT binary patch literal 3355 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 Z^Zy~Et&WHP?+fdnYW%Y;{}2cO_z#pxP%Que literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/if-all.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/if-all.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..184f8275329f761eb6c686a436e3231023e3576f GIT binary patch literal 3356 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/if-all.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/if-all.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..1851aff07a5e4143334373b98690698403c3ea52 GIT binary patch literal 3356 zcmaLa*CQJY!v*k|joqNch+P!1`;@9()JW~EwWVfikCGs|5IB|4jr*lZ7QtBS#QW(H&+dwc+=!$P$ zv_B7R*iNWGiwMT0%u*F(B?X%28-5DDM)*xnGtJnI4bc`vck85bRXObhR8ECuxvNiu z@ax9LLr;&r(U-t}k=JZtZ5~;`z>)C=g|UqCg%M!+WDPp zku~Hgy|Ege@#Il-Gj2CmSj|`l=WBAfcMK3Cn1D;4@X*L+6|BWziI`u=T7-4zp10H` zB!^V<=|(<^E_pP16eh1x&}EJ?-{>|j`MOvo6>r5%w!W;*7wxI2XSxQ(M&%}V2Zz6E z|8@EH{GOFmszfT=-a-y#XXOoS>SsiUA4cS2YtWpSPw`$ubl^9TsS(y6=3^7J6U;Be z*jDQu?y8I*wG{%-Mbh7roWfy`6atHr#gtx~DcRL>Y4zFz+a%D~wb$J0^tYt{jD@(?^0Ksx4f!#1>rH){M-T{yE6(DuVFTQWgcSwNv z_V+vb;W0ucveR=VO9x$EG&RrR{e6r$@4YSs4Yxvnb)*8RD2nxb?P0}ih4u`C0}?m^ z&HK8gCswPI#9iJT*N`s`2=gI8zwILt9U{b_0f>)4mB|+uzfbM`q3dmlo$ychUj6eU zWkTyprunQ5#i0`C)aNs~=O&mHo9(0GqMolDPCBun6Z=LMPkH93QogVAiA4fz^xjj~ zdYSFcAYw^M3tBuqlDo61bM9C|C=UG`peB8+d;g7r^c4n|EbxdAigM#HUqwqD=3(8` z+UTv>P@uxYZH{dH&6;Y=wH+)FP~)*a^Pq>XViW{v*gs20{Tu<4E8k_r%-8)hf_qeU zQGopVXg4K?J+|rbjB*H8ugZ8|0}+BWr&ObQ3V0le}Z%sTpP|xY2bS3QK(LXnjmc&-qkO z>&#!F8ec&jQBKntiCSj3rEh0<_mpB(m2W^F{&C`d3; zBnF9_Um?U~emgG?zE9WF*IYfdC>^us7=Rc-$rCSPi~J9N2ZjZK;cuCCEv#ZxRm9S= z%<0Ov#j6Om$xuak z;fn;x%n^qqzB#RO-PH-l=DjsA>tKg4=ANEc{0s&OSF^nFA<*+lZ!li+$gJH%sA73R zUS~48Jurkd-VccT>DD^G)P%a1>%8b2wA+6mz2-I=A8}_Y{rJy@!{J4I%0>2VyfJlz z$q!{g2iVZh5Qgm4<_xr!fafW#>i7cvw^8U` zcLADyi!jE1{`=W=Hi@&&l4P4)JALFn@ZQL-A`(_X1)T7Nu0QD*bp3bwLq%nCXpf#qjCrdSa45xV zOA&lLm@-W{%0aucJbcfD1!&>s8)%?IepSt_LEkAMZD5#41-2$h$G6)sMqS2T|BE z9>yDNG@sU1*H**fIXlaxj&$%wg~0-C&dZpcw~rFEk+OE*o7*}Av-m>Ov$S8nMF*fm z0vNRmZ2~(iHpV~JT^YM7cxISViOMte?5M0eRURQpdfncse6oq~t`u%QXz9uc5DBw~ zn^n0^mW%rzKiyyy@}2rcPz4%gb3sEHk?8kBd4 z4fl&{BDSXJ_7J;5O6g1zd?hDwKsepjg0loZF1Gcmx)L$*9GYlG#+4H{e9ARud(?%a zuJ$AY`IZ(AWm~`@3Rvlvk`Gu7!B?b@xf9t{3|^p*=F7}7SYnoOQXVST9F?owwP)Ro z&kC8B?O6@4h1zg0Ow>LoMV*ziR+5kF)??V1*_+g3BTsbFas=m|*SR?zyfeMvftkMC zf7lX`x~vXMwM+*0aSBa(Q=L*ZQDG#!JJ?6k6}fXWGJOu*dsQripmIK>r6O`&%clKWl++r|GkcmsAc+IAD#DAN3763oJFZrB1WuD z5@V3V{M(SrcCO1`s9?(V<#js4#XdMSOi_w6q_;o3_wXx6`ferco*sqW;J8$5uzKue zO6iW!dZ&}`?Wd+6`k%rgugdzB=@x*`2V^FnQ$pnYC)#|gD7(L&1z6-Defzq2^^~_( z5^DQRR)RhdcW@rbBV!5b@uz$ElWERd#LF*5ahJ1!X@d{7N?=w_BRNG%@=eb$O@vy4 zAMo9pPw_y=u^4#yq_EtH!hGAXTa9mq!|h;x6vtbp4>96BsMU!?Ntj*bK_?T;K{AHU zmPqC&b4%gp*tZVi7-a@7;6KP`?yt(K(wt4bJdEd-ua9j%7a8c1kSde?cf0({m;X;V c$$#d5OU6K#g7QBvl7FlB@3#DFAOPV104g71761SM literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..2a75f5def68bd63c5761f65adc524fae2907108d GIT binary patch literal 1354 zcmWIWW@fQxU}E57n3?h{B&Kl!cNhx;gM<(RgC_$6LuPJ4eo;w$W?o5ZQCebhYJ7QS zNk)8eNl|HXNqkySer|k8enEUrYFTQIu7RGpo|#^8eolO91z1;NQF2CRS*l)Eaef{r z3oAn`149D?gKbAgy73?5!iAU4ZL{W`b2Kkgb-!F|Z;+Io{Pp6!Vn*^CZ?zo1^P={7 z>X9EgGwP)dCD>m4ddM)3ed~sh65pxocK%4Y&Ny*Nq0QN^Ix#QY%{Q$uzk8Qo?aKxC ziig~1os9L81kEJ9AC+-;|LRLw_4L?*xqENNm7i44YR^tFx)MIyj{oLd^Mhw@+EKEr~2yLOWNCoQwt-^`r99-ew280zIMLZOvTjPgP{eRSA>=y_6(T1EPY$J zvD{9dbKT|7(?0xsk!_mfmg1c_S=g(1b$|N_b+K*y=dym5rB<1}KiCoeR4FdWb*9OI zon}|gsK-wVzk82ou8YBGp640+*ri^FztY?z%ya#WT?Yj;~hC?KhVexZrG5fBXNLI+2Sf zb8=ji)%5C5uCw-X@;q|j=3c+9t(VW-v*@mCu+R~WobMa;gm-58fvq3@etBHw>V1Xv zb4=9j;`IDb{auEcDz#c$U#0%*@#vDDes-sPwwhgCsE^>{S=lUCj_i88t3EN|lANxk z-y7o|4wGQ;2vz@|K;G5vxj5yU-@ut(kj=r&Cv}%E}$RQt;BoL$I0SD>RYRgANr$t z%HlaDX}?N-w%fHz(Mx8RUgozMyFTfuNPM-sF=0>5(dUMnE-AJA-w?JeKB7AI^-I13 z!j6hA#~yaA(_?f$&ES~p%e#8H?XG=EJ%!sIxK*8aTmI^T@^7_lL%fyZAZbzP+oa$|!W3jJDG}Gl^ z>N+K{%&N3q%Qw##(>lbWey}z&LQj2N=mD97)gp!xH{yy`=@N<^6sZQ0Mqw@1b)vSI(vjFMYIEerySFG(({ef#LN zG_&Fpu~2u3>3bd)UA!tZmBY{cO{PzS>#kRczmqpHFP+uC$f4)x`t6U8{hxbzcY|b| z)8n)>d2mvi)ao71M=RbfVR-fb6}R)0 zfG?ZZ=e72X57UWuml5x21XD?wZbgGo0Sb@AR`c# M1L?iM5|e=e0P#?3#{d8T literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..9a4b41040c7a9acf10ab1785959508d6d01ed794 GIT binary patch literal 1354 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 OWV`;`e6ejz0Qe7r`+9}| literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/indexaccess-all.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/indexaccess-all.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..0f1e4e6be2693355f722ac6b3dc3c00d68bbdb2a GIT binary patch literal 1689 zcma)-dpOez1IK@3lxK(LAT^hq!(4Kidr?b6$u_o_5oUH~7&9~nb0p?AMuj*oJw$Gi zV~2%~yWFBss<}myaLjoL4+rDzod4hFdB5L3KF{}gzW;yl7)h`VAOXk$d469Af%J6P ziWC6IDguBG004BRA1#_frP5d|Lkfdo#0q7QY0+V!HzUZDo76yhB+V#@70Q$WO93PR zhz9^9mm6SqU>08bW~AwY?1Mfg9p0&)oaq9)bVkT(KWTdA_o<|TndMtcwBB7t{%u%~ zFY@(vj|ubGQ$8WWDfhQ$yMB|*{J!p>y!hO->n+QTJ-zV8tSsj<0^=^qPqkP;AP;o|%n3 z6M_v>X;J-A=kIy(PIza=i=3wB)OYNLS1Vr2{ZiW}W_D!NIY=enSuRdxmnxFAW?gte zW(rO9wPimg$br ziUHSpG?2JEF_qM}(DB{D`(CNM$}S~R>3~Vm=Y8XGJx0NA&nrJI{`myatmrxBT0Ze$ zQ=qB|&i;e@Yw^#1Qdyb8rg47VuOBB!RzIRXT&%W|$WbP}(4dbxO9>nVE?Z`Zl$PS8 znMY03qk|+hWL$1igKl%??J$o{qU`0HZ~dd&xRIClu6_Xu*3kQVgmq3KwkC_?1|i2)?VAVOzOa6r?Dwi#MIWwOu;&u-o(cs%pu1EzG_wLG zqG!>U(<$~4G1WM@csq;k<*_9o~E?SD^>nHLBOPYl{uX z*0G~T)a8qYmSu6g#UtVSuC+k8`Mk7bFXMEC7r?R3Nx*&m;=Z2M8dK)>PBP?4D&$c_ z&px!0aErcrNJ?b9bUTY#_`44dV`}f|JYOgWCfpi#3QQ&}jnphWU${3@7OtxXmR!0* zN_^d32eD3n^;q0pnaayG6)h-Kje8R5nbS+eI3lx3|m^D3p_5u58h_K=7 zltQw~-Ie6gk>#e#nN(SByn=dcB?#`lXq(MSjx|nEKvovb<*eELpKCGv)%YVUkL?bI;&UvDgZ&uJ^+d zyTa0hi*Uz*2BCKfiUP)N*&7BoOM|Yw!CZfq6*3fw!?x%V7p7hDEpJMp+@=-v>}{wT zE@Jt!t3Wny*@7&ZceR84e8XC_o!Lxuy)iVkzBc9RskwzB-I#xtcwsA{yc}0z@`tHo z8eZ6mo(}Y91gwVGrxcD^i66~O9u(%Gn$^RH;7Q<5<06xyo?Wa8#8MlrVEO~=@AM1= z#yfG`u095VdP^fre_iw$&@+2Z;Wl_?mnZ3CqTS^GCZam}oo(Bw-`@zkTsd8UH38 Y^bh_|d*Crr(*N8+-|F^_M*pt=0>eBMJ^%m! literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/indexaccess-all.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/indexaccess-all.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..c4d10cccf9c4d5059edb7c204edb7f265526b52c GIT binary patch literal 1687 zcma)-c{tMz0LOo0=1A{mB3C3#rfKnp968_AhTJK+vN>i+PlXmQ0h(u|j&4W3Th=egA)-=ly>F_&nd|`Tqa$z)FMd04d-HfQg&&nN88L z70Up?&Rqat2mnA-EDoO-8Wx79P*9;nq6vjW48|wMk;oT;xC1-HVME(uN$TQty1VA2Y6JiVZ1gY?f@N#=zo&EwKc1Hz4hd>y?E zBc_9~y@S&99=q@XgtIPpL`78IH2X|Fyg|}5%0>-v!#N@5p#vq~u8k8W4Pmbr;4KpI z=Lg}*TY%O}rEw2Io}!^Md|BDsbFObr#b5H)yzMT0X3i<~jtdX&$-|9)Jtrr%nZ{L% zAGiFP)PQrQ(^Ok@D~`cQThyiOgQkuNK=R zkF(<8wPEG6$}tPvm3)~hH=on8qKT4W_x353v=S|?8-e<0?QD$*?tIMsWJh5^d%RkF6aSBpc8 zAi28{>|ar4IXT!dMALg-p_YP9Z{VS`u~ty|wbP6dfz8S3ho-D643!4?H#p~dh0UL8 zT5ggpU;G)B8ejX3=o&cEX1nqX?Khky?bjAX7dM}0BF@d8SyC>y+L1UoqIp!)WcJ<( zD#^LTvkE3ydYijLI_c8^R95|Z^5pgcESmPgIO4|a$JJj@Gk+u;yHR8cu9QdFF!4>~ z_#ri8D|X|@878UcD*D@R#9Q%ze%_Ok{PO7JgOBu9h3OOIBmFz)!@W5<_xT(ZE-isE zAhvegjs|sx*fBbIp|u^NLR{p%I%{YF($IkxIiVX=r8P*i7DVtZ{UQ9!oC9!Jv}ro2 z%@>qeYSx%DzbLWqh%9KGgpdb0}VV?y{16jD0CRlMT8nZWdyk zf2z3mvT*}1PewVt5AN&K^y&WK%6xZgC z3zaPO?gpQL@y|CcFE=~wdP+C7TFye=`2@0gJa*9)mJT+7xqH}Qp`zwo7jvs~L{v{{ z=Mm6h(Edgx%%ZqksFuu5o)8o0^hE~m9whn*dWYD@Ck zEEt91IrlSPm2Q{nHa=DO=4JYN>^2B?(-?wKwczutFlHa@E5My-(Jt{#}0qYyS;) literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/indexaccess-all.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/indexaccess-all.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..baca125cfd10238c3f87725be9f292e0fc993a9b GIT binary patch literal 1683 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 E4}>acvj6}9 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/indexrangeaccess-0.6.1.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/indexrangeaccess-0.6.1.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..5d81df8d1ff748dadcb741ceae84a32d6e105ce9 GIT binary patch literal 2351 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 A^8f$< literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/library_implicit_conversion-0.5.0.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/library_implicit_conversion-0.5.0.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..a32f87daf4b6f2e399b2cd768bf2a878e2fd86c7 GIT binary patch literal 4223 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/library_implicit_conversion-0.5.0.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/library_implicit_conversion-0.5.0.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..198deded196774f23b188ecf8c2a53cda4d863f8 GIT binary patch literal 4226 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 sWv3fC97aH>K=glWfPW_7e8NC19 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/memberaccess-0.5.3.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/memberaccess-0.5.3.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..1849ae73314c38655aed21a68506e3e136810cc8 GIT binary patch literal 2593 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 lo9cg~?YGuGP5?j@0HA@# zd%#X%4_{A?HK{{#-}+)Cy06BiSn_EK&0srum4xc&pA1sgBWUP>V{amkug^te;zysN zFQ~E3D$tZr(|YVS!*!WnN8$r6riR$MxMi%H<72F2=-KlzZuHINlz3TpUmKCO_N0m^ zdS}>2jxG=a^A4Th?WP%6_@JsfgFPdn4cE`e6feHVI_l?3%61fl3tDFGiUC_kq-rN18;doE6U*L})f4IlU^TY^BqVTfC0R>>PMJ!7{^M^F+wz_Dr@}raqxi z8;`#=0nfg_q)eQVJmA*@U2PZ!VDdh-bASiem_w?>S(OPPyO9zbW&qV_RLL} z`#00PnQ4kG%sN^XY_U+A=IBOGo@SGX%-uc)*U7+d$v9W8_I#ZhGpDq_2`VM}Ka0}> zp#5y4+QQ`2tmg5?xt#bc3>;dk`z=f}>`VGtKfU?EK`ZqH-CHm}vh;0+;c<$%ma^*Q zAAc=6lY`oJ94M?+!!eg9U&>?-v^k{h&2NwtcKqvU8+Y7l^+BudzDM^k^jU)tq@Po> zpOSKqs-f0=L^Ivls?fk5MxXohv@A(qby39dU@YBepJVn2813R{*wR7wU9_;>SHOhP z9zNfY;95<-aa3@ITu3xwgytV`k^{B3Xn(Lf%D2k5Lx)ucHn?fqd{L9j%P_Z+wU+H` zbS;qqyB^hQK9v|wZ;cP4mCXmZ1a?%&RgcKdFFQ?RjZc~Ed>rNhK?U7RdSHk}aNRfT z-L5W8qB*woO`kRI>6KvN&>zUiwIGhuzr&-&u!nXFajB{#Mgbi?IUWnCd!=m=gh$mU zWC}ZzDT{ChJ_D<58FXtuqh^dXw5lBbS|qVJDXoDjRk>+6@dodIV8wHe&o{ehAB3z^^AK9W5~OBD zCTQxfu&UQ>$Gn}qAC7oUUSyZH(Xlb#9D0AbJU`atpT^+?4d>i6?<8yjlSrbMsKinr zl2>(mLH3^6p9M0|3^!_qxNreNs6$1G?K??&YU41UU)OXg)i!MoS$-;54@TH7TU@Ve zkFo;y#j1@igu5$?7B(|Be~ zx2G*~b?3v249udLr3{P~So%deA@4#gU^!&NfLhLGzUm+5;KwbiHmUyW>o1bJNH<{! zHUwO|zPfPOJv+{XDTWt6`Wz?u5w@N!`jB$ZzsP~AiKTddw&{SBO70x&@(56o_t*LITiR~%%@y-ft?`}t_3VsT<(2-(2t&ZTdQ+>wc4+!uZ(fZJ zs%T0Xe17V*8lZ5cXq*4jUcu05Al2o4E3aQ8J1N9b?YvhqKGJZlgK6%qimLiw9Fy-~ zead8eLPfm&HI|AC@g|ZcUXpHib$K3>ZRXaWI14;6Y6!B%X;w->0T|o-IOFR$;HR-c^W?z>6b1OQLsnU6L`>LlyK1l zMhgC;p5rEYiFlwvpsv4h>Kwf3-qco6CWQjgl?-f` zlMBQLDI>wTtSlz6Bc1lrP_a0*@ry$qarSC(Jb_`6LCj^|xEHD!tXeJ+mEUCBFy%Il#xQ*clC#nZ~HiQ~IGcJR>0QxBN%i2^lO zcOQ|HN(JjprxGy!VVWv7bC09PZ{B}LYDlq4ic|QLEtXFC8Zv07Z~zl%MAT}$MP{$3 zI&vq>|2eU~(68yy`1}Y?G@tGdSVFdE6(?raW&$_j-2v$t!s7g_28Rt>1H8AH70D-? zSLi>*H*ea@h(er7Huw@DyJ+!1wx0{K**%wZjF!F-=Py6MahBU{T*#S7`(}=8O7732 z%7B++;~h$c2PL&SEp#a5f*XUhQJg!6G-&v?Nrk*x?Q}KW!^Qqd|^F`-4MLOQ<*l6y;W}xdX0~qTvzB*l0H2g z`|=BNob<@aoJsute1%zvDl-Fo%Z4Vy`r_8zhkFc%*s!{egZ zA{HC=KG@G%0>U_yR;}_Yvhw9%9I8Z0z@qLr7#4eV_2>9It2DAtz+|&9UTVs9SClRV zw_GMF@RAJeJFV!&?bbYwtx*uA5$$^%pV=kWh7-UA3O?4AZ?UIeQ~b`k7B?-7fpl8* j|C?;T)%M>+0so!TWwD654hEwMx3nw`>YknH8GoBLOX*sPDaz38JhpFG z+G#=E(0HAc=*1DVtb~rLx!R}1_tDYPd6cS4lA|$)c%6fF+&GsP7L>CKeS;ly*+Kx5 zMpqT4zr?e}zf%WGC)!8m&y&0KN>QA*Rb$E3XPXADDIHj;K#k(*F=#VEhNGFr3WZ$%<$NBlyAeS6ugpZc0~a~1ooRBYc*mL43B z_A7`z4VtilYan`9)U{Icblq#mvTL)sCkm0K>QeII_x@IRtNxn=WOnB(WfsT{+E>%D z*kbPO`CNZR$5SBtP+oE+_mPb)1*+5bAj&)a{aHC?0$ujW3Bf=ffOGQVYd#k8%+7Sd za10NhKp4CWf6tIcYo347P@y_kqq0*|>%yKuL&srLn#9dw;f`~!H(n)R)8%a!c|{D3 zX`Sb;oArk@xcM>z-lOZ`FE558q8BP`A$crT`(h&T&ei&+KEfU>!mv)H9qKL;3ziNs zm@I3LPYg_an7hnvJRm#jC`^~R74G>gs+hH)U6;72p(D(1|Kl%;P3i=GI!W3jQZB23 zY>e7DNbasIWSBfuxNkTsbBeuvx)N>*(cVz-w3`3Dy^R1r*NWl;*H>4Pw3L|`@Z(Nl*3SS9m~xC;{8O4hsUTWWdc3v-#Oy2s9DU`k3*bo%0rCha^1Hd`83LL zl~=1hU8y>sIcwbT=wg3xT=+qRuPZZ6X{DAYthJo5DRgo`w=Ic^=!)Izf5TEFCDl>l z<{Z>rapT(U=|k%z%?NGKH!NLJB|Yk;M;furFP=G>K%1)#j`IT@-j&14pCL^envZxg zpB&m#COwd(|FYT<Q`f-$-eZ35UJnrSUDdG#>>qx*Q_Ll{Bp6-j~Rd1c5G*iY@hfYdL6W?ph z9n;-l{`}mp*AyyCvbN${&(Z5L_OIPy?;m4m;Rq*FrvkdvT5sd)#ciU^qP_cZL^yVC z9NAZOEEO|rFW6!muEO?{#B~KP2tw8vEuXch;6H*6ZV;;b^cQsb%)dKhC*HO>X<^MJ#m$MO3#_^Pab%wd~laoGv8kURIg;fHKp+>re%jM7kZXa6p%? zS0aR1D2j&|OQxDU#w@r%dL&xGVmV|%C!1?o2O*SK3)bxDlaD!t&8Phe&&@cOg=Ij0 zBT)ROv;03Zd*0ZeDQf+!#HB6?8!xHdc-pC+2@(yt&g2?#0>e$e(YLRS4Guak>EK^= z+zp3jG8&b66VzARxyE5a>vL(8MWNE&pzLO~*hOU?F|VNf0ZSuan$&7Emdm%>v5+f6 zmLeO|p00~DJ=P;TAU=4IoFn+ZCI7?o|K=3vC;pG}eee*4pIgw65`S>|$7KM(KMgtS AGynhq literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..682a042bfb397bd47f18b94e19b3beb0943b5341 GIT binary patch literal 1611 zcma)-Ydq5n0EYj=Na!M$B~y+jD$J#lOQVv*Orj=Roym-r`z|ikatTqBO0Gp4i6ZyZ zWNkKtIS$LcQcW%qT4Urer_T5D`O-J4eEwCq@!XFOb7Rl@-9iSpbLw0Q;1b zK+6@&2&S;B-d62?ODGY>(MwA6)H$?$fXvpi*j_!H`1;)>ZGzCe6r2;Q!}GQ8S>Tz6 zDm|+@NkL^+u$KG>)Q{L)A_*d_7QUKpK1@ZxGCiv@k0Dg1(*w@YcUjfm4lXgTfGz|T zXT{pSR^8Y*pVDnzd7C!nSL(fhp+5U?<^Bt&b=C=S@ol<9Xh@tI~uLxp_ef6 z!6D@d9d8xy^14v4hJ+i<1TKB!603OdM7~IC@AJs4K3CRT9f$*0H-RE+2O_34}-6xea1%w)dKo+Ki=otd+)PIN>oSQ;^WXpgXF zD2xD?L~EE&a5dAuy7w?bOWb!^{jILzv+0rE-!bWDO1CV}%a-zjI^wRhzsf&IjMBz7 zp4_F1)4C2^Pg&E-1;L^fYq`UOe3CTz_uC0h#sfi*_wbxd00^Z8fgi6X40mn@bom-- zzD-62YO);T%46BZe_~E&=^qgoE>w(KIP2ytnz*b3>y-WQJ@b$W#-uvesBk22EdvG7 zZ7+Mmt2%_O{V{=ZS$qPHq-=P{h_jhuSGB^ZwYv##tkLbteQt$A@xS9$Nl) zoeu0=x$Yq?W`r>aHjHvZV#59MxBofmFF`pmY?Ej+=T!@*+icE;u7u0dea7PFn-Ec)1#QhX z2Oym|!8Wqxxwt(zkYnxhM}{$W`rYYLkPNIl6-kPs#CfaY@^mz7q*YL?FRYN}5aX(um+ zA9vT~Y9&tY*dJTHo?;mKs^K$2gj*{WuKJ`=ONDl3=)g15HTtcNfNM8<{mohiTIx({Ow9J|A8?3aSFSDSd3t|P=#LFts_NSCL4ZC(M zXGvP-z(wh{cn$N*_~cX!vlFRsLk*nQZ8GMiQhk(o&+TAVMoI)`n;jEkL1NAl}!G9FDE7$7Vmxv*XJgRPSitA3porutEM+R;}n^ zWwOTG%y$Lq{7V{-suVl+0Uj1V#MHyGWYbM?R!V!!>faj&K^mnOzUC%9NNz4`m^H7N z9HUanNz-S(ZxvliOH5Ff-!9iT<_-M;nyV0Je`y=s$##@D8KeKGPU?7>R-&reYttLq z)DOIAy<=V^K)s0lbbbO|ZorRnbS&uM9aWLf98y5Qe{d(eOuy+b%QaWWw7p;JEIgLCdrl1*BkjZRB0Yru zP;u`}3x7y%?PL3tp9c~ohmiko$^Z2Hzlj6=!v9ge2NJCKYYX~W&z~Iqc^Lrk51zgR AIRF3v literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..5ef0bb8c448c185f7881cf1853441251b5fd4448 GIT binary patch literal 1612 zcma)-YdF&j0LK3dBlm=g(a1G5NkpDCr9v9BV#0>ZFvcjivRNV`B!*^k%cbNJQDiQo zR> zIHYi}x4}Y&`7+2~yH!0t1+8*?@9<@o^5MNtM&mf+^Ax^M=XzjHj0)QmKCsF*3KFlc zxo`zZuWDS!4=Y$5yB69Va%5Ei+i@}sp-o5E(9a;G7Sjk`w{?%yr3aQ7RjI88lw`$Z zeA$$1UPSx?bq%ZkNM$}hEnyZrQFV6tT~-6{XP1g63EF(*y4p3@>w%=l zv0Y=}Om;6)yD2ug(>t%&>e%oz8I|32zP6;M@e`p(Ybr=1TVncRa(?1~B_c0|B9 z*}{b?NbSid6OPV;O_$0VD%fLC)k7c;iQF`J#%Wx$aYeT-$zYmht}P`cjJMAO?xx>z zoU_Eohm;zLM)DcY33unMoIOPTm@-`09=scLg%;ht7NaP(x~8$$L1CnZXH!4&(2s41b5d!S=FlueXN zE42}>$be>)E`8u8slo-U+Tndye+LwPQ^h2h7 z@gd6TFWvlaB_bk6wGW0vK`vK=P|G?|5iSncozv%}VUv}L=3tVvLXlrdYR%QUf_{5T zxHW^@5f+tDxc)S6WOEyl@Mc4kyfTtH-kCKEh;OjYsZto=Lj4Ky#2f$46Gn1EG9?v9 zH)!*q$Z(u0mwuKTGB)-c$*C1@Sc_EF(pc``CC!s8xXhjEqNmz>;xfT<)YlJqmhKZ5d zWspnV&KjfArrcL!wN8A*DlSWZm&(;^K;P5x8^eV#ECw$k^c9j`JSgG`|*UbSOjk2!tu=8f5TDG8pTa{}aI@axa{IX-F!vKY1se0|tl zz**Z#?`p94tXQN+*p~HY{M0z3$~p1J!1vx<)AFjx7putr@V<}=`CeKl?Zj?KRCxW} z{aP)e9WuotTvsLM8K3^Lq?8FPv`MX3ncjZv(v;JbCr24-3)uAC9~&6WJ)D38S@Y=7 zLc&IXdu?l1vQw7DjlNWS+qogrv|O$_zs&Kro0*rL=lR=37RHgKjxWhuy@UQ@Py-{B z%NCIUr8vEyZlp%7v=hK46vt;4`L{ix zf!`hX7^{a=@}8q&Hx=>gHM{XbWMhKL)R)UHOdaO4I%R1mj5mKe?tTP!T)hS%1#XYXAAmW^l#4m{tN*42R;4slK=n! literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..7845c49f6cbe7a36b1ed17e8cd88b0ba4404107f GIT binary patch literal 1350 zcma*nc{tMz00;1&VUBV%IWjrkWh}=W5o+6$<9*d^G(;OYW^$}e)=Ta^avynWTH{$> z3q|B8sjW~sh7L!h!xb61mb`BA>iz$Hp7;Cxd8&?t&&7=uoeladB}0e}er zsEmyBmRpt=d3|pijwx{4XrcPe+Nrq&O|;G+qfyO5r|wgVaA-PViqg79;Z6;*zX`a=Y`Jzt(SA<8^;-d&npI0e zmd$R8R1+aN4O?D#FRm4hSM@|`CB$FH%W&km688SF_b7IhB1f)=zV`YrxY%{^`(-D2kh2Han(*k;$K z$*@ms){|H>3vuoRt91%$N;;Qr3i*CftE`h*%Nz-I?WD9^LHW2ZxalF>-PyUJ>H0g6 zX32uPOGh&}Dmy4y11vGx7LO{vV8Dh~e7PC_=E^#cKT1XjMF$6NEu! zFjv36II{YQSDE?240fW>ZdNv)coI&Mj9oPet0iepB5bW+wpXMeRH7!WY;Di@4~4Yp!{IKKh~h-42PL2!>Z2eUev&5 zd`8($4X`?V zza25X*#yYYeI|aOoW=gDB70Qo(RMjZJf|FSB&kTy!_EBwH>liE7-V_t=q1}f6n#y} z(}%Dc^Zx8`N<4grkhS$BIJtH*kMYg(&flkFA;fA}$C8!+{}|D+K^cBp z-~$|_bo#bM%InoNP8!}f968jw+KF$Phk00k`D`IZ^^c-l+i_cj5VYsU0A;v}m2}vl zdbzOj@G}!_0(SCsZxUBI+Bu|L-_+Ek>!`iB>wyD~QB0q5gmKQfMk%Z7*C z9JL)~!}KfmJ%%64-KwlX(B_0{#WJw0vUIjnx|+``>c({(k2{%UnA2fJ=3Dp;vJh2T z!8Ily@^|j>`!dYr)dnMb96OC;_g*acY~YIkb$)c9?P>IVKRvjnt{EjEv{v{7^!*E- zXzZ&JQ3U4{I}L{~W!hi!oV6_WZa5IgTir&x*0@?W#lcjAm(s^ln~)+K;@MRV&fS?O zoyA7#CRB8J<4=6hf*V!>gpvGj-*$=nH%y6N^MAB+!%BmHeI<5F*xiv`Edk&kYpH8P literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..cdc342f1230e5434b61101d36844d56a5fa5f18d GIT binary patch literal 1350 zcmWIWW@fQxU}E57n4Iz~L|k_b;~W+ShFO9P3@Qu^47vF!nQ57+MY@SOIeNwUIq|6# z1^GoK@rgyr8JT6NdRfK!d7Lb)46zIh4Gavn9UbY$e~b$kUOKnUns?68yiC>oa;?2V zQg-s!i}#8d$#1;Xa{SJV+UKc9e&o!kmpYVSd-3Zb!#wt_8$wEar>@)iBjvhKJ4fo| zKV?uh`bZkx+*PKJyJEm|S zfA{fG<;=JHly9vRQgM70b2LmiCgAMa(=RL6-(zrjd*bA@l?<6C7Q2;BO7?HhXHMQ0 z5xDz8*59fZob6)G>1GRGek*M}b;HZuGPyJR@aGzFm%eKgRxgtCd?;&h>9O5}3CfEiqX~k3aEUdS+=djA2unq5f;8@%Lxv6h~+SEqVM~`(U?h#e_ zbI<$0WO=tV!KR>{tGCN+(wMh>=Z3dumX>VzD0tC5C1lmz8a=U}5&K2CRW`2`Ua;lM zs`fuRe2(QdJM)dMg?!&vEmWu-c3n4x@%a7E&lR4#t^QG-6L#}M$W8&jbCXs)>^dG& z(>1qS$nxu#Dxvr57I#cJIweo}k^H0tv>UEucuX@XS@yAfB z1s|^ln}}~&U8Q>Ws?;N&M+FBKK3|f#XlDr5Y)S;YemXT z%{DP1#;csoe;k>e$0YGHyD6_C*4y=y6Pxp&dmntcEImq}-*m8apYr#3Ov)^WlJ_eQ z6_y`eICJ-m6+NFknzW^hF8_P{A*Za$x$u4YmzK=aC#!R==bTM`JNfOdJ7;*F)JGH> z#)g^v+`pgScBP4sfU0T6l|%D87TE5z3)E2I_xriR;d`x$nx=fu6q)INx+lFjD|l+h zX2!4X#oOZ|Ut8(+YE@ULA8C_S7EesANwF==eP|ojW~Y67k$&8+EizTLzN+DiWozf% z2+vDDRc`%%$36YdH?tXSKYv>BsNs!-r+2;!zo$3HHcoA~kSl!KCd+k;d(GUtTY9&* zS;_XsfVtJtAIhd$dKl?6*B%wg3%$+D4J9Zu?*`=pQ9U7G8gd*d$WyqB??URoX5 zxSOHRAXfgOY}SO=Z>*R83YFS-q-v|orIiNKUz;5zWk1Ynw3j;N_WSmk5Z9O9Eax-k z#Qyu%a;~*WY>ks~Ra>Tpz?IkYQ`fa9hn!K{B6r_M+Ax4UzAHZT`pPectJVm&&0TO) z^VEJHL&kn7*Mb$7eZ$vpT^*+XaLLpa)rTzJY?%Ki^X8L9Yh(fWMBXQXT4_c literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..d4d53a419e0abbee46099180e35742bfc3f6ad82 GIT binary patch literal 1349 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/newexpression-0.5.0.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/newexpression-0.5.0.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..bb0b279b795c7258fab4810b4e05c9f9cc02a841 GIT binary patch literal 1816 zcmb7__dnYS1IND+V(a8kS84^RSfy6P$#Gg+)mB1m5<=|~#HQCfjjGmas8M^wZZ(L# zB1TX;6jjt}ji)%z{r>#$d_F(CU!TuE@HRIBvmyZ&fDb6ZEL+{T_)_8m0RZ`50RRR7 z0M}a}SPJWiP6u@eD2vw45_{)YAFQ}{ANXa*2vc1UlY{+@`* zQ@$y|Exp*xQ2{yN3~pP0fwo*!*CDV4Vk^-qI$cAb>$EgyN^*a|u)_szYLav-kSO<6 z9b@svq>I^~-4A|7j1r_Dm3QU6&U$Y4Y4 zE?NukKKpJ+h|kPh={+pt(w-2cRWLj94w)Hv=8FtV1P#Dv?gQDMd z`epY$v&hYB7on&XxCrrzZx32Dej{1c+X*#6)Ea&Uj`sKka*~#F`5W|#P&^SgFJ&1RFU+f8IDZ*El zJ4w(;FEkfEf_xrRqYHwL>S!$SLax>%{-)jXTtQH3=O?Y}_Rmyk&SDtp-&3;5$9V$* zT)#mRHCws&W)LO~gQ8*TtoWfVqwRYC)q-u)HhNl-*&AbjaX)GoHLcU8P_n%N*shtku=>Ijas$!H_N$xrRMt`4+I8!P-(sJ7*Jx!^p*JK9+=)!q4SybHvhfd z#5rfWj3ow|riHgNF6m3^_)Xb(UWzdy&C=E$?^*w8V?5upoun%*j4Mh}W>im#FQF87 zYIjj~)ui+5Y9xD+XvpbZ(xTB(i8G&E%C!6l!l1VRf`l5zi!N42)IL6W>-1H{f3JvH zk{Z3=s2&gv(@05fRa*OS|HchNwFI(sZ(+0Q!p#i^zQ8e4+ghQM3HB{}FUS&;JsmZ{ z?5XHBK+=7-WnmrN?;IR{y!U$KE9eD=h(~P-qYi23>M)>C75`m!(|z*!(^VW8dHarD zHnz%hjaV1bQhU$Wvtf5?+%1bWaw`*F2YcK9B*m7;HOdR^Vi1lf(Y?=HEB;74o$2ul z4~&zJ_%^6#pTDya)p6VmF4b>g=9b#L&YhRkSrS4oNb+*=i#M|g4MkdrAKi;%Il_|b zC18iw!jMy%&J@-^!$JvNAID;hpJZnt`M+l{?W#J8JlZ&q%3H^_0({cT=l-L>>;;-a zVJNhQnweL=sjlG!w*?=Sg|5i3npvt4^H9PyA;a=mos*YChW=>dp6#~ncF2Sv1Gb@o z`%05t>d&(e@AubmmU6;~<`aT=gH}+zpT;#xJl)lVwF%XRlD#!t{X`)emUEh$92K=Y4TO$eknIc<#g7|ILOCzR=TolM4zzwWiqm$ zb%4@Bi^-gu2ee=E#6iqt8b-@&BNYIvP%#?^teo~ug%YdRrz`|RpL+j+jzh)1LxQ}B zc1o@zSCuj1jc@B;U1^E>n{N%$cwjDWGG z5)Gw~6Bwn6W{&E_45!Xp%}B3Op7!5?XJ6ys@lJN(JkfX8rk)#pq&C zm6{1O9&xC>vpS&~GQ%S4{j_Xk_=#e!{@9BZo++ z{U%4q7vdE&scNZ$H({8fG~f0SKg_403rnh%*y=-m- kVnKrcx2n!;^=}BE|Kk4;m$?z!nehMsbXL1Fmi@c_0Y%Yaf&c&j literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/newexpression-0.5.0.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/newexpression-0.5.0.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..96749d0f2658cc2e4ee69dbbff8a320eda6d91d0 GIT binary patch literal 1817 zcmb7_=|9^E0>*!0qV8(hNE1p2Q6*tQ>u5+RMbW_~L|gY!G^7%xZbclUSZ8${b(Ff# z$heO%bgM|+G>$q-)mdUf9c$f zk^rCx0D!lvzw5InWLFBsgXE1=L0w0wpeQ7w{n<$(``SB_o!veBTv47Bk~iN^V89jt z!T~@#HujO~k*ZJr@F4xBQ1+kR9&#O*sR@=a9jOUQ8w4#?I~~=>S`Aro?coqJ!(a>t z?T>86FW%=GYH+@0=~Yb}mkEe@LCjpIY!*x!O8bjJBxSQ~KT4mLv}?wjy}L%5xOWiP>imK?Mu{~qq? zqAqpeqiww)B(jx2Z$w3}7io5c_l-<)L7h!fqiu?-5gRR#770^oO_0VM(fq@eiAJSBs{T zv~7_l)}w(bH?gM3$N$cR%f&3$g4@@u>-&vJdxt=P$|+$Rux?-z`4k*TY*# z9W_`pvjnW{;_LIBw~_=}nu(Tzo8l|5oeWTo<*Lb!&MIL`4tXk9yTh<)fUC+v8VrV8 zQ@j+L-zB{TlY;7W&fDwBDp_%C3LboU)@9oR{n`jUR_ebttRjpu+xXPA<^^48952XA zIjsptPU%X+iK$ETk&R<@AeBNxk*?*{EnjZZ(C2Pxih8~r9j1AJlW4B%yp(>mHp)Mr zOn_o0H_By9#CxaSwD*BeZ!*6WLb0;!cvhzq2`8Snh6js!YeYq2il` zQsXSu!LMO4t08!g7Lq@b)M$(y%BbMLIc;j&di^S|KKFCpwBit6abI63q04@jBbZiT z^Q5Hlot3p>`yW&x&BJ%4rEE}jMYi%C$Gk?DdNrK*1hhRS(8Q4)1ZALJcsZ>{3;CB{ zL|U1U;dbwzC0tZL`DQ0Un1aA93=_7UZxjllFF5s70=dd%nj@1pM2EV$il-5ab+W$) z9>UX-3#XWcp1xtfO2E6CPZdpy9b3d9lw0KMtoW16h}2U-UIBd^J!&+`u*!k)h*#m( zp!L%lcZsmu%4j=GhHmR&aZF(1w$HSxZ@1%kR5Sa(2&5W+<CStkI5Tz3lGYz*P_QD0``n( z=Lv&Pm#gcedgnFP`bWN%@n4qP-EQy_^Kj5{%m3Yrbi5p)147p+k2`eSrLv~es z?`xp%H)Ta4N;6HRRW6LmbV=TWTfH;Nn<{KwU(H+g|2dU7Pu;XS%)wG=ucv?T6d1JB z|LRB-r?LD;gHRZhuUy7MYpngg=fvVVcG~snUW5oT8_Dgi!CBm;w&e)?Skfoy^IGS& z^3{M10ZgG@znXhxAecvjMa|E*g)6{7eCM*WD>4fq3EAI91A*)u#ZP0`cSiG68axlh zj#G?zf~`P*G50ghpZ5~B$i0y+HFM9I-zZg|UD0Z7yOs=T8Dlo7riJDq+28Ha+q>gs zx3%(Q4rca(ccL^Ep42AG;$#d`AtWE|pi%RDhdJ8fKfzGZa<7tMyx;@Tfe&C<)Htg{ zA#1GqPW3^uRk!eOPsOY*lNm~jAt~{~uV;MJa)IvegG-#Y>RaH!mky}3IbX&^qWQ@~ zg<@A74;5#{_~5ZlVdjHo)wgbq30@k8iMA4t-PCxpJ8_Oi*(b3Ym+krsVzaJc5yzOo zu%QcFA|LfMQpqoYvS2|oDsVRq*FtP%1}q}BB1IA`tAT7rTTy_p( z+J<4I*4bKXI7ecS#sVY5wTd171bQ*Yl0PdVY<)n4bbvK@j!&rFHA@c_FCylhc&bgB mn{a`!-2dBEXS(`3;ava4|6wk36Y!bx0D$YPHfJpRd;JF@-&P<1 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/pragma-0.8.0.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/pragma-0.8.0.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..37c80b75b3bd4095b869afd82b8427bd4936f59b GIT binary patch literal 1023 zcmWIWW@fQxU}E57=t_AOGBfz7NGLM{!y!%v1{DSdhJvER^xQ;U13e2p1HIz>ocPp= zg8ZVA_{5^*jLfoBy{zK=JWdu?hFAuM1_lP(j*fKWKgNX%FP+yy zpWN?uHqN~-W;t!I=KEa{MiKTiq|5tRAHELMXN$U@_%<%!x$OHBkzRaO9V*Ffvu|mX z?09)eaDtQL^Mjw#yBXY{NUf6OFEiR3)qK-;dcyW6XU;Nydw1jZ;vActnr6nb&PuIm`i#Q?cP*bW z-{bH;p&+tUggew`?NNW9lNVA~|2)FDLXnfV|E4cIbCgUDeCUFVrmd zrEIXVUO6NG>t1o;g2EHmjpi+T@ZoJ(%8c$KTsL!^q`X#LG}W+kI<5Ya>-CbI4J_aD zFHaFMX0dXYoRnu`)^o+uFs!nF=9QL{@PTBL5ok!UfUNf=2_`dW0 zE^nbS*(GP33Zf)}Zwgz6t(kc3SL^A%gHHe7RtS^@cr!BDGvm&fz`O|t4U8a)m~0y0 U&B_K+%Ls%)Kzcebn=>!~0Kj+4)Bpeg literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/pragma-0.8.0.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/pragma-0.8.0.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..60fcc04d0d95799c5dc9a53654466c41ad8a575a GIT binary patch literal 1022 zcmWIWW@fQxU}E57=t_AOa@T}=MF=wk!y!%v1{DSdhJvER^xQ;U13e2p1HIz>ocPp= zg8ZVA_{5^*jLfoBy{zK=JWdu?hFAuM1_lP(j*fKWKgNX%FP+5dfZrZa1nbLC7~`Q>-4^^V0J5Aw@>yK8@K5os1Ud!o-Q#jp37CwdxW)o=1ju(2yux9gYAPVo~|DOI?8 za=F9O$ndFGOq=|)x#mQ1F|K@RqWf^|>9kanutI+CFRLEz(8ytWRsTnM{hYZ@^0O}; z;^OQ|>2ADuNHkI9mW4M2YD>8d(Gjlk$iX==m^0{)HD{7@o;^J8S zxV?Oz?Av^+g%|uSdz6+?%@-UpZ|{DN_r7$KY1r!esyD!gb3{EX+@p4j+CM z>9Xf~xyTgtM62(0r&6xZxyf9xDB|mx$wsOSM~_@t@#JOhvT328cOU!fr~a$WG-CU` zcqYz5o862dj%+EDZCNr_m@!4%-E^I6hsw9`Cl6+1eLdMc!LUE;*z;Lmy}z0@*!jfh z_NHHbwJvYo!DC_CHWRXzygcn$yY_{M*U=y447uwx@3{CIhwYj2+)W|Pd)E>7ApaEk z+wVeGN=q1(zT5f4SU3FA(*@lgm5!VRvy9)D`YJ6*Zzx{FIC0IZif1-2>J1-0J{gt4 zyrI_DE8aPZE7onp>80h|-5gc#1KJe-o%y)_-NCt{DWZIzb3bmF<+ocPp= zg8ZVA_{5^*jLfoBy{zK=JWdu?hFAuM1_lP(j*fKWKgNX%FP+^Ydw9gto-hHj*?r} zlVhFVu^tQ0^t>-EZZ#w6taI)s{~LyU;nMd$9|$+tb$43-rPN7|W%;+#jV|@)o~%sy zZ(nHDxT&Rc=_*Ik*0YClzExYr5rP=4aOzV@J2ev(~*m%ZrZa{|d zCHdbk7i2l#{u3g?v;8OQmoq{f>NlS?MZ26aeXYxT{^cUub(c(zRegP{`be@bu$B8{ zz`lyh>1F3^yr(Dkx7`q*mEro7rPZm>&1L2r(}|p#5vF z?nZxupH9hFS9dy8N!Cy5WtCIg^j$K1E8CgV&fczH<)`+UcP3eHt>xbndwuB|)NbWp2?_KEI%+mi~=Q6Yecr!BDGvm&dz?=yN4U8a)m`obr&B_K+ Q%Ls%)Kzb@LlQS>?03hhc>Hq)$ literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/push-all.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/push-all.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..1582a59548ffa3e45377ace039ef2ba431777e37 GIT binary patch literal 1961 zcmajgc|6mN0|)SLu02ab))abB%`wL?J-p_TxmGPlvow;D$6Pb#Sfn{Cw?@Vs>vD|9 zqueDu4fB+nIk()TqQjNjujlvw^Ljp?KR*9_{(s}GMa3|H2p|P8NplY0nG#_j5CC8l z0YC)+fWT0yw~iZyf}{peTs^`91A;?b-Gbe{eP|v?GBv;-EG7H6 z5Ms-$Xjmr=DL4A2O-jY2pu0uFVH?7*?vo>p0D`qMD!0hZuUQ6v)@UlRVN~t=)?OoV zcsg~w!VEg<+AM7xZ`XD6liiX}e_v@xRySd=H2eY`HLttI+|+5-5I?qfyVm5dH}%0e zV`UEWrzT_NEuM4~bz9e)UG3Ex`DksZ3S@$Y4_?pIO4jh?rDC4wbYXD8T(zd(37Zu; z2K*>__SYL*LupgZ!^-M~N%unXN=zm_3$&Op`*R>rnfQ7=k`xQitvl0GirY?*!Lt5b zaj|UMi@4HlOjJ7p(iQ7ZCYkxsI^OSQg-6~L5ISSqBedjl1#>yc%YsWi*9ZHuUWTio zdoA=jClpup%=+)n(h9bCUWH#KdX7VKQE;Pmm*B(v{_o$V9+{@GzqVzjn~Q?7wuVtD z!JU5jO3wvzQoGHNxo3@rh&pa5`S?a`0{mozY+@qxJp9#Mf+}>VgApt-_z2?^S-uix zw+pj$ijlE5KK*@N#zC2jqjpLjd?i{nsj%}|Tmf9|Q=YTfwj~0i=p0CNs7yzEuaH>jBB>aFsG609k}LGRE4fTQsLRM zDb&*l26O)pZ7T$6W6ev2mUM%UQ@t##$-I=hlo$pTLq&&joYt?(QXu2_ zl3T_62(Wx%Guw7xni2)AC*OkCikvFUg}eLJ`k} zxVKqxo{FOghghsOUU#Bx=~pupUdk!PHZ>!gU39!jr{LE+>_pQ7hc=<=+_YiRLTyCd z844RE=I9A$6Ti`O*h-cD=K}N>YpZ*ntM#>yp_A%V_wM3szJFEv@PAlMGW*6&^ zwz1^HICQ2fV{#l?D6o+{nr~jr&2d3o_hni=ld=dECusHUp$s?6l@4Z zeK0fH|0*Eb?B>i}BC@-8)Wd!=z-T;|mapqH5MJ_manJYi4S{Xoc%b>q1(ch$IGpEU8Jf+-yp zpL7xs69S*TmSl2F;3iEw{mo!IueK_;`u2nH307D(OE-;jFY$Dj z>d{zJ#cHHBsVY7VIiHNXh7)Bx^y;8(>-+^GM+}=6Gy$G<)WJqZIl7QJCnn20 z)!i)=S*r;mAY$15Peum;F$#*)haKiAJCB9aEH=YSe8-oTFKCrcsvAb0LvuIGp zJ?~=;6I(|5dJAL5D6B}?3}s-JEPu#(XFU!I`6Hbq%!TmUn;MVpxA(%D@&{ZSR2JHL zREGO{A%{vhHy*si6U=7~2r)c7{2R?~%v*&xQdAte%YqN{w*)5V6fGV>CnLO0XPF(l zX#IM)3caL;Y{6mf^}O3LF#ZslE^kDP#AP9~KP}b7Pt!J?vbM?aid`2S@YtZy2lH*R zC~tw09ij09Bc6Asp!kv_O-w5x`N;F9ie(rN0<@h*2#>#d)6a%A!l21NoXI(WVOga& zL~3*lXma})j)yTkJHJX3sTPh&1}MpNn_k}w*a9xHix1~!|He87rB-=Yz6>3TjUw!T z$pk~L^x2ETCH;S*_x&^fg(}`!T;iYKzMr-Gx!9i|1Hk_Pv3I2& literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/push-all.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/push-all.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..a6c6125c174717471bb46dbe206277ffcb787152 GIT binary patch literal 1963 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/return-all.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/return-all.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..6416b40fcfa9d2eda1ca0697a57a69cbd0514fd1 GIT binary patch literal 3063 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/return-all.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/return-all.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..80f7e0ea8c5fc7321e31177e8747da1aa36125bc GIT binary patch literal 3064 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 H4*>oHURBUV literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/scope-0.5.0.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/scope-0.5.0.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..c7d44dedc5bc204ec5aa41ccb3cae45e4a9b8fa4 GIT binary patch literal 2551 zcma*p`9Bj50|)TAk7|oB=Gb!PnwTL+ZnC9VC^6^A&E_UI`<8RAV&W0v>&#tZt|H1& za^F`ObLR^2?fd-xyk5`e^TX$t&mZtMK{GIF0_Xui02%kg%z;|Ccb5$SFw+14L;wJQ zucNn*lk9ak5`G=->+NCd6y)Pg@UyiiIJ&q7IKka~y}j5NnE+S-AQAx3c=F^C;uL{@ zIW*9ycIiczm#bKtP+SrQauYh{OW{#~)=b8JoTi4YIDI(s$clh;+G%{<@09mqX{a{y zGtR7PI>L>~7-|xRMF|>^R_ivo&FLt4N?}g#Bx*?g-gSMzJQ@8~lkg!s>Ff zvaL`a1=x-)x8bSoEO;hS*o+vaA=QR&+|)j`?>JE4P++gsr8>&f@Y=(y0vb2uC1YhR z9FCTG`*9UEtHPOz73>zg))QORiN%$*@753di!BYrXDvs~@hl#Q0*U8*$W{c1?5({H zl8@J^4hYK+d_DPNgczD8!+*bgCi}rCWcMdDL!Nrfm+z~*blWUJu`t2*&?ETep#4b2*}T%zKHh8-P##nL|?IJiLgp^;z;$0CXEO01c)50pxHwCq;OSh!o z%&?QmVWRFg(ty<$e~xJs4b)ON38lSvP6V6N16DkYMAw)zG)sB=e4{3o1KMu5e*)EQ z&g`WjLHUR2R>oq5xGkZ#~kA`Ugw9Y zC_{T%T)yxgUwb+~T~lLJ!sA9nwB6CJ(fIXpjt>$m?;-oG$*LPMRr;UjLGXLQ%2GSi z(&@!{i6eImMvhaD-f?Z>Sm2sg!6k;?=;ES7%Ok3d(2uNv*{G);=zSj0VoKpPEJUh{ z6Y8HGYf7JfDv!e<;L_ij5?JM4!J+4F*}8V-I{@1UlW|_LZyIFU;~M9=khe&`*)L zIEpeha57e!bU)$k;%+j*zBL~w^E+&rNqDDLq)c+5%?uW5KH2~Wy>X*B(*blHkY$oO4dW#x~$EcmxQBgTpp=!HPOn$7)Fm*tT}6M-A1pS@GIzlJNbeG zVW_M=!yn&Idt)BRwg;~PyzhHzf)p}K|3V@>q+J-nB&07wl%-V%(kmPF6o`* zA{(84Ey%zbuf{5bV3tB~0bpw`QN798k>nzej%z)oS!%&^O-q;CX|O(<(R}rGGr^`r z2md-$wFdYZW;C~D2q@6^QAe`tgG?^BitFB)tm-_=069S)Aj#2!g*P)#Dz{GCC2KE9&mq_9!s?q@^pXiyFM{i>^*ieg-Mc4PaLJ3- zzdcmt&#-&Ao!b)am05~?rNFgRwfWM1RD5FT=ci%mHFha95zDsLdb~C64d>(nVfB)oxLJH zE9sLLcGe`KYbnybd5W808#wM1ujENJeK#!gd5`q!6Q6DHETpnOzG<^=Pf>g7shdam;7^ z!1)WaM_TlgDqwsY$j{74Qsr1#_=F~zI|$794<+1l@jybtaX$M|`6jOCp)sk}CVpix zD15=pFq<5z=rwl4LO}cRky3xjlWA)`)<1@M3Fd<@N3k#x#K#25b^4Q<~(PCpuxqaYo63O5XAp~;K9!{YPTFX$*Pg?ydRJzf zxOBt~_Hn&?WP-#-b6d<8%#~lrDiAovL-`y}IXCJagYIYPlL{Y1u;%Laeo-#+g@}Z8 z+UObUE=tkQyg8TSMG+e|_>swS%2rcngyU6mcMn?-of@lQmM`XAd2saG?>uI|IfZ{e zplU6NgSn!rNZnl2&^w+xMpaNg0Wpb1UMJwk9Nuc*reHq*9{&QJQoV$ff!>igO8#rH zxG2PZj8o&PJMpi0)ZAp6Z6&Ov~5N+DqX{>e{BJ_nmXz027;$W~x zcv37X|7*F(dGrr@fC-w8UX$T}i|h}|{+md;f9L=3nF*SS`QIzupPK$z(jVRd0RI39 C@W)^P literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/scope-0.5.0.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/scope-0.5.0.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..949a82255a8e58c039682d4201ad4afdcf27c1c1 GIT binary patch literal 2555 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 Ii3b4x0V9*swEzGB literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/struct-0.6.0.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/struct-0.6.0.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..cf71c5cec22c1fc60e449f2d67afd112589b972c GIT binary patch literal 1425 zcma)+c{tMz0LOo{X+0syu^giuMcM179OWuAB4!CCjNDtUB+N0&5ppZXln7(x8fH!I zcZl)kXwG7Wyya-h)m!iX@AJIh?;oG%`#j&jKQ_n%pbG#mAP6L5*r*3vY{Vi6063xm zAP)dQP;g*~d$5WsTpO+m55oGnc!c4wfx#}Wf$m=3p&oFbAZ)-P5E!@t0MP(o@bKYn zja`j9CByF;^#lsK0=yOIu=q!|5{5EkK{PRSnb#i(J(HZsMUT$!etCF__FD$bZ|!OU z2OD0Yf~~S^n!jTva4EfISD49RMi%*9#J)l%x3t28n$KIsh1_N6V98Nm?XE9{=h2qC zXRHl4zE;PltM*%@wT4i6UUqfMEA)kIV7+!!ZkZYy=_g{&7}%2XltItzjomx(cqx+X zb0Hd6pXArd`#O^ZIykdC=pa*izU3lLoc6p@Edw4E9HA_FrJ&ec+dnNR1gP8e5b~6F zKdc<8eyDhz!*RLbG}2W=a5ifcA+)Isz2omWn_NH3J+k8w)UMSuo3eIRdhy^- zU9X1K>7ngxo$xNmFd7vKAY?>L>iFau(k-V8mx}wQh&R)WQBpOv31N8OrV0O}m{Wy! zkkz%qo3{^Rb*o7Z>cr-PObEht3R}BGCF_oygWvi~?ISo4Y}T(LL2&Vx%lNyANDDVw zc3ZNh<`b|ZFli!2-BNNPQHp{LixlKPe`xK8HJy~Je~IsniNds|O@B(U@G9YQ+j=t_ zbmIA_*_5WObkbBUmE9YV)4674dYGH<%g}kYK^pJVP`VtmB072}o%9nr7s9es-#^RR z;SejSn92Q7pTyS%hqZ_Jq0I_giHK=xtR8nA)EMP|_0) zy*@$;E@FSB!9j^u<7#zt3-cJ!oqX@OL~Nd4Lsp_(p~8nx6XALwl-N^9%*QoHQ^)S| zv0P;p9$oFLi3d)my)7@{8cjs^7qRLKY~~m%oh>t)%fkKuZ70M(+lZZl zHtIRvI3~x(K9fmg`Ps*rrmENvjiJ*adS_=;6+f;jo1Y%IRHh>#q?X}B1(x2Em;CD! zIcO0u*k>=viQys^&}%aPq`rbXD_=pUj1cS4?hu?H0>6n9@P?xLYAl3SIXUJ$X#OJ? z!LBj=9W##{qtVQ{%Tbj#B9z1;KewjN;%D!^NtM+o%oCyT?~^49bp`vC1f0E}>(}R0 zeDU557)t9%E)6QiGQIIhh~g~6x!BZW-K6uh-gAsEf}L~WC591=XeewxAzW&2MH9*Q zqChbv)ub_;?mYh0P{p0RAbDN5BRHi8`B2dy{$`zPm2*~hOrDFdY^Ti+RzBkKsqvK} z_i5Bcg`Lf}(|KErr}Iem-c{M%{hBfw0Z(ZSOS8#mY#}5ink~>LK+Uw?VvgW0RJ&u; zZqd*f-u(x;=lWuRV2j@UjnO)zV+FgzZb!sxdP*+gQ-X@j<^~`5zsx1i5A&1T_y;WC zGp5A_Cj6j~h0`Ul(s&Zj=hYAwy$|HU?Q)7yRq6)IIc@-QQZ-`IBO2n;FgxUL)vlm| z(Ir(6dL3=4m+v7!AvmW~c;ip<$TPbylNKzjw|=q*U%+gTJiHeU{I@E9+4A2+^ZdsD V5vL6j%=i1t^Q*SMs09AK{sF>)sSE%B literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/struct-0.6.0.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/struct-0.6.0.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..55eda1a92e2fc64dce389de1e73aa3ee4e380180 GIT binary patch literal 1419 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/throw-0.5.0.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/throw-0.5.0.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..782b152faa1334bf7d5e45fa7814f2a37f93e736 GIT binary patch literal 888 zcmWIWW@fQxU}E57=uLSRB5;;Z`vMaKgCGY3gE9jHLrF$aez~rJo~fRJUU7a-d}>8O zeo;w$Vo`ENW?8CUR&jnFCkrb>ECWLW1A}cxN4oJJvsM~xmoz--c_3! zvmcr*o)q-u0f$!GUYS^)=`&?N#Y|OInd$j7wNg9h>V?o-9c$o`{{ca{u9{mOP;k_rE=MU^~+lyMk5=9nnqczot8j25#W- z>z~}sb+=ELg+n%9um9|4*Q@$7LwsIDai9JeE6ud}W261l>x`)veKG`&H5p#$5y+c! zCOBfjw#j9lu_u~VtV%14bn~cl%h{xJes}+|xupjK{-kcS-S%;l!S7|QftQv~2)dK^ zd2zwYr$6#%J-U5*%TeFc_Ey&>{kV56ZH~K-U)7ApSDrWD`UzahS@~sU?#IG&+s=D_ zx6$YM`R~S_f1i&iPk0lwh5M3}dEu6f3-{wQM1!7}_}@(l|EjZfWtR?zGTV;@d1s3( z1qI5DW?FrJ{61~PS^?z`mEvmO)Pg$~{4u^ZYp=FI&-2NZD+215PBAF@UEk(-cYA@} zn~U6!>~F32ekkyyL^3VkY_s_OfE7P){t#Gu?!?54jA2y`9T|1Me`Y$#MV?`uxTks3 z!Fei6J_*kIJK5tVze(s_hpky%{%6r|^uF&Gy+dTs@EOJos#R z?4wSmlwgNjk5%{G^AlX6Zp5|VLtXnmt~)Y@jekVCrl_P=nMp2^TNV(spyAA%EoO~7 z1V8)iX46eJu{NzLZ91J8J;j?fBKvOA?hT)#W^Y?s&~xk73iA_B?lKB`|NLAL6X4Cr jWY3H{O8|2P7&I_~C?YaQfHx}}NGT%_1_Eh8W)KemLdcV} literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/throw-0.5.0.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/throw-0.5.0.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..69ebe019b51db5cc28268093c1dfda2e075e20f8 GIT binary patch literal 888 zcmWIWW@fQxU}E57=uLSRvL^Cr%LOI|20;!624w~YhLVh;{Bm6bJySgcz2f|w_|%Gm z{GyWh#G>Sk%(7Iytm6DUP8L>%SO$g$1_s-Xj&$Qc#)S(no!e&3JLhO#rs{sV*4`i~ zJNfIyd&P|8H{NPFe&ue5^GHBe*0QI^?Vr^)UjW)MdNCRtf*w_FG)|4>fg`R z9{zg5d)hbcZ-ejgV=Zf@9=(Ab@Q-2mV9Zpklrfc`=|PD zImN05Zu!3VPs*d8Q7iHo-Y^J9wJ|nWcypY4|7YL5zX$ma1#bw64mrxUH*DcH_g9C- z7&72b-T|P50aG^EgJ_rZq5Rn(3xbg%0`m|AJ)T&nW?5WnGugWoed<<2yCCh~kROkwu)7&K!LyIxU{xFZ_K$m zL+dT4W@jE_+womi((dKF67RM}J3gg;Sn5gV0FSYLCi%nCx4`2KLb-_{T0B=Sn iduH5O0+=hnpn(xY5s^Uxyjj^mN*RGL5J(F$gLnWON{(#+ literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/throw-0.5.0.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/throw-0.5.0.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..19b0b183a5763777a628d302c2a9cd458ac1fac3 GIT binary patch literal 890 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 F{0YF8>m>jH literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/top-level-0.7.4.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/top-level-0.7.4.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..7900e8f7cd1bd0d41b89427d42d4002bce480af1 GIT binary patch literal 1617 zcma)-Z9LP90>}R|GeV9$(I(Qcmw3im0wq$V^!yN7$a8K53GAf`P3@qhDKb zo8H~(mw{{fjd2k;QQwq@LDtaeos$J;DOOjKyjJ%yOq!JOrZZC%7j?yErbp@s9ikUi&H{SD%oX?JVd3rS2t*#L2fT3oqfxO} z8|jssZ1y1v^j`cXXDekaJE>#6@H?KhHDRB)C0}0OYO$&2+d7bY$&kvV1%As8G$6~{ z=dGBI<&BThJ8#;lhOlg4vA1JPhmR4)Ewz97=jb0WEcEHqK>=J(3&r`(t?H_r%Vn#L zoi71}=#Ng|y>%tf+Bi3zrO4*7`T^)&{Sl$jXVW4bmIix${dINXPB^3hkOygUYMP%0 z&#fX7UiN8fH?CL`NRo7Icz*HxNF(yJHGiCGUqLJ9^&ToK+@lc7Ggx6|Fzlu#p9@v& z`l{48N-OL=tG~prEQJM~CZ%wms|ru%!enp$A{$j>j&zj|i?KS5aL-+h3@2V;gR+E@ zCC%{V#dm<5$ou^Djb-PEHj)FdQMu_kSbh^8Ny5ImV9!hUu6RkM?h`*RxKp2XGmrg{ z+){?j^m|Zch)}V*uKaH1z;vWt_TX`YcWhv&<8t?rOQWp~^lzewkC180qrIRmY)PGD z?`-Hj^esb1@~JucCzPC-`L93b(;f@tkUHl{zgZS z=@4(Ue5&CJu|B(Tr+Pwr5fPtv}JqLYl&{xiV IJq`f)57E5*od5s; literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/top-level-0.7.4.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/top-level-0.7.4.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..417dd85a6ee5bb9315c871a8270273851461d961 GIT binary patch literal 1617 zcma)-Ydq5n1IPa}llquA?qal#`?C?nDUoZj&~nM;kTBUYTcd|qt+_^xoiiM=xfEHh zNs7p&#(7`OqPUm_5d_K?b_u~8J_xk%op8zW#1(X1Fpd2F#eyT6T z-GTrB#s~l`006j1ynw*Rr^e$Ec1S1W0b~jhA02<`0x|hwbWCy_7MB{2JfA`&>{NyT zQ2;;%0GIsy1c$EUQf z!u1nP4jdePnUFlcc^u=U??*>Tk41;A2}&~7<*1X<4EOm=Lb=jsnH|xVgic%a#{H{$ zoiRG!oJJ8hDkXZgIo+XqbZo1$r-qr!=$UU_)hboEP=z6>JtWbV9CBtLX7C*&a<;X# zS1`lt>ri&B%yd7Ob4c?qslD2E-on)|Haqut;nHi6Lo=1h#cts2t=1u#m~L-&G2K-K=4Wqm69XjoUky|+*$MzHl4e2rl-4w6y}BH?<3Kzp zipmoRqBS4;-!;*Sn}wKK2*>N2K)bQE(~O`61Dm1RuZp-e9oFUi>py?`0DC}6jx~hI z(3+Pr->wB&(vzQRtvGqZHb5mP+2?ePQ(R*)kCec#YB>BZd265rRMrdjlX zl2&Ix5JuwSEknnHG)}h*Bh1eeie7T!tkN{0#l44Se}m^vkX!!n%7C~{h$&Z|=Xj1# zkD45^esMl@iAHM^IKe$$sXdx$>@m@wTwX@rQ5OH|GG;wzrfl0+#=UOJ2=~FoE~m%c z>(af{2c2oYo51h(34YbOp|)orK}B*0=A9Fr>7R9 zJD>9%U_%3`yBl>Zj+Kfsn%kRy$U4}Y_N(nLuG{;%x~YK?o;Ey2R=rY`EmCK&Z$7ZV zJ-)k^t<&Rp+vf<*+js{~+p@n?#83`9)cPd8 zw~d*Zu4@_vnau@Sb>YI9yyr~FY3ZNNuFTkAw}tL_U1-l+heY#(` zr)x&I6_b=3h+o!2(kTilCMo@QR(;H-+hEwlcMyJnTPQ-Jc=73hCySh0FJ_oCP6s zhFajd4~rZ+T3U{^q!u8(4R;zCFM3+MsdO*X!#^*I_~yWOK1crI>&eppSjwDt$Trna zs=4NG-R=qdBjI)B$b%+4S1dMBiB;G^P=2sMY{jFH_nd)x1Er3tJE?x~`x%%H-Og~y z0q`5}ZgNDZ-a4yZqlc~uacj!q5k+gJH7Z8vWs8rMiOAw6V6!B%!BJS8f(kh_4M zi~3U9c0PrTh;eD(QSn%~rD~P2vM{OMG&$>9?ijXqa5HG>*^jzq0NV$a`%q!U`AqG> z&Al&m!Wmi1uXmYCcQLM!;YFClI4E6wvdF?UTM*Gn5s!|SB+ez}@)74=(A`k*v zxmmZWdp~ij%O3Yvf5b@KBu^c#pCDUNXshU~ENBUXdx6CkCd;Q#IU@2dZAsGxuFe_9`X0;2NI9Q3^*-zoZj H902e)jw%D| literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/top-level-import-0.7.1.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/top-level-import-0.7.1.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..e8e2147cd7b8ba4c1aec12d71c686e22db7268aa GIT binary patch literal 2839 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 QMfa<2zgYE4e*u9102b;-2mk;8 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/top-level-import-0.7.1.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/top-level-import-0.7.1.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..73779b9a07dedc438ff3d1be9722d144bc95d18e GIT binary patch literal 2837 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 CxrLSh literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/top-level-import-bis-0.7.1.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/top-level-import-bis-0.7.1.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..8d24a1e6658b7ee3664e00abe2f74f90e321fc8a GIT binary patch literal 2407 zcmb7`X*kr20>=OLIL1;TW0|st!5Cpo$exldrV_@!@1$fejs0Xf#wf)gE>5-~#>h6r zL}aNU`_dqcEn;k^bHCpY_kBP7p67j@_xsQCCJU=BzzpyJ7&n^DMH$Q%{tN(!Tm}GD z006=QgP?xy;qHD=Z~vgckT9r=cPLavNka*y6dLG1l04x@@L>G#z&j);zdOKNx=s99x;0n_LJfT{s0yk5me4b~9KGb;weN?E z1$R1W5AAls0yr9KY{G8kR1x>xTC&*({CBu|-SptF4W1`Spbt1oLZ#F(Z8jo(#x1ot zv%PPxJ1`4^%4`@-&eSj>{E!+~MFpb{hc=gGVtR2%v#lpO1l=JXyEP@pN%~O}XC`Lj zu)5gfrXcE+t?b-i5INtTiEaVQd2Yi9xydWo>DfPveLbRMndZ%-yE~~Y%g1jLOyZtW zMQejOQOGr&*qQP1O7RSr9CC~2g4CBUT(QH3jblRRyStP6oBXf+u!%Hhz8V@3D)UZ( z$%lUi+4wC~K$L8)rI|}Lf<2qI8lO=6u!*CQPOhgi^a#5&uy{Wsut2OAT6x6#kPCi{{&XWJ|VnSvWRhKX)F+ zpS^Vm!2jblfvbtZx-NeAR$!6Hi1c|F9m{AcJ%XxoqjA#(YoHm;<>cMBf^ih>26uZoG1q{gUQCr0vrHfSysT%x(lo*o|pX z$(kFEg;JgU-M7~5(*dwVSp-)ik=$jBk~CgYHpjZFMF-~bsVnZbWv-1}zpJ-3z)E?w zAGa9o%0wbLhY(j?to^plZaBeXc$B|?Ht5HjLXowtN4x&>eA1EX&tI_K(xJ zE+SD)16wD>?PtC2JXDJ^c)9UC+udq{AI@<(Ah}2f^aZk*G5z{Bdz$3ysQMvNnPg+? zhXzh2Mz?fvQNv%DaEb&mCjL zd`HH$Q(Z=TehB7iO}?+nrQ~Suin8Xs^s|Xo>^0-cvh-L={px1JuTg`iy+%9uL~nhS zJ!s@Qd0&%v;Xy7`T3$^x&p~EbS@D$KH-kRtvK~fyl81z8ial1}AJAE5tM0%=BL$ZG zS>Gcfw5=p?gQ4Lhrq~8H1+orrh7o(VEq-0%xn89s*lIXPP_OoE9Z`F5<*GZ#) zx%vX6KPSF;8+LuqLU&O3v44k_3mtXIb`>O?!(Cs(B3sja`=L{c@E=nRg}Vr~R5^KR zaS4i#nc$7*=hr!A7z~WP3Zz8GG+s#(8KzIZUUtU9!_B^n`_HF~I9BtPVRNsPHHdrG zBOVf5$-0qNp|DOe*Rm@FUaE(xzD}rWs^Rsz|D5I6RAgqo#jdnd{i-u;a4t_W&J{^lGiUj_j)u-QO@_$m2_8Q1 zEf~F_ajG-H3!RqQKU01alb|U#v(?B$TqJtPf<*fexnj5%Umr3fllrO~QwVt0Z~0d> zRI}5%dpo!Si~`d2v*s3oL&`O zWAIIFXsf(#o*YXfbaXf47Z|`;ca@D7hqf=YF|;U}mzm zojzd?TdZJ&e09*tb_e~nE6~}#^#SB@*I=W(4M7Z6k!{s_G^4AWm+_T=fcRc3#WBPC z+23d>Dq!>D*Xb6t(!3Yd)n`28#Pn0=n@zf#S={^X1S>Hy3G@IEbY~V7+gr`n--()ERp9;?!N~!3|Wl?WKFSXh6#|=-%1*H^FHHB{Kv=)%E|E>qI z*(|Gsmk5OV6&%>!+O~6NuospfyJl#ZCwxI<(o%dVb8@9HLKsP3VvpWhCT z_X1z3odl)SAV&a0gn+nFbGQ>r=Q#|Mvs;f;su;w0_A;E=f90x3hr&z z#uQtG*PT4+Mx!H^q$}snB32%`Eq%9RrH-K$dH1!vgnp?2BVoNj{&IV`1b`sv;OIqT zV%wmy!?4!1LD(oa`Pt9*`d?P`y{}Z|A1iDixf|M= z^raNc=pXJ7Sy zQk(kp8hLWaUuA81lZjcE<$o*BZ|nJQ;+X!$|1Ut6H`&<#eKP&7({FD5)+qq^2mIED A9{>OV literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/top-level-import-bis-0.7.1.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/top-level-import-bis-0.7.1.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..48a253f3d491155370efbc1a5e804ed1944024ca GIT binary patch literal 2410 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 G0RI78_<@fA literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/top-level-nested-import-0.7.1.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/top-level-nested-import-0.7.1.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..0070f96c4b17a768a3f5f2b69276ca20314bbc42 GIT binary patch literal 2277 zcmbW3c{me{1IIVS+))xnhDK^b&eWXawO4X1$<>5mXj|?%B1v<+t~nBtmE0lZK61?U zQf|sEN6eAiT)+DL|NH0n{r>TJp6~N~|Nod6GP7s`m;gKgvg5*Cw`X&qLLdNud>H^x z1^@tF1R~5G>w|TN;jx}xSVtJ{5s~2G1(S!X!WH121a}P9@6UjF=;7dk^TEPhJqdVr zmNNib03ZYaK#z7Kug|&|_1ubG* z_uXFx3pd*#`gWQX@N5+&cfE{~K2+~J)=^k{A8m1TIBFLPM6D-#Ht}tZ-FoCJXvDe^ zWF?z3$X{n|iyEg?s`s~{lfv%Aj?VU~CYO8E6g738$8S3{Qyd==!X zr>xSm;DvE}14znmIjLit+Eo?|-GSrm*opfsMp zJgT4!zL4t3o^z3IZ~oL@^v=z4t8G0`WkJq4yT-qU;a#gH-~@f3uV!~p_YNUUll>3{j@id0;W?} z(4w~|D`i$+bGHA`@SXE;PZrvb)|S~DRl8b;&~vsd2=rIf;2@Wq9wk%`&nf_47*^jA zGEP8Ct*J^kcgZDrj9xai30*4&<3H=n5PBMg6MycxKyy%}QglS5T@glRKia}9zLGK+ z@j8h5ZbzjKvCvLA-$I8E(>;2cBYLJ@Hbsf;Z8%K51(pYlJrleRbZS(wt_)Ki8 zm63@wO%}~9=c-6_R85k#J6pUy&>Siv>&No_F4?vB7}DAg-TmZ{5LtFcE4pGtUYEsq z#u>X>9s@^|W*vJJF{UwbH6SOWJBiMuBOE(O^3RiPp zDPGQE@b#*=&$H$0>LZfx1;Y%8)1iHR8y>w7I8LM9~sl`+$*;$<{V&K|_)#W`Web%*M zDb*IEWIeQabX4%YjN|?g0o5@vbOd)XYB(cmfF=4|;QcE;`lMBD#+p|RzhpL={bwY$ z)xtU!<9f|DzeeP2hw8%^10;w}qiUaHPUD21wzp)~B&HPl6ddk0{QP_|P~RKZIKOeL zWH#TYWd3pehu8`yD#W&&`%r&CWq@QFamb7QmPV)*gif9ShgY7O^cx);o>)>GGo}!c zVPqCghNYCjy;lwDG@sKf`MnJPAXKBM=mEOSAu@O9D%%ujdwvj#x7_t1TfsQ8LS(|y z1UN(*YoL42%;cT~1PZ%KH2KsQumCRbiB%w>y8~`s?C2-tFj+)vK=(BEz@DR94Dr1W@{t3m%01j7(EZj z8_(`C4<(O9lt}oVOn=-Fc)>f=s*yY6?bgq(C5xL+0(xel7qa&j3yI?swDV#2tDrFt z8a?V6a+2?D61InCsX( zIh+0thFj6x;-E{rAsfh3Vz1dcrF)J0UEBk`@v+O{lXkCaX33JSTKf&^ zt;UC+(Wg^K3O%%{U5eVOdqIULkK&knwpNaqQ((0HHxmZKp^W5;8=fN1UlM6H#SB;F zc}#oHCMS)V?pIp-wcyv0nR)mN#-mVm9+B8KUFDCtMApNyF`cB^>KUcn&W|@_Dp6}+ zFW)Pe6d4(iOdDAId+x7auVU4H=xeqpKTbWAOP#o0fs$UhEqg|f!{Iz3MtsOp)=PXj z4sy1#&x(U4K3q|>shGouP`Qdr3k&SyEIÉilZ4x@$h!!|SbUBsAJx#m`qGgr<`?xRtX zBUf^hWUlby%ZPbakV>`rQ80zu|1Tj6%# z;!$3zJn5>(0)kTo~dxb@+$G`_TmcE|cA@Rf5RELv0k zN&P1Zc<{tEan3b`m`b5kA5Nh8VZZ&@<90*!K8MKhUt`$UIO5pa9S`9adz;ULmW#+m27tH&7%?z|uJllcUdLfdz_<8%rFD10$guK|J@BNfH+3^lZ9L z8qPN&i8br05bjPGX;!aVNc89|PsoN%AhTKDi+@q-M@~2OpF)daW9r=>mJii$M@Rb5 z%LjIkH4%g3QC-tVD@K9Hf3Iu{;>%-2S!y7|_Ib_~@!F6=e1S(ZgD!qx2Zv=LyMY@9 zJb2h&dX6w&p;6)5x5HiX>z~Ipx%qw16FOG#)MXdPa$%y=n>_eNwM$&1Z(-k$)5O zh`eR%BJy`{Y@knPfwoz20!<##Xzck)7k`tT)j^Xi!yPf2af>Mm&L=1H7U-U&n|geT z^{55{2^y&fiGK4#6&{ga8xz-MgLih0v<(>M`|Vi?;SoQ2*`muMPa1$WyB*g0@TM|>h14UrH%X+3&s zCs*xGQ{LDu0dnyyAHzmSCySYO=XrjL$eso+-D74?meKc&k!-XcjfHJBq8NLaXSj|_ zRa!?ao)ap%mcU!XV?knB-?)n=^Od^?C^chEhmn0cExHDH^Y3kgZLJEDvRx61r0>{g}kCQCn1paLb( zCHSVR4`SLm+y`$LR+Dx1c=avy(wMQrf$eOIDdUNJ>b;6{dr>5_9?Cf}U5gDt8|jn| zvx}Gz>eIt@z2hg)wuhb^HUjH#hqMf1AK_@ADtzc{IB#*|Aj+WynKz<`)Qka<79iJy zrswI-DrFYpO3uV_r`YA5$n#fFSPt``+7$6U;~)+ok>5)xfTbjqsKzLL?dhK$Od0SmUV@2!nWO1XF-GZ(Xb}YX(r;TFswhGlsCitt&B-nkV6*< z(lT6z_m7o$IiXE9PSzixY}dmPQf=(^bD-MTz$-ZYBA^^j2c18VFxYaT;azg2V$?fc zCh3tLp}p3ri&(Zmz~;SQ)@$!}gDK#S{ljI~-p)EQ{PT|TB?cAIqOm58iJG-D`OWf9 zha)Q(8J2(EaFEI+eGyW(_5fEW6x#AQVDS2Zd-I9Ty%%3iNwiD(!=O>Y_pGz-_*@jcV z+c{>cs_F3ZAWF9P<#})T>}b`)!R3xJ#4KN%m=s>>T3NZBD?+cz^h@I8)O?;eUBsdT zF4zxadwm2g9*EYAQOxBYnO|?1?2G&4-(51TQd%sZE~h5;SeVK_cZZR$XEbp6y4+J| zhl@h0-(IOKjMUY$gB@%5u*JUETkH?>l)%n|X#Db`&jWrB%aD%(ZHEvdk0NvQrZ^vCCt6>I161&|5?=Ph-&rTNocSiHn<5kUuvH4=O&M6k!v?+ zw{u6*MZq>oHFvwuRT?v29^W6&xl@`YtH9l;5~^`FBO`MIVa5Q|Vf^2^@!L55n<$1q Y_`l=>VaCkz=gjcCsNcl=wiy86KR9wduK)l5 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/top-level-nested-import-0.7.1.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/top-level-nested-import-0.7.1.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..26353193d30f0189112bc7ed2ad9293663908a3f GIT binary patch literal 2276 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 Lw~wd_`FH&X*HD}O literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/top_level_variable-0.8.0.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/top_level_variable-0.8.0.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..7048a6264d5c0c5d08281f139f0948caaae8dfd2 GIT binary patch literal 1947 zcmb8w_dnYS0|)T0k@`YKR-O5&kvv1=P!7pEqQni0d7DDDD_^mvy6>jo;d>m z-d6xX9RL7gNT@pjPr?)2NuJ^Uo?ZkzR9#g^Rb4eAgy4>k3JnP-x_gG>{QOCH)qseQ z;Iq6Sz!d=E06;%E*%y8c4=bG*YtlPc&>!qC*CmydZYyCRO^@h+z@+PDe;u6Ph*`(? zaR@oF61^V!HnZj*?b8fJ!P@jO3Ab`8edt^EK?}?mDM!tB6bCqT0ZjJh zykl7-gr8yh=B+!CI^4E&*{71nE`xqdl!R9wXLgIe5IOSI$q+~wH8Q9-m%qy!q_HD< zVoj%%E$D$x%UY!=>rA*78^pic@uf!H5V5!mxI5xt4k-w%orS?!8dCzl}dq5_E+=Ss&s|H7e+=_s2F(ne#9}fKhel&l05nv zvmV>2f*aSbxG?t5{tQf`?vhU`uLmgJrG^3bT<~8TaTTgNC~QP~AhIsQ?K67g#S+^|GpRwmdpLQL`!z4E&IN9KkUCImW3z6V9O~UC zT?OTe75k|NOIDWncsj+9O|73PD7(6meWn&wEy55oOj4L0qou)?j{Gjk2ZFKY@lpe7 z`9Fx7zyE8s3L#vrOIFDJGzor#Y|aZ-a^wbkzFn@$FG$pBzHtG$m4CHQ`O!$bV87a$Vo_ z-+U-N^Xx2Yxhj>axo1+P==<_xLWxR7k(Z!vMEezpfA9w9If<|<;RQ*v2gU0--`ei% zeMB@-A*&`JYmgz$vf>eRqN&5o9!`y$EV^f&7k94x5g8ntOqiy-5(BIA0(m1@71~np z=eL=F78@I4F1ly7X28#ZA?86AfG3D1>MgPszRTp=-T!*{mQ&r-5f#;A#+9_Xo^aL$ z$+q~oRM?tZ-l%Z59valb(0C%3th4$mY}FIdf#x7+sFbf&Uxi%%(ACYFunk|t*#4wt z&?2oS!X&0C<^5Ut80;lwWweOc80dV?;nIWJ|LYKRfk zrIW3rDkXFKL=Pe_R~%-;3u2*zhF!8XNk!2P>fWTFfP<>LSMRj@7ol2UyYHN>>e2=? zMK=4?Lsf`7*BPmUi=ztghh1n=${1$MWCyuy*`ayvqAJBfegf8Hr<_Ni_297P)_-*5 zo?oVelCh-pm|Xk;vy3qi%l9CkAR2HQ&OQ_hdeQ^OCA$ z5wIED0$kVbF0u7+JDTSg9W2IU0BieN;lyoasKyg{q7*aG0- zQJ<-X6|nIs1#w*)ao-p*iYk#1?eHa0$c)M*-h;32@o2Y>+ro^8vwjXYSDhoT=9Tju zIupFG*SCMnAuH~%onR+4d`WIEc`oijb>~dSbvbE<4e(^ z-AEaVx%|ULjaObZ_tGJ-H|aOa=5^l3=C=$Lk2r2hO|ay==klkvhbrL(4bFbEJdMF| zg8n-SJ1XnhwxVvO_DDabnPXEk=NBGrl(sFx;gGtuO?~FX&R|(=iD0cEdZyn7UvXMztbOY+EeH{dHk$B;uZOQMu_U zc)wOCVWR2I!PmZGWAT5w9loe#QoWQiHKu0}D!9nE4z?GSkQIau%V)S#nS|&S5sek5 z3B<-}!&pL|cNsqYD6B N-|O~$75M&r{{bzMqm%#u literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/top_level_variable-0.8.0.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/top_level_variable-0.8.0.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..81f8f6716b79795a6f9f49123b7a606c60961bde GIT binary patch literal 1949 zcmb8w`9Bkk0|)TAHo{zmIZ~mAuwl!QV~)zbJWWP9qRr9coVC0jbL7Z1*<4Ab2)VCe zEtENO=g#q%np=e|S6O^}zQ2Ee_FR*?6Ol8lyv+bAOL_> z006WB001F4#4`X##07W~z3~2C-T^o*ZKwfM8yXfI;E4+l3C0sVz3{jE{E0Z|?Xch= zA$|dXI{**^0GK2t`NFyI(1OwTO-7jx%#{PNnv!( z+N|q~MrlFz<(>gg!bD&5M|q!eJ}1f~m!Jr*;!@kBDkKhk4Jg8~1G9>;kb77Ntt&xZ zCA4^{@nvRTS>G#_t&!Js0k6m+@>1>Pblanm@K?{B7OKZu`yk~yR;!$SGo08yqr-)KQiW&xAN9aA)aO*xl z)JLc9wq*EqRia;K+fyGd$Yq^uh923gQdY?#eD6%qI&@Mljd<*c*q8csq*~#a*hsrTWQ0EEOD9D0^%U*-+-RM64CU#()VqtiB$m97(b#Qnt%2$mMo1= zRAI93U7aIpHjEiW*Cd8|blCkJLFsT{X{Dkinok_x$6?yj$wv|;f}$6{QXVBv@8n{% z4!kZv5v5uVmsY9$#?}iZI}v6At%)ibJ&$`=Zhrf6-sH!7H)j?HK?YXO%Vw_^hjpy9 zc4I;O2=WSZMqagb!IeShrNf4oQWQuv5a%YaXRLR}Ec;Rz8x4uqgwqID8 zZ=$3dslPPpK?7kG&gn8;mZy)-8FU16zRAi-d|K;z?yhZ>l*LCb&ZR)CD%8WlLKpD`d2}BCQ&1 zhp}V)vITV59}l<1NR-ovz1$0_+2PPQcJ=DIIQy)M+{<0ngt8kKf(Iaz8e81ITm2AC z8#(^nfsV>s6S)f4n;wgvm*D3H3Z_;{*`vR?+-c7&cnM~j?~!L9oKvZ6CP?qDZFHHh zdwJ&ydsLn&Xn#+XecZec1%Dg`!eLBbD>FrT6W0rAEj-mTsbXM_RIVlrR5NF2M45p& zYTJQ!dO8(RK6>VX&SpQqqo*^|^CswyJt>GXHNEdcXg9tA$&|{MEtb{|lDm(sv<6*8 zk|6HWK<(bHC5F{R_@SE)?5T~&Bht7ST{uPGYV&#oeSB`n_V8)l8bCI!SxuYo+nH;u zW;#cRM020%rFQQ=t)_+5|IwURF5)V4)9+y~ID2|nV7TrB#aD||XFbReQ@E5}q)(m; zj=&akcx8}j{S3n_hK7oLLJ#H#+C;mGqwAqYv12V0>VUgaLmyR1K_`VRi!~~z;T?-{ z)G-uIaOdqP%4*Fr+xXMLc}-6(R)^KsLe4Y%jvDucq}{XAquUwMX~X`p@ZJUI%s=Vx zy@!e3*W;^Paa1o8=XxKomn;)XSM0e$JM`^)iy@#W;--xoC#*xRoAB1;j-rxlY(7PA zif8~mK5+7vIrk5dJQevri^j1v!bb#S7x`Liwm8HfC)mAR-ySz91^YI7FD$a@?~#H~xzcubeaDdAD( ze__gg+U}{s9kOE6e}N-D`Xe{gHjzSciuFvEGhwwg#sXH~aO$)e9)Mt-*kh_b`UjCn z^-H@Gdif^9E^koJb6BaQRiZyFe{r!ks?cU#ZXQ%Q4U*fn@Gv8)QgTNBO4K{&;BeS! z5|wzY?Cce%Q{7uk0rL_n8!pm>KH6Ssf9Pn(!;9qm-&FqA^1q4U`FH+bI34W-ezOYz O@cgdF?^Or=`~Cy?=b*a) literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/top_level_variable2-0.8.0.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/top_level_variable2-0.8.0.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..12d6382aadd896fb6ca23887c17bebbe3dcd2dfb GIT binary patch literal 3374 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/top_level_variable2-0.8.0.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/top_level_variable2-0.8.0.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..40233c756d5ad63489c26ef49bbbb94dcb4fb49b GIT binary patch literal 3372 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/trycatch-0.6.0.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/trycatch-0.6.0.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..d0f3c1b4c3869fe762972a723aec8613e5bc4586 GIT binary patch literal 6479 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 VMI_|^zTy5;t^e%)f6xQ~_#Xw&Zq5Jz literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/trycatch-0.6.0.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/trycatch-0.6.0.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..3950995d1ee99c97d0d81b8ba314c3d904a2dd5c GIT binary patch literal 6482 zcma)>(_1ADptY;LYqBvl**12zU6XCwwr#s6+qNcKlWkky?|k>?dCpoF@6GxL*7GVz z1AzQs5MYR4*~Uk|Ys_Wvi+_TFm9K$;k%NJOIXik788{o6(=pPs(=*aL*;(tExZB$~ zI_nuY8kt+Tn$TN1+1bJXA;EOO!2H3$c*DcZSUy-B3g)LNrz0Or zLOQ~QGAAJ30`u++Joc)JHoSEyWfjw9y0`KX73XV{XE?03HFr66OV0x(eN0cM^N4d| z)5Bk;JQe90`9~3QTwD{g(~&|Yb~&mP1PhZ{{q z5olEPVV%cwt}8Lf3GCUrrGTLaSb3p%%WXo(vM(x6!VKx{eGd>NkF~pHRq{Q)29k0# z^VS^7^!AGx*PjLK8yMpCd73xp&&j>G9%CVFxB6#}b5eFR&lBY3^snMUxDT0ZO&oF8 zB{tDT1k9ro9|G@!Ef!Q&Kt7G^s7*xI6c&+I=Bs+Qg;3f#I;ZG5P+H^_;`QlCPbS|zRj0U?IYL{z7OT4l+J97hJi_IE zsnio5$7Q6Be>91al&fL9l)OL0ZkpPx)Yi#RqmY4%@6;@I6T>`fuB==kTmrOZG6Hp$ zJ**$C7QZJ$-s)Vw9|&Y8cmKXSw)kR0j3xhMmN#R7y&|&n?|tkBLeh>wdiL zaS*YVRsBh8)?OM67!`TUavVS1twP?69qskQS>5cd`UGBxM0sn?N3WCi%B+K4nBQ&p z0%~)PuB?2lQ@tG~iI^-tl4TCuDjuXy4XFDRGnoI_?|fGWXF&!sT=27k zo*7*HKqr zE?^A|kkb*6tcdxNH%e7&+4W5cN2TcQug3iSL_h@h-x$r+_$JT?3?ENvrw9}jXIrOk z^I_ejX%(+eF+q-d?oZp~Y$8eyU^>5iH>QE3JD4j_ll_8&&>f4Y%AFAQw|UDnfo#5; zERu0n*w#}cA)3{2IbA6J83PYD`wvope8n5yNZSQx@{iZ-{qo)AK(p3$2Z-psn{7a$ zTI+~Z;(~7iW(?sEi7wCc#M0mnIx!>O+NgR zEh?-hO$6?QG(5*I__S{QVy571_?rj_9F=upHa~MQr1A<>pigi3tVx)lOfJp3-RWDP z&#oW3Ig!?evgXJV`g;6FvGD?&=p5VW*4&3m;XDxouga)XqSSk?5J>=c*Cph}dF~l4 zqrxX}9iTq@Ti$=2XBL_YuwnPGM5_~&gU=V^h@?ywo8JRBE^|&O+POj0VKUo^^{FbC zDe3f@Rt;C}OUl>2Ly*s)LmasayW#Fr4xxltNnq)D!)@yeRQE0-h6lvIYt zO%^kM{}{+l1E)&dZ)=92WKzB-2(R_5TPmft@O^2DEh@tkbvZnRs5+gBG~BdD!(qBA z+-4G?3bv7>wC1|N@*s%V`gBAmy^-(h+2mD#AEb6fZj62V6S*|jQ(Q0AB{O>xqdPPU zlSooI{Y$QpLR+ZRUvx%^#B$*o#y;x zRB7&9s;ymUruUN0Lm;K~h!f@iFS((3$AjSp07%?kSx90A0+3QYUJ-mu55<1NX7hf- zO66MZQtIP3ayx|W_!v3^2SO=?p+7SIqA`4m(R&JT@cM~kD!XucfFRZt;lai*>Dk^F zt(mlcN6YLNA?3lP=LFgK7QT(?othUS0A_u(39h?xd6y7=G<#OfRZdG=Is&(z$}?EH zq)M)EJC{EiJD`t`&+A^xQLqh#2wL(z+WA<8nEXdiP7?>@HE<8@ySHLkZYsWt$HDVb zMTY-Gg0PB*Tbq$^&y6~6w3Cn$cQhSRr;Cra9HqdcvdC8lf)HC=&<~S!D5Q_`!SBA4cW@D_X~?SgZ+1%&kK)JZ$<#~SyI4=9UJYR9XGE9=#V9p&hh zXhLEJ{n2yh0zT<+(vA1b6p~akDG<&OEpS+8@g!BmwpwjVTF2aAo~fwjO?I+|QazHO z1etJmV-2d!Gz|0rXz(1FBWA zKF~j(P#qxFga3EreMJD98(fm0*31L6F|~`oy?@tVw-lr0U{9E^!ZwtrTY|9ax9R_b zJU;1wrktZ8pk`4Px_$zy<~G!B*pCc_?D1*_jwri_0r!u*+`KXiP^K2x3ZE14^B8w$ z@?vT%a^z4EI?Sl#bye9iP#|y&Q-sN_CSM0sd*j;hIugS~WFIlGa&QYxaP-i+g#~fT z`Zbrfl*cREW;@wqxyeI-mqxyzU&!5@Mnk!+S`qD)X%2jgEQ*RDXcii`JG>J3v$BIp zG~gN6m(Ol;nAN~=`qiIE#bv+y4_1?NVz?ZAusYn>PBCh2dZ_9?YO{B09c?wnd!jdT z+FR$XeUqCYbhU&d;;ult?Y9Xre2B5`$AIvm+$l18Ai(rj;x8WU9>n&xMRS1mvb*jq zegnAyUJfUkYl2H0f}PKzmK)O)vcNlnTy1AROvE)z};q&Y+<(+QA#$3w!5D|gOOFgF5{q~^Jy`y$ovod zYtox87)rIf;A0?)G=h0~d+>a6aLH}Q*UME~E88>WFOn0#{kUkpE=N{E|ib@d@OBFg0vWp}eVB!2l<2 zyeJ?mmCUe!_-v~`YjV=_*V=kL`hy7*E(Dosf5P*y#sf5d^=~U4exoo1*^wQY)=gX{ zVgR%*kgp9Hq@wxBhd~>|6$)FsbFFaEN@2NHru^7hM zP%a3kw@vM=!X2e$`%Oe48Zv*L9;NP1K8??NVEClbj^jHi-;G$e~x z{cy7;0AG6H5dvwsJd9XMHNYGWLyOg^NP`Fa(hwHJhd9{eC@kfE@ZL4#uoBGu!Z?HG zJ{9$=f<+Rej7_d9a}o(M!s-`d?oMmm#lGJxed>sO32F{XPeH` zz?X2#$W?v4hX71uyj~7;K?3D2r73-Q(p&|wE}@FVQ{Or@hsiX*su!@15fAY9sMBs7 zJLXTE(Zcxy-`x01czlAFeAa#xV2n+$uzqJRxF7d1+XasV;&>^GIoyZiX08K>6|oQ` zSFSk;%#XlOeS_8O8<24^$4H)w1B1~v=g z2={y8iikO7TC-=vvbF$>WTfBV?mm(eVkX)WIaV`!?=}Qe^~{eP9bAxRXqN{)HTVh^ zScE!smoxO=D~P8%>l;kkh#bIIwYvH_((?V%)o-Qrlp1}|jbVH+V)?xE*1TULo$U(6 zT4&&rm+OmJ`a`^MT+<*%yG3%F#br+fG)1THid|Q3$aeGV)y&SwjQvF|wmiiSmG$@3 z{LXBibcM>Rh4ElXn|?O-m*7o70VkB-fh1mIBA0X*$D@fZu}LBI=q^1z3b3_(vqiA+ zS9^kmfiD&hRY@3mPF4Lr5+z&FEOTKi|Jh&T^e075T2oFsa3v^vJviTSYq&E0)jWwq zhP?*Sf^qQ(m3C@l4`aDGaV`4>(Cs zC2J$W3;PR`e0ZznZ<=A_MlqstYgVX6Cd)cq$Is%}oYgN16AHSVV96x(ELJ*jqCzOR z-k-y)knY0Sa{FLl8oqNjCg#dXAF_h;C}irTr3#43QzvhI%xDM|SY(54Cm3IK`=Snx|CWWF~^-n+XZ zzLlG_hp>T-@nwfO*by`Ob+CEM1KL3+{qeu8dOQ%L*V#X4RCNT9TDv(w%^elBb#`S_HW#&87JgiZ zcd5`ks7GNPW^HNbR%zDX#a|Ze3Q_iNhCC`lCZ}bk(ZjVnbjibcjBHNWRBWi0^em)# zHmv6R zc4C{Bg9TJKx}>?%l9^liYpVkTp@X8nnD0N4XbHZkU1V&z5KK?ly~;iAq^RfXDitUt z9n*Kao)AJ*C1f~V@U4NGWUO+aZ)!Jb+}GCpL%yc*hz;PaolQop9XfwcGA)z5U-Ej1 zcU4|R+?v3RC*@mbX%oCnizvr+{nA{K_xCfOp8v;a-QMZ5 z^-v56-r@3oo`xt04*0qhYSQD=f3X)3lI1^%`)#RN;U|LE>GgI5UsYh}qR8xy*(!z4 zeShwLG5fihIUCacJWVU*ZEqjy1Udwj5|h5ngMPX#Qh#*LZ|15xYvm)H_>X!gl|5=< zQDAN%;qCUAN703!a&OFd2)A?8Y1KIYWXguHS|8pfqmW`KyPSF}rpA6s=#)hWNt#7< zhxWlC-H&2EgsTX+UFFg6&3R+?o^akTvO2Ojx1DxHU1{AxS^-m2mGv!ABvYpo8~QsB zRf56>I{ftsmp;Osv#_pY>69p#TeuG&Fx4^ZzC_EnHu_{lFT!(uzq+esXr7h@PcR3t97Xl$|_s;Nn-;1iqo2QxW zItnS#H!rk823zPa&-}9LRv1n<@98d)?F>BOL;c*Xr^pkq-Xnk*po1IYNiq`@QjcIl z`@nogk^<1zMF$&5+3{ZWr&4-LH@t94{-f|l040vuG#tKoHCx_ z@ay5WdFPDPULMg*h0p2U=^XOFvA-c>dwXLnb$_Dumx=1=WMNh_+xgwJ8HeqeTz8!* zFnFJ#ocm~A!@2ht$XvO&2hvN}r_(>>So;fLlcYuQRpmEwGA8_BYLQA%KCOQYo2%>b z2}0^wq0Nz<umG$~IMUUv$d$r$fc0=FD)!&@E?`uQJOeV9MuYpJeUzE zDl>CQ>ZbQynK7Ni)hti05aFtOrC+r{51%M_e0QFjM*jV(?SRPdco9HyG*}=JC-(Xk z>ki(`vAW2#?>?AP@y3v0IC|@>kwPSsz&-BBInjQ$Vc(X{njs(TPsJcUeqn?MXnqYf4BFaaR^-nXR)l@DC1Rm9mvc3ljNz4_>I;%qYq^zgNqO zNTbCE)B+X-Qt7fw0Z4Mm z*TuKc(LMLvbpImauY5EEWC>KH$ zc|=0aT>-bH%kb4%{m12NmkMsjEu|8`qTyn@e`@r#+jbq#+A|Wf`bsb1pJaN?uNKo1 zoqP*t^fZpc$)q6rPtVE0o|h4)-8BXaNUw(XPeM~B4~>1 zr!!dOBmUgp!=4Ql?j###xqsXB;9`)!8QF~PM(qb~=O?Sc(J1sDXaY%jMP%INPv{Pk zLrG4#!NL4C7QABE^3-wD*h_VMJ51(=B_t0^BT%AXg0H=n!ibaBA=zg$jw9txm)Wx6 zTQqYWzsRdfg~N}br9Ut{TE9RxB6oxo(_U`}m0^k^14eS?D39F`T?#R`;gT9~C$YmZB$x?*+{3oj|evwNy+lY86 zOr0Z`fzC??|KhPMZNVJIj33J|Z^abev*q(ygJ8eMaC6@nx${mN!aksdCY>lV7s0$J z?p?HRr7^S(1A3qb4LpX37uq1h)~xmsU0E#x*Df9 z;0!R)(D@70nEjKGX$~dw7OLkbV6kuKyAkiGv4`!U*D^ zBY-ym!~=j$N($cOn+cIIHr!|hDe5Bx!aCKG?z$@ftj;5~D;TTSPE-5eEygb3dbdOJ zkDcDC zWiCzH6HZL;Dn1K7*&gVt0{9zao~-*aF#Er2?kGCXfRoDMmaAz4Z*aG~Lp9YcU>8cx zvXcr5z4h$JUqEJLaF_p5_M~TRqvh58Dr7Ij2KoqXcs~dnlp%aeZUZe<=_IkgNY8=7 zBcNBJ>NeQNmReWLmK_f4BCsLWQb;7!E7GI9C^z5Be8Ly~L03WMD?X#QFs0OV;98hx zXjk!8;ri9%oeqejRY8ny7lM}l<-tT}iNIq1sUR5H;Og#zC>C9Hko%{wb6%I+LGDwc z4#Idkge6rWtV5g>?xrn~V5b{Ky9E~D6~_`MZ3U4sOQ}+`>?XHLZb6oSorgdUX1tP@ zx*0xOBbGZHQ`Lv_JZ}9%yy)#tivUU)m5*I^n#wbdNdY&_gJ*9jr6-kgj>~`iNXbXP zeEaaJy>9R3KIDU0RSjcVmoBiNq-D@^7Em&w?mL?XTn+#kV(3mWf4eh>Y^LDlo^08r zDN|=&25wmCW)BZ!>wisNIhR9;h%Im_YR^Nq8ZCDseVW9#VJRTRg!K0;fVU9Ol^#}P zMoGin2I9(DEh{;tMf!S8`=;X*h&^}HArnO3(|M}DSaTvVBTXP~oUa$nTe@M}*1n3* z;^VO@s5Wi^HEu1HF-~)F7rl$PL$JrKUl9CVcD`X>J2?j&d*8m+AJa*6Rg;qKt7b;8 zci?J2N2V4d4QvuJ=HKhVC0^J0lO1EuFZc=lh_uQ$%33p2gl0wBOeYXhEn6YY6sOB(SIb!4~z}DM~T@p)49{53C}B3 zd22Bm-|`aE>={S3>w|jYR5C5N+@9R&tWW8qZLZ4Yzv78>R63J`at}@ky>R8G*}n`% z6TG7CkTvp9Q5|iy6BXQT?<-u`9czNanSyHS1VMgvEk7LpQVK z7yTDS8X8719-k#0Z`NA4b~&TKBj#(7j%;bM$7h|ZJtX#7n}S4bmuUQY%w~ys zJVC3oo%T6J?VCU9cZXKte40i~?>PJ7?bQ0&?)HHPyxnZZNiXPDvXbr5$ZXuos<>h} zj1o}wip#RnDavPAXv53k-xKs<}!=Sr|gJ=FESG>G@i z86^5fi0H#|8#pe5uaB}eXbP`u9~#(NFodsp8UUf1YAZnj0n${W!$l+|clRYMhoKdW^aV+}Jrg$e&pr=@S!78}Zu+xkFHpY{?lPH)lk{*oyU zc1tK5;4Pttx+&h>)6Hyev2gLF0A@MIL;56uOGv{#VML@R88R? zk!WkqFw3W34So$SAq#ZUBy3mQ&13DTcQsw#eY~GKrmae|p}IhMGai#q5UBo)HL0Si zM#0YN%&qzWD&(9a4213XyQK1>FYW#j5e#d0i~iOHEhKC!^1uCZsF?4G7y1|fmu+0o RM-D{=078fLI;79{^$%)=E}#Ga literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/tupleexpression-0.5.3.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/tupleexpression-0.5.3.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..3de8575060f7b0aec9306c08e4c91e121b9316b1 GIT binary patch literal 1742 zcmb7_={wtr0)>A>i;JmJq0};VL2Mx^cA;*A#=eeNlF<+$Vkw$RN9vkNGc`?8G!Iq# zIv884Mo~gVqtz1K$92>~cV!avPv< z8UQNP0KgOgfYh{P0uFaAIR!^16_lJrz?_^(DXEy~l-R5IbR0CEoJ5qC zI0bwM08{{Q$j^_nI{zAk4&LJ8OyFN80iNT%9QVyh2E9o5@i z;jqrx$4v=H#onIWkY&NQ<+Ek=sZCpmGREe;s^y{8eCRK(KfvP4!?#+t>K6Y@-^{(Y zVsU0uyRzQ&b7q&MqOn2>@Kfcv-78>j>(U^8L=Gza&vLp>&bTcc59j5mUW>ht< z{N@sxeAD}l100ck?Fpa~4Ws{c$shcoXbJK2(JOv|b$jxtn?;=712DEXWSD5TE6<=U z>c=`(V|3uZ91}Fju`|@FOZ`~w;vPXNV-n`Pt_rZb%>IZ?7N;yiZ#~7 z<7{<^-c=^Xevch7Rc&YBdA~t2eL-g{u-*+mdzk01W_-wk&_$>bx6^7Xdt<~Bu#XGqHi|ht-Z`OFJ*?dRa4p+Tq zaZWfZ_97w4dq1+flV8z-$>6BBd};mkNe(35wfiU#6fp18X8HNy!h5PlS>;yDeq}C? z#OjXBf6Fiva~#%(?-{8{87G@jGA>7GM2s!aA0FJ5fz1fzz&BO({Gzq@Uf+Mgh1GJp%oekiND9%EG$qmgTqcF{cw=^od#E#F7jS7>6w6}L+tS0fA@zv++ z;N0^NTFJzZ$xbfT6OHWSED!|jIm9dhgM`TDWm2!SzL-3NU#$^vjZ-|Bdb+|Ev2fl; ze=TmI1!2KNT0CrOO4jc1%fYPs;WjL@qlFhL_j$l5HLoBoRN+a!YN+cxU5%fCxzHYl zZe|_RcVI8^xQz%ETLh0wjL@?vwJz(wWg&nKQpk%odfPuTMt>K3uwmRNKol4muMJB`-atCOPB~pGCSO_7~{K+RMv`1>0r>am7FiiJw`W?kn)b2vKqh!I1N z1Ua@qgjiA$1i73xs!iBvY(Vr-#G)X?2g~Efb=RWW=~)IdvT>Dt9D97{U>e*#Q%I>g zAmSi}O?d#2F zSS|i5s9?X}?GiK}JMyQBG~7bf3%!Xute_)$bB9j^flc|{L5HkcebP@kfzi!dcnM# z#LYG2sqM#Fr6Z*;!BL=YzXl^x@f6kbDKRz2U`PVqVC;Q+osK2x-BGL_OXDqP4IU%= zL~#`)G)VXIDn~aPbz~LVWV#S}P+zcJOEqM9-J7)8a!#rr%G1&EB?y>YtsXn&&z|@hFkUxWloQ9RLKJgDfX2N7AeG2c(e+*;dA@E_|4O@ZC za{`L9t+N5i;Co?~gX~)9dQvezzChi3K-+DPQ%s-)u{TKh2Y|yAvC!PWT Mv6F_M@VkH3-#pMPrvLx| literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/tupleexpression-0.5.3.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/tupleexpression-0.5.3.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..fb45451072668700c45f471ed3c39468102caaee GIT binary patch literal 1737 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 Yt_J7-d0OCZNIRF3v literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/unaryexpression-0.5.0.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/unaryexpression-0.5.0.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..e9876b8399ffdfdf9c196ca4461b27693c41e713 GIT binary patch literal 2471 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 Rh4t?d!=JVLLq+z#=|5u%s8av{ literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/unchecked-0.8.0.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/unchecked-0.8.0.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..56c527b01ba9b7a9a729056d4344dc4194fce3f0 GIT binary patch literal 2460 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 Pdk6kg)IZeX`gi>eF&BpE literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/unchecked-0.8.0.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/unchecked-0.8.0.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..8b4ca708ad578f2dc935afc00cf136629f8040c4 GIT binary patch literal 2461 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 QfA0eS6#EaMV*jrH0EHfynE(I) literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/units_and_global_variables-0.8.0.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/units_and_global_variables-0.8.0.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..94a3448cfbc62ed72f49cbbd1d904edc01723bbf GIT binary patch literal 9657 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 R|MkKCTg(3_Mftz~MbnbAN8mS{Lv0U3~ZJ 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 TFtGpYL;SZE|51wif9d}KYlNyS literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/using-for-0.4.1.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/using-for-0.4.1.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..dd3068c7f96ae3b4dbca55a46da8058db90b91f7 GIT binary patch literal 2364 zcma*p`9IT-0|)T8+ro+@O*Xf3-#1&X4wPeZ4JE{A<|br9j&haz_{cIu_DR`9$#Nve zaxCV)K8obbvAMr}zQ2DTkMHaC!|RvVAMmucU}J{^tN<8D@ce-^jT=>e!VLfxssJDh z06=K4FXpbIcR-M$ijszss#0)(zq?liHXta({dUkDAKx%9C3J8A2E@(*xB>tU01T6p z@2VfD2bK+fCF}DQcVK*_TcC+)wh$v2J-As&4OTan&^fUfv*6Xv^v{olwB9lt*ltzD zaFJdkL#%R$jZ9Cv7D{pi7S&2sK8WPr=0tE`_1*Q(>ZIZCg$l-#4Khl%B7ojg85Ku*^@&p?Fk1Oj zw?}#>neaE<4S(A*lN{>a>RH=Se?bRU-QRl=hj`G{#^&2T65#=-$dY z%}5bl$hJD8&_ha?)?(S*;g#E(NgyEvpe5kbjw9jdKGl?%OZTp?SQU-oaIRk^MJN`F zE|ZCA{8I;48|_6$roPOFC-)TbX!y;62CyIWJklr+k_BJ>Vu9r8&ZD#jtNL@Y%=RBG z&09KUnxbmf*&KzYuO`~Y(CE{wz3Cmgw}=u;R=i+wh_Kx)j&1VmJr8ybHvBbP*{awz zrGk@F>zuyh(%+WP!)xMm_>*X}j zG+Mz{icYtX0?|KQEjO@q`2#)ay{BZkAHF{Cy<=h}&TS!nsgmXvakQE$p0OfS0Bbys zixy_tzUX)I{pR3D_J%=+GsUiBXoz#ybFz9^cg9w1YmG5M)_iRBfi>dUi{b$V#&NPmIUVxVeDhkm=_N9I#?wjvat6{89 z8Blz-f4}sDU-+Svt9s~S-9MV=$0guV4W=vd?Cv0;6v&nuqB>E<;5kAIAt7XaA$xeH z4`^g(H$w{$?M9f_uo=0J+cjqiA_IlWpN-T#!^6)^i8FKBbrAVbqE8uPsuTI13kAf# zHGb)s_h26u6?LuYBj5e--a(OJLVXh&{E_R-bIVgU+BMgpdz#X7xjOgfC~?6lBxf0x z=_ef6T5>MUx&WSZIqa_od^Ne7vZZcW^(QsGE7>Y}5g(0FUaST?cwuSI7^%9tyFa)4 z;)r9J#XTIq>X*Frr{*sG!r%qzjUM+IBX-gLK$rqQhsjx)~&UO&+ zwrfTkb&-!|phE_hohecugXB?WPYNBbeTO)lv$*k4IPY~sqcnBWebZ-Hui92Gzo9b= zgCB3{Y?GkAu1{Y~rzV9yc8EDwgv^19c$wR|0z*wCLU%CtQ+q=R0Fta}70uR)r2XCH z<=vus$y9p9@qrCb)Y}u@yDn1vI?qj^Ewh*b-y-n3K0`YzNKDy2HRob}z-Qa9pvK7- z#yd@63}3qqn;kaD_@9)E9rHMfyF+tyPZ>OW+-m;Y`R6$(my9BLiQDFwtkud!g@)fI zf&QX;2FF(9#m0j5Hr509SyD6>D_`y8ja+^uf;+fe_VjMW@n~&*5_9_r$O5&f5_$wOFQ`aK)-PU(^M5OH@86o2ehC_YDnI$cy z9%sMAyUl+Q+U-d$GhkoV#tu-oys-<>P=t$x@+XLxb0SgJp2EQTv`^;(Gm$NO1>0AX zGVJNZ4EN%7|Bx)+2=(N!r<98-GH+b2#G+iyD2iHW2@|}4OVvsdvqNg4I9_X@L6ZF* zWLB*7W@QykT-#PgJ4pM?RkBFMu4nPqZnK_%MqRHC=KSwBt4)lzc9Ce;>02tAsKli-F?N0 zr;?-J=BNugn=iC4$=GY0SZQmv5DVjSFrUAmy-{-E2%Zf`j(Eejs0;i`(o<_X-wJPz z;oVp-QTXRPcoFx9G*@-db&OKBOmH;az`3sM=0WXOBm`O3{pm9(HENm8gJ+MWMX2%M zuf$odF|g@E9>+0RFN9LU1-X^4Pj44yLqw2HZf>z;6Y@LbRDRtXl%W$Ak+pkytW3Jk zjr=Y7P(AMQO@GK!{hD!K5m=j-L(Bfriwad`QXdue`ze>5+1|K4L<(7);32zMv+DtqmNUv6SSpIe>{UT)3l>&5+y5rbAJzOfIF^6s{{)V; U1qbK9ca}f3|FZ*sj06Dx0oRge2mk;8 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/using-for-0.4.1.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/using-for-0.4.1.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..22e37251d5fbf7f868ccae9b4275ee5a975f1b8a GIT binary patch literal 2366 zcma*p`9IVN0|)T0`#y@CIcM8MGZ<%X2_cIHW5#`t9An0rBjak_WSGGUAwr?Xl_=ww zj9kMKX)&%?waO8i!P7p!Kd;yG`TX$taea2!W+pz^o@z(ySa zE&~7%6%iB`2o6AF!DvNs{XKGNc{! ztA}y5w>n1J7B{~<@_VoC2AY$L?;lfT-sS!_IiY9JZf;Vipip;1#^T2seLyM|K7R;D z%=uu%HroaFKrcEYQS)o;4tT~T323(T7CQa_Q6XEhFP>MGW{0~ZHT41oqR0sbtks&P{F`hYk(gZ`@EVig9kRqvB$kW>?>JoIV!#V$bi_K%m7tSQW~i z#QvyE1jh3@O@9tJzg+?V4TR8H3&*Wi4Hk))A)AJKx#Q2>y-Q2L1)}o@zplh)24(rkaUVSQRXYD|k$sT#+pF39^`5Op z9AUg}q+*w@n+6M(uelZ+CJVEKcFES`jFnyC=QoOn5zKAX($Pg$=ysyAHiu z_$ol`#n$6_2GbI@!uPKFR_DWQ*8&KKx|1ZlE(o)9epVH8^1)JZUZtK*%l-I}rIMde z`X<ukgDA1DW=)PqFk^+wk zx^%i8{kBafk{T0j0iUu4e;&W=7A?4fZ>VMD-q4VpHF8FJ*pMWP zUMoatR6XSkLfNa&1Q*11h6)K)c~_R$mmQHQ=F+7S5%T!g8Bxn!aPj5MS0Svb*Kr^2PiNzF-`z zo60o2Qw+O(l5dzv4{777ku{*@e?DZkhdPVg>rzNAmX0v_p(;gQIc7+h*-f9U(JF z*FkOEfccn?3>hXhx=vwa?Xp@wLRdzTlRO9$q^CJ|Shd z{SXoBT&=-*{T+Tu%~7A2Ioza{LN<$5ptwzl)R={O0BWBTH)cK@A`^F+7VMuNiWTFu z*1kde70tqCMWe6nBJpZSVqox*p6J_v5#AEF?2P>HUZz#aMRrx)%kpOnJ^l~{Mknv|zE4lq z0Xy@&D<8wnbz9ETx!wL`Dh{q+xP$+Fqjy6x*|o6#V!Fy5T8*8J@{Yq4Uri43JSo#B zv78iwG3stL`3Ee`(8yCIE!ZN*haY-3j_lDiXCE5Ydhy}-!R0#BYE_vTBt$?%3n!rF zRGU#L-XH2$%={a^%=d1NL((Yg1?36OT7t{@=EA!?3%m^XJ&8?0K}lLwm)Rdiu4|3? z4FWPYh(_Mm$-E!VUFT3qRcZOQ*=yQh)eU>@P$!&^->RER?8>JED}tUI-X0};)`nXu zpU9mQ6AM+xM9%TgYZ7CSf#-j(BB*Z=+~-Hz`IlurJ}(v&+G+6ZsL`NRt2T9Hm#>a+ z$}cVGbJH+w)1hUfgS0&ZSB|et$ttsYGU;|=5h-C$fhR7vR!oIie@X@>j0Xnp=-h@x zKa7{v&?(G85EGy67&l&zLi7oYe-H1y3Wlxpd6Tl~8w9Vy6CS2;iS&h*UT?Ik(05WR zXXo_a$Ekbhp=%u2rg6-0D60n|y#9u{k7(1nVa%9Dz$k>yQGwbD;nL9=7#7E7N1%By zBbbi%Qy@tZ%A>4mu5B=1BBA*qkIH=Snik5PJl3%|vFIyl`Z7e+?Duw0ac(gy2!rG3 zt+m3c^|n*XuPLTE!w!sexP$Z+i?cdZ7=S@YG04tzt`R}ExP>{iketRG2&Bg!cQZC2 z&!Y-Aal{ohfpJlLlCxy5*15ORmAA8hR_7Nqn{D+`jNDW4<07d8N7J<<<}EVWzVj80 zq4BEXN_pil>M+mbtDTd-I_XEl$p&T7BK6k@36eHV&||Pt-89l~Ryj~C^T@WSE#oTb zky700y#g$v-U;FT?v|gle=2OBx*4CP*ZbRER<_VHuNzCk&+N&m+cv#PqgdO%*>d5L z@BsSLB`Ku6PwW-*6ZP6MQ<>Ool6&k8M~?50(Qi&aYIfV(u&^4l{cqI#bj^Q*WBGUf XPvY3yaB%*6XZcyDpF90iNdWL4$$)X6 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/using-for-0.4.1.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/using-for-0.4.1.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..f6aeaaba7202deefe6a3e34c7e4a788f995c2cf2 GIT binary patch literal 2361 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 VZNbX+@15yyZU64bUmyVh{{eW~Zf^hp literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/variable-0.8.0.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/variable-0.8.0.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..87e778600d5b20d3c5001a431c47120cb9c10e17 GIT binary patch literal 4293 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 WTMYyAKW~(OtN-u5|JN!2fd2z&VKYAf literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/variable-0.8.0.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/variable-0.8.0.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..d3db72a587a1699f1bafa79529de3a2ffd54b7d3 GIT binary patch literal 4291 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 U8Rb83gnz5^?;8F~6#&5h0VxzVJOBUy literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/variabledeclaration-0.5.0.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/variabledeclaration-0.5.0.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..c6aa3e7c06844cec4c6f17ad86056b67d38b2c15 GIT binary patch literal 2891 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 N>%Tkmm&^dbe*h2@hdBTM literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/variabledeclaration-0.5.0.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/variabledeclaration-0.5.0.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..298087feabcde047f537644b86593579bdc5f089 GIT binary patch literal 2893 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 xoAVOmG{1g&+E|maj@rYdjE7myITD^+Bli`x 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 Dv#(7s literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..783d4e0ef2ed5a8cf41c824258a48bba6b7616a1 GIT binary patch literal 5771 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..a3688063592f63b0a26fc1a926c8aab9ca1baf94 GIT binary patch literal 5768 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..cb145b39d1ce8e40cce5d479643cb87baa58399b GIT binary patch literal 5773 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/expected/assembly-all.sol-0.8.13-compact.json b/tests/ast-parsing/expected/assembly-all.sol-0.8.13-compact.json new file mode 100644 index 000000000..d0a1cb33e --- /dev/null +++ b/tests/ast-parsing/expected/assembly-all.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/assembly-all.sol-0.8.14-compact.json b/tests/ast-parsing/expected/assembly-all.sol-0.8.14-compact.json new file mode 100644 index 000000000..d0a1cb33e --- /dev/null +++ b/tests/ast-parsing/expected/assembly-all.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/assembly-all.sol-0.8.15-compact.json b/tests/ast-parsing/expected/assembly-all.sol-0.8.15-compact.json new file mode 100644 index 000000000..d0a1cb33e --- /dev/null +++ b/tests/ast-parsing/expected/assembly-all.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/assignment-0.4.7.sol-0.8.13-compact.json b/tests/ast-parsing/expected/assignment-0.4.7.sol-0.8.13-compact.json new file mode 100644 index 000000000..8f9f9857b --- /dev/null +++ b/tests/ast-parsing/expected/assignment-0.4.7.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/assignment-0.4.7.sol-0.8.14-compact.json b/tests/ast-parsing/expected/assignment-0.4.7.sol-0.8.14-compact.json new file mode 100644 index 000000000..8f9f9857b --- /dev/null +++ b/tests/ast-parsing/expected/assignment-0.4.7.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/assignment-0.4.7.sol-0.8.15-compact.json b/tests/ast-parsing/expected/assignment-0.4.7.sol-0.8.15-compact.json new file mode 100644 index 000000000..8f9f9857b --- /dev/null +++ b/tests/ast-parsing/expected/assignment-0.4.7.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/break-all.sol-0.8.13-compact.json b/tests/ast-parsing/expected/break-all.sol-0.8.13-compact.json new file mode 100644 index 000000000..b9b7fc93e --- /dev/null +++ b/tests/ast-parsing/expected/break-all.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: BREAK 7\n\"];\n7->3;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: BREAK 20\n\"];\n20->16;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/break-all.sol-0.8.14-compact.json b/tests/ast-parsing/expected/break-all.sol-0.8.14-compact.json new file mode 100644 index 000000000..b9b7fc93e --- /dev/null +++ b/tests/ast-parsing/expected/break-all.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: BREAK 7\n\"];\n7->3;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: BREAK 20\n\"];\n20->16;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/break-all.sol-0.8.15-compact.json b/tests/ast-parsing/expected/break-all.sol-0.8.15-compact.json new file mode 100644 index 000000000..b9b7fc93e --- /dev/null +++ b/tests/ast-parsing/expected/break-all.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: BREAK 7\n\"];\n7->3;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: BREAK 20\n\"];\n20->16;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/call_to_variable-all.sol-0.8.13-compact.json b/tests/ast-parsing/expected/call_to_variable-all.sol-0.8.13-compact.json new file mode 100644 index 000000000..113bb5a14 --- /dev/null +++ b/tests/ast-parsing/expected/call_to_variable-all.sol-0.8.13-compact.json @@ -0,0 +1,6 @@ +{ + "C": {}, + "D": { + "f(C)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/call_to_variable-all.sol-0.8.14-compact.json b/tests/ast-parsing/expected/call_to_variable-all.sol-0.8.14-compact.json new file mode 100644 index 000000000..113bb5a14 --- /dev/null +++ b/tests/ast-parsing/expected/call_to_variable-all.sol-0.8.14-compact.json @@ -0,0 +1,6 @@ +{ + "C": {}, + "D": { + "f(C)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/call_to_variable-all.sol-0.8.15-compact.json b/tests/ast-parsing/expected/call_to_variable-all.sol-0.8.15-compact.json new file mode 100644 index 000000000..113bb5a14 --- /dev/null +++ b/tests/ast-parsing/expected/call_to_variable-all.sol-0.8.15-compact.json @@ -0,0 +1,6 @@ +{ + "C": {}, + "D": { + "f(C)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/comment-all.sol-0.8.13-compact.json b/tests/ast-parsing/expected/comment-all.sol-0.8.13-compact.json new file mode 100644 index 000000000..a53745acd --- /dev/null +++ b/tests/ast-parsing/expected/comment-all.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/comment-all.sol-0.8.14-compact.json b/tests/ast-parsing/expected/comment-all.sol-0.8.14-compact.json new file mode 100644 index 000000000..a53745acd --- /dev/null +++ b/tests/ast-parsing/expected/comment-all.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/comment-all.sol-0.8.15-compact.json b/tests/ast-parsing/expected/comment-all.sol-0.8.15-compact.json new file mode 100644 index 000000000..a53745acd --- /dev/null +++ b/tests/ast-parsing/expected/comment-all.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.13-compact.json b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.13-compact.json new file mode 100644 index 000000000..6710349b1 --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.13-compact.json @@ -0,0 +1,7 @@ +{ + "Test": {}, + "Lib": {}, + "C": { + "f(St)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.14-compact.json b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.14-compact.json new file mode 100644 index 000000000..6710349b1 --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.14-compact.json @@ -0,0 +1,7 @@ +{ + "Test": {}, + "Lib": {}, + "C": { + "f(St)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.15-compact.json b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.15-compact.json new file mode 100644 index 000000000..6710349b1 --- /dev/null +++ b/tests/ast-parsing/expected/complex_imports/import_aliases/test.sol-0.8.15-compact.json @@ -0,0 +1,7 @@ +{ + "Test": {}, + "Lib": {}, + "C": { + "f(St)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/conditional-all.sol-0.8.13-compact.json b/tests/ast-parsing/expected/conditional-all.sol-0.8.13-compact.json new file mode 100644 index 000000000..6ef3d40e7 --- /dev/null +++ b/tests/ast-parsing/expected/conditional-all.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->6;\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->9;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n9->10;\n10[label=\"Node Type: IF 10\n\"];\n10->11[label=\"True\"];\n10->12[label=\"False\"];\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->13;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: END_IF 13\n\"];\n13->14;\n14[label=\"Node Type: IF 14\n\"];\n14->16[label=\"True\"];\n14->26[label=\"False\"];\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: END_IF 17\n\"];\n17->18;\n18[label=\"Node Type: IF 18\n\"];\n18->19[label=\"True\"];\n18->20[label=\"False\"];\n19[label=\"Node Type: EXPRESSION 19\n\"];\n19->21;\n20[label=\"Node Type: EXPRESSION 20\n\"];\n20->21;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: IF 22\n\"];\n22->23[label=\"True\"];\n22->24[label=\"False\"];\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->25;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->25;\n25[label=\"Node Type: END_IF 25\n\"];\n26[label=\"Node Type: IF 26\n\"];\n26->27[label=\"True\"];\n26->28[label=\"False\"];\n27[label=\"Node Type: EXPRESSION 27\n\"];\n27->29;\n28[label=\"Node Type: EXPRESSION 28\n\"];\n28->29;\n29[label=\"Node Type: END_IF 29\n\"];\n29->17;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/conditional-all.sol-0.8.14-compact.json b/tests/ast-parsing/expected/conditional-all.sol-0.8.14-compact.json new file mode 100644 index 000000000..6ef3d40e7 --- /dev/null +++ b/tests/ast-parsing/expected/conditional-all.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->6;\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->9;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n9->10;\n10[label=\"Node Type: IF 10\n\"];\n10->11[label=\"True\"];\n10->12[label=\"False\"];\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->13;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: END_IF 13\n\"];\n13->14;\n14[label=\"Node Type: IF 14\n\"];\n14->16[label=\"True\"];\n14->26[label=\"False\"];\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: END_IF 17\n\"];\n17->18;\n18[label=\"Node Type: IF 18\n\"];\n18->19[label=\"True\"];\n18->20[label=\"False\"];\n19[label=\"Node Type: EXPRESSION 19\n\"];\n19->21;\n20[label=\"Node Type: EXPRESSION 20\n\"];\n20->21;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: IF 22\n\"];\n22->23[label=\"True\"];\n22->24[label=\"False\"];\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->25;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->25;\n25[label=\"Node Type: END_IF 25\n\"];\n26[label=\"Node Type: IF 26\n\"];\n26->27[label=\"True\"];\n26->28[label=\"False\"];\n27[label=\"Node Type: EXPRESSION 27\n\"];\n27->29;\n28[label=\"Node Type: EXPRESSION 28\n\"];\n28->29;\n29[label=\"Node Type: END_IF 29\n\"];\n29->17;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/conditional-all.sol-0.8.15-compact.json b/tests/ast-parsing/expected/conditional-all.sol-0.8.15-compact.json new file mode 100644 index 000000000..6ef3d40e7 --- /dev/null +++ b/tests/ast-parsing/expected/conditional-all.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->6;\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->9;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n9->10;\n10[label=\"Node Type: IF 10\n\"];\n10->11[label=\"True\"];\n10->12[label=\"False\"];\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->13;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: END_IF 13\n\"];\n13->14;\n14[label=\"Node Type: IF 14\n\"];\n14->16[label=\"True\"];\n14->26[label=\"False\"];\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: END_IF 17\n\"];\n17->18;\n18[label=\"Node Type: IF 18\n\"];\n18->19[label=\"True\"];\n18->20[label=\"False\"];\n19[label=\"Node Type: EXPRESSION 19\n\"];\n19->21;\n20[label=\"Node Type: EXPRESSION 20\n\"];\n20->21;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: IF 22\n\"];\n22->23[label=\"True\"];\n22->24[label=\"False\"];\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->25;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->25;\n25[label=\"Node Type: END_IF 25\n\"];\n26[label=\"Node Type: IF 26\n\"];\n26->27[label=\"True\"];\n26->28[label=\"False\"];\n27[label=\"Node Type: EXPRESSION 27\n\"];\n27->29;\n28[label=\"Node Type: EXPRESSION 28\n\"];\n28->29;\n29[label=\"Node Type: END_IF 29\n\"];\n29->17;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/continue-all.sol-0.8.13-compact.json b/tests/ast-parsing/expected/continue-all.sol-0.8.13-compact.json new file mode 100644 index 000000000..bba15d9bd --- /dev/null +++ b/tests/ast-parsing/expected/continue-all.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: CONTINUE 7\n\"];\n7->2;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: CONTINUE 20\n\"];\n20->15;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/continue-all.sol-0.8.14-compact.json b/tests/ast-parsing/expected/continue-all.sol-0.8.14-compact.json new file mode 100644 index 000000000..bba15d9bd --- /dev/null +++ b/tests/ast-parsing/expected/continue-all.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: CONTINUE 7\n\"];\n7->2;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: CONTINUE 20\n\"];\n20->15;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/continue-all.sol-0.8.15-compact.json b/tests/ast-parsing/expected/continue-all.sol-0.8.15-compact.json new file mode 100644 index 000000000..bba15d9bd --- /dev/null +++ b/tests/ast-parsing/expected/continue-all.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: CONTINUE 7\n\"];\n7->2;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: CONTINUE 20\n\"];\n20->15;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/contract-0.6.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/contract-0.6.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..1df28fb3d --- /dev/null +++ b/tests/ast-parsing/expected/contract-0.6.0.sol-0.8.13-compact.json @@ -0,0 +1,19 @@ +{ + "A": {}, + "B": { + "constructor(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C": { + "constructor(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "D": { + "constructor(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + }, + "E": { + "constructor(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "F": {}, + "G": {}, + "H": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/contract-0.6.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/contract-0.6.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..1df28fb3d --- /dev/null +++ b/tests/ast-parsing/expected/contract-0.6.0.sol-0.8.14-compact.json @@ -0,0 +1,19 @@ +{ + "A": {}, + "B": { + "constructor(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C": { + "constructor(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "D": { + "constructor(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + }, + "E": { + "constructor(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "F": {}, + "G": {}, + "H": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/contract-0.6.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/contract-0.6.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..1df28fb3d --- /dev/null +++ b/tests/ast-parsing/expected/contract-0.6.0.sol-0.8.15-compact.json @@ -0,0 +1,19 @@ +{ + "A": {}, + "B": { + "constructor(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C": { + "constructor(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "D": { + "constructor(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + }, + "E": { + "constructor(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "F": {}, + "G": {}, + "H": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error-0.4.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/custom_error-0.4.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/tests/ast-parsing/expected/custom_error-0.4.0.sol-0.8.13-compact.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error-0.4.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/custom_error-0.4.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/tests/ast-parsing/expected/custom_error-0.4.0.sol-0.8.14-compact.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error-0.4.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/custom_error-0.4.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/tests/ast-parsing/expected/custom_error-0.4.0.sol-0.8.15-compact.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/tests/ast-parsing/expected/dowhile-0.4.5.sol-0.8.13-compact.json b/tests/ast-parsing/expected/dowhile-0.4.5.sol-0.8.13-compact.json new file mode 100644 index 000000000..1cf317575 --- /dev/null +++ b/tests/ast-parsing/expected/dowhile-0.4.5.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->4;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->9;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/dowhile-0.4.5.sol-0.8.14-compact.json b/tests/ast-parsing/expected/dowhile-0.4.5.sol-0.8.14-compact.json new file mode 100644 index 000000000..1cf317575 --- /dev/null +++ b/tests/ast-parsing/expected/dowhile-0.4.5.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->4;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->9;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/dowhile-0.4.5.sol-0.8.15-compact.json b/tests/ast-parsing/expected/dowhile-0.4.5.sol-0.8.15-compact.json new file mode 100644 index 000000000..1cf317575 --- /dev/null +++ b/tests/ast-parsing/expected/dowhile-0.4.5.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->4;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->9;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/emit-0.5.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/emit-0.5.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..b043ced39 --- /dev/null +++ b/tests/ast-parsing/expected/emit-0.5.0.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "emitWithKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/emit-0.5.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/emit-0.5.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..b043ced39 --- /dev/null +++ b/tests/ast-parsing/expected/emit-0.5.0.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "emitWithKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/emit-0.5.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/emit-0.5.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..b043ced39 --- /dev/null +++ b/tests/ast-parsing/expected/emit-0.5.0.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "emitWithKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/enum-0.8.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/enum-0.8.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/enum-0.8.0.sol-0.8.13-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/enum-0.8.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/enum-0.8.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/enum-0.8.0.sol-0.8.14-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/enum-0.8.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/enum-0.8.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/enum-0.8.0.sol-0.8.15-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/event-all.sol-0.8.13-compact.json b/tests/ast-parsing/expected/event-all.sol-0.8.13-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/event-all.sol-0.8.13-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/event-all.sol-0.8.14-compact.json b/tests/ast-parsing/expected/event-all.sol-0.8.14-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/event-all.sol-0.8.14-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/event-all.sol-0.8.15-compact.json b/tests/ast-parsing/expected/event-all.sol-0.8.15-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/event-all.sol-0.8.15-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/for-all.sol-0.8.13-compact.json b/tests/ast-parsing/expected/for-all.sol-0.8.13-compact.json new file mode 100644 index 000000000..fe24348d8 --- /dev/null +++ b/tests/ast-parsing/expected/for-all.sol-0.8.13-compact.json @@ -0,0 +1,15 @@ +{ + "C": { + "normalLoopBlockBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", + "normalLoopExprBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", + "normalLoopNoBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->5;\n}\n", + "loopNoPre()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", + "loopNoCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", + "loopNoPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", + "loopNoPreCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", + "loopNoPrePost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", + "loopNoCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", + "loopNoPreCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", + "loopNoPreCondPostBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->1;\n1->2;\n2[label=\"Node Type: END_LOOP 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/for-all.sol-0.8.14-compact.json b/tests/ast-parsing/expected/for-all.sol-0.8.14-compact.json new file mode 100644 index 000000000..fe24348d8 --- /dev/null +++ b/tests/ast-parsing/expected/for-all.sol-0.8.14-compact.json @@ -0,0 +1,15 @@ +{ + "C": { + "normalLoopBlockBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", + "normalLoopExprBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", + "normalLoopNoBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->5;\n}\n", + "loopNoPre()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", + "loopNoCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", + "loopNoPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", + "loopNoPreCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", + "loopNoPrePost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", + "loopNoCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", + "loopNoPreCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", + "loopNoPreCondPostBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->1;\n1->2;\n2[label=\"Node Type: END_LOOP 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/for-all.sol-0.8.15-compact.json b/tests/ast-parsing/expected/for-all.sol-0.8.15-compact.json new file mode 100644 index 000000000..fe24348d8 --- /dev/null +++ b/tests/ast-parsing/expected/for-all.sol-0.8.15-compact.json @@ -0,0 +1,15 @@ +{ + "C": { + "normalLoopBlockBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", + "normalLoopExprBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", + "normalLoopNoBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->5;\n}\n", + "loopNoPre()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", + "loopNoCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", + "loopNoPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", + "loopNoPreCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", + "loopNoPrePost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", + "loopNoCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", + "loopNoPreCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", + "loopNoPreCondPostBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->1;\n1->2;\n2[label=\"Node Type: END_LOOP 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/function-0.7.1.sol-0.8.13-compact.json b/tests/ast-parsing/expected/function-0.7.1.sol-0.8.13-compact.json new file mode 100644 index 000000000..50465d36d --- /dev/null +++ b/tests/ast-parsing/expected/function-0.7.1.sol-0.8.13-compact.json @@ -0,0 +1,52 @@ +{ + "C1": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "receive()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C2": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "receive()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C3": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", + "modifierNoArgs()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", + "modifierWithArgs(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" + }, + "C4": { + "hasArgs(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "hasReturns()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "hasArgsAndReturns(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C5": { + "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "pureFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "viewFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "abstractFunc()": "digraph{\n}\n" + }, + "C6": { + "abstractFunc()": "digraph{\n}\n", + "abstractFunc2()": "digraph{\n}\n" + }, + "C7": { + "abstractFunc3()": "digraph{\n}\n" + }, + "C8": { + "abstractFunc3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "abstractFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "abstractFunc2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "pureFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "viewFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/function-0.7.1.sol-0.8.14-compact.json b/tests/ast-parsing/expected/function-0.7.1.sol-0.8.14-compact.json new file mode 100644 index 000000000..50465d36d --- /dev/null +++ b/tests/ast-parsing/expected/function-0.7.1.sol-0.8.14-compact.json @@ -0,0 +1,52 @@ +{ + "C1": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "receive()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C2": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "receive()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C3": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", + "modifierNoArgs()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", + "modifierWithArgs(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" + }, + "C4": { + "hasArgs(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "hasReturns()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "hasArgsAndReturns(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C5": { + "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "pureFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "viewFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "abstractFunc()": "digraph{\n}\n" + }, + "C6": { + "abstractFunc()": "digraph{\n}\n", + "abstractFunc2()": "digraph{\n}\n" + }, + "C7": { + "abstractFunc3()": "digraph{\n}\n" + }, + "C8": { + "abstractFunc3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "abstractFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "abstractFunc2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "pureFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "viewFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/function-0.7.1.sol-0.8.15-compact.json b/tests/ast-parsing/expected/function-0.7.1.sol-0.8.15-compact.json new file mode 100644 index 000000000..50465d36d --- /dev/null +++ b/tests/ast-parsing/expected/function-0.7.1.sol-0.8.15-compact.json @@ -0,0 +1,52 @@ +{ + "C1": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "receive()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C2": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "receive()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C3": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", + "modifierNoArgs()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", + "modifierWithArgs(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" + }, + "C4": { + "hasArgs(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "hasReturns()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "hasArgsAndReturns(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C5": { + "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "pureFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "viewFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "abstractFunc()": "digraph{\n}\n" + }, + "C6": { + "abstractFunc()": "digraph{\n}\n", + "abstractFunc2()": "digraph{\n}\n" + }, + "C7": { + "abstractFunc3()": "digraph{\n}\n" + }, + "C8": { + "abstractFunc3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "abstractFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "abstractFunc2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "pureFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "viewFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/functioncall-0.8.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/functioncall-0.8.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..f266b62b1 --- /dev/null +++ b/tests/ast-parsing/expected/functioncall-0.8.0.sol-0.8.13-compact.json @@ -0,0 +1,10 @@ +{ + "I": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n18->19;\n19[label=\"Node Type: EXPRESSION 19\n\"];\n19->20;\n20[label=\"Node Type: EXPRESSION 20\n\"];\n}\n", + "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/functioncall-0.8.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/functioncall-0.8.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..f266b62b1 --- /dev/null +++ b/tests/ast-parsing/expected/functioncall-0.8.0.sol-0.8.14-compact.json @@ -0,0 +1,10 @@ +{ + "I": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n18->19;\n19[label=\"Node Type: EXPRESSION 19\n\"];\n19->20;\n20[label=\"Node Type: EXPRESSION 20\n\"];\n}\n", + "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/functioncall-0.8.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/functioncall-0.8.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..f266b62b1 --- /dev/null +++ b/tests/ast-parsing/expected/functioncall-0.8.0.sol-0.8.15-compact.json @@ -0,0 +1,10 @@ +{ + "I": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n18->19;\n19[label=\"Node Type: EXPRESSION 19\n\"];\n19->20;\n20[label=\"Node Type: EXPRESSION 20\n\"];\n}\n", + "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/if-all.sol-0.8.13-compact.json b/tests/ast-parsing/expected/if-all.sol-0.8.13-compact.json new file mode 100644 index 000000000..c0c884b4e --- /dev/null +++ b/tests/ast-parsing/expected/if-all.sol-0.8.13-compact.json @@ -0,0 +1,8 @@ +{ + "C": { + "ifWithoutElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: END_IF 3\n\"];\n}\n", + "ifWithElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->4;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", + "ifWithElseIf()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->9;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->8;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n}\n", + "ifWithElseIfElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->7;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->6;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: END_IF 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/if-all.sol-0.8.14-compact.json b/tests/ast-parsing/expected/if-all.sol-0.8.14-compact.json new file mode 100644 index 000000000..c0c884b4e --- /dev/null +++ b/tests/ast-parsing/expected/if-all.sol-0.8.14-compact.json @@ -0,0 +1,8 @@ +{ + "C": { + "ifWithoutElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: END_IF 3\n\"];\n}\n", + "ifWithElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->4;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", + "ifWithElseIf()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->9;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->8;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n}\n", + "ifWithElseIfElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->7;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->6;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: END_IF 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/if-all.sol-0.8.15-compact.json b/tests/ast-parsing/expected/if-all.sol-0.8.15-compact.json new file mode 100644 index 000000000..c0c884b4e --- /dev/null +++ b/tests/ast-parsing/expected/if-all.sol-0.8.15-compact.json @@ -0,0 +1,8 @@ +{ + "C": { + "ifWithoutElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: END_IF 3\n\"];\n}\n", + "ifWithElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->4;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", + "ifWithElseIf()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->9;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->8;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n}\n", + "ifWithElseIfElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->7;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->6;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: END_IF 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.13-compact.json b/tests/ast-parsing/expected/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.13-compact.json new file mode 100644 index 000000000..355945be7 --- /dev/null +++ b/tests/ast-parsing/expected/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.13-compact.json @@ -0,0 +1,3 @@ +{ + "I": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.14-compact.json b/tests/ast-parsing/expected/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.14-compact.json new file mode 100644 index 000000000..355945be7 --- /dev/null +++ b/tests/ast-parsing/expected/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.14-compact.json @@ -0,0 +1,3 @@ +{ + "I": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.15-compact.json b/tests/ast-parsing/expected/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.15-compact.json new file mode 100644 index 000000000..355945be7 --- /dev/null +++ b/tests/ast-parsing/expected/import_interface_with_struct_from_top_level-0.7.6.sol-0.8.15-compact.json @@ -0,0 +1,3 @@ +{ + "I": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/indexaccess-all.sol-0.8.13-compact.json b/tests/ast-parsing/expected/indexaccess-all.sol-0.8.13-compact.json new file mode 100644 index 000000000..43190fcd6 --- /dev/null +++ b/tests/ast-parsing/expected/indexaccess-all.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/indexaccess-all.sol-0.8.14-compact.json b/tests/ast-parsing/expected/indexaccess-all.sol-0.8.14-compact.json new file mode 100644 index 000000000..43190fcd6 --- /dev/null +++ b/tests/ast-parsing/expected/indexaccess-all.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/indexaccess-all.sol-0.8.15-compact.json b/tests/ast-parsing/expected/indexaccess-all.sol-0.8.15-compact.json new file mode 100644 index 000000000..43190fcd6 --- /dev/null +++ b/tests/ast-parsing/expected/indexaccess-all.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/indexrangeaccess-0.6.1.sol-0.8.13-compact.json b/tests/ast-parsing/expected/indexrangeaccess-0.6.1.sol-0.8.13-compact.json new file mode 100644 index 000000000..f4529bc86 --- /dev/null +++ b/tests/ast-parsing/expected/indexrangeaccess-0.6.1.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f(bytes)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/indexrangeaccess-0.6.1.sol-0.8.14-compact.json b/tests/ast-parsing/expected/indexrangeaccess-0.6.1.sol-0.8.14-compact.json new file mode 100644 index 000000000..f4529bc86 --- /dev/null +++ b/tests/ast-parsing/expected/indexrangeaccess-0.6.1.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f(bytes)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/indexrangeaccess-0.6.1.sol-0.8.15-compact.json b/tests/ast-parsing/expected/indexrangeaccess-0.6.1.sol-0.8.15-compact.json new file mode 100644 index 000000000..f4529bc86 --- /dev/null +++ b/tests/ast-parsing/expected/indexrangeaccess-0.6.1.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f(bytes)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/library_implicit_conversion-0.5.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/library_implicit_conversion-0.5.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..81b56547c --- /dev/null +++ b/tests/ast-parsing/expected/library_implicit_conversion-0.5.0.sol-0.8.13-compact.json @@ -0,0 +1,23 @@ +{ + "LibByte": { + "t(uint256,bytes1)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "t(uint256,bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "TestByte": { + "test()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n" + }, + "LibUint": { + "t(uint256,uint8)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "t(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "TestUint": { + "test()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n" + }, + "LibInt": { + "t(uint256,int8)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "t(uint256,int256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "TestUintWithVariableiAndConversion": { + "test()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/library_implicit_conversion-0.5.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/library_implicit_conversion-0.5.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..81b56547c --- /dev/null +++ b/tests/ast-parsing/expected/library_implicit_conversion-0.5.0.sol-0.8.14-compact.json @@ -0,0 +1,23 @@ +{ + "LibByte": { + "t(uint256,bytes1)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "t(uint256,bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "TestByte": { + "test()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n" + }, + "LibUint": { + "t(uint256,uint8)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "t(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "TestUint": { + "test()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n" + }, + "LibInt": { + "t(uint256,int8)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "t(uint256,int256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "TestUintWithVariableiAndConversion": { + "test()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/library_implicit_conversion-0.5.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/library_implicit_conversion-0.5.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..81b56547c --- /dev/null +++ b/tests/ast-parsing/expected/library_implicit_conversion-0.5.0.sol-0.8.15-compact.json @@ -0,0 +1,23 @@ +{ + "LibByte": { + "t(uint256,bytes1)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "t(uint256,bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "TestByte": { + "test()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n" + }, + "LibUint": { + "t(uint256,uint8)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "t(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "TestUint": { + "test()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n" + }, + "LibInt": { + "t(uint256,int8)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "t(uint256,int256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "TestUintWithVariableiAndConversion": { + "test()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/memberaccess-0.5.3.sol-0.8.13-compact.json b/tests/ast-parsing/expected/memberaccess-0.5.3.sol-0.8.13-compact.json new file mode 100644 index 000000000..cc7fbbb8c --- /dev/null +++ b/tests/ast-parsing/expected/memberaccess-0.5.3.sol-0.8.13-compact.json @@ -0,0 +1,6 @@ +{ + "I": {}, + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/memberaccess-0.5.3.sol-0.8.14-compact.json b/tests/ast-parsing/expected/memberaccess-0.5.3.sol-0.8.14-compact.json new file mode 100644 index 000000000..cc7fbbb8c --- /dev/null +++ b/tests/ast-parsing/expected/memberaccess-0.5.3.sol-0.8.14-compact.json @@ -0,0 +1,6 @@ +{ + "I": {}, + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/memberaccess-0.5.3.sol-0.8.15-compact.json b/tests/ast-parsing/expected/memberaccess-0.5.3.sol-0.8.15-compact.json new file mode 100644 index 000000000..cc7fbbb8c --- /dev/null +++ b/tests/ast-parsing/expected/memberaccess-0.5.3.sol-0.8.15-compact.json @@ -0,0 +1,6 @@ +{ + "I": {}, + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.13-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.13-compact.json new file mode 100644 index 000000000..228af371a --- /dev/null +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.14-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.14-compact.json new file mode 100644 index 000000000..228af371a --- /dev/null +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.15-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.15-compact.json new file mode 100644 index 000000000..228af371a --- /dev/null +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/modifier-all.sol-0.8.13-compact.json b/tests/ast-parsing/expected/modifier-all.sol-0.8.13-compact.json new file mode 100644 index 000000000..34aad8ef1 --- /dev/null +++ b/tests/ast-parsing/expected/modifier-all.sol-0.8.13-compact.json @@ -0,0 +1,8 @@ +{ + "C": { + "onePlaceholder()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", + "multiplePlaceholders()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n1->2;\n2[label=\"Node Type: _ 2\n\"];\n2->3;\n3[label=\"Node Type: _ 3\n\"];\n}\n", + "acceptsVar(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", + "noParams()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/modifier-all.sol-0.8.14-compact.json b/tests/ast-parsing/expected/modifier-all.sol-0.8.14-compact.json new file mode 100644 index 000000000..34aad8ef1 --- /dev/null +++ b/tests/ast-parsing/expected/modifier-all.sol-0.8.14-compact.json @@ -0,0 +1,8 @@ +{ + "C": { + "onePlaceholder()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", + "multiplePlaceholders()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n1->2;\n2[label=\"Node Type: _ 2\n\"];\n2->3;\n3[label=\"Node Type: _ 3\n\"];\n}\n", + "acceptsVar(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", + "noParams()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/modifier-all.sol-0.8.15-compact.json b/tests/ast-parsing/expected/modifier-all.sol-0.8.15-compact.json new file mode 100644 index 000000000..34aad8ef1 --- /dev/null +++ b/tests/ast-parsing/expected/modifier-all.sol-0.8.15-compact.json @@ -0,0 +1,8 @@ +{ + "C": { + "onePlaceholder()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", + "multiplePlaceholders()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n1->2;\n2[label=\"Node Type: _ 2\n\"];\n2->3;\n3[label=\"Node Type: _ 3\n\"];\n}\n", + "acceptsVar(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", + "noParams()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/newexpression-0.5.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/newexpression-0.5.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..e46dafe75 --- /dev/null +++ b/tests/ast-parsing/expected/newexpression-0.5.0.sol-0.8.13-compact.json @@ -0,0 +1,8 @@ +{ + "B": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/newexpression-0.5.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/newexpression-0.5.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..e46dafe75 --- /dev/null +++ b/tests/ast-parsing/expected/newexpression-0.5.0.sol-0.8.14-compact.json @@ -0,0 +1,8 @@ +{ + "B": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/newexpression-0.5.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/newexpression-0.5.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..e46dafe75 --- /dev/null +++ b/tests/ast-parsing/expected/newexpression-0.5.0.sol-0.8.15-compact.json @@ -0,0 +1,8 @@ +{ + "B": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + }, + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/pragma-0.8.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/pragma-0.8.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/pragma-0.8.0.sol-0.8.13-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/pragma-0.8.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/pragma-0.8.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/pragma-0.8.0.sol-0.8.14-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/pragma-0.8.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/pragma-0.8.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/pragma-0.8.0.sol-0.8.15-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/push-all.sol-0.8.13-compact.json b/tests/ast-parsing/expected/push-all.sol-0.8.13-compact.json new file mode 100644 index 000000000..a1a35e654 --- /dev/null +++ b/tests/ast-parsing/expected/push-all.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/push-all.sol-0.8.14-compact.json b/tests/ast-parsing/expected/push-all.sol-0.8.14-compact.json new file mode 100644 index 000000000..a1a35e654 --- /dev/null +++ b/tests/ast-parsing/expected/push-all.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/push-all.sol-0.8.15-compact.json b/tests/ast-parsing/expected/push-all.sol-0.8.15-compact.json new file mode 100644 index 000000000..a1a35e654 --- /dev/null +++ b/tests/ast-parsing/expected/push-all.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/return-all.sol-0.8.13-compact.json b/tests/ast-parsing/expected/return-all.sol-0.8.13-compact.json new file mode 100644 index 000000000..7eddd38f6 --- /dev/null +++ b/tests/ast-parsing/expected/return-all.sol-0.8.13-compact.json @@ -0,0 +1,9 @@ +{ + "C": { + "returnConstant()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "returnVariable()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "returnTuple()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", + "returnTernary()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->3;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: RETURN 4\n\"];\n5[label=\"Node Type: RETURN 5\n\"];\n}\n", + "returnDelete()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/return-all.sol-0.8.14-compact.json b/tests/ast-parsing/expected/return-all.sol-0.8.14-compact.json new file mode 100644 index 000000000..7eddd38f6 --- /dev/null +++ b/tests/ast-parsing/expected/return-all.sol-0.8.14-compact.json @@ -0,0 +1,9 @@ +{ + "C": { + "returnConstant()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "returnVariable()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "returnTuple()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", + "returnTernary()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->3;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: RETURN 4\n\"];\n5[label=\"Node Type: RETURN 5\n\"];\n}\n", + "returnDelete()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/return-all.sol-0.8.15-compact.json b/tests/ast-parsing/expected/return-all.sol-0.8.15-compact.json new file mode 100644 index 000000000..7eddd38f6 --- /dev/null +++ b/tests/ast-parsing/expected/return-all.sol-0.8.15-compact.json @@ -0,0 +1,9 @@ +{ + "C": { + "returnConstant()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "returnVariable()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "returnTuple()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", + "returnTernary()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->3;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: RETURN 4\n\"];\n5[label=\"Node Type: RETURN 5\n\"];\n}\n", + "returnDelete()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/scope-0.5.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/scope-0.5.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..00c3dbb1a --- /dev/null +++ b/tests/ast-parsing/expected/scope-0.5.0.sol-0.8.13-compact.json @@ -0,0 +1,8 @@ +{ + "Scope": { + "nested_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n}\n", + "if_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->4;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", + "while_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n}\n", + "for_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/scope-0.5.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/scope-0.5.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..00c3dbb1a --- /dev/null +++ b/tests/ast-parsing/expected/scope-0.5.0.sol-0.8.14-compact.json @@ -0,0 +1,8 @@ +{ + "Scope": { + "nested_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n}\n", + "if_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->4;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", + "while_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n}\n", + "for_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/scope-0.5.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/scope-0.5.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..00c3dbb1a --- /dev/null +++ b/tests/ast-parsing/expected/scope-0.5.0.sol-0.8.15-compact.json @@ -0,0 +1,8 @@ +{ + "Scope": { + "nested_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n}\n", + "if_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->4;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", + "while_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n}\n", + "for_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/struct-0.6.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/struct-0.6.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/struct-0.6.0.sol-0.8.13-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/struct-0.6.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/struct-0.6.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/struct-0.6.0.sol-0.8.14-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/struct-0.6.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/struct-0.6.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/struct-0.6.0.sol-0.8.15-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/throw-0.5.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/throw-0.5.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/throw-0.5.0.sol-0.8.13-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/throw-0.5.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/throw-0.5.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/throw-0.5.0.sol-0.8.14-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/throw-0.5.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/throw-0.5.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/throw-0.5.0.sol-0.8.15-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top-level-0.7.4.sol-0.8.13-compact.json b/tests/ast-parsing/expected/top-level-0.7.4.sol-0.8.13-compact.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/tests/ast-parsing/expected/top-level-0.7.4.sol-0.8.13-compact.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top-level-0.7.4.sol-0.8.14-compact.json b/tests/ast-parsing/expected/top-level-0.7.4.sol-0.8.14-compact.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/tests/ast-parsing/expected/top-level-0.7.4.sol-0.8.14-compact.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top-level-0.7.4.sol-0.8.15-compact.json b/tests/ast-parsing/expected/top-level-0.7.4.sol-0.8.15-compact.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/tests/ast-parsing/expected/top-level-0.7.4.sol-0.8.15-compact.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top-level-import-0.7.1.sol-0.8.13-compact.json b/tests/ast-parsing/expected/top-level-import-0.7.1.sol-0.8.13-compact.json new file mode 100644 index 000000000..a1a35e654 --- /dev/null +++ b/tests/ast-parsing/expected/top-level-import-0.7.1.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top-level-import-0.7.1.sol-0.8.14-compact.json b/tests/ast-parsing/expected/top-level-import-0.7.1.sol-0.8.14-compact.json new file mode 100644 index 000000000..a1a35e654 --- /dev/null +++ b/tests/ast-parsing/expected/top-level-import-0.7.1.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top-level-import-0.7.1.sol-0.8.15-compact.json b/tests/ast-parsing/expected/top-level-import-0.7.1.sol-0.8.15-compact.json new file mode 100644 index 000000000..a1a35e654 --- /dev/null +++ b/tests/ast-parsing/expected/top-level-import-0.7.1.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top-level-import-bis-0.7.1.sol-0.8.13-compact.json b/tests/ast-parsing/expected/top-level-import-bis-0.7.1.sol-0.8.13-compact.json new file mode 100644 index 000000000..a1a35e654 --- /dev/null +++ b/tests/ast-parsing/expected/top-level-import-bis-0.7.1.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top-level-import-bis-0.7.1.sol-0.8.14-compact.json b/tests/ast-parsing/expected/top-level-import-bis-0.7.1.sol-0.8.14-compact.json new file mode 100644 index 000000000..a1a35e654 --- /dev/null +++ b/tests/ast-parsing/expected/top-level-import-bis-0.7.1.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top-level-import-bis-0.7.1.sol-0.8.15-compact.json b/tests/ast-parsing/expected/top-level-import-bis-0.7.1.sol-0.8.15-compact.json new file mode 100644 index 000000000..a1a35e654 --- /dev/null +++ b/tests/ast-parsing/expected/top-level-import-bis-0.7.1.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top-level-nested-import-0.7.1.sol-0.8.13-compact.json b/tests/ast-parsing/expected/top-level-nested-import-0.7.1.sol-0.8.13-compact.json new file mode 100644 index 000000000..a1a35e654 --- /dev/null +++ b/tests/ast-parsing/expected/top-level-nested-import-0.7.1.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top-level-nested-import-0.7.1.sol-0.8.14-compact.json b/tests/ast-parsing/expected/top-level-nested-import-0.7.1.sol-0.8.14-compact.json new file mode 100644 index 000000000..a1a35e654 --- /dev/null +++ b/tests/ast-parsing/expected/top-level-nested-import-0.7.1.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top-level-nested-import-0.7.1.sol-0.8.15-compact.json b/tests/ast-parsing/expected/top-level-nested-import-0.7.1.sol-0.8.15-compact.json new file mode 100644 index 000000000..a1a35e654 --- /dev/null +++ b/tests/ast-parsing/expected/top-level-nested-import-0.7.1.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top_level_variable-0.8.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/top_level_variable-0.8.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..35c752376 --- /dev/null +++ b/tests/ast-parsing/expected/top_level_variable-0.8.0.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "T": { + "g()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top_level_variable-0.8.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/top_level_variable-0.8.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..35c752376 --- /dev/null +++ b/tests/ast-parsing/expected/top_level_variable-0.8.0.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "T": { + "g()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top_level_variable-0.8.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/top_level_variable-0.8.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..35c752376 --- /dev/null +++ b/tests/ast-parsing/expected/top_level_variable-0.8.0.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "T": { + "g()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top_level_variable2-0.8.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/top_level_variable2-0.8.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..503a5cebd --- /dev/null +++ b/tests/ast-parsing/expected/top_level_variable2-0.8.0.sol-0.8.13-compact.json @@ -0,0 +1,8 @@ +{ + "T": { + "g()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + }, + "T2": { + "h(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top_level_variable2-0.8.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/top_level_variable2-0.8.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..503a5cebd --- /dev/null +++ b/tests/ast-parsing/expected/top_level_variable2-0.8.0.sol-0.8.14-compact.json @@ -0,0 +1,8 @@ +{ + "T": { + "g()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + }, + "T2": { + "h(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/top_level_variable2-0.8.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/top_level_variable2-0.8.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..503a5cebd --- /dev/null +++ b/tests/ast-parsing/expected/top_level_variable2-0.8.0.sol-0.8.15-compact.json @@ -0,0 +1,8 @@ +{ + "T": { + "g()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + }, + "T2": { + "h(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/trycatch-0.6.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/trycatch-0.6.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..6099f6be4 --- /dev/null +++ b/tests/ast-parsing/expected/trycatch-0.6.0.sol-0.8.13-compact.json @@ -0,0 +1,9 @@ +{ + "ERC20": { + "balanceOf(address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "C": { + "tryCatchFunctionCall()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: TRY 2\n\"];\n2->3;\n2->5;\n2->7;\n3[label=\"Node Type: CATCH 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->7;\n5[label=\"Node Type: CATCH 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: TRY 7\n\"];\n7->8;\n7->10;\n7->12;\n8[label=\"Node Type: CATCH 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->12;\n10[label=\"Node Type: CATCH 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: TRY 12\n\"];\n12->13;\n12->15;\n12->17;\n12->19;\n13[label=\"Node Type: CATCH 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->19;\n15[label=\"Node Type: CATCH 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->19;\n17[label=\"Node Type: CATCH 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n18->19;\n19[label=\"Node Type: TRY 19\n\"];\n19->20;\n19->21;\n20[label=\"Node Type: CATCH 20\n\"];\n21[label=\"Node Type: CATCH 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n}\n", + "tryCatchContractDeployment()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: TRY 1\n\"];\n1->2;\n1->6;\n2[label=\"Node Type: CATCH 2\n\"];\n2->3;\n3[label=\"Node Type: TRY 3\n\"];\n3->4;\n3->5;\n4[label=\"Node Type: CATCH 4\n\"];\n5[label=\"Node Type: CATCH 5\n\"];\n6[label=\"Node Type: CATCH 6\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/trycatch-0.6.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/trycatch-0.6.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..6099f6be4 --- /dev/null +++ b/tests/ast-parsing/expected/trycatch-0.6.0.sol-0.8.14-compact.json @@ -0,0 +1,9 @@ +{ + "ERC20": { + "balanceOf(address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "C": { + "tryCatchFunctionCall()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: TRY 2\n\"];\n2->3;\n2->5;\n2->7;\n3[label=\"Node Type: CATCH 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->7;\n5[label=\"Node Type: CATCH 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: TRY 7\n\"];\n7->8;\n7->10;\n7->12;\n8[label=\"Node Type: CATCH 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->12;\n10[label=\"Node Type: CATCH 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: TRY 12\n\"];\n12->13;\n12->15;\n12->17;\n12->19;\n13[label=\"Node Type: CATCH 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->19;\n15[label=\"Node Type: CATCH 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->19;\n17[label=\"Node Type: CATCH 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n18->19;\n19[label=\"Node Type: TRY 19\n\"];\n19->20;\n19->21;\n20[label=\"Node Type: CATCH 20\n\"];\n21[label=\"Node Type: CATCH 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n}\n", + "tryCatchContractDeployment()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: TRY 1\n\"];\n1->2;\n1->6;\n2[label=\"Node Type: CATCH 2\n\"];\n2->3;\n3[label=\"Node Type: TRY 3\n\"];\n3->4;\n3->5;\n4[label=\"Node Type: CATCH 4\n\"];\n5[label=\"Node Type: CATCH 5\n\"];\n6[label=\"Node Type: CATCH 6\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/trycatch-0.6.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/trycatch-0.6.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..6099f6be4 --- /dev/null +++ b/tests/ast-parsing/expected/trycatch-0.6.0.sol-0.8.15-compact.json @@ -0,0 +1,9 @@ +{ + "ERC20": { + "balanceOf(address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "C": { + "tryCatchFunctionCall()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: TRY 2\n\"];\n2->3;\n2->5;\n2->7;\n3[label=\"Node Type: CATCH 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->7;\n5[label=\"Node Type: CATCH 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: TRY 7\n\"];\n7->8;\n7->10;\n7->12;\n8[label=\"Node Type: CATCH 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->12;\n10[label=\"Node Type: CATCH 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: TRY 12\n\"];\n12->13;\n12->15;\n12->17;\n12->19;\n13[label=\"Node Type: CATCH 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->19;\n15[label=\"Node Type: CATCH 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->19;\n17[label=\"Node Type: CATCH 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n18->19;\n19[label=\"Node Type: TRY 19\n\"];\n19->20;\n19->21;\n20[label=\"Node Type: CATCH 20\n\"];\n21[label=\"Node Type: CATCH 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n}\n", + "tryCatchContractDeployment()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: TRY 1\n\"];\n1->2;\n1->6;\n2[label=\"Node Type: CATCH 2\n\"];\n2->3;\n3[label=\"Node Type: TRY 3\n\"];\n3->4;\n3->5;\n4[label=\"Node Type: CATCH 4\n\"];\n5[label=\"Node Type: CATCH 5\n\"];\n6[label=\"Node Type: CATCH 6\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/tupleexpression-0.5.3.sol-0.8.13-compact.json b/tests/ast-parsing/expected/tupleexpression-0.5.3.sol-0.8.13-compact.json new file mode 100644 index 000000000..b5912e6b8 --- /dev/null +++ b/tests/ast-parsing/expected/tupleexpression-0.5.3.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/tupleexpression-0.5.3.sol-0.8.14-compact.json b/tests/ast-parsing/expected/tupleexpression-0.5.3.sol-0.8.14-compact.json new file mode 100644 index 000000000..b5912e6b8 --- /dev/null +++ b/tests/ast-parsing/expected/tupleexpression-0.5.3.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/tupleexpression-0.5.3.sol-0.8.15-compact.json b/tests/ast-parsing/expected/tupleexpression-0.5.3.sol-0.8.15-compact.json new file mode 100644 index 000000000..b5912e6b8 --- /dev/null +++ b/tests/ast-parsing/expected/tupleexpression-0.5.3.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/unaryexpression-0.5.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/unaryexpression-0.5.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..f7fcf9203 --- /dev/null +++ b/tests/ast-parsing/expected/unaryexpression-0.5.0.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/unaryexpression-0.5.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/unaryexpression-0.5.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..f7fcf9203 --- /dev/null +++ b/tests/ast-parsing/expected/unaryexpression-0.5.0.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/unaryexpression-0.5.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/unaryexpression-0.5.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..f7fcf9203 --- /dev/null +++ b/tests/ast-parsing/expected/unaryexpression-0.5.0.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/unchecked-0.8.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/unchecked-0.8.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..557c3d932 --- /dev/null +++ b/tests/ast-parsing/expected/unchecked-0.8.0.sol-0.8.13-compact.json @@ -0,0 +1,6 @@ +{ + "C": { + "f(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "g(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/unchecked-0.8.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/unchecked-0.8.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..557c3d932 --- /dev/null +++ b/tests/ast-parsing/expected/unchecked-0.8.0.sol-0.8.14-compact.json @@ -0,0 +1,6 @@ +{ + "C": { + "f(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "g(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/unchecked-0.8.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/unchecked-0.8.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..557c3d932 --- /dev/null +++ b/tests/ast-parsing/expected/unchecked-0.8.0.sol-0.8.15-compact.json @@ -0,0 +1,6 @@ +{ + "C": { + "f(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "g(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/units_and_global_variables-0.8.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/units_and_global_variables-0.8.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..74226bae7 --- /dev/null +++ b/tests/ast-parsing/expected/units_and_global_variables-0.8.0.sol-0.8.13-compact.json @@ -0,0 +1,17 @@ +{ + "A": {}, + "I": {}, + "Test": { + "ether_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", + "time_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n", + "block_and_transactions()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n}\n", + "abi_encode()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n}\n", + "error_handling()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n", + "math_and_crypto()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n", + "address_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n", + "return_addr()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "address_edge_case()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", + "contract_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", + "type_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/units_and_global_variables-0.8.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/units_and_global_variables-0.8.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..74226bae7 --- /dev/null +++ b/tests/ast-parsing/expected/units_and_global_variables-0.8.0.sol-0.8.14-compact.json @@ -0,0 +1,17 @@ +{ + "A": {}, + "I": {}, + "Test": { + "ether_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", + "time_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n", + "block_and_transactions()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n}\n", + "abi_encode()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n}\n", + "error_handling()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n", + "math_and_crypto()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n", + "address_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n", + "return_addr()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "address_edge_case()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", + "contract_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", + "type_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/units_and_global_variables-0.8.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/units_and_global_variables-0.8.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..74226bae7 --- /dev/null +++ b/tests/ast-parsing/expected/units_and_global_variables-0.8.0.sol-0.8.15-compact.json @@ -0,0 +1,17 @@ +{ + "A": {}, + "I": {}, + "Test": { + "ether_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", + "time_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n", + "block_and_transactions()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n}\n", + "abi_encode()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n}\n", + "error_handling()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n", + "math_and_crypto()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n", + "address_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n", + "return_addr()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "address_edge_case()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", + "contract_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", + "type_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/using-for-0.4.1.sol-0.8.13-compact.json b/tests/ast-parsing/expected/using-for-0.4.1.sol-0.8.13-compact.json new file mode 100644 index 000000000..27fa7c323 --- /dev/null +++ b/tests/ast-parsing/expected/using-for-0.4.1.sol-0.8.13-compact.json @@ -0,0 +1,9 @@ +{ + "L1": { + "f(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "L2": { + "f(bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/using-for-0.4.1.sol-0.8.14-compact.json b/tests/ast-parsing/expected/using-for-0.4.1.sol-0.8.14-compact.json new file mode 100644 index 000000000..27fa7c323 --- /dev/null +++ b/tests/ast-parsing/expected/using-for-0.4.1.sol-0.8.14-compact.json @@ -0,0 +1,9 @@ +{ + "L1": { + "f(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "L2": { + "f(bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/using-for-0.4.1.sol-0.8.15-compact.json b/tests/ast-parsing/expected/using-for-0.4.1.sol-0.8.15-compact.json new file mode 100644 index 000000000..27fa7c323 --- /dev/null +++ b/tests/ast-parsing/expected/using-for-0.4.1.sol-0.8.15-compact.json @@ -0,0 +1,9 @@ +{ + "L1": { + "f(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "L2": { + "f(bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/variable-0.8.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/variable-0.8.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..97689fda1 --- /dev/null +++ b/tests/ast-parsing/expected/variable-0.8.0.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n16->17;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->18;\n18[label=\"Node Type: NEW VARIABLE 18\n\"];\n18->19;\n19[label=\"Node Type: NEW VARIABLE 19\n\"];\n19->20;\n20[label=\"Node Type: NEW VARIABLE 20\n\"];\n20->21;\n21[label=\"Node Type: NEW VARIABLE 21\n\"];\n21->22;\n22[label=\"Node Type: NEW VARIABLE 22\n\"];\n22->23;\n23[label=\"Node Type: NEW VARIABLE 23\n\"];\n23->24;\n24[label=\"Node Type: NEW VARIABLE 24\n\"];\n24->25;\n25[label=\"Node Type: NEW VARIABLE 25\n\"];\n25->26;\n26[label=\"Node Type: NEW VARIABLE 26\n\"];\n26->27;\n27[label=\"Node Type: NEW VARIABLE 27\n\"];\n27->28;\n28[label=\"Node Type: NEW VARIABLE 28\n\"];\n28->29;\n29[label=\"Node Type: NEW VARIABLE 29\n\"];\n29->30;\n30[label=\"Node Type: NEW VARIABLE 30\n\"];\n30->31;\n31[label=\"Node Type: NEW VARIABLE 31\n\"];\n31->32;\n32[label=\"Node Type: NEW VARIABLE 32\n\"];\n32->33;\n33[label=\"Node Type: NEW VARIABLE 33\n\"];\n33->34;\n34[label=\"Node Type: NEW VARIABLE 34\n\"];\n34->35;\n35[label=\"Node Type: NEW VARIABLE 35\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/variable-0.8.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/variable-0.8.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..97689fda1 --- /dev/null +++ b/tests/ast-parsing/expected/variable-0.8.0.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n16->17;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->18;\n18[label=\"Node Type: NEW VARIABLE 18\n\"];\n18->19;\n19[label=\"Node Type: NEW VARIABLE 19\n\"];\n19->20;\n20[label=\"Node Type: NEW VARIABLE 20\n\"];\n20->21;\n21[label=\"Node Type: NEW VARIABLE 21\n\"];\n21->22;\n22[label=\"Node Type: NEW VARIABLE 22\n\"];\n22->23;\n23[label=\"Node Type: NEW VARIABLE 23\n\"];\n23->24;\n24[label=\"Node Type: NEW VARIABLE 24\n\"];\n24->25;\n25[label=\"Node Type: NEW VARIABLE 25\n\"];\n25->26;\n26[label=\"Node Type: NEW VARIABLE 26\n\"];\n26->27;\n27[label=\"Node Type: NEW VARIABLE 27\n\"];\n27->28;\n28[label=\"Node Type: NEW VARIABLE 28\n\"];\n28->29;\n29[label=\"Node Type: NEW VARIABLE 29\n\"];\n29->30;\n30[label=\"Node Type: NEW VARIABLE 30\n\"];\n30->31;\n31[label=\"Node Type: NEW VARIABLE 31\n\"];\n31->32;\n32[label=\"Node Type: NEW VARIABLE 32\n\"];\n32->33;\n33[label=\"Node Type: NEW VARIABLE 33\n\"];\n33->34;\n34[label=\"Node Type: NEW VARIABLE 34\n\"];\n34->35;\n35[label=\"Node Type: NEW VARIABLE 35\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/variable-0.8.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/variable-0.8.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..97689fda1 --- /dev/null +++ b/tests/ast-parsing/expected/variable-0.8.0.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n16->17;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->18;\n18[label=\"Node Type: NEW VARIABLE 18\n\"];\n18->19;\n19[label=\"Node Type: NEW VARIABLE 19\n\"];\n19->20;\n20[label=\"Node Type: NEW VARIABLE 20\n\"];\n20->21;\n21[label=\"Node Type: NEW VARIABLE 21\n\"];\n21->22;\n22[label=\"Node Type: NEW VARIABLE 22\n\"];\n22->23;\n23[label=\"Node Type: NEW VARIABLE 23\n\"];\n23->24;\n24[label=\"Node Type: NEW VARIABLE 24\n\"];\n24->25;\n25[label=\"Node Type: NEW VARIABLE 25\n\"];\n25->26;\n26[label=\"Node Type: NEW VARIABLE 26\n\"];\n26->27;\n27[label=\"Node Type: NEW VARIABLE 27\n\"];\n27->28;\n28[label=\"Node Type: NEW VARIABLE 28\n\"];\n28->29;\n29[label=\"Node Type: NEW VARIABLE 29\n\"];\n29->30;\n30[label=\"Node Type: NEW VARIABLE 30\n\"];\n30->31;\n31[label=\"Node Type: NEW VARIABLE 31\n\"];\n31->32;\n32[label=\"Node Type: NEW VARIABLE 32\n\"];\n32->33;\n33[label=\"Node Type: NEW VARIABLE 33\n\"];\n33->34;\n34[label=\"Node Type: NEW VARIABLE 34\n\"];\n34->35;\n35[label=\"Node Type: NEW VARIABLE 35\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/variabledeclaration-0.5.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/variabledeclaration-0.5.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..f9182c607 --- /dev/null +++ b/tests/ast-parsing/expected/variabledeclaration-0.5.0.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->12;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n12[label=\"Node Type: IF 12\n\"];\n12->13[label=\"True\"];\n12->14[label=\"False\"];\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->15;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: END_IF 15\n\"];\n15->10;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/variabledeclaration-0.5.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/variabledeclaration-0.5.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..f9182c607 --- /dev/null +++ b/tests/ast-parsing/expected/variabledeclaration-0.5.0.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->12;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n12[label=\"Node Type: IF 12\n\"];\n12->13[label=\"True\"];\n12->14[label=\"False\"];\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->15;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: END_IF 15\n\"];\n15->10;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/variabledeclaration-0.5.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/variabledeclaration-0.5.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..f9182c607 --- /dev/null +++ b/tests/ast-parsing/expected/variabledeclaration-0.5.0.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->12;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n12[label=\"Node Type: IF 12\n\"];\n12->13[label=\"True\"];\n12->14[label=\"False\"];\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->15;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: END_IF 15\n\"];\n15->10;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/while-all.sol-0.8.13-compact.json b/tests/ast-parsing/expected/while-all.sol-0.8.13-compact.json new file mode 100644 index 000000000..4d9657391 --- /dev/null +++ b/tests/ast-parsing/expected/while-all.sol-0.8.13-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->8;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/while-all.sol-0.8.14-compact.json b/tests/ast-parsing/expected/while-all.sol-0.8.14-compact.json new file mode 100644 index 000000000..4d9657391 --- /dev/null +++ b/tests/ast-parsing/expected/while-all.sol-0.8.14-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->8;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/while-all.sol-0.8.15-compact.json b/tests/ast-parsing/expected/while-all.sol-0.8.15-compact.json new file mode 100644 index 000000000..4d9657391 --- /dev/null +++ b/tests/ast-parsing/expected/while-all.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->8;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/yul-0.8.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/yul-0.8.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..c7716d2db --- /dev/null +++ b/tests/ast-parsing/expected/yul-0.8.0.sol-0.8.13-compact.json @@ -0,0 +1,7 @@ +{ + "L": {}, + "C": { + "f(uint256,uint256[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: INLINE ASM 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: NEW VARIABLE 18\n\"];\n18->19;\n19[label=\"Node Type: EXPRESSION 19\n\"];\n19->20;\n20[label=\"Node Type: NEW VARIABLE 20\n\"];\n20->21;\n21[label=\"Node Type: EXPRESSION 21\n\"];\n21->22;\n22[label=\"Node Type: NEW VARIABLE 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->24;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->25;\n25[label=\"Node Type: EXPRESSION 25\n\"];\n25->26;\n26[label=\"Node Type: EXPRESSION 26\n\"];\n26->27;\n27[label=\"Node Type: EXPRESSION 27\n\"];\n27->28;\n28[label=\"Node Type: NEW VARIABLE 28\n\"];\n28->29;\n29[label=\"Node Type: EXPRESSION 29\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/yul-0.8.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/yul-0.8.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..c7716d2db --- /dev/null +++ b/tests/ast-parsing/expected/yul-0.8.0.sol-0.8.14-compact.json @@ -0,0 +1,7 @@ +{ + "L": {}, + "C": { + "f(uint256,uint256[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: INLINE ASM 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: NEW VARIABLE 18\n\"];\n18->19;\n19[label=\"Node Type: EXPRESSION 19\n\"];\n19->20;\n20[label=\"Node Type: NEW VARIABLE 20\n\"];\n20->21;\n21[label=\"Node Type: EXPRESSION 21\n\"];\n21->22;\n22[label=\"Node Type: NEW VARIABLE 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->24;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->25;\n25[label=\"Node Type: EXPRESSION 25\n\"];\n25->26;\n26[label=\"Node Type: EXPRESSION 26\n\"];\n26->27;\n27[label=\"Node Type: EXPRESSION 27\n\"];\n27->28;\n28[label=\"Node Type: NEW VARIABLE 28\n\"];\n28->29;\n29[label=\"Node Type: EXPRESSION 29\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/yul-0.8.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/yul-0.8.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..c7716d2db --- /dev/null +++ b/tests/ast-parsing/expected/yul-0.8.0.sol-0.8.15-compact.json @@ -0,0 +1,7 @@ +{ + "L": {}, + "C": { + "f(uint256,uint256[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: INLINE ASM 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: NEW VARIABLE 18\n\"];\n18->19;\n19[label=\"Node Type: EXPRESSION 19\n\"];\n19->20;\n20[label=\"Node Type: NEW VARIABLE 20\n\"];\n20->21;\n21[label=\"Node Type: EXPRESSION 21\n\"];\n21->22;\n22[label=\"Node Type: NEW VARIABLE 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->24;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->25;\n25[label=\"Node Type: EXPRESSION 25\n\"];\n25->26;\n26[label=\"Node Type: EXPRESSION 26\n\"];\n26->27;\n27[label=\"Node Type: EXPRESSION 27\n\"];\n27->28;\n28[label=\"Node Type: NEW VARIABLE 28\n\"];\n28->29;\n29[label=\"Node Type: EXPRESSION 29\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/test_ast_parsing.py b/tests/test_ast_parsing.py index eafe6a2f3..c255f06c3 100644 --- a/tests/test_ast_parsing.py +++ b/tests/test_ast_parsing.py @@ -60,7 +60,7 @@ VERSIONS_04 = make_version(4, 0, 26) VERSIONS_05 = make_version(5, 0, 17) VERSIONS_06 = make_version(6, 0, 12) VERSIONS_07 = make_version(7, 0, 6) -VERSIONS_08 = make_version(8, 0, 12) +VERSIONS_08 = make_version(8, 0, 15) ALL_VERSIONS = VERSIONS_04 + VERSIONS_05 + VERSIONS_06 + VERSIONS_07 + VERSIONS_08 From 77551209d2f3307219e2d09175c3b9185a237522 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 6 Jul 2022 15:08:16 -0500 Subject: [PATCH 066/101] convert .call() member of address type alias to low level call --- slither/slithir/convert.py | 8 +++++++- .../{calldata.sol => calldata-0.8.9.sol} | 3 ++- 2 files changed, 9 insertions(+), 2 deletions(-) rename tests/ast-parsing/user_defined_value_type/{calldata.sol => calldata-0.8.9.sol} (97%) diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index 663d96abe..35fc8e11a 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -33,6 +33,7 @@ from slither.core.solidity_types.elementary_type import ( MaxValues, ) from slither.core.solidity_types.type import Type +from slither.core.solidity_types.type_alias import TypeAlias from slither.core.variables.function_type_variable import FunctionTypeVariable from slither.core.variables.state_variable import StateVariable from slither.core.variables.variable import Variable @@ -428,6 +429,9 @@ def propagate_type_and_convert_call(result, node): continue new_ins = propagate_types(ins, node) + # Validate that type was propagated + if isinstance(new_ins, OperationWithLValue): + assert new_ins.lvalue.type if new_ins: if isinstance(new_ins, (list,)): for new_ins_ in new_ins: @@ -531,7 +535,9 @@ def propagate_types(ir, node: "Node"): # pylint: disable=too-many-locals return convert_type_of_high_and_internal_level_call(ir, contract) # Convert HighLevelCall to LowLevelCall - if isinstance(t, ElementaryType) and t.name == "address": + if (isinstance(t, ElementaryType) and t.name == "address") or ( + isinstance(t, TypeAlias) and t.underlying_type.name == "address" + ): # Cannot be a top level function with this. assert isinstance(node_function, FunctionContract) if ir.destination.name == "this": diff --git a/tests/ast-parsing/user_defined_value_type/calldata.sol b/tests/ast-parsing/user_defined_value_type/calldata-0.8.9.sol similarity index 97% rename from tests/ast-parsing/user_defined_value_type/calldata.sol rename to tests/ast-parsing/user_defined_value_type/calldata-0.8.9.sol index feb2d8ac3..b69e2e0d6 100644 --- a/tests/ast-parsing/user_defined_value_type/calldata.sol +++ b/tests/ast-parsing/user_defined_value_type/calldata-0.8.9.sol @@ -1,3 +1,4 @@ +pragma solidity ^0.8.9; pragma abicoder v2; type MyAddress is address; @@ -21,7 +22,7 @@ contract C { test[0] = MyAddress.wrap(address(21)); test[1] = MyAddress.wrap(address(22)); test[2] = MyAddress.wrap(address(23)); - this.f(test); + // this.f(test); test_equality(test); return true; } From ee82e1016420d80b68195988fc4a31f164bfd9d8 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 6 Jul 2022 17:29:16 -0500 Subject: [PATCH 067/101] fix argument propagation for .unwrap --- slither/slithir/convert.py | 14 +++++++++++--- .../{argument.sol => argument-0.8.9.sol} | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) rename tests/ast-parsing/user_defined_value_type/{argument.sol => argument-0.8.9.sol} (86%) diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index 35fc8e11a..ef5cacc16 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -400,6 +400,13 @@ def propagate_type_and_convert_call(result, node): ins = new_ins result[idx] = ins + # If there's two consecutive type conversions, keep only the last + # ARG_CALL x call_data = [x] + # TMP_4 = CONVERT x to Fix call_data = [] + # TMP_5 = CONVERT TMP_4 to uint192 call_data = [TMP_5] + if isinstance(ins, TypeConversion) and ins.variable in call_data: + call_data.remove(ins.variable) + if isinstance(ins, Argument): # In case of dupplicate arguments we overwrite the value # This can happen because of addr.call.value(1).value(2) @@ -429,10 +436,10 @@ def propagate_type_and_convert_call(result, node): continue new_ins = propagate_types(ins, node) - # Validate that type was propagated - if isinstance(new_ins, OperationWithLValue): - assert new_ins.lvalue.type if new_ins: + # Validate that type was propagated + if isinstance(new_ins, OperationWithLValue): + assert new_ins.lvalue.type if isinstance(new_ins, (list,)): for new_ins_ in new_ins: new_ins_.set_node(ins.node) @@ -1682,6 +1689,7 @@ def convert_constant_types(irs): # TODO: add POP instruction break types = [p.type for p in func.parameters] + assert len(types) == len(ir.arguments) for idx, arg in enumerate(ir.arguments): t = types[idx] if isinstance(t, ElementaryType): diff --git a/tests/ast-parsing/user_defined_value_type/argument.sol b/tests/ast-parsing/user_defined_value_type/argument-0.8.9.sol similarity index 86% rename from tests/ast-parsing/user_defined_value_type/argument.sol rename to tests/ast-parsing/user_defined_value_type/argument-0.8.9.sol index 7bdc7d560..55fe237e1 100644 --- a/tests/ast-parsing/user_defined_value_type/argument.sol +++ b/tests/ast-parsing/user_defined_value_type/argument-0.8.9.sol @@ -11,7 +11,7 @@ contract FixLib { uint256 y = uint192(Fix.unwrap(x)); return div(y, 1e18); } - function broken(Fix x) external pure returns (uint256) { + function test(Fix x) external pure returns (uint256) { return div(uint192(Fix.unwrap(x)), 1e18); } } From 378f5373f33334a0bc5d917cc9f6b8538244edd1 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 6 Jul 2022 17:44:16 -0500 Subject: [PATCH 068/101] remove invalid assertion --- slither/slithir/convert.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index ef5cacc16..2d5f7ad35 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -437,9 +437,6 @@ def propagate_type_and_convert_call(result, node): new_ins = propagate_types(ins, node) if new_ins: - # Validate that type was propagated - if isinstance(new_ins, OperationWithLValue): - assert new_ins.lvalue.type if isinstance(new_ins, (list,)): for new_ins_ in new_ins: new_ins_.set_node(ins.node) From 57cbafa51dd87190e2eec16e150a631c5bae69e7 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 6 Jul 2022 18:20:32 -0500 Subject: [PATCH 069/101] handle constant conversionn of type alias --- slither/slithir/convert.py | 5 ++++- .../{constant.sol => constant-0.8.9.sol} | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) rename tests/ast-parsing/user_defined_value_type/{constant.sol => constant-0.8.9.sol} (88%) diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index 2d5f7ad35..0e2311f69 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -1667,7 +1667,10 @@ def convert_constant_types(irs): if isinstance(ir.rvalue, TupleVariable): # TODO: fix missing Unpack conversion continue - if ir.rvalue.type.type not in ElementaryTypeInt: + if isinstance(ir.rvalue.type, TypeAlias): + ir.rvalue.set_type(ElementaryType(ir.lvalue.type.name)) + was_changed = True + elif ir.rvalue.type.type not in ElementaryTypeInt: ir.rvalue.set_type(ElementaryType(ir.lvalue.type.type)) was_changed = True if isinstance(ir, Binary): diff --git a/tests/ast-parsing/user_defined_value_type/constant.sol b/tests/ast-parsing/user_defined_value_type/constant-0.8.9.sol similarity index 88% rename from tests/ast-parsing/user_defined_value_type/constant.sol rename to tests/ast-parsing/user_defined_value_type/constant-0.8.9.sol index 0cab2a6f3..70b395441 100644 --- a/tests/ast-parsing/user_defined_value_type/constant.sol +++ b/tests/ast-parsing/user_defined_value_type/constant-0.8.9.sol @@ -1,5 +1,5 @@ type T is int224; -pragma solidity >= 0.8.12; +pragma solidity ^0.8.9; contract C { T constant public s = T.wrap(int224(165521356710917456517261742455526507355687727119203895813322792776)); T constant public t = s; From b6e17811f9e6d9ac359c97f548eb8d6e0a55d072 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 6 Jul 2022 18:41:45 -0500 Subject: [PATCH 070/101] add tests and artifacts --- .../user_defined_types.sol-0.8.10-compact.zip | Bin 3215 -> 0 bytes .../user_defined_types.sol-0.8.11-compact.zip | Bin 3215 -> 0 bytes .../user_defined_types.sol-0.8.12-compact.zip | Bin 3217 -> 0 bytes .../user_defined_types.sol-0.8.8-compact.zip | Bin 3180 -> 0 bytes .../argument-0.8.8.sol-0.8.10-compact.zip | Bin 0 -> 3576 bytes .../argument-0.8.8.sol-0.8.11-compact.zip | Bin 0 -> 3578 bytes .../argument-0.8.8.sol-0.8.12-compact.zip | Bin 0 -> 3581 bytes .../argument-0.8.8.sol-0.8.13-compact.zip | Bin 0 -> 3575 bytes .../argument-0.8.8.sol-0.8.14-compact.zip | Bin 0 -> 3572 bytes .../argument-0.8.8.sol-0.8.15-compact.zip | Bin 0 -> 3578 bytes .../argument-0.8.8.sol-0.8.8-compact.zip | Bin 0 -> 3566 bytes .../calldata-0.8.8.sol-0.8.10-compact.zip | Bin 0 -> 9648 bytes .../calldata-0.8.8.sol-0.8.11-compact.zip | Bin 0 -> 9661 bytes .../calldata-0.8.8.sol-0.8.12-compact.zip | Bin 0 -> 9662 bytes .../calldata-0.8.8.sol-0.8.13-compact.zip | Bin 0 -> 9661 bytes .../calldata-0.8.8.sol-0.8.14-compact.zip | Bin 0 -> 9632 bytes .../calldata-0.8.8.sol-0.8.15-compact.zip | Bin 0 -> 9666 bytes .../calldata-0.8.8.sol-0.8.8-compact.zip | Bin 0 -> 9489 bytes .../constant-0.8.8.sol-0.8.10-compact.zip | Bin 0 -> 2428 bytes .../constant-0.8.8.sol-0.8.11-compact.zip | Bin 0 -> 2429 bytes .../constant-0.8.8.sol-0.8.12-compact.zip | Bin 0 -> 2431 bytes .../constant-0.8.8.sol-0.8.13-compact.zip | Bin 0 -> 2430 bytes .../constant-0.8.8.sol-0.8.14-compact.zip | Bin 0 -> 2432 bytes .../constant-0.8.8.sol-0.8.15-compact.zip | Bin 0 -> 2432 bytes .../constant-0.8.8.sol-0.8.8-compact.zip | Bin 0 -> 2413 bytes .../erc20-0.8.8.sol-0.8.10-compact.zip | Bin 0 -> 12287 bytes .../erc20-0.8.8.sol-0.8.11-compact.zip | Bin 0 -> 12318 bytes .../erc20-0.8.8.sol-0.8.12-compact.zip | Bin 0 -> 12317 bytes .../erc20-0.8.8.sol-0.8.13-compact.zip | Bin 0 -> 12308 bytes .../erc20-0.8.8.sol-0.8.14-compact.zip | Bin 0 -> 12318 bytes .../erc20-0.8.8.sol-0.8.15-compact.zip | Bin 0 -> 12314 bytes .../erc20-0.8.8.sol-0.8.8-compact.zip | Bin 0 -> 12316 bytes ...n_parenthesis-0.8.8.sol-0.8.10-compact.zip | Bin 0 -> 5969 bytes ...n_parenthesis-0.8.8.sol-0.8.11-compact.zip | Bin 0 -> 5964 bytes ...n_parenthesis-0.8.8.sol-0.8.12-compact.zip | Bin 0 -> 5972 bytes ...n_parenthesis-0.8.8.sol-0.8.13-compact.zip | Bin 0 -> 5977 bytes ...n_parenthesis-0.8.8.sol-0.8.14-compact.zip | Bin 0 -> 5981 bytes ...n_parenthesis-0.8.8.sol-0.8.15-compact.zip | Bin 0 -> 5969 bytes ...in_parenthesis-0.8.8.sol-0.8.8-compact.zip | Bin 0 -> 5936 bytes ...defined_types-0.8.8.sol-0.8.10-compact.zip | Bin 0 -> 3244 bytes ...defined_types-0.8.8.sol-0.8.11-compact.zip | Bin 0 -> 3245 bytes ...defined_types-0.8.8.sol-0.8.12-compact.zip | Bin 0 -> 3243 bytes ...defined_types-0.8.8.sol-0.8.13-compact.zip | Bin 0 -> 3246 bytes ...defined_types-0.8.8.sol-0.8.14-compact.zip | Bin 0 -> 3243 bytes ...defined_types-0.8.8.sol-0.8.15-compact.zip | Bin 0 -> 3245 bytes ..._defined_types-0.8.8.sol-0.8.8-compact.zip | Bin 0 -> 3216 bytes .../argument-0.8.8.sol-0.8.10-compact.json | 7 +++ .../argument-0.8.8.sol-0.8.11-compact.json | 7 +++ .../argument-0.8.8.sol-0.8.12-compact.json | 7 +++ .../argument-0.8.8.sol-0.8.13-compact.json | 7 +++ .../argument-0.8.8.sol-0.8.14-compact.json | 7 +++ .../argument-0.8.8.sol-0.8.15-compact.json | 7 +++ .../argument-0.8.8.sol-0.8.8-compact.json | 7 +++ .../calldata-0.8.8.sol-0.8.10-compact.json | 10 ++++ .../calldata-0.8.8.sol-0.8.11-compact.json | 10 ++++ .../calldata-0.8.8.sol-0.8.12-compact.json | 10 ++++ .../calldata-0.8.8.sol-0.8.13-compact.json | 10 ++++ .../calldata-0.8.8.sol-0.8.14-compact.json | 10 ++++ .../calldata-0.8.8.sol-0.8.15-compact.json | 10 ++++ .../calldata-0.8.8.sol-0.8.8-compact.json | 10 ++++ .../constant-0.8.8.sol-0.8.10-compact.json | 3 ++ .../constant-0.8.8.sol-0.8.11-compact.json | 3 ++ .../constant-0.8.8.sol-0.8.12-compact.json | 3 ++ .../constant-0.8.8.sol-0.8.13-compact.json | 3 ++ .../constant-0.8.8.sol-0.8.14-compact.json | 3 ++ .../constant-0.8.8.sol-0.8.15-compact.json | 3 ++ .../constant-0.8.8.sol-0.8.8-compact.json | 3 ++ .../erc20-0.8.8.sol-0.8.10-compact.json | 22 ++++++++ .../erc20-0.8.8.sol-0.8.11-compact.json | 22 ++++++++ .../erc20-0.8.8.sol-0.8.12-compact.json | 22 ++++++++ .../erc20-0.8.8.sol-0.8.13-compact.json | 22 ++++++++ .../erc20-0.8.8.sol-0.8.14-compact.json | 22 ++++++++ .../erc20-0.8.8.sol-0.8.15-compact.json | 22 ++++++++ .../erc20-0.8.8.sol-0.8.8-compact.json | 22 ++++++++ ..._parenthesis-0.8.8.sol-0.8.10-compact.json | 14 +++++ ..._parenthesis-0.8.8.sol-0.8.11-compact.json | 14 +++++ ..._parenthesis-0.8.8.sol-0.8.12-compact.json | 14 +++++ ..._parenthesis-0.8.8.sol-0.8.13-compact.json | 14 +++++ ..._parenthesis-0.8.8.sol-0.8.14-compact.json | 14 +++++ ..._parenthesis-0.8.8.sol-0.8.15-compact.json | 14 +++++ ...n_parenthesis-0.8.8.sol-0.8.8-compact.json | 14 +++++ ...efined_types-0.8.8.sol-0.8.10-compact.json | 10 ++++ ...efined_types-0.8.8.sol-0.8.11-compact.json | 10 ++++ ...efined_types-0.8.8.sol-0.8.12-compact.json | 10 ++++ ...efined_types-0.8.8.sol-0.8.13-compact.json | 10 ++++ ...efined_types-0.8.8.sol-0.8.14-compact.json | 10 ++++ ...efined_types-0.8.8.sol-0.8.15-compact.json | 10 ++++ ...defined_types-0.8.8.sol-0.8.8-compact.json | 10 ++++ ...{argument-0.8.9.sol => argument-0.8.8.sol} | 2 - ...{calldata-0.8.9.sol => calldata-0.8.8.sol} | 1 - ...{constant-0.8.9.sol => constant-0.8.8.sol} | 2 +- .../{erc20.sol => erc20-0.8.8.sol} | 0 .../in_parenthesis-0.8.8.sol | 48 ++++++++++++++++++ .../in_parenthesis.sol | 9 ---- .../user_defined_types-0.8.8.sol} | 0 tests/test_ast_parsing.py | 9 +++- 96 files changed, 519 insertions(+), 14 deletions(-) delete mode 100644 tests/ast-parsing/compile/user_defined_types.sol-0.8.10-compact.zip delete mode 100644 tests/ast-parsing/compile/user_defined_types.sol-0.8.11-compact.zip delete mode 100644 tests/ast-parsing/compile/user_defined_types.sol-0.8.12-compact.zip delete mode 100644 tests/ast-parsing/compile/user_defined_types.sol-0.8.8-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.10-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.11-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.12-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.8-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/calldata-0.8.8.sol-0.8.10-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/calldata-0.8.8.sol-0.8.11-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/calldata-0.8.8.sol-0.8.12-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/calldata-0.8.8.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/calldata-0.8.8.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/calldata-0.8.8.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/calldata-0.8.8.sol-0.8.8-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.10-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.11-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.12-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.8-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/erc20-0.8.8.sol-0.8.10-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/erc20-0.8.8.sol-0.8.11-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/erc20-0.8.8.sol-0.8.12-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/erc20-0.8.8.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/erc20-0.8.8.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/erc20-0.8.8.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/erc20-0.8.8.sol-0.8.8-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.10-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.11-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.12-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.8-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.10-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.11-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.12-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.8-compact.zip create mode 100644 tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.10-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.11-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.12-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.8-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.10-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.11-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.12-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.8-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.10-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.11-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.12-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.8-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.10-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.11-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.12-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.8-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.10-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.11-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.12-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.8-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.10-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.11-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.12-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.8-compact.json rename tests/ast-parsing/user_defined_value_type/{argument-0.8.9.sol => argument-0.8.8.sol} (94%) rename tests/ast-parsing/user_defined_value_type/{calldata-0.8.9.sol => calldata-0.8.8.sol} (98%) rename tests/ast-parsing/user_defined_value_type/{constant-0.8.9.sol => constant-0.8.8.sol} (89%) rename tests/ast-parsing/user_defined_value_type/{erc20.sol => erc20-0.8.8.sol} (100%) create mode 100644 tests/ast-parsing/user_defined_value_type/in_parenthesis-0.8.8.sol delete mode 100644 tests/ast-parsing/user_defined_value_type/in_parenthesis.sol rename tests/ast-parsing/{user_defined_types.sol => user_defined_value_type/user_defined_types-0.8.8.sol} (100%) diff --git a/tests/ast-parsing/compile/user_defined_types.sol-0.8.10-compact.zip b/tests/ast-parsing/compile/user_defined_types.sol-0.8.10-compact.zip deleted file mode 100644 index 245529e6b77aa572359813a25dc4f242f759cd74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3215 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 diff --git a/tests/ast-parsing/compile/user_defined_types.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/user_defined_types.sol-0.8.8-compact.zip deleted file mode 100644 index 36924b8c2c904640651d8fb697001be94eda7f5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3180 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.11-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.11-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..5b0bfc860cb7f525bca4b84f768878f82147bb22 GIT binary patch literal 3578 zcma)uX{`dL(p6A8$=6U(Nc)n&vq+}WZ62L9MMAovE$we!LF%1A9YXboA0{{Rg->3eb za4$bGNpZ!0e(vo7g9rI|`})D0d|lk!1K{G%o_l*yl7RpY06-)FpcWthROUhkSvWS_ zq(X!0^>V-0!4;cg!KThV`Mix;n!9#7=JT)BuoXCg=#d-2*6pbF?WkMI>qg@TD?ey< zbqmpTQr@VQ2r^fRpL-3ZQK#L03=~}iN#9(c4iEX__=iC-A;Db2x1v4@B7X_4MYT3_)JTDJlB4J+PG3zo8V4Oz%Rlz_3zIB`WDxW9#K zj5fA#U6Ro+lx%jW8LTwQnR|V$DKfZH?J9m*{a|J1h@t*DeL{tKQ+=)xst59xHK?xZ zaVjX`u~$zWtZ`NOFVQ&1`+(+YiKsMrKz}QkBl4)gk3m6^Ptxbv@3oL9yo9jncpicA5(It){kE^nz z=T)A7q|+8X#(z{Wi;$9#y+>;*-KEAzQVUXC+s*y<)RAYXDLYLauO*Jo>eytyh!R|r z@-8{^@QKz7fVX|@el@ao_=w1qdC1gMbn$0{caT%``|PdR0-Gy^7R+4=7^$@AVSS8# zmvNId+Paa7_7U#{ngJ?Yh_zwY8D)?Q?G)q*@HF%(SGo_e z&1XU`d=cp3U4&noeit;oIybrj zdRC7mQZ4n$3Lb2HYU@5$*>O)>NbF}x_T9Ymsx!j&y-<`{ec~6b3=hq*W^v-UE9^Aq z>@T{GtZL#iQsYN^Jk&r|Ri{AquVmEmVpf)>$^CqFiC19rbUq{Ru4>tp%#QKJr~mcm{5)6f=4)j& zf%8M9ZE@9x6Y8W{m_l(^Qo-M}i8lpmxuyF=9qk zp|L7B_C&uimZ8=;xRq@ z-$^R~^Kh?~uII4`T&E3h$TwyU?A%>D3ch4xw9yTo<5LkycRV_Mt1l<7ao*c5FsK<3 z_|Pp3FTR%2T@V&*LwJCh?Gn>fb+PX>Z(EN0xVgOQjlH|Yo5D=_R-aYuq_-zg=zHYM zAv#kFCmT`FrL~Z}JN`hCcal!3Ngp(wxGAfd(Sw-?rPhT)D7AA+U)On~;3uK@uueln zA`v&T#6=2p&o1Tv)$^2olU3GZR6G}7?saveX#izh|KWAOVN@h~z+gCZcd~?|qM^I$^9J$JC3iwx-KQr%h-GbPwX=r>xBVrU{!rXJ zdLmjJ!mCjFkg6e;{!V+6z|YHe{oxB#!(d2&;o&(J1Ir(cBem9Hj?~)5-a(kY)1MpYh z(OB`kfst;96cqS0qmr$~q)xo+!7{7YiVZoyKDz}9K5x||1vhk@`0h<)N|Ql0s~5_@ z<_eZ2GXP_zgZhY%p%FKda%C6!-|X(mik{_992fU+Pds&_m>_rl?(NWE8F~t=N$yy4 zkqCNNYlUMzL)0teBa?N(S~-G3NDe*ja5-ZDr6W>J5C)J39XGWk}}MO@5)< z(3qTE;igWqT9fBSuM*S6jo)gb-Z)=>2IFJp>`!Nm`jkK?U*$KJy}}rx0>8gfrDv91 z_sPJ5<0^Ow8XQ}gr}Mv&0Vle_E=?~vNdKgM@8ZPN$zNm|elZEBKRQR8RlyCdIf0A0(01r zS8-yngtU`3IZ9b&493l=kRWf8zq-sar-`sU2-pJli53b93wSnJ`^P`))nDP<=ff@| z{D6NlQ3sSrdu#l2$6rX=TaqnT)1?u1rb-SU(ae>OMI&~azqxp0)y9KvZ#(B zI>NU*Cth+xX!HI0-B{|lEt+I2CmZ();AttI|5j&CCL}E|7wEUbO1}hOUW>Z$^fbs1 z=S4K#)IO*s3wg&NG*VuY$McyFO$^X<|v`kGU;Nk z$PL+&Q6sAv7PsV;lxv4gapLkEQnLiKGNW1EWhx^t<&iVqS3X!U^yS$jgBV8ew307( zA3uF_=Nm3^73Iy`RXb8zouM%sUB@c^himv7-bj>O5{<+BX4xM`8-5!M=V1iS#vi;s zKhAdLhx7SA)B4L6ei0i!5}m#n{_iMdWY<71^`?j@*6k}NfvCGHq8uoVI2qP%xwAO@x-@UUB#1-XKjxfa zJKu4<&2;l8(gm;NUtECCaQpe*r1kW8u%#T08Ju4%N$u%K!YC;mMX9-nPLruh6T38E zdn!U3lODAtg4&g(XRW5=)kPIPi^-Bd!s41-U7`ZTpBJP8B@RqA(oOnotrz$cTNeX`k`;kdL0!kE*Y>axzAW(D@%-}2#AP+E z(G-fzhM}Q6E6U0X^%zOWPanJK>W(Dl`1TRn1pXx_%~gk#jwI|P2?NKId!60$Tw!vV z!S7UJxrfxn6m%t4XsJH}`?8z`BCaEZ#_3a!b{zUSV#rsq)?GR2Dx>-w79n;;=VXyT zVG!GTx$t>H+yh#TbKo;8JADHKWyvtXo+IJ+tJ$tJ23KMCbjn^o!3ah={S|BH_bLw1 z@JkTnMJjV|!Rb(5p=@WjKyBD`yS7Veb3GDBSqUbF zy47P*p=##viEdkmT)Bl2sXN6OtG-7;0n%GNTFE-C6sK4&WZ2(Lmf8$X0x1V|wf22> zscGggtP_5b#et9w@LNzELm%XLjyU4BadZ}$=`LbKUO6v_gZ}5pysH+g@`qk`#sfNc z_sQDR*ALgr4ED4+;c&uxr@hoKPVqJv<9e<_i>b#wJf)4#Dhu__!8djfpEv4>OwLgj6Eb`{c_Ij&Xh`b#rQud0w{FwtIyZk6KCG;&u%eZMSEokvKO zaNBR;41dn9EGTBofq!eX{M&zm>bRZYsKz>J;0hXrZXDyuk*VCY0I`#uYjvYJfSD1H nM1%Cd6WKo~`+r3O{}cZkpP3nf$p6y@{?GC| literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.12-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.12-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..c4be608bc74c831c2958ddbccab1fbefcf9f6776 GIT binary patch literal 3581 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..56841fbaf550d377626203b8d913e1446b3a3100 GIT binary patch literal 3575 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..131c5769ed3f4fc726719794639c70292f321522 GIT binary patch literal 3572 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/argument-0.8.8.sol-0.8.8-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..a74b49ac1510e77161f322c69c1194d41257059c GIT binary patch literal 3566 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 StReqH{lEV4pO*yz@&5o}Gg`v{ literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/calldata-0.8.8.sol-0.8.11-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/calldata-0.8.8.sol-0.8.11-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..c69a936a3bd23c5e73baa09d82c8da216423b69c GIT binary patch literal 9661 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/calldata-0.8.8.sol-0.8.12-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/calldata-0.8.8.sol-0.8.12-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..2770368493927fb64a2fa9321aeb77a982d6c9dc GIT binary patch literal 9662 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/calldata-0.8.8.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/calldata-0.8.8.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..b17496fc484df2a04c9d59a208d398e08a50e643 GIT binary patch literal 9661 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 GTRAH<+IKBXy=8 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/calldata-0.8.8.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/calldata-0.8.8.sol-0.8.8-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..4b98a2bc6548b3a8c598312263ecc029d28e057b GIT binary patch literal 9489 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.11-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.11-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..24b01b8dfb98a5d3f15a3682b4953b8e05a65b78 GIT binary patch literal 2429 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.12-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.12-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..43f7607498787faf149dbf1909ac06fa9cdafc83 GIT binary patch literal 2431 zcma);=QkS)1IA;I;;L&ais&Up?NU-PYNfFo)Jh03lM=l}s}!vmZBl#os#URFVpe06 zt5PJqcGRXtwN{L(-uC_ep7TDx56^kddH#T(9h8mT2*3&u08D1AIWcLPGIVYLpil(> zxC8(Ie6Sc?I1&@Cs;;K@6C5_!%QxZAlx>(v_=oW^dfoT!QE*O-WDf#NKj_iG zaFOes!eN=UZAYj{U1<9ehrI#*0};l5{kLsT7L{f8a#W{hp+ARQdsUXiD2p3R*CA@} z=rZL~rF@Q&|BBtAtU$uV;N6J1+qY|f)Al(a>s)hS)ljr?{QP2tWv5N#d)Ip{tn{6596RNA71N1*16cd>i^4K7y05)iWtS3e9eH$ z(KG-WUlI7Se?-##Y&j2?c5q@Fwa)I2yMNA|$o0dz$Sn#ot=B}-KWx#QZTXvW{V$}i zHkAy6KZoKQjIHa>HI?GH<0cam_Zyrf6hGumn2B1>S`3v_{>anfDH5pRZGtryW}3}i zl$acgk7&;VydW&3<~N{j=4O_IrQ|XPs1>(v(Th&{x$YhA=orBG6e2pyBvv@A^rd%t zSHR4oE(C{RxGdTQs#4rmK(Z{}m&;0Y-H~F7sP3lQ#)@1`qeN#+AAqZv%KsSkNJ=~b zzJl=7(mHt;@QvIMg@)q+zf`-@u1h!kgop`h^6dB3oHuE&g(L>WrK{)#{iUCu?Vdo# zowz36VP(BUHl>4zls@p5)iQk-FgPYA>S3cS1~$xL1b+P|$3)rS`hewI7!<+MKhMzY za*Q@jJ~D|duhu>cxEYuwuW=mb(yRs3XiKMz-Wv6ih<3}P>ktJ+x5-$IK(*vck2%72 zn`wgi@@0-yiJ5*Vj~!qrL5uIkOx>U+A9XKww;uPTG_}MG8LLjoEiRZ>D?oj;&yr{2 ziIu*~n_3RkVjfxn74FD>%*=zd>x`6N5NZcx1W`4bL06J{mbh)73fJpfBe`Na30sF1 z>Q67Y+I<*L++c0nQvciluyx0ug^v%#WqD2RJ?spxg6_9r0L-u?*R&2DNbm@J<51}s z1TeqHHYc(X%Xz;<)N?S^r`so__5v2_!)eLbbi7Ke_`P-P05n(CU&oO$4gVvem;H6{ zLyqLchbhPW-=nm19RhZf-CFG3+hZ`Azz(r^jkYT;Fz*iQ6O(dFs*B|DoiCvz+gG5) z5k`*FltJ0V`H|v@E;3p=;!oZCuZR2l7sidWDnaWXmCPJJhSlJ%w36%|%WTO+NsxTq zy${IU&*+Q5}ypU%)sfjwJXR4xRpow@9kv4B5F$`jQHJ%`5 zcgX8~y{?_`nm5yY3Q}Wud{*85jl5+KOH3DtPLo{Ag~=ziEiD~Cx>h!x=ope85@y%^ zo+Y3%!_A*Buymiby4rb>*F9lDIS2F>A@qdikzXNDn{2EnaZN?R^oHltUbawJ@b|`n zIlY%BJ?kyrRuw>#-HqOo-|Z_uK)7EHmrA9cyA#sd@FrR@piaB*it(FKcj%-IZ`h-a z%DmHU<54&s=~rVMp>htmuhN#36RkX;O zW*vI^dzP}#r|m5#&`q$46T_y_l}COH{r6NA4fp;ka->}Z<)g7 zy!e~qX?dI4DGVJtV_m3nDJxpiHQBs=x^nImJAv~A+V@b{IrlQz>af@3@c}iIP$cefRf+Cu zQi(Wbb;d9CtV(8Kt{h937HMp^?Mi)vHyFeSokRG{I28*!E@18{p6cQq%I4#^9>Z-V zBr{yhyG`~O0OOVSQsB61ksI7n+~1_@uX%Enrn9F7LM)OH$`!36sATr)VNLSP1A>Y1 zvg7~=^?=u-N{IBp1Wm;2&Gcg!uXYK2(XGZ1`7U0YNcn-FFHtc@EfKauGJ3|JzF%4a z(npCG*FwsVF2sA@6Ni)&u0|!*q8V<7Mvvo zqzmSd-`H`dyufTt`X7L4ho<|Gy|O@!H*V$*f1|nPOec4n=d;te6}QR-8$hOGzMssP zLWw^7i`)pg6n;D4NkmN*PE>et6y5kPG6_&phdOC8yTGHc(byotS0V61`4UP4IrZr* zD?JXUK>jO;to$hh8 zM70c>@p<{|0Cn@_4WsuzG>|%}Vgn(OKnfK0?mTAzXQ_f`ik7$cX8mNkA|#)GbO)GZ z$=oCuAm!kW!y;50wS?{$U7ED&Pf9qBuR`@hGXG)3&2Kj#^)VRZnn=MPCw;bHJ17gQ j5!?UPqMv5;-^8-~s{c=t?4TT+zuqiAar)UJJipezuPBXY literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..647d124a43fd9832509633a757484e3481502e2c GIT binary patch literal 2430 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..50f2cc275bfdf103bc203c05d1ba26e42d981d10 GIT binary patch literal 2432 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..652617a3d536790adced2841064109600f63a13c GIT binary patch literal 2432 zcma);=T{O61IEF?J+4;nZSIu=wA=$VC+0RsL>if4iYr&SQp`c6=E5*@1W75{bwg&? zakT{8H#KLjoDJM>_x=8!^FF^1&w0*y{(v9c;S|UWzy{z4Oyw`RD`=`LGB^PMyaoWE z1ONb#VQ5Sw0v)M&Ud!+|n6S{mpx8TM5s`t22qfxebdXjECJfC50t5U3fcpS|NoM8^ zy+gh53dYB`Mto%-&^HyS(&;&u#Z6_#Fdf3WGWC;bJ)f5ozXo-)LW}N+cU?81|LD>| zb2Pnik8~;^x3I2{K^K?gdML%U({P>MTY%=pETfAaGESnnB>!m&xo0 z{M^Fw%;+sJed?b0(9^YpN6|P>!kK>vW3+5)(raI_1z`{25|?HP_Spz+;END%AD(&0 zeK(O0SJ5nq{r2A86w^9q#Yme*d=YAy0-Mhx+F{DB^}$F)b)6%~!>`m*!|fqj%sV4T zIar9z{h8NQ=fvX7j6;pm@S}dosdCZmR5@5pi zQFTH1ZAs7P%l`Y|$lZ;^yZh}YjjbU!bUC>)UG9r%jZrNIs=ePTwHy}&zyK;g2HvEV zsKmj0RSc-*BySJrHc0Sv{;p;f%tPXFrstC2u39B;_hHPs(dfGVYH(FaDbt|dQ0;c! zwAZViHJ!ZWm4}xOnY0A!w%ZvgE>4eS#FH)sKJzYG4EE!3%CWtmPs0R*zHoRe576TN z+P8V$)W{Vyf1Ca=6&Z^B(yl<_B$?(EiUyi~xU-vFgBWs=b#X4LP^Ihh9#FmT&Q5u| z8+fpX(P!m0wqv9WIKOho2t#-w?HD#*-T7AP9_-t?N>@OS+x145%(a~(Pst< z-tG2UM#nS|&MoTN?+FE8_;M!NM__0we=r}d%=6OUbQnb@Fiv2V&6n*Lv+CME#x~AJvCS1z0N=7lD=f@K15p7H3R0mwO(@vzD_Rg*8V+%2EQW>aKJgE-yCv?#^|IgIn-XCkI#6 zb?sQ)b5XLcITMNTTzZH2&ry-d0dmOnbXUbB?; zFJV{~ajoaqwU*gr^AdGmnbS&tN|`I_e)e1&#HBGv(Nn7|J^CX-Q_*_;&V@4E(c_)h zT;H)N-R;E5_e}o3RRJv{ke<`8=GntO!HkFwz0;QL9D0XQaTZ=J2G%~l-R4YRa@NWD zs#+tUq4u0z^zjb{ zd95A!$cc?7HY^yn8EP;qx0!DXDsNzO3vigK@yYyqE4=jRIBKfgKmU+EX3f|CGMI{* z`??wKZkB{g)kOTz_c|+Uh1W5*v?_4u=Y$h@g`P=UFIBU9K!S>@?U(f>gyE^SUUnl5 zgmlV5#uBfadfb8hIHfj&r;@dY`@>4>Gb2D8KgXQ!jE`;Q@XRbZ_w58|)E4@&uD^vD zdg=*h1%$QPa4zp@)-`Dy8=oJI!i<1fAe1^IgdDX(s1=3H^T2n#P4Hn-^+=fj#Y$nx zRB2}HxMk&@6{i(hdDSCB&kf@`^VABKTT_%-w8E-&V#J5HxUBcJ3khz?gt)dWrmVeBZ?+hxPP)En%$XOzI@~ z3imQcn`FDm&0EkTm4lCdjLbyG@HKW=RtB+h5(iS!6u*^MeIiRh*QI+(w`YO4UpzT+ z$_jzydliCM^Kx`7hPdQ%Iv9grfPMVMj&)+#C}GZRi#0vy>go#> zN%{rt9j`k6i2urOV{I}#Yb@h?7B=)-ql9Ixosb0 zvGiRyE~nD;!RBA91k0ZB1`Q5|u=M%8^oF!w_HyUX{Ui5;^qPi~k%)g5rZuh=pxW*o$l>!R921kgv1 z3iR&9x=WL4J#JS>LTv^eVozi5hA3&^Jk!TI`HQC3FHu+jN=`}clw6>r&`;dA0)2$#}>O#5Li{C$&E-W94j^;j~h5$*tF kGduOaz38_Z{Wtf4|JMI!NpJ@+`@e7CZ`^;kFxS89KWb``MF0Q* literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/constant-0.8.8.sol-0.8.8-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..d98aa7751ecb2e21196bcd608e4695f411000076 GIT binary patch literal 2413 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/erc20-0.8.8.sol-0.8.12-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/erc20-0.8.8.sol-0.8.12-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..c9e8559cd8c272c1e62c9ba2c0504addd87c5309 GIT binary patch literal 12317 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

C#I(E2s*nxZV;yc0kPgS$L%*QS*Fv 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/erc20-0.8.8.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/erc20-0.8.8.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..36b5e01437a308502feaac81d43939d188516669 GIT binary patch literal 12308 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/erc20-0.8.8.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/erc20-0.8.8.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..41dd2566ceb8de3aeb691fb93b5cf38f506e8862 GIT binary patch literal 12314 zcma)@LvSt(u(V^_wrx8nw%!;gwr$(CZQHhO+sTRXfA`8Bj1m zAP^t~pq=DX)f$u7CPzjfpe{2IAW|S8AQML;7AATo2Co0)WM{2!;%;x}=&b+O(a7Aw z)r7&)$<7uU3>-)o2*@7@h(A2sjP;Avpgl@~sH#MXkmk02yQ8ApI{&8Y{2g|J~W zcx?OJ=gegI%{tu=XV8Fu;ol&$Eo4i*sx_a81d13XUoBaYDP3LWHV)6|8h zlOgKemuVSn_Q|AB`u)T&7MFz35H1y*AuYy{d268StpSk&4#L8=UUZ=tjO6B^kgV-3 zXP1-b8>_mZTnZ%8IM{7HRK6Z)o<$;8pM(f! z8XoIgJXZsEf0#;ff(JPo^-OvmmR6&B6CFsf&LPTm-gSx_7!}~xeCFHcS@*)20c`!E zk`RB8rM^o96h!A5RHEboA;?2Z_1qCk-ASU6D`rnSHA6-$yFZ<)UJ*(x%!KK4UTU7u zwc5&d47f3=t7i*km)Gm=^MpJD6-lbp->bg}uY?C8$BMqE)({9MnoN~17HN+2|HgO9 z2rUX7*1-gW?;tn6iFm#Pwh^EaM#(qnUW&^8PyjB(=BOo*Z3hU=4w|2^R}3C6Z;xCd zoG677F4Yvi2@&mlz}UNN?SW$c0#RP?5316cHBf6K$Oc_HW%mPH=EFE#QhZ1@On z;>w{|Q-svaDvfEq!K7;@zvMOSP{9URp=N?XBLiE?kAonsTx z6iwv0x?JDL{D2v-DVlTL&WN)RK>0-~jbkP6aCP^P=_;DTKeRRR#$zwN`=galuD7Pp zkYHi|kfpIhPiB!s2O!@#22WSDkH`jQ)D<*(m^|W#vzV2^#&3JwV7K1Z;T)=j#=^&Q zYV>ytp0tB1OQr9J3dO?3YqrX5U*{_BjoQ|?iqxF*O+I=72KH!1LwZQX``IsUGzSKS z?=Ey5%9wFDTQNKxPZi9|(*#dnqe_&$-`qLuJB0`Cjz^-_BE)j?x?8FH` zChA1GGG|RFjZ+J-5}RKre}zpJN|3vyp-N{bEKndL&06<_Fg=Plf=^4`<`{{piY zH9#>?#eL?_fDi?ZmuWH4u0$EgQ?Y<;7Yh?Mxv1FRshv6ik8vcu1^(}D=Hlhc#k|GC zGm9^SbeJ6enp=aV;rc~+)1Bb%)O$wkhuit&e&K(qO^fgIRi1^^%!k4g-Q-5Vst#+B zpP%gp`@&F~>N={{1(IgU2eVL8Ki`#y30vBW#%nYw<{RcpSBkL22X7oB#7a?z%FQT( z(mW0S0i*F#k|D>tDnxlPM)_15+&e&8gEOV;cC2CSP^X98t6>C+vP-bgk;xCP`~6#l zP6+0@i+nM!?$eYqYvk7n9a=8D>}4~E2FDn~*&297vzGjf)HW^E=5%_?5E96=;qP`Y zYhnWTG89<-LbFRu*#E6UTR(9|1(zRucV=dia**_q_s_@in5Zp_U!Nj1oSy<*$hH1K z#6@i+63FD&$`C=pk`Hef%MQ13V%<`%=dg0!dG(G{R>N|hoqsT@T*|6M2sa?Cg3 zvL-9Rjn1YoEY{{35&;1^q?H>I>hus0SXS2{I`R*S&7gz5umK@~nT!`?FwDV?l*h?3 z){N)SyG^Oj=B;OzJdp-5Cw08YCB)DMPD#yP3?v<}j(Hd$&Pi`LNQJ+6QycV*-*>JN ziijDaaX6>kN5$uUnbkM%atA7v{`$)JQ@WaRM`P*O&mYmgn zRdpNnSQG9l+~Fvvb6MIvfbx4O{-c>j9)mh*ncED?llO=GI_&BR-{&=xW=_6c48Jxvm3{re-9hPdl z-D@79omJ+fHh9@#2=PqF5=#5mGgXdQzBY|2T{rAhyLXt!Fi4); z*R(XjQI~J1(m$j3LNI8G?5Ed~vXn9CcyJ`k?rEEm>!i*lv3AUvi=yH6bO7UXAP~w| zvxP(54Y-kzhq6ww ziJud!#Q}rCQIE>f> zL%`0dN<`%t-~)CN1qw0?#vGN-J(v6AJ-KQPvAstLNh5lwt<7Zc9JrukY49M9{#X<+ zA{Q+MmK%^4)i1L>i^Y{x>f#bE8dJ%*tv`Uk%;)8kh@DGT*PQA!8JZj}&)|T>mKjuf z=;dvXgnE?0QwJVYcr9yld(K7l=8){co$t{ghah(kMIK%}*m7UCdW4);y~}o9-gqWF z4=o-@NVIBAr&{{i`HsSW+Vg3pE=98FV6j5%wy_4#l*9=xL?>v?kUNRJOXk*k!|**> zTYZa=rwBw7luG}=Uu^S?J(bW)7~PFBJ@(sEXm#@86E(7?_mLY&<6Xa<7ai!;w&eS= z;!@{Uf@Ltbl@Uejzf2Zc%;=I2O1Qil{CoLq&P(B)Gu^}6^8H5;TFLASuu@{ZaJTkg zMuGmP^3Z~Y{zDUF31ACxOZl`R(}tSnwA3c)zD)HVbKMc;sP5evk7P5LRg-@0l4Eg) zBcf`NMDO>^a=)7PM?*w1skzcloE~F3#MHXag9>^oo=j*&wEpMuU@*RPqmz?CN4QPx z#RgDc)>u^BmpU~COzynhqLIOQx}=699OJ}FVd>hPd*?vXR5}#xtSt>$)(S&*aFzj@ zbXDs3!opqPgj-J9#T`{SZD!?@T${4qoAtJ1H$_T>7zJmrPUZIr)j1}MD-4JNfnGsT zI3)UWh7H(z(z^=9%Tn0yjbQw~+QM%N)25}$3*It=P-DeaT=YdGkdqk|M>MX^qa`TQ zDxkU#SOn3MuVfc-SLt6Bp0B(<;7K+2{cAuva}rO&Zz@E{VZe26-CSNiQPPP>#Ti>LEQKn4FO6e5MhRRY@RJ-%3nHStptr?_GS?~1(>r*LKL!~x?cc#nq3 z1Ex^X6XN(ca3uUm+b3BT9b2hRs}a=d6|CuVp40JTz`()~6SF}4LG-^P8)!h2AX){3(!v-N~&G@vEk-IQ|{4!EXD=zsB6!XR2(yxa(s6>CoFm%gPZBLFpM^9Qmq18Hz37w zy>31<*vOGp((jATYh*bK!shB?*?eYuyaULV7-?(jWd}U4)3eIj>W6+|w9tj(TY~Vn z4=Wz>u7-lSKqsY#&l5T*T3960@_h)COfPTrw+ow3`Gs1>nG(8%hxl@guy^Sa*!ZZq z6>nRZG+ad3ObtsjAzan3p8WL1~BhTG0utG1VxWn11r z$I6JXr87|@5=wEi0!^{~91 zWDsXQpDhyHUR=ve5;T#RggC)_vy4VWvw~_{5YmT65?wn5Ws!L9emE)KWQRZJY5!9tdEElL|+u~yg-fUB^_beQrQv^qz?!HE6a|wj-MKzNp{)5i2sexvM(zZ%;y%RB4g&Hvd>D@{}XNyOwhK zH|Z_xhgdi>SQ?HN3_GMz5`-KCViM=zQ~m7EdsdZse8*Qw`JGOg=>)rJ@dP8v+s|0; zw%9RFz}vi>9Xy;8ru3W~CI)=8gsLZE^j0UID*abN@FJa%(eG|gihToQ@1f1Wxy>7S z#uXcK2N~L46O#m)E?dI1@AGKZd~pE|!NVaomjf;#%{`J!*vJxNoLy89n zCltH|8qm5)Vsswz^b#pvi&X@F4ALAd!e+Oiw3ZO_>}gHg-EBf+6p)z-460~_B39Hi zZ`>Gt&&$u!VFxmFDL`*QlDyW1UC29(NT_Kw7r)o`4XM`(IF>H;(hx?g#$y%eOs1QFK*YuI%f0DReM+gu}Nn2>ddZ)w3_{aBWY z&jE;MKc`%TZyo7e#7uNqE^Q^GrFjgr#ZJJpWx7qT)VNdHna}J*K$VE}*pc2#W_D2~ z1Cw=>*Mfw-P$kv~Q)unTtZ0zQLn^+u-CNyzYBq*YAeG}%_rJMvUfOKadfBW#ey_zh zN<;`htV~$`O9GuguT@7dX zJov07RO9%?oc0H=K>|}wVt+xKWH$&MJ*e0)I~@#FD_lV-7$J_ffqZaYbsQNWOnf~k|E%|5PGqon)D$uCJnLaq zc&u9xLiKTs`#rMy?e<$7^+mc6n`<2u8w^rtcp`M*IO;-F6y4nQU491qUb8=VoALl0 zhe<`a*ll&e592=!Yt*AQMHD)PR9C^2G^A*4wov>x*U(>la^!tWJm+u79_Cz(SXuMM zNa=RbAYXf=@s#AwG6sSo@d^;6Ao2a5C3%I}p?xpCQAef14eVezsUjM%CNz*P?mQ_D zQJhh~+ccmQXE!9E1KN#|pGPjyEy-I$h7-UO2gB$hu{3wa^zf;0dMp!p6T<+z9b=Ni z;q;)I+2q*(j-V zxts|**xA7`9C=(eQmgW(`_qLuMC&=cT|Wpb$Uogs&^d$J+;e)4%bDNi*sNd~AuDlz zsFE!DI#)CT-goLv<80G}yw;MKl#@p(WBME_dtbWFuV+(%p_6s&vrurwzqCi?lbsz9 zy@+P!NT3N?5jb^Kv3e;nx+7@^hif%GZe(KKC9;Rmc8t(bW`8>*_(b71;a2w03xvMY zc)9<`67VcDuU8WHy`65GAu7?RSLC6T-9Q@?St6Ad%cx%?aLz&tVqhkf^QQqyavZt( zSCBpU>x34tm~y04znE$7p%_v-s@FU`sO;xS8md;M5sGURGg@dbRg>p!$N844(JY|G z@9(l+NpXAgo0Gzez6sE_aHP1N9Je!}rflq3l_vnfs81}{jcP=i7V*n3ls2_4xb*-l z7s5AN!={Ff9xf*lzK(;Zw!#N&ygX6J=qtv7G6fNj< z9PV&U6p+0Q-P0pD26rI&Ce)BWyS**<%yUkj!V05#W9OVxsM|77P`Nq_0qKq#Vk(*K&-(;?7hU`{aPJb6^AM-67u=1}Vu_Ul7CjcY~cPclF-h5!t4+KcCOU4r@)r zaSDc}g;@oS9ZYXTjgV9PNpe2>`LwThzOcdlwh3BN)SBrLE-Rg6zQbj-olXXWasNzc zrcF+3lLaxVQG)i8`5@Rg2Ui*tgVbXcHW(x3QAmn9O9Nuk7sqJfI!$sXMS-*M{dRhQ z<@9y%nfmryC$gP$O(ZFa9^H>8=4rn~#`B3xl<0vPWr&&ZCGsx4rd;;1gcoxy{?dC?vNd$G0N&V|^soJ8NG45lGs(U2;=6))Bi zv8zSL?qMrfF`lJCKc+bYM~_)NpFo4=cGBADC73jtX3Iahd|m>%Z8c088j4VlveK`| zf2hk&Jb%52XRB@m7eDr-56TNRdiHyheiwRuDJdb-Q{`cY5IDOx4TSU1|JtbbDLLKl z-R~B?jpU;l;v9(06(p63>-z|Z;x96&tM$iNf92oVwHPi>Td8s~2Mf}LcN#uB;Mu-gsFCl$uC%@-(Y|4j!l*kMBk7MWZD;)$zT zWJ+ALXo(&n=J{%4Z=4)5w3c+J4hhse7|;{P(Q^nw$0nd;V!#Xunh?&zxWHiimw|8% zrrKO0=1zjy)e-iA$z4I7avD^0aY?JIkviQkP3|C(_3UI#Isv#2-f)Dd8(nPX6v063 z@|AH4;Q~j9D5l`kO3?HFyeFX^!nq~=HT<=Qm}NoJ5RAI8&>>{XKB!9xqoa>Z+bIE^ zqw(V*q}3TWLKOkL{0gzdS>pmdv1V1$Tc+28>{ze2A@z z;@bM|V$b$2GWEDyP4#M%*7wEeqz7s6It$%(?u`s7KmVqE4sh*-2AEIKY?+S@T*k{v z@l`pnfMipi4fx3rse2R`kp8nkib?C!HNHcC5IxM$xfz`L zM|z=*R>-bMR}Y(ks!n5reA9BY6iDXqwg82>&cQa#nMYVuL`kwVuc;%&mepp3nPo(~ zbbpQ-J)mlek5j18*Y4tw4w4e4*T!Sgjg*bLD8Q377wEE&@t8@QC9eJ4WniI*j|q+exfDg{=FVMJD*CoM_S8BWV?JY)#2hI+D(#Y2W#XXUCvGJXND~c*w$yeUv3}Q!#5OYh4vnidYfFEw|36dd1L=q(Mg9?&px?kC|ud z26p0mEC!pcx$ONoB+sKHZpv=YdB*6o=UCZ||Iiv2W=g+MLk+dGchU}^78mm*?LY$S z9D|m$r4VJft^)e&0@`6dnsQelj400il8}ezJMgWZ{A)~^ymS6Kh1x)_|7zt)10kRT z$Z(>(JQ021o=r11T%&f45-SQof(!MVgZ+0_+( zO{p=VxOETNZly)5!I~?~oLPmAuv*ZFOiW@Li+NeI+3^a~Rg7)6LlBkBjjE1`mKIjY zC0uO%C8_6oP1&hNYvT!eIYF5>z^vTr316O@WlWAeRD^MwfqAbnn@K3&(s6X*gRr8q z@bNDbr~-)50w&=*_t0pYjHhjp#qxv*gIEdb=$oakUKU}mXnY=mRE?tlb?GM*;gWhuJg)1`JT zOjf5y>u0klK{Uv}A)TGDG*}$PnkE)C1B|w5U#Ibwo=z1bA#j)N1^u_j;{K$q$T|u_ z(Z#RbgH+{Lhh+m#|8;fZq8y+OKx~W`42IAK*C0Qjz5ot!?s4!Z(s!tA4(!1NBf;*# ztAt*G@Q7aFtLP{G3{a|bHqdOS#o+(L=5}~~wFVLs8DL9~G!_*I=sutmrbTvL@cDoN z9kHSBA+%xtRM}iRF4cSZyfD_)t4=nTCf4wto3`YHoABML#geGn+4v}SL1f4OXuHw( z^io3Ykq~bjI0f%*^u>(I!_SUuB={J*WmgQqd+c{W9EM8Cckk{}E5v)_q0bp${IARL zIqkmDQcpGgsaX3IOr`~2m? z(Q;-AeF%nz&hxn>D#2)al7b_ZN5-8kA*1k91%SAt#qMUr(9g;CwresmiSbd}Ygbx+ zvUWzJOq(81o;KyOc_eLnk@JW>ORBU%~A> zBVfU@%c1MM=XrueJfaUi3&)nO7mi#bpt(~-DGBNww^We23{&5kol4Ew960$LxvUP* z_6`S@oU2v5l%jll;RW}i9&G{I+JAp}CLM$%6O5E$&DmU8bA(N>t#MtLe=9 zdENo8$+C+$FiXs)8}+30*Ywn(d+CI&;@ZfhTGPzd=il!&(n;_UZlpvRS z>yu$jpOOE!)OfF$aPB%pNM=6I+rBQ#lu1WyjIUWyTm*bJYBby_2QZFR+E)BY1awoveWb*5uwJEL6+m_wwfbQ<3+hV?6g(=OozN@wgbi zu=vrzGF{Fww^Wn1`9;Z6`$|JIHMSi6igEBA=JZoc*)xkUD`Gv_i{$HS_=ZvWQoI}y zw3x^86t_f|!vhVSTRa&)dM6hRy4N|M$&5muYN(3Eqifx>pPngLb~SL`9`c`xz1pU+ z{tJ(2Uj4804&?Dc&KJ|%Cr5<;NtwAs$gGj*WrUc z^MH%9TSWq${=LN)6~2HdE!Y6buRVn|CDro#&cP2BQ~=_G3t&(?i%QC~=yAOqetzFY`Z=J$z1?EMocNnL8@ zPz=-S%Z~%S1ebsNx#R->vMh4>dkzIg^;y)|g7?o9`5c4F>i93oZHDO%6YsR7j*#a$ zQam8&=Qn>gGY?57xxS25^wzsP(0kt{^yJ?U4#Ixyhhw%il?~d=Oj%uaLEtRK zXaJd&*qz<}tsa*H2gGQZQijbrcbZ&+RfE7<0V{^E{rB{0oB}phNUh17_%HHma)9)+ z>)B9dxyg$UeaG@*jrz0Ggqxn*t!R?+jOknlpG-10y@=ecG}SqwpBM*sfMcPY9nUIR0b`4gm< zBq%7r5Z8>WSPHy<@>hN4MYNn7bMvv3&A~YqW@5L%1&pIHJnOkwbSK!QDs0SAO8mFK z194zxs;}4*8#05E$6J)Lo0}AMkL!`dI+MOxl%8of&!z~@`b^=JTUX1}-44UtGgpF3 z%M~Q2AW+4a=T6fjef;lYFFK^cm&8srlFI63M38UWK+0bX zGxT3i9DM%5ipW1I9GyH^D)2lV#h43#<=zJfT;03zvyTlF3q7;|W?4Wf@lO=G1<=o52@Vob zCY-kMU@FtRc*ztneHyV3qlCXniMtv|d^bbv)g_p5y2aZGcdUUZp>|TrfA5w~+ESHD zgM-TP%D%T05bSH@VdXY)XAX`OY)Y!&CestrBE9NnU$TPq%zECDhX7;{ij6E zJ4^HiNw2*nU{jW~(uZED;aAU-AkjAu_0<94DhfUfwAr#bL!wjA^3`*_rCDo7#Bi@9k`?|Tx<@e?*6ELJkMOFT}a_b z%w+LYf|3t~AZW%y(ps@M515}%dKUx3W#E3Ls5<#&8Jp^T~sxcuK0h&E!u(3 z3-EPcDSV|_^z~*oytrk0twcOKH3pMzwaZFk#5F6ABcNp4o6o;qqP52IAcs}Pkt|x` zNQNu0=vD-UQN*sM_Vo9T@*lQO=S`N?ArCm7SKsnZW#6KrI+BG9-Hx$9vA~~MASvt` zp56q~F@v44rXE-skZH-xYMQh&_K8qKwRxPEVzCe`@-8p9jr{Pf3|5h8GjgRa(Z#X> z1Q#rd9ByFC%rxHBImRbwA(bhz(U+2Q#W4VW1L<~k3%Qc18`MZ=pXS1vgJnnMJ{Sjv z9J@0zcRo-bv)qp3+d>Kfb(%sAq;NoBhGjrSKKSJ$m1tFCg<16@ZkIN`ulCT<5Jp0yu0Uqrw+lk?F#0EmH{K6{F_&8?z)$RUV0Fe z>(A@`j(173T$ezX(o{;*;w00AR7SuI;wy5lCqtdLr}BfJ!4+-U7=J&lP~PeZjA;m7 zuyozdo8(d8)4z@jb_oo>>QGpD?2OqvUyB7itCXA$bI>r+SYTy z(-z`8q(_Zybx=Z87$c*y9oE7^;P7$e72NN*ca>4jk%5o;OX-21E#-`@7QHFdgdhrCh5h`hw`t!orFa+{^a)k-m zgvqvOQ&VV6wy6U>Zg@F0fto%gd7A4X5JyUdq~@Vjre2Fjk~M^nOMP`P%7NNJNj+;-Y}(25vf?XzG~epQlCGDg3dUve zKgm490Z4iG32bsUmQGpz@5{9wH_Q+}evZBj)^HCLlx{*cfi;7>^&yKFy$Tfn6dkU# zbtX*aG`$D~hQd6Rwpo8f4Jr!11Mpkt6;Y{%oNXD+$}e8Is4*)~I6CMTnTB6=ri&a0 z3;Vd{jgEz#0)5>T@kXpehjaAUB?7u0($5*MjQ98hZVkj)&_;`GAp(T zH?FshJlbzlkcBnvHE!us}$7#jO?dR9p{JEJJwq3CYD>)k_dsFTmKbv7$wnuAm9xCNEe6@2*XRb<>1de zZpGR{F+p*z^BcO1cYV_XT7Q<+m_|=zhtd)3L3zAM(^D$uuQP0v%1~$B%#c(p2e@$- z7^fMdn3OL*lU$nVq74DApD09K1X&CkO@ZHCwMgF(K1n>@snIP+*s z7Ly9DfPC^mfOtREZ~IiNc(B#Av-V4YHbXk(V-hrdIUe_!(jd^j8hsPeKh)`CGsxpJ zlF~s0hEB?!ZAycx(AsFys4}WPiJ7LZ6@SV6<&5QHH=slBmEpT9n;CAo^kwfU`$Q(y6T8INkB)h@C9k_x8Lt{kPo$#vPcmo9xT3$9zDp6$LQu^t zL!aa6OtM3N@9J9orv7CWdaFsJ1|iirS+1kDk`6t%AnT{Jr!C!i>{Y6ov8N?A|EQn0OG1Rm>Za~m6;tkHIt(o97S64(>s|)J}MbqDw-m)Aj zPHHxu=S`R=-d&wcFk|Z9^j<3>(g8}LU2r9V`@6vw|2zWZ-b8BrbL*|e;VU~JiK_X( z1>j=g5wP}e@R8yL1jrlMNFBIVBzPLxj`-y7%~U`!!Aa`lg2FpBXMLq6 ziCAks>qJ)!ZWtdj)YdbI5S~GtfmF4e-lc5EZh}21{d=NwGfjX>p`fSS2|<1FU13*@fI* zd^SIEy+n+V4dMK|A36#vqPs{?Yo3+S6in_QhR9s zZ@r~V6aa$EmPTMxl15x{3c*kqLIj+p;ZeGCUtnjktxDS|x^6fVs_ut`TTtb9_7lbh1K`DVXsz%_@Q4?v0?bOrijhuo_ zvD3B9$czOOflj@GWv^6B)gN05(J+)j?Mgfq8spdohH$*Ea11Yv34g!Idz+qxY7wH} z1h+U(qW`mUD&|Ff018L^MdAYdl`N9{Hq7 z)Ofq$x;*0)>-0wmpY5pvAkX3gki*M8-?ZWOU67GTe}jg(aGL zNN;6JxY!)Z0+xn@_{i1%(*dq;1!zQRV+d)n@m9i$`_^w0 z{u65tW37@D)i6}H`Ipkd{3)8~DGR~lCK;AkUcPM|5FS4qf>1)7vTNyQ3LLDJ$`A0$ zIqpX{ul9s|Sy5PoYOUI~h4x1Q(5-@DZok>9FVEg@6;Fp_YgK&_sQ}xf$Nl@ zRz6;vX(~dkb3tfQt<=|Q;W_e=`8*3n+0Qw)n&~zK`sGpO9J_UP>=R(Nba^-VK{tu$ zUE^4l)&0T1^R|69^bIQ+kO*V1uSxJSe{p-3c9}1oqZ6fFCt2e?DYz)D?}EM|I_|f{ zvl^y(4;h1Gqx)k+a`>3D!8ZWJK=#QYLxpWh;-dGY`b$!MqBHt!M&ayTppYYTY2R?4 zG$~cFtnD0Z__a)TSb0mz!G6JP(;_F68R@D4>=odk%Q&ce0zF!1jzM)ML*Ng@oJ^B; zKH>*%^9qGqYh$~L(JWRU(_5;BrC)3e8$HtE1wjzy(9$L&NvD;7UuT@SB&mJ|KYP^5 z{rYKUo=MdSa0+{ab@B`Sc$6Qa=CjHLfgZyNh9W)p#HIYb4E8=(lmP}21pVKk{r|ZA h|3Ch~|6~6LgkMnx9O8dgf&Y`zf8O-p2LKSz{{#9UnLz*m literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/erc20-0.8.8.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/erc20-0.8.8.sol-0.8.8-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..1752e6322eaa7172e8907695138c8d4a39fa729e GIT binary patch literal 12316 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.10-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.10-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..0d3ca25a0f6780d768b417e381ab19c14f26be29 GIT binary patch literal 5969 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 WbtNG3|7;Nci{XF0`Jb5s0RIo@M1f5J literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.12-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.12-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..a9f8231db16a7d78fc02b5f4b3101693eec39515 GIT binary patch literal 5972 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..65636b54f0b0f6f3d87b1fd45a3f3902b1414548 GIT binary patch literal 5977 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..aaff7aec640b0df359395b5efd8b437487b3007d GIT binary patch literal 5981 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 ZMR;o{15y5GgYX|;{_Cy(#5n-){{R$Fc$5GD literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.8-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..56b368c60c41e527780a379f333e37e8aa0c4949 GIT binary patch literal 5936 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 C+ZyHo literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.12-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.12-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..751c2cf7cf9f3c9a6fadc5032f627601aa824168 GIT binary patch literal 3243 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 D{Kz24 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..04156bb2a93b614432b3e76cb7c8b3d3c61b4a6e GIT binary patch literal 3245 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 Jt$6L<^&goX6;c2I literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.8-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..658877ed7243c4cb5861a177c7d7fc5f956862f7 GIT binary patch literal 3216 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.10-compact.json b/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.10-compact.json new file mode 100644 index 000000000..cb45a229a --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.10-compact.json @@ -0,0 +1,7 @@ +{ + "FixLib": { + "div(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "works(Fix)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "test(Fix)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.11-compact.json b/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.11-compact.json new file mode 100644 index 000000000..cb45a229a --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.11-compact.json @@ -0,0 +1,7 @@ +{ + "FixLib": { + "div(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "works(Fix)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "test(Fix)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.12-compact.json b/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.12-compact.json new file mode 100644 index 000000000..cb45a229a --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.12-compact.json @@ -0,0 +1,7 @@ +{ + "FixLib": { + "div(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "works(Fix)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "test(Fix)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.13-compact.json b/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.13-compact.json new file mode 100644 index 000000000..cb45a229a --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.13-compact.json @@ -0,0 +1,7 @@ +{ + "FixLib": { + "div(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "works(Fix)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "test(Fix)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.14-compact.json b/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.14-compact.json new file mode 100644 index 000000000..cb45a229a --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.14-compact.json @@ -0,0 +1,7 @@ +{ + "FixLib": { + "div(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "works(Fix)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "test(Fix)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.15-compact.json b/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.15-compact.json new file mode 100644 index 000000000..cb45a229a --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.15-compact.json @@ -0,0 +1,7 @@ +{ + "FixLib": { + "div(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "works(Fix)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "test(Fix)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.8-compact.json b/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.8-compact.json new file mode 100644 index 000000000..cb45a229a --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/argument-0.8.8.sol-0.8.8-compact.json @@ -0,0 +1,7 @@ +{ + "FixLib": { + "div(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "works(Fix)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "test(Fix)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.10-compact.json b/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.10-compact.json new file mode 100644 index 000000000..3ebff8630 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.10-compact.json @@ -0,0 +1,10 @@ +{ + "C": { + "f(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->3;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->4;\n2[label=\"Node Type: END_LOOP 2\n\"];\n2->7;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->1;\n4[label=\"Node Type: IF_LOOP 4\n\"];\n4->5[label=\"True\"];\n4->2[label=\"False\"];\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->4;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n", + "g(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->3;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->4;\n2[label=\"Node Type: END_LOOP 2\n\"];\n2->7;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->1;\n4[label=\"Node Type: IF_LOOP 4\n\"];\n4->5[label=\"True\"];\n4->2[label=\"False\"];\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->4;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n", + "test_f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: RETURN 7\n\"];\n}\n", + "test_g()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: RETURN 10\n\"];\n}\n", + "clean()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "test_equality(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.11-compact.json b/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.11-compact.json new file mode 100644 index 000000000..3ebff8630 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.11-compact.json @@ -0,0 +1,10 @@ +{ + "C": { + "f(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->3;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->4;\n2[label=\"Node Type: END_LOOP 2\n\"];\n2->7;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->1;\n4[label=\"Node Type: IF_LOOP 4\n\"];\n4->5[label=\"True\"];\n4->2[label=\"False\"];\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->4;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n", + "g(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->3;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->4;\n2[label=\"Node Type: END_LOOP 2\n\"];\n2->7;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->1;\n4[label=\"Node Type: IF_LOOP 4\n\"];\n4->5[label=\"True\"];\n4->2[label=\"False\"];\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->4;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n", + "test_f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: RETURN 7\n\"];\n}\n", + "test_g()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: RETURN 10\n\"];\n}\n", + "clean()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "test_equality(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.12-compact.json b/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.12-compact.json new file mode 100644 index 000000000..3ebff8630 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.12-compact.json @@ -0,0 +1,10 @@ +{ + "C": { + "f(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->3;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->4;\n2[label=\"Node Type: END_LOOP 2\n\"];\n2->7;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->1;\n4[label=\"Node Type: IF_LOOP 4\n\"];\n4->5[label=\"True\"];\n4->2[label=\"False\"];\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->4;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n", + "g(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->3;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->4;\n2[label=\"Node Type: END_LOOP 2\n\"];\n2->7;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->1;\n4[label=\"Node Type: IF_LOOP 4\n\"];\n4->5[label=\"True\"];\n4->2[label=\"False\"];\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->4;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n", + "test_f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: RETURN 7\n\"];\n}\n", + "test_g()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: RETURN 10\n\"];\n}\n", + "clean()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "test_equality(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.13-compact.json b/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.13-compact.json new file mode 100644 index 000000000..3ebff8630 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.13-compact.json @@ -0,0 +1,10 @@ +{ + "C": { + "f(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->3;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->4;\n2[label=\"Node Type: END_LOOP 2\n\"];\n2->7;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->1;\n4[label=\"Node Type: IF_LOOP 4\n\"];\n4->5[label=\"True\"];\n4->2[label=\"False\"];\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->4;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n", + "g(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->3;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->4;\n2[label=\"Node Type: END_LOOP 2\n\"];\n2->7;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->1;\n4[label=\"Node Type: IF_LOOP 4\n\"];\n4->5[label=\"True\"];\n4->2[label=\"False\"];\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->4;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n", + "test_f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: RETURN 7\n\"];\n}\n", + "test_g()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: RETURN 10\n\"];\n}\n", + "clean()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "test_equality(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.14-compact.json b/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.14-compact.json new file mode 100644 index 000000000..3ebff8630 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.14-compact.json @@ -0,0 +1,10 @@ +{ + "C": { + "f(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->3;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->4;\n2[label=\"Node Type: END_LOOP 2\n\"];\n2->7;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->1;\n4[label=\"Node Type: IF_LOOP 4\n\"];\n4->5[label=\"True\"];\n4->2[label=\"False\"];\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->4;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n", + "g(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->3;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->4;\n2[label=\"Node Type: END_LOOP 2\n\"];\n2->7;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->1;\n4[label=\"Node Type: IF_LOOP 4\n\"];\n4->5[label=\"True\"];\n4->2[label=\"False\"];\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->4;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n", + "test_f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: RETURN 7\n\"];\n}\n", + "test_g()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: RETURN 10\n\"];\n}\n", + "clean()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "test_equality(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.15-compact.json b/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.15-compact.json new file mode 100644 index 000000000..3ebff8630 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.15-compact.json @@ -0,0 +1,10 @@ +{ + "C": { + "f(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->3;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->4;\n2[label=\"Node Type: END_LOOP 2\n\"];\n2->7;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->1;\n4[label=\"Node Type: IF_LOOP 4\n\"];\n4->5[label=\"True\"];\n4->2[label=\"False\"];\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->4;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n", + "g(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->3;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->4;\n2[label=\"Node Type: END_LOOP 2\n\"];\n2->7;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->1;\n4[label=\"Node Type: IF_LOOP 4\n\"];\n4->5[label=\"True\"];\n4->2[label=\"False\"];\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->4;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n", + "test_f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: RETURN 7\n\"];\n}\n", + "test_g()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: RETURN 10\n\"];\n}\n", + "clean()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "test_equality(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.8-compact.json b/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.8-compact.json new file mode 100644 index 000000000..3ebff8630 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/calldata-0.8.8.sol-0.8.8-compact.json @@ -0,0 +1,10 @@ +{ + "C": { + "f(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->3;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->4;\n2[label=\"Node Type: END_LOOP 2\n\"];\n2->7;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->1;\n4[label=\"Node Type: IF_LOOP 4\n\"];\n4->5[label=\"True\"];\n4->2[label=\"False\"];\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->4;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n", + "g(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->3;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->4;\n2[label=\"Node Type: END_LOOP 2\n\"];\n2->7;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->1;\n4[label=\"Node Type: IF_LOOP 4\n\"];\n4->5[label=\"True\"];\n4->2[label=\"False\"];\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->4;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n", + "test_f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: RETURN 7\n\"];\n}\n", + "test_g()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: RETURN 10\n\"];\n}\n", + "clean()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "test_equality(MyAddress[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.10-compact.json b/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.10-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.10-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.11-compact.json b/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.11-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.11-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.12-compact.json b/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.12-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.12-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.13-compact.json b/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.13-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.13-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.14-compact.json b/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.14-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.14-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.15-compact.json b/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.15-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.15-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.8-compact.json b/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.8-compact.json new file mode 100644 index 000000000..0008a4469 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/constant-0.8.8.sol-0.8.8-compact.json @@ -0,0 +1,3 @@ +{ + "C": {} +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.10-compact.json b/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.10-compact.json new file mode 100644 index 000000000..d8c9a5943 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.10-compact.json @@ -0,0 +1,22 @@ +{ + "FixedMath": { + "add(UFixed18,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "sub(UFixed18,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "ERC20": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "totalSupply()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "balanceOf(address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "allowance(address,address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "transfer(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "approve(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "transferFrom(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", + "increaseAllowance(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "decreaseAllowance(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "_transfer(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_mint(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_burn(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_approve(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_burnFrom(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.11-compact.json b/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.11-compact.json new file mode 100644 index 000000000..d8c9a5943 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.11-compact.json @@ -0,0 +1,22 @@ +{ + "FixedMath": { + "add(UFixed18,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "sub(UFixed18,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "ERC20": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "totalSupply()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "balanceOf(address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "allowance(address,address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "transfer(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "approve(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "transferFrom(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", + "increaseAllowance(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "decreaseAllowance(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "_transfer(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_mint(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_burn(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_approve(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_burnFrom(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.12-compact.json b/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.12-compact.json new file mode 100644 index 000000000..d8c9a5943 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.12-compact.json @@ -0,0 +1,22 @@ +{ + "FixedMath": { + "add(UFixed18,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "sub(UFixed18,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "ERC20": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "totalSupply()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "balanceOf(address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "allowance(address,address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "transfer(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "approve(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "transferFrom(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", + "increaseAllowance(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "decreaseAllowance(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "_transfer(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_mint(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_burn(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_approve(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_burnFrom(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.13-compact.json b/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.13-compact.json new file mode 100644 index 000000000..d8c9a5943 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.13-compact.json @@ -0,0 +1,22 @@ +{ + "FixedMath": { + "add(UFixed18,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "sub(UFixed18,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "ERC20": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "totalSupply()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "balanceOf(address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "allowance(address,address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "transfer(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "approve(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "transferFrom(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", + "increaseAllowance(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "decreaseAllowance(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "_transfer(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_mint(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_burn(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_approve(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_burnFrom(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.14-compact.json b/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.14-compact.json new file mode 100644 index 000000000..d8c9a5943 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.14-compact.json @@ -0,0 +1,22 @@ +{ + "FixedMath": { + "add(UFixed18,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "sub(UFixed18,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "ERC20": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "totalSupply()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "balanceOf(address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "allowance(address,address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "transfer(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "approve(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "transferFrom(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", + "increaseAllowance(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "decreaseAllowance(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "_transfer(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_mint(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_burn(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_approve(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_burnFrom(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.15-compact.json b/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.15-compact.json new file mode 100644 index 000000000..d8c9a5943 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.15-compact.json @@ -0,0 +1,22 @@ +{ + "FixedMath": { + "add(UFixed18,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "sub(UFixed18,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "ERC20": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "totalSupply()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "balanceOf(address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "allowance(address,address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "transfer(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "approve(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "transferFrom(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", + "increaseAllowance(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "decreaseAllowance(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "_transfer(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_mint(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_burn(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_approve(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_burnFrom(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.8-compact.json b/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.8-compact.json new file mode 100644 index 000000000..d8c9a5943 --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/erc20-0.8.8.sol-0.8.8-compact.json @@ -0,0 +1,22 @@ +{ + "FixedMath": { + "add(UFixed18,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "sub(UFixed18,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "ERC20": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "totalSupply()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "balanceOf(address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "allowance(address,address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "transfer(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "approve(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "transferFrom(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", + "increaseAllowance(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "decreaseAllowance(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", + "_transfer(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_mint(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_burn(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_approve(address,address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "_burnFrom(address,UFixed18)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.10-compact.json b/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.10-compact.json new file mode 100644 index 000000000..272a4265d --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.10-compact.json @@ -0,0 +1,14 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n" + }, + "FixedMath": { + "add(UFixed,UFixed)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "mul(UFixed,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "floor(UFixed)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "toUFixed(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "Greeter": { + "constructor(string)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.11-compact.json b/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.11-compact.json new file mode 100644 index 000000000..272a4265d --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.11-compact.json @@ -0,0 +1,14 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n" + }, + "FixedMath": { + "add(UFixed,UFixed)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "mul(UFixed,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "floor(UFixed)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "toUFixed(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "Greeter": { + "constructor(string)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.12-compact.json b/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.12-compact.json new file mode 100644 index 000000000..272a4265d --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.12-compact.json @@ -0,0 +1,14 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n" + }, + "FixedMath": { + "add(UFixed,UFixed)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "mul(UFixed,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "floor(UFixed)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "toUFixed(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "Greeter": { + "constructor(string)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.13-compact.json b/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.13-compact.json new file mode 100644 index 000000000..272a4265d --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.13-compact.json @@ -0,0 +1,14 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n" + }, + "FixedMath": { + "add(UFixed,UFixed)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "mul(UFixed,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "floor(UFixed)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "toUFixed(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "Greeter": { + "constructor(string)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.14-compact.json b/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.14-compact.json new file mode 100644 index 000000000..272a4265d --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.14-compact.json @@ -0,0 +1,14 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n" + }, + "FixedMath": { + "add(UFixed,UFixed)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "mul(UFixed,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "floor(UFixed)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "toUFixed(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "Greeter": { + "constructor(string)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.15-compact.json b/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.15-compact.json new file mode 100644 index 000000000..272a4265d --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.15-compact.json @@ -0,0 +1,14 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n" + }, + "FixedMath": { + "add(UFixed,UFixed)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "mul(UFixed,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "floor(UFixed)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "toUFixed(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "Greeter": { + "constructor(string)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.8-compact.json b/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.8-compact.json new file mode 100644 index 000000000..272a4265d --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/in_parenthesis-0.8.8.sol-0.8.8-compact.json @@ -0,0 +1,14 @@ +{ + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n" + }, + "FixedMath": { + "add(UFixed,UFixed)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "mul(UFixed,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "floor(UFixed)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "toUFixed(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "Greeter": { + "constructor(string)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.10-compact.json b/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.10-compact.json new file mode 100644 index 000000000..06367c7cd --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.10-compact.json @@ -0,0 +1,10 @@ +{ + "B": { + "u()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + }, + "D": {}, + "C": { + "f(Left[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.11-compact.json b/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.11-compact.json new file mode 100644 index 000000000..06367c7cd --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.11-compact.json @@ -0,0 +1,10 @@ +{ + "B": { + "u()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + }, + "D": {}, + "C": { + "f(Left[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.12-compact.json b/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.12-compact.json new file mode 100644 index 000000000..06367c7cd --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.12-compact.json @@ -0,0 +1,10 @@ +{ + "B": { + "u()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + }, + "D": {}, + "C": { + "f(Left[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.13-compact.json b/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.13-compact.json new file mode 100644 index 000000000..06367c7cd --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.13-compact.json @@ -0,0 +1,10 @@ +{ + "B": { + "u()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + }, + "D": {}, + "C": { + "f(Left[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.14-compact.json b/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.14-compact.json new file mode 100644 index 000000000..06367c7cd --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.14-compact.json @@ -0,0 +1,10 @@ +{ + "B": { + "u()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + }, + "D": {}, + "C": { + "f(Left[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.15-compact.json b/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.15-compact.json new file mode 100644 index 000000000..06367c7cd --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.15-compact.json @@ -0,0 +1,10 @@ +{ + "B": { + "u()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + }, + "D": {}, + "C": { + "f(Left[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.8-compact.json b/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.8-compact.json new file mode 100644 index 000000000..06367c7cd --- /dev/null +++ b/tests/ast-parsing/expected/user_defined_value_type/user_defined_types-0.8.8.sol-0.8.8-compact.json @@ -0,0 +1,10 @@ +{ + "B": { + "u()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + }, + "D": {}, + "C": { + "f(Left[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/user_defined_value_type/argument-0.8.9.sol b/tests/ast-parsing/user_defined_value_type/argument-0.8.8.sol similarity index 94% rename from tests/ast-parsing/user_defined_value_type/argument-0.8.9.sol rename to tests/ast-parsing/user_defined_value_type/argument-0.8.8.sol index 55fe237e1..8d511db7a 100644 --- a/tests/ast-parsing/user_defined_value_type/argument-0.8.9.sol +++ b/tests/ast-parsing/user_defined_value_type/argument-0.8.8.sol @@ -1,5 +1,3 @@ -pragma solidity ^0.8.9; - type Fix is int192; diff --git a/tests/ast-parsing/user_defined_value_type/calldata-0.8.9.sol b/tests/ast-parsing/user_defined_value_type/calldata-0.8.8.sol similarity index 98% rename from tests/ast-parsing/user_defined_value_type/calldata-0.8.9.sol rename to tests/ast-parsing/user_defined_value_type/calldata-0.8.8.sol index b69e2e0d6..dff2146e8 100644 --- a/tests/ast-parsing/user_defined_value_type/calldata-0.8.9.sol +++ b/tests/ast-parsing/user_defined_value_type/calldata-0.8.8.sol @@ -1,4 +1,3 @@ -pragma solidity ^0.8.9; pragma abicoder v2; type MyAddress is address; diff --git a/tests/ast-parsing/user_defined_value_type/constant-0.8.9.sol b/tests/ast-parsing/user_defined_value_type/constant-0.8.8.sol similarity index 89% rename from tests/ast-parsing/user_defined_value_type/constant-0.8.9.sol rename to tests/ast-parsing/user_defined_value_type/constant-0.8.8.sol index 70b395441..0ea1e5df8 100644 --- a/tests/ast-parsing/user_defined_value_type/constant-0.8.9.sol +++ b/tests/ast-parsing/user_defined_value_type/constant-0.8.8.sol @@ -1,5 +1,5 @@ type T is int224; -pragma solidity ^0.8.9; + contract C { T constant public s = T.wrap(int224(165521356710917456517261742455526507355687727119203895813322792776)); T constant public t = s; diff --git a/tests/ast-parsing/user_defined_value_type/erc20.sol b/tests/ast-parsing/user_defined_value_type/erc20-0.8.8.sol similarity index 100% rename from tests/ast-parsing/user_defined_value_type/erc20.sol rename to tests/ast-parsing/user_defined_value_type/erc20-0.8.8.sol diff --git a/tests/ast-parsing/user_defined_value_type/in_parenthesis-0.8.8.sol b/tests/ast-parsing/user_defined_value_type/in_parenthesis-0.8.8.sol new file mode 100644 index 000000000..739221fb9 --- /dev/null +++ b/tests/ast-parsing/user_defined_value_type/in_parenthesis-0.8.8.sol @@ -0,0 +1,48 @@ +type MyInt is int; +contract C { + function f() public returns (MyInt a, int b) { + (MyInt).wrap; + a = (MyInt).wrap(5); + (MyInt).unwrap; + b = (MyInt).unwrap((MyInt).wrap(10)); + } +} + +// Represent a 18 decimal, 256 bit wide fixed point type +// using a user defined value type. +type UFixed is uint256; + +/// A minimal library to do fixed point operations on UFixed. +library FixedMath { + uint constant multiplier = 10**18; + + /// Adds two UFixed numbers. Reverts on overflow, + /// relying on checked arithmetic on uint256. + function add(UFixed a, UFixed b) internal pure returns (UFixed) { + return UFixed.wrap(UFixed.unwrap(a) + UFixed.unwrap(b)); + } + /// Multiplies UFixed and uint256. Reverts on overflow, + /// relying on checked arithmetic on uint256. + function mul(UFixed a, uint256 b) internal pure returns (UFixed) { + return UFixed.wrap(UFixed.unwrap(a) * b); + } + /// Take the floor of a UFixed number. + /// @return the largest integer that does not exceed `a`. + function floor(UFixed a) internal pure returns (uint256) { + return UFixed.unwrap(a) / multiplier; + } + /// Turns a uint256 into a UFixed of the same value. + /// Reverts if the integer is too large. + function toUFixed(uint256 a) internal pure returns (UFixed) { + return UFixed.wrap(a * multiplier); + } +} + + +contract Greeter { + using FixedMath for UFixed; + UFixed public someValue; + + constructor(string memory _greeting) { + } +} diff --git a/tests/ast-parsing/user_defined_value_type/in_parenthesis.sol b/tests/ast-parsing/user_defined_value_type/in_parenthesis.sol deleted file mode 100644 index d45dacb4f..000000000 --- a/tests/ast-parsing/user_defined_value_type/in_parenthesis.sol +++ /dev/null @@ -1,9 +0,0 @@ -type MyInt is int; -contract C { - function f() public returns (MyInt a, int b) { - (MyInt).wrap; - a = (MyInt).wrap(5); - (MyInt).unwrap; - b = (MyInt).unwrap((MyInt).wrap(10)); - } -} diff --git a/tests/ast-parsing/user_defined_types.sol b/tests/ast-parsing/user_defined_value_type/user_defined_types-0.8.8.sol similarity index 100% rename from tests/ast-parsing/user_defined_types.sol rename to tests/ast-parsing/user_defined_value_type/user_defined_types-0.8.8.sol diff --git a/tests/test_ast_parsing.py b/tests/test_ast_parsing.py index eafe6a2f3..0b791f0ea 100644 --- a/tests/test_ast_parsing.py +++ b/tests/test_ast_parsing.py @@ -402,7 +402,14 @@ ALL_TESTS = [ Test("custom_error_with_state_variable.sol", make_version(8, 4, 12)), Test("complex_imports/import_aliases/test.sol", VERSIONS_08), # 0.8.9 crashes on our testcase - Test("user_defined_types.sol", ["0.8.8"] + make_version(8, 10, 12)), + Test( + "user_defined_value_type/user_defined_types-0.8.8.sol", ["0.8.8"] + make_version(8, 10, 15) + ), + Test("user_defined_value_type/argument-0.8.8.sol", ["0.8.8"] + make_version(8, 10, 15)), + Test("user_defined_value_type/calldata-0.8.8.sol", ["0.8.8"] + make_version(8, 10, 15)), + Test("user_defined_value_type/constant-0.8.8.sol", ["0.8.8"] + make_version(8, 10, 15)), + Test("user_defined_value_type/erc20-0.8.8.sol", ["0.8.8"] + make_version(8, 10, 15)), + Test("user_defined_value_type/in_parenthesis-0.8.8.sol", ["0.8.8"] + make_version(8, 10, 15)), Test("bytes_call.sol", ["0.8.12"]), ] # create the output folder if needed From a4a139ecaa3b9ed06d1ac43824d67e9470ba331a Mon Sep 17 00:00:00 2001 From: Vladislav Volosnikov Date: Sat, 9 Jul 2022 14:34:26 +0300 Subject: [PATCH 071/101] Add check ElementaryTypeNameExpression in copy_expression --- slither/utils/expression_manipulations.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/slither/utils/expression_manipulations.py b/slither/utils/expression_manipulations.py index 24d43299b..1a300c39b 100644 --- a/slither/utils/expression_manipulations.py +++ b/slither/utils/expression_manipulations.py @@ -9,6 +9,7 @@ from slither.core.expressions.assignment_operation import AssignmentOperation from slither.core.expressions.binary_operation import BinaryOperation from slither.core.expressions.call_expression import CallExpression from slither.core.expressions.conditional_expression import ConditionalExpression +from slither.core.expressions.elementary_type_name_expression import ElementaryTypeNameExpression from slither.core.expressions.expression import Expression from slither.core.expressions.identifier import Identifier from slither.core.expressions.index_access import IndexAccess @@ -80,7 +81,10 @@ class SplitTernaryExpression: if isinstance(expression, ConditionalExpression): raise SlitherException("Nested ternary operator not handled") - if isinstance(expression, (Literal, Identifier, IndexAccess, NewArray, NewContract)): + if isinstance( + expression, + (Literal, Identifier, IndexAccess, NewArray, NewContract, ElementaryTypeNameExpression), + ): return # case of lib From 800504238b98280ae196219dc599451f0ebd56b8 Mon Sep 17 00:00:00 2001 From: TheStarBoys Date: Sun, 24 Jul 2022 11:11:27 +0800 Subject: [PATCH 072/101] Fix #1296: contract.contract_kind is always None. So use contract.is_interface instead of contract_kind. --- slither/tools/flattening/flattening.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/tools/flattening/flattening.py b/slither/tools/flattening/flattening.py index f067bde6d..26f979648 100644 --- a/slither/tools/flattening/flattening.py +++ b/slither/tools/flattening/flattening.py @@ -111,7 +111,7 @@ class Flattening: to_patch = [] # interface must use external - if self._external_to_public and contract.contract_kind != "interface": + if self._external_to_public and not contract.is_interface: for f in contract.functions_declared: # fallback must be external if f.is_fallback or f.is_constructor_variables: From e64de7f7b35cee88ba94127c1e77dd84a1585ee0 Mon Sep 17 00:00:00 2001 From: TheStarBoys Date: Sun, 24 Jul 2022 14:03:37 +0800 Subject: [PATCH 073/101] Add feature #1298 --- slither/core/declarations/contract.py | 9 +++++ slither/solc_parsing/declarations/contract.py | 2 + slither/tools/flattening/__main__.py | 7 ++++ slither/tools/flattening/flattening.py | 40 +++++++++++++++++++ 4 files changed, 58 insertions(+) diff --git a/slither/core/declarations/contract.py b/slither/core/declarations/contract.py index 2db1cd964..c70711502 100644 --- a/slither/core/declarations/contract.py +++ b/slither/core/declarations/contract.py @@ -78,6 +78,7 @@ class Contract(SourceMapping): # pylint: disable=too-many-public-methods self._using_for: Dict[Union[str, Type], List[Type]] = {} self._kind: Optional[str] = None self._is_interface: bool = False + self._is_library: bool = False self._signatures: Optional[List[str]] = None self._signatures_declared: Optional[List[str]] = None @@ -144,6 +145,14 @@ class Contract(SourceMapping): # pylint: disable=too-many-public-methods def is_interface(self, is_interface: bool): self._is_interface = is_interface + @property + def is_library(self) -> bool: + return self._is_library + + @is_library.setter + def is_library(self, is_library: bool): + self._is_library = is_library + # endregion ################################################################################### ################################################################################### diff --git a/slither/solc_parsing/declarations/contract.py b/slither/solc_parsing/declarations/contract.py index efc53f2aa..8823112fb 100644 --- a/slither/solc_parsing/declarations/contract.py +++ b/slither/solc_parsing/declarations/contract.py @@ -157,6 +157,8 @@ class ContractSolc(CallerContextExpression): if "contractKind" in attributes: if attributes["contractKind"] == "interface": self._contract.is_interface = True + elif attributes["contractKind"] == "library": + self._contract.is_library = True self._contract.kind = attributes["contractKind"] self._linearized_base_contracts = attributes["linearizedBaseContracts"] # self._contract.fullyImplemented = attributes["fullyImplemented"] diff --git a/slither/tools/flattening/__main__.py b/slither/tools/flattening/__main__.py index e0888f222..977b84896 100644 --- a/slither/tools/flattening/__main__.py +++ b/slither/tools/flattening/__main__.py @@ -79,6 +79,12 @@ def parse_args(): action="store_true", ) + group_patching.add_argument( + "--convert-library-to-internal", + help="Convert external or public functions to internal in library.", + action="store_true", + ) + group_patching.add_argument( "--remove-assert", help="Remove call to assert().", action="store_true" ) @@ -111,6 +117,7 @@ def main(): compilation_unit, external_to_public=args.convert_external, remove_assert=args.remove_assert, + convert_library_to_internal=args.convert_library_to_internal, private_to_internal=args.convert_private, export_path=args.dir, pragma_solidity=args.pragma_solidity, diff --git a/slither/tools/flattening/flattening.py b/slither/tools/flattening/flattening.py index f067bde6d..90b751afb 100644 --- a/slither/tools/flattening/flattening.py +++ b/slither/tools/flattening/flattening.py @@ -51,6 +51,7 @@ class Flattening: compilation_unit: SlitherCompilationUnit, external_to_public=False, remove_assert=False, + convert_library_to_internal=False, private_to_internal=False, export_path: Optional[str] = None, pragma_solidity: Optional[str] = None, @@ -61,6 +62,7 @@ class Flattening: self._external_to_public = external_to_public self._remove_assert = remove_assert self._use_abi_encoder_v2 = False + self._convert_library_to_internal = convert_library_to_internal self._private_to_internal = private_to_internal self._pragma_solidity = pragma_solidity @@ -146,6 +148,40 @@ class Flattening: ) ) + if self._convert_library_to_internal and contract.is_library: + for f in contract.functions_declared: + visibility = "" + if f.visibility == "external": + visibility = f.visibility + elif f.visibility == "public": + visibility = f.visibility + + if visibility != "": + attributes_start = ( + f.parameters_src().source_mapping["start"] + + f.parameters_src().source_mapping["length"] + ) + attributes_end = f.returns_src().source_mapping["start"] + attributes = content[attributes_start:attributes_end] + regex = ( + re.search(r"((\sexternal)\s+)|(\sexternal)$|(\)external)$", attributes) + if visibility == "external" + else re.search(r"((\spublic)\s+)|(\spublic)$|(\)public)$", attributes) + ) + if regex: + to_patch.append( + Patch( + attributes_start + regex.span()[0] + 1, + "external_to_internal" + if visibility == "external" + else "public_to_internal", + ) + ) + else: + raise SlitherException( + f"{visibility} keyword not found {f.name} {attributes}" + ) + if self._private_to_internal: for variable in contract.state_variables_declared: if variable.visibility == "private": @@ -186,6 +222,10 @@ class Flattening: index = index - start if patch_type == "public_to_external": content = content[:index] + "public" + content[index + len("external") :] + elif patch_type == "external_to_internal": + content = content[:index] + "internal" + content[index + len("external") :] + elif patch_type == "public_to_internal": + content = content[:index] + "internal" + content[index + len("public") :] elif patch_type == "private_to_internal": content = content[:index] + "internal" + content[index + len("private") :] elif patch_type == "calldata_to_memory": From c1ed068ae178b62f807bd888821c0758d1d2de37 Mon Sep 17 00:00:00 2001 From: TheStarBoys <41286328+TheStarBoys@users.noreply.github.com> Date: Mon, 25 Jul 2022 09:52:35 +0800 Subject: [PATCH 074/101] Update slither/tools/flattening/flattening.py Co-authored-by: alpharush <0xalpharush@protonmail.com> --- slither/tools/flattening/flattening.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/slither/tools/flattening/flattening.py b/slither/tools/flattening/flattening.py index 90b751afb..e88c10e3a 100644 --- a/slither/tools/flattening/flattening.py +++ b/slither/tools/flattening/flattening.py @@ -151,12 +151,8 @@ class Flattening: if self._convert_library_to_internal and contract.is_library: for f in contract.functions_declared: visibility = "" - if f.visibility == "external": - visibility = f.visibility - elif f.visibility == "public": + if f.visibility in ["external", "public"]: visibility = f.visibility - - if visibility != "": attributes_start = ( f.parameters_src().source_mapping["start"] + f.parameters_src().source_mapping["length"] From ce0a4006b904e626dac9fdee29eadf12ad3bc957 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= <2642849+elopez@users.noreply.github.com> Date: Mon, 25 Jul 2022 10:52:59 -0300 Subject: [PATCH 075/101] Disable coloring if output is not a terminal, fix Windows tests (#1244) * Disable coloring if output is not a terminal Color escape codes are most likely not expected if piping the output of slither into a file or other tool. Check if stdout is a tty before enabling colored output. --- .github/workflows/ci.yml | 14 ++++---------- scripts/ci_test_kspec.sh | 2 +- scripts/ci_test_simil.sh | 4 ++-- slither/__main__.py | 2 +- slither/utils/colors.py | 8 ++++---- tests/check-kspec/test_1.txt | 12 ++++++------ tests/check-upgradeability/test_1.txt | 4 ++-- tests/check-upgradeability/test_10.txt | 16 ++++++++-------- tests/check-upgradeability/test_11.txt | 8 ++++---- tests/check-upgradeability/test_2.txt | 8 ++++---- tests/check-upgradeability/test_3.txt | 24 ++++++++++++------------ tests/check-upgradeability/test_4.txt | 20 ++++++++++---------- tests/check-upgradeability/test_5.txt | 4 ++-- tests/check-upgradeability/test_6.txt | 8 ++++---- tests/check-upgradeability/test_7.txt | 8 ++++---- tests/check-upgradeability/test_8.txt | 4 ++-- tests/check-upgradeability/test_9.txt | 8 ++++---- 17 files changed, 74 insertions(+), 80 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1252e385a..f2a295452 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,8 +3,7 @@ name: CI defaults: run: - # To load bashrc - shell: bash -ieo pipefail {0} + shell: bash on: push: @@ -52,16 +51,10 @@ jobs: steps: - uses: actions/checkout@v1 - - name: Set up shell - if: runner.os == 'Windows' - run: | - echo 'C:\msys64\mingw64\bin' >> "$GITHUB_PATH" - echo 'C:\msys64\usr\bin' >> "$GITHUB_PATH" - - - name: Set up Python 3.6 + - name: Set up Python 3.8 uses: actions/setup-python@v3 with: - python-version: 3.6 + python-version: 3.8 - name: Install dependencies run: | @@ -87,6 +80,7 @@ jobs: - name: Run Tests env: + PYTHONUTF8: 1 TEST_TYPE: ${{ matrix.type }} GITHUB_ETHERSCAN: ${{ secrets.GITHUB_ETHERSCAN }} run: | diff --git a/scripts/ci_test_kspec.sh b/scripts/ci_test_kspec.sh index cb0a131a8..3bd827e69 100755 --- a/scripts/ci_test_kspec.sh +++ b/scripts/ci_test_kspec.sh @@ -7,7 +7,7 @@ slither-check-kspec "$DIR_TESTS/safeAdd/safeAdd.sol" "$DIR_TESTS/safeAdd/spec.md DIFF=$(diff test_1.txt "$DIR_TESTS/test_1.txt") if [ "$DIFF" != "" ] then - echo "slither-check-upgradeability 1 failed" + echo "slither-check-kspec 1 failed" cat test_1.txt echo "" cat "$DIR_TESTS/test_1.txt" diff --git a/scripts/ci_test_simil.sh b/scripts/ci_test_simil.sh index bad5fd067..1d405191e 100755 --- a/scripts/ci_test_simil.sh +++ b/scripts/ci_test_simil.sh @@ -2,8 +2,8 @@ ### Install requisites -pip3.6 install pybind11 -pip3.6 install https://github.com/facebookresearch/fastText/archive/0.2.0.zip +pip3 install pybind11 +pip3 install https://github.com/facebookresearch/fastText/archive/0.2.0.zip ### Test slither-simil diff --git a/slither/__main__.py b/slither/__main__.py index dd195b65b..c062dbf7c 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -659,7 +659,7 @@ def main_impl(all_detector_classes, all_printer_classes): cp.enable() # Set colorization option - set_colorization_enabled(not args.disable_color) + set_colorization_enabled(False if args.disable_color else sys.stdout.isatty()) # Define some variables for potential JSON output json_results = {} diff --git a/slither/utils/colors.py b/slither/utils/colors.py index aff4fa373..14fc4b345 100644 --- a/slither/utils/colors.py +++ b/slither/utils/colors.py @@ -1,5 +1,6 @@ from functools import partial import platform +import sys class Colors: # pylint: disable=too-few-public-methods @@ -73,7 +74,7 @@ def set_colorization_enabled(enabled: bool): if enabled and platform.system() == "Windows": Colors.COLORIZATION_ENABLED = enable_windows_virtual_terminal_sequences() else: - # This is not windows so we can enable color immediately. + # This is not windows, or colorization is being disabled, so we can adjust the state immediately. Colors.COLORIZATION_ENABLED = enabled @@ -83,6 +84,5 @@ red = partial(colorize, Colors.RED) blue = partial(colorize, Colors.BLUE) magenta = partial(colorize, Colors.MAGENTA) -# We enable colorization by default (this call is important as it will enable color mode on Windows by default), -# regardless of whether Slither is interacted with from CLI or another script. -set_colorization_enabled(True) +# We enable colorization by default if the output is a tty +set_colorization_enabled(sys.stdout.isatty()) diff --git a/tests/check-kspec/test_1.txt b/tests/check-kspec/test_1.txt index ed0482c87..d93356685 100644 --- a/tests/check-kspec/test_1.txt +++ b/tests/check-kspec/test_1.txt @@ -1,7 +1,7 @@ ## Check for functions coverage -[✓] SafeAdd.add(uint256,uint256) - -[ ] (Missing function) SafeAdd.add_v2(uint256,uint256) - -[ ] (Unresolved) SafeAdd.addv2(uint256,uint256) - +[✓] SafeAdd.add(uint256,uint256) + +[ ] (Missing function) SafeAdd.add_v2(uint256,uint256) + +[ ] (Unresolved) SafeAdd.addv2(uint256,uint256) + diff --git a/tests/check-upgradeability/test_1.txt b/tests/check-upgradeability/test_1.txt index 5681c4619..48d8484a7 100644 --- a/tests/check-upgradeability/test_1.txt +++ b/tests/check-upgradeability/test_1.txt @@ -1,4 +1,4 @@ -INFO:Slither: +INFO:Slither: Initializable contract not found, the contract does not follow a standard initalization schema. -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing INFO:Slither:1 findings, 12 detectors run diff --git a/tests/check-upgradeability/test_10.txt b/tests/check-upgradeability/test_10.txt index 1e0f99584..1527735c5 100644 --- a/tests/check-upgradeability/test_10.txt +++ b/tests/check-upgradeability/test_10.txt @@ -1,13 +1,13 @@ -INFO:Slither: +INFO:Slither: Initializable contract not found, the contract does not follow a standard initalization schema. -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing +INFO:Slither: ContractV1.destination (tests/check-upgradeability/contractV1.sol#2) was not constant but ContractV2.destination (tests/check-upgradeability/contract_v2_constant.sol#2) is. -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#variables-that-should-not-be-constant -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#variables-that-should-not-be-constant +INFO:Slither: Variable missing in ContractV2 (tests/check-upgradeability/contract_v2_constant.sol#1-3): ContractV1.destination (tests/check-upgradeability/contractV1.sol#2) -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#missing-variables -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#missing-variables +INFO:Slither: Initializable contract not found, the contract does not follow a standard initalization schema. -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing INFO:Slither:4 findings, 18 detectors run diff --git a/tests/check-upgradeability/test_11.txt b/tests/check-upgradeability/test_11.txt index f6e8009f5..e2ad677b1 100644 --- a/tests/check-upgradeability/test_11.txt +++ b/tests/check-upgradeability/test_11.txt @@ -1,7 +1,7 @@ -INFO:Slither: +INFO:Slither: Initializable contract not found, the contract does not follow a standard initalization schema. -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing +INFO:Slither: ContractV1.destination (tests/check-upgradeability/contract_v1_var_init.sol#2) is a state variable with an initial value. -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#state-variable-initialized +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#state-variable-initialized INFO:Slither:2 findings, 8 detectors run diff --git a/tests/check-upgradeability/test_2.txt b/tests/check-upgradeability/test_2.txt index ecff55f48..7641e8335 100644 --- a/tests/check-upgradeability/test_2.txt +++ b/tests/check-upgradeability/test_2.txt @@ -1,7 +1,7 @@ -INFO:Slither: +INFO:Slither: Initializable contract not found, the contract does not follow a standard initalization schema. -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing +INFO:Slither: Initializable contract not found, the contract does not follow a standard initalization schema. -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing INFO:Slither:2 findings, 22 detectors run diff --git a/tests/check-upgradeability/test_3.txt b/tests/check-upgradeability/test_3.txt index 8b40490a8..b3c7c0a15 100644 --- a/tests/check-upgradeability/test_3.txt +++ b/tests/check-upgradeability/test_3.txt @@ -1,23 +1,23 @@ -INFO:Slither: +INFO:Slither: Initializable contract not found, the contract does not follow a standard initalization schema. -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing +INFO:Slither: Different variables between ContractV2 (tests/check-upgradeability/contractV2_bug.sol#1-5) and Proxy (tests/check-upgradeability/proxy.sol#7-27) ContractV2.destination (tests/check-upgradeability/contractV2_bug.sol#2) Proxy.destination (tests/check-upgradeability/proxy.sol#9) -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#incorrect-variables-with-the-proxy -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#incorrect-variables-with-the-proxy +INFO:Slither: Function shadowing found: ContractV2.myFunc (tests/check-upgradeability/contractV2_bug.sol#4) Proxy.myFunc() (tests/check-upgradeability/proxy.sol#11) -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#functions-shadowing -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#functions-shadowing +INFO:Slither: Different variables between ContractV1 (tests/check-upgradeability/contractV1.sol#1-3) and ContractV2 (tests/check-upgradeability/contractV2_bug.sol#1-5) ContractV1.destination (tests/check-upgradeability/contractV1.sol#2) ContractV2.destination (tests/check-upgradeability/contractV2_bug.sol#2) -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#incorrect-variables-with-the-v2 -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#incorrect-variables-with-the-v2 +INFO:Slither: Extra variables in ContractV2 (tests/check-upgradeability/contractV2_bug.sol#1-5): ContractV2.myFunc (tests/check-upgradeability/contractV2_bug.sol#4) -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#extra-variables-in-the-v2 -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#extra-variables-in-the-v2 +INFO:Slither: Initializable contract not found, the contract does not follow a standard initalization schema. -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing INFO:Slither:6 findings, 22 detectors run diff --git a/tests/check-upgradeability/test_4.txt b/tests/check-upgradeability/test_4.txt index 7411e06cb..4e32dc904 100644 --- a/tests/check-upgradeability/test_4.txt +++ b/tests/check-upgradeability/test_4.txt @@ -1,20 +1,20 @@ -INFO:Slither: +INFO:Slither: Initializable contract not found, the contract does not follow a standard initalization schema. -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing +INFO:Slither: Different variables between ContractV2 (tests/check-upgradeability/contractV2_bug2.sol#4-6) and Proxy (tests/check-upgradeability/proxy.sol#7-27) Base.val (tests/check-upgradeability/contractV2_bug2.sol#2) Proxy.destination (tests/check-upgradeability/proxy.sol#9) -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#incorrect-variables-with-the-proxy -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#incorrect-variables-with-the-proxy +INFO:Slither: Different variables between ContractV1 (tests/check-upgradeability/contractV1.sol#1-3) and ContractV2 (tests/check-upgradeability/contractV2_bug2.sol#4-6) ContractV1.destination (tests/check-upgradeability/contractV1.sol#2) Base.val (tests/check-upgradeability/contractV2_bug2.sol#2) -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#incorrect-variables-with-the-v2 -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#incorrect-variables-with-the-v2 +INFO:Slither: Extra variables in ContractV2 (tests/check-upgradeability/contractV2_bug2.sol#4-6): ContractV2.destination (tests/check-upgradeability/contractV2_bug2.sol#5) -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#extra-variables-in-the-v2 -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#extra-variables-in-the-v2 +INFO:Slither: Initializable contract not found, the contract does not follow a standard initalization schema. -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializable-is-missing INFO:Slither:5 findings, 22 detectors run diff --git a/tests/check-upgradeability/test_5.txt b/tests/check-upgradeability/test_5.txt index 99bdf0bab..805602ee4 100644 --- a/tests/check-upgradeability/test_5.txt +++ b/tests/check-upgradeability/test_5.txt @@ -1,4 +1,4 @@ -INFO:Slither: +INFO:Slither: Contract_no_bug (tests/check-upgradeability/contract_initialization.sol#11-17) needs to be initialized by Contract_no_bug.initialize() (tests/check-upgradeability/contract_initialization.sol#13-15). -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initialize-function +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initialize-function INFO:Slither:1 findings, 12 detectors run diff --git a/tests/check-upgradeability/test_6.txt b/tests/check-upgradeability/test_6.txt index 842708b8f..663cb62d0 100644 --- a/tests/check-upgradeability/test_6.txt +++ b/tests/check-upgradeability/test_6.txt @@ -1,7 +1,7 @@ -INFO:Slither: +INFO:Slither: Contract_lack_to_call_modifier (tests/check-upgradeability/contract_initialization.sol#19-24) needs to be initialized by Contract_lack_to_call_modifier.initialize() (tests/check-upgradeability/contract_initialization.sol#21-23). -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initialize-function -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initialize-function +INFO:Slither: Contract_lack_to_call_modifier.initialize() (tests/check-upgradeability/contract_initialization.sol#21-23) does not call the initializer modifier. -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializer-is-not-called +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initializer-is-not-called INFO:Slither:2 findings, 12 detectors run diff --git a/tests/check-upgradeability/test_7.txt b/tests/check-upgradeability/test_7.txt index 160cd95e4..9f232338e 100644 --- a/tests/check-upgradeability/test_7.txt +++ b/tests/check-upgradeability/test_7.txt @@ -1,7 +1,7 @@ -INFO:Slither: +INFO:Slither: Contract_not_called_super_init (tests/check-upgradeability/contract_initialization.sol#26-32) needs to be initialized by Contract_not_called_super_init.initialize() (tests/check-upgradeability/contract_initialization.sol#28-30). -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initialize-function -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initialize-function +INFO:Slither: Missing call to Contract_no_bug.initialize() (tests/check-upgradeability/contract_initialization.sol#13-15) in Contract_not_called_super_init.initialize() (tests/check-upgradeability/contract_initialization.sol#28-30). -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initialize-functions-are-not-called +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initialize-functions-are-not-called INFO:Slither:2 findings, 12 detectors run diff --git a/tests/check-upgradeability/test_8.txt b/tests/check-upgradeability/test_8.txt index 6a7debd30..38c71e28c 100644 --- a/tests/check-upgradeability/test_8.txt +++ b/tests/check-upgradeability/test_8.txt @@ -1,4 +1,4 @@ -INFO:Slither: +INFO:Slither: Contract_no_bug_inherits (tests/check-upgradeability/contract_initialization.sol#34-40) needs to be initialized by Contract_no_bug_inherits.initialize() (tests/check-upgradeability/contract_initialization.sol#36-38). -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initialize-function +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initialize-function INFO:Slither:1 findings, 12 detectors run diff --git a/tests/check-upgradeability/test_9.txt b/tests/check-upgradeability/test_9.txt index 9c2fa353e..a67578a08 100644 --- a/tests/check-upgradeability/test_9.txt +++ b/tests/check-upgradeability/test_9.txt @@ -1,7 +1,7 @@ -INFO:Slither: +INFO:Slither: Contract_double_call (tests/check-upgradeability/contract_initialization.sol#42-49) needs to be initialized by Contract_double_call.initialize() (tests/check-upgradeability/contract_initialization.sol#44-47). -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initialize-function -INFO:Slither: +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initialize-function +INFO:Slither: Contract_no_bug.initialize() (tests/check-upgradeability/contract_initialization.sol#13-15) is called multiple times in Contract_double_call.initialize() (tests/check-upgradeability/contract_initialization.sol#44-47). -Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initialize-functions-are-called-multiple-times +Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initialize-functions-are-called-multiple-times INFO:Slither:2 findings, 12 detectors run From ad60e5e089b08d3850dddc612571eaa56e2bd49e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= <2642849+elopez@users.noreply.github.com> Date: Mon, 25 Jul 2022 10:54:45 -0300 Subject: [PATCH 076/101] pip-audit: Use our official action (#1243) Replaces the manual use here with our official GitHub Action. --- .github/workflows/pip-audit.yml | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/.github/workflows/pip-audit.yml b/.github/workflows/pip-audit.yml index c14674ce7..d0fcb419c 100644 --- a/.github/workflows/pip-audit.yml +++ b/.github/workflows/pip-audit.yml @@ -11,18 +11,25 @@ on: jobs: audit: runs-on: ubuntu-latest + steps: - name: Checkout repository - uses: actions/checkout@v2 - - name: Set up Python 3.10 - uses: actions/setup-python@v3 + uses: actions/checkout@v3 + + - name: Install Python + uses: actions/setup-python@v4 with: python-version: "3.10" - - name: Install pip-audit + + - name: Install Slither run: | + python -m venv /tmp/pip-audit-env + source /tmp/pip-audit-env/bin/activate + python -m pip install --upgrade pip - python -m pip install pip-audit - - name: Run pip-audit - run: | python -m pip install . - pip-audit --desc -v + + - name: Run pip-audit + uses: trailofbits/gh-action-pip-audit@v0.0.4 + with: + virtual-environment: /tmp/pip-audit-env From 63a154fbb03e7c9ad9d16405fc6d5fa5ea0bfe46 Mon Sep 17 00:00:00 2001 From: h00p30 <105890602+h00p30@users.noreply.github.com> Date: Mon, 25 Jul 2022 15:57:20 +0200 Subject: [PATCH 077/101] Remove unnecessary Check event (#1277) * fix typo in `--help` output for `--print` flag (#1149) * fix: #1275 Co-authored-by: Erick --- slither/__main__.py | 2 +- slither/tools/erc_conformance/erc/ercs.py | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/slither/__main__.py b/slither/__main__.py index c062dbf7c..f6f84feeb 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -315,7 +315,7 @@ def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-s group_printer.add_argument( "--print", - help="Comma-separated list fo contract information printers, " + help="Comma-separated list of contract information printers, " f"available printers: {', '.join(d.ARGUMENT for d in printer_classes)}", action="store", dest="printers_to_run", diff --git a/slither/tools/erc_conformance/erc/ercs.py b/slither/tools/erc_conformance/erc/ercs.py index 1c64dc4a7..afc9a698a 100644 --- a/slither/tools/erc_conformance/erc/ercs.py +++ b/slither/tools/erc_conformance/erc/ercs.py @@ -192,9 +192,10 @@ def generic_erc_checks(contract, erc_functions, erc_events, ret, explored=None): logger.info("## Check functions") for erc_function in erc_functions: _check_signature(erc_function, contract, ret) - logger.info("\n## Check events") - for erc_event in erc_events: - _check_events(erc_event, contract, ret) + if erc_events: + logger.info("\n## Check events") + for erc_event in erc_events: + _check_events(erc_event, contract, ret) logger.info("\n") From 98e6d8c13e5578544ba0396b1b331ee93559768e Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 25 Jul 2022 09:01:00 -0500 Subject: [PATCH 078/101] add support for enum max/min members, fix min member on elementary (#1276) --- slither/core/declarations/enum.py | 11 +++++++ .../core/solidity_types/type_information.py | 3 +- .../visitors/slithir/expression_to_slithir.py | 18 ++++++++--- .../minmax-0.6.8.sol-0.6.8-compact.zip | Bin 1672 -> 1861 bytes .../compile/minmax-0.6.8.sol-0.6.8-legacy.zip | Bin 1591 -> 1769 bytes .../minmax-0.6.8.sol-0.6.9-compact.zip | Bin 1644 -> 1839 bytes .../compile/minmax-0.6.8.sol-0.6.9-legacy.zip | Bin 1562 -> 1745 bytes .../minmax-0.6.8.sol-0.7.0-compact.zip | Bin 1592 -> 1792 bytes .../compile/minmax-0.6.8.sol-0.7.0-legacy.zip | Bin 1529 -> 1716 bytes .../minmax-0.6.8.sol-0.7.1-compact.zip | Bin 1592 -> 1794 bytes .../compile/minmax-0.6.8.sol-0.7.1-legacy.zip | Bin 1529 -> 1716 bytes .../minmax-0.6.8.sol-0.7.2-compact.zip | Bin 1594 -> 1796 bytes .../compile/minmax-0.6.8.sol-0.7.2-legacy.zip | Bin 1531 -> 1718 bytes .../minmax-0.6.8.sol-0.7.3-compact.zip | Bin 1589 -> 1795 bytes .../compile/minmax-0.6.8.sol-0.7.3-legacy.zip | Bin 1526 -> 1718 bytes .../minmax-0.6.8.sol-0.7.4-compact.zip | Bin 1594 -> 1792 bytes .../compile/minmax-0.6.8.sol-0.7.4-legacy.zip | Bin 1530 -> 1715 bytes .../minmax-0.6.8.sol-0.7.5-compact.zip | Bin 1590 -> 1791 bytes .../compile/minmax-0.6.8.sol-0.7.5-legacy.zip | Bin 1528 -> 1714 bytes .../minmax-0.6.8.sol-0.7.6-compact.zip | Bin 1591 -> 1794 bytes .../compile/minmax-0.6.8.sol-0.7.6-legacy.zip | Bin 1528 -> 1717 bytes .../minmax-0.6.8.sol-0.8.0-compact.zip | Bin 1593 -> 1796 bytes .../minmax-0.6.8.sol-0.8.1-compact.zip | Bin 1595 -> 1794 bytes .../minmax-0.6.8.sol-0.8.10-compact.zip | Bin 1610 -> 1834 bytes .../minmax-0.6.8.sol-0.8.11-compact.zip | Bin 1613 -> 1835 bytes .../minmax-0.6.8.sol-0.8.12-compact.zip | Bin 1613 -> 1835 bytes .../minmax-0.6.8.sol-0.8.2-compact.zip | Bin 1608 -> 1819 bytes .../minmax-0.6.8.sol-0.8.3-compact.zip | Bin 1607 -> 1819 bytes .../minmax-0.6.8.sol-0.8.4-compact.zip | Bin 1615 -> 1823 bytes .../minmax-0.6.8.sol-0.8.5-compact.zip | Bin 1623 -> 1825 bytes .../minmax-0.6.8.sol-0.8.6-compact.zip | Bin 1617 -> 1826 bytes .../minmax-0.6.8.sol-0.8.7-compact.zip | Bin 1621 -> 1828 bytes .../minmax-0.6.8.sol-0.8.8-compact.zip | Bin 1601 -> 1823 bytes .../minmax-0.6.8.sol-0.8.9-compact.zip | Bin 1619 -> 1835 bytes .../minmax-0.8.8.sol-0.8.10-compact.zip | Bin 0 -> 3684 bytes .../minmax-0.8.8.sol-0.8.11-compact.zip | Bin 0 -> 3684 bytes .../minmax-0.8.8.sol-0.8.12-compact.zip | Bin 0 -> 3683 bytes .../minmax-0.8.8.sol-0.8.13-compact.zip | Bin 0 -> 3685 bytes .../minmax-0.8.8.sol-0.8.14-compact.zip | Bin 0 -> 3686 bytes .../minmax-0.8.8.sol-0.8.15-compact.zip | Bin 0 -> 3684 bytes .../minmax-0.8.8.sol-0.8.8-compact.zip | Bin 0 -> 3688 bytes .../minmax-0.8.8.sol-0.8.9-compact.zip | Bin 0 -> 3686 bytes .../minmax-0.6.8.sol-0.6.8-compact.json | 4 +-- .../minmax-0.6.8.sol-0.6.8-legacy.json | 4 +-- .../minmax-0.6.8.sol-0.6.9-compact.json | 4 +-- .../minmax-0.6.8.sol-0.6.9-legacy.json | 4 +-- .../minmax-0.6.8.sol-0.7.0-compact.json | 4 +-- .../minmax-0.6.8.sol-0.7.0-legacy.json | 4 +-- .../minmax-0.6.8.sol-0.7.1-compact.json | 4 +-- .../minmax-0.6.8.sol-0.7.1-legacy.json | 4 +-- .../minmax-0.6.8.sol-0.7.2-compact.json | 4 +-- .../minmax-0.6.8.sol-0.7.2-legacy.json | 4 +-- .../minmax-0.6.8.sol-0.7.3-compact.json | 4 +-- .../minmax-0.6.8.sol-0.7.3-legacy.json | 4 +-- .../minmax-0.6.8.sol-0.7.4-compact.json | 4 +-- .../minmax-0.6.8.sol-0.7.4-legacy.json | 4 +-- .../minmax-0.6.8.sol-0.7.5-compact.json | 4 +-- .../minmax-0.6.8.sol-0.7.5-legacy.json | 4 +-- .../minmax-0.6.8.sol-0.7.6-compact.json | 4 +-- .../minmax-0.6.8.sol-0.7.6-legacy.json | 4 +-- .../minmax-0.6.8.sol-0.8.0-compact.json | 4 +-- .../minmax-0.6.8.sol-0.8.1-compact.json | 4 +-- .../minmax-0.6.8.sol-0.8.10-compact.json | 4 +-- .../minmax-0.6.8.sol-0.8.11-compact.json | 4 +-- .../minmax-0.6.8.sol-0.8.12-compact.json | 4 +-- .../minmax-0.6.8.sol-0.8.2-compact.json | 4 +-- .../minmax-0.6.8.sol-0.8.3-compact.json | 4 +-- .../minmax-0.6.8.sol-0.8.4-compact.json | 4 +-- .../minmax-0.6.8.sol-0.8.5-compact.json | 4 +-- .../minmax-0.6.8.sol-0.8.6-compact.json | 4 +-- .../minmax-0.6.8.sol-0.8.7-compact.json | 4 +-- .../minmax-0.6.8.sol-0.8.8-compact.json | 4 +-- .../minmax-0.6.8.sol-0.8.9-compact.json | 4 +-- .../minmax-0.8.8.sol-0.8.10-compact.json | 7 +++++ .../minmax-0.8.8.sol-0.8.11-compact.json | 7 +++++ .../minmax-0.8.8.sol-0.8.12-compact.json | 7 +++++ .../minmax-0.8.8.sol-0.8.13-compact.json | 7 +++++ .../minmax-0.8.8.sol-0.8.14-compact.json | 7 +++++ .../minmax-0.8.8.sol-0.8.15-compact.json | 7 +++++ .../minmax-0.8.8.sol-0.8.8-compact.json | 7 +++++ .../minmax-0.8.8.sol-0.8.9-compact.json | 7 +++++ tests/ast-parsing/minmax-0.6.8.sol | 12 +++++--- tests/ast-parsing/minmax-0.8.8.sol | 29 ++++++++++++++++++ tests/test_ast_parsing.py | 4 +++ 84 files changed, 154 insertions(+), 103 deletions(-) create mode 100644 tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.10-compact.zip create mode 100644 tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.11-compact.zip create mode 100644 tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.12-compact.zip create mode 100644 tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.8-compact.zip create mode 100644 tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.9-compact.zip create mode 100644 tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.10-compact.json create mode 100644 tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.11-compact.json create mode 100644 tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.12-compact.json create mode 100644 tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.8-compact.json create mode 100644 tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.9-compact.json create mode 100644 tests/ast-parsing/minmax-0.8.8.sol diff --git a/slither/core/declarations/enum.py b/slither/core/declarations/enum.py index 76a43dc4d..c53c1c38d 100644 --- a/slither/core/declarations/enum.py +++ b/slither/core/declarations/enum.py @@ -9,6 +9,9 @@ class Enum(SourceMapping): self._name = name self._canonical_name = canonical_name self._values = values + self._min = 0 + # The max value of an Enum is the index of the last element + self._max = len(values) - 1 @property def canonical_name(self) -> str: @@ -22,5 +25,13 @@ class Enum(SourceMapping): def values(self) -> List[str]: return self._values + @property + def min(self) -> int: + return self._min + + @property + def max(self) -> int: + return self._max + def __str__(self): return self.name diff --git a/slither/core/solidity_types/type_information.py b/slither/core/solidity_types/type_information.py index 0ede1f6d0..ccc84e8c1 100644 --- a/slither/core/solidity_types/type_information.py +++ b/slither/core/solidity_types/type_information.py @@ -13,8 +13,9 @@ class TypeInformation(Type): def __init__(self, c): # pylint: disable=import-outside-toplevel from slither.core.declarations.contract import Contract + from slither.core.declarations.enum import Enum - assert isinstance(c, (Contract, ElementaryType)) + assert isinstance(c, (Contract, ElementaryType, Enum)) super().__init__() self._type = c diff --git a/slither/visitors/slithir/expression_to_slithir.py b/slither/visitors/slithir/expression_to_slithir.py index 0029c29ed..3c4595b92 100644 --- a/slither/visitors/slithir/expression_to_slithir.py +++ b/slither/visitors/slithir/expression_to_slithir.py @@ -9,6 +9,7 @@ from slither.core.declarations import ( SolidityFunction, Contract, ) +from slither.core.declarations.enum import Enum from slither.core.expressions import ( AssignmentOperationType, UnaryOperationType, @@ -403,18 +404,25 @@ class ExpressionToSlithIR(ExpressionVisitor): assert len(expression.expression.arguments) == 1 val = TemporaryVariable(self._node) type_expression_found = expression.expression.arguments[0] - assert isinstance(type_expression_found, ElementaryTypeNameExpression) - type_found = type_expression_found.type - if expression.member_name == "min:": + if isinstance(type_expression_found, ElementaryTypeNameExpression): + type_found = type_expression_found.type + constant_type = type_found + else: + # type(enum).max/min + assert isinstance(type_expression_found, Identifier) + type_found = type_expression_found.value + assert isinstance(type_found, Enum) + constant_type = None + if expression.member_name == "min": op = Assignment( val, - Constant(str(type_found.min), type_found), + Constant(str(type_found.min), constant_type), type_found, ) else: op = Assignment( val, - Constant(str(type_found.max), type_found), + Constant(str(type_found.max), constant_type), type_found, ) self._result.append(op) diff --git a/tests/ast-parsing/compile/minmax-0.6.8.sol-0.6.8-compact.zip b/tests/ast-parsing/compile/minmax-0.6.8.sol-0.6.8-compact.zip index f7a88ba89f618bc7e7a2c856e9d431501c9dadea..212d4fc534f2721641f97b11c287aa222ec58946 100644 GIT binary patch delta 1738 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 diff --git a/tests/ast-parsing/compile/minmax-0.6.8.sol-0.6.8-legacy.zip b/tests/ast-parsing/compile/minmax-0.6.8.sol-0.6.8-legacy.zip index 7c6610e624f65c8c603062a945f777d83ded52fc..97a4c65a6bf1ec666f7e7e0cfd1e1536f0c4df0a 100644 GIT binary patch delta 1645 zcmV-z29o)=4CxIRP)h>@KL7#%4gi>Y=Trv%n^Qjq008MPkr+;YAJ=oe7BU~P+Jwj4 z=zZs9#Q1EOe;UGIJ<;{TF>VL7uvBzSm9Dw?WY-cyI(u@mdFej{l&N zR@~ZW>{YrE_gd+H^2@XN=#Tl`p0%|&(kD_})ag4e>)v9*2m>9ctEkbpi}tZc4QoPo zfE>#o+%4#K+v;QRY z{Jh}W7mO~E#$4Ra0B_caVMCBN%t=7>iI)ttZb1Y04?n#xiEy4eqzZ7vBtC<&E~)1S zx^qmMQg@Ai7-Hy8ih;9s`>!gYMM>+OD;rg`V4a3(deel;jnEvjRJZRNCCH1JkyC`O ze9WH!UQUuPd9ab^JJN5&7ZWNZp5WUL>P0FMEB@KITY6hEQ_Wz&NbmcVR&q460#V1Z zJ6;`ZNFdxqU)AGC)A{9Sdo?mfp%y;80K9GY>mVF|!RTQ`6*??Y||TQQL}!f*xgd=kbhhu#}B6`zECl8axMS_H`&oL@8adF-NfiN7_6rvvD(ggv44 zEI_4y1R@r}J_%%j8THAVre`U_$%;(My6xEn=_0K%n)IPX|W_Tn%^sUafe3j6*S;BIt2v`i^I~SRq=HI4de7(`gViDI@ z$tY_@uUOBoMlls(WJ6pR?+ej<|G6ECUR-Fu`xJWkN0cP50j zcksm_N33pogs5ZNc((FV4%u2>_rYDyIl1>DsV-olBe;qTrPXw&PkG>xE-u_H?e_k; zu=%U`oEc=5YVqN0EBwOOClnq6 z@}n($M7GX3q!5iCr2D-21G+2)eq50FSNpY(k8&AuaLj$+&)X26>n!rMsyYP5zi1qh zUO#w8leOTBPq$P79_4Yygh6WKix7wlsTxKk-0X zOUIX)jEmJn)O+RSUZtXU&d%g_nEj!YhaLB-wHoihid~W{4VtJ%RnaME z@~tbFim$w5Tu8#GD{eTGWIt-0uo?bfdH2uB>udao#DqxN{8Cm8;4 z+YGS1_sZyyx~aV(G_i`6~nF7#;GQ`*{&IL2LYsLbX8 z0iXBkcBzxg!dyPWTH*Ua=qXPJQYOPT_C?^u`peQ8FrXD^<&m8ISyW^E0Xi_m1y=vn rM57!~O928u13v%)01g0{d*@UJ{+m-j1^@u*FO%s7NCtrh00000yhJty delta 1473 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

gt(a}&tKlcs$xc{hbXC8BNK+f4d2V=TwQ+@ z=r83~bR4csPmI16K zZ3R4Hffy`{(ECNLzONehYa9o_5n+GX?1@(!=n_OQj;NmZ+U4fAD53Gg1WJjtbc21W;?T%JXK7@G25vAfo^a!{g#f!6_|=KMSaYHM zNfY2{Syx93M%fM2%(s31p*o&}+Te%(X)p``P)h*@KL7#%4gg?ta8$M(y#B%k004Ovkr+;YC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6>BKWR}a_II5nZ5d`mV~m0Fa)(=sU>Unec2j_k;3!Xe5X}K(M8Xd0P+|}F(SUR zS)rb*fRXerr4SW=%)eQL8dK2(?P!QRJ$-^yB4NfXl_#*B3w!bs9uGPVeR==bxHel^ zu(4cf2w*y$lc3vI26oDH6EkeHHod=~x$cvIsc_m{ke=lMG{+Np^wMDlu?b_hY=ngO z>B<{D%B{=M%_=hNSuYue`x|Q_vMTWhH6w}`nM4N5&BOYCGhk{5%7M+!k+7CwNkavD zre67VY1RXgMrdU;EK3R4C+Fv{$2V}1#ffi7IS7&e)ROZ~0-VkP(>l>+b%j#xmblGt zs?~Mh%U?cnZcNr_zdx#=--R!MwYR7FEvlEO)$hb1(Q1a!AXHrAjfFYLm2mfUGi{@f0tcK7@aSh*!o^a=W<$SRJOnHj%wLbO^1$q=xgr+w<(< zV4kOg{=*_NasK9UP2NoTcM0cfKGt(FHqcJ;YJo^2}QX0`(b zUcW$WuhG@iaT)%JCS1hzg!fHLh0PF}&dLDFDL)qS11+s6)HVh>1%oqkopwt$cDgYl zY~R2cywWs8s|#R<)ta3R_ab>#*pCFHF+Y{~c`nnE)jT(VR-;K0OGMI0MY2abX6Ux(C$#ytYEXMn{#Ul9)8*b=>cD!HW|U=OC74~lxrNZBg{)f6vMT& zYjDkp1>fB$6Y|7eNJ@jZ2tt>UBJL7Y8OCa!%Tmvn>pio87n5;8fJnpqYj!CyU9h)^ z3Wx2VR;Gqyr}Sn&rZR<6O?vgBEaqRoz7p$%jQ~N&r^SvpjvJximGb;{h)Y z0k~DltLpW=chNCdV0=oZeYec`^$I#pSYgJBB7a?PRHgPH zK61G5Luwdq071SL=H-K<(AMaVU7ocLpK6!F>=+H#Q3(h)=}d~Kg*_NsMO!AmVsR0F z-3X3-2Z=4sr)r4L*wHbQ=TaELp2>Bbh{?yZJkJ7Y<^Cg@tMvYxvF^qQkbPq%1Vui2 zk7=KA=`D?)q(Im`E4Re>{6SP@XBFP?q3$6ns z$iysCKScl1hkruQ1_F|Bx8R9!8?H~?x(V-*Q92xpbKX})DJGjO)`Cx!yYEUT*T`qT z2zcpxEV4{OVbLe|9BRZ)pkg2ctD6%FQ=Y+G(aT7Iqflw6H6>jFre+t^W8b36GEJBI zUeCzv4W+cvH81xb%?wW!Y;JIW7#gXCX({Ilg@7em+}6j?=#*%hkcgHl%b@fEo_<7(=xg`f0n1mU-@t`v9GvgODcKQ(O2$nOf1VaY1Ql zkSQd%*fM^nbz`Um2j;CGYs9h<-82~ogrX7SoBmzMMo>!u0zU&k00ICG0AO=)RJI+w V{=x+S0C^RY;RZ+s1O@;A000C+;y(ZY diff --git a/tests/ast-parsing/compile/minmax-0.6.8.sol-0.6.9-legacy.zip b/tests/ast-parsing/compile/minmax-0.6.8.sol-0.6.9-legacy.zip index 9aaebf2d6e4a8ac5f483dc4600af134a51383e7b..8689e5052ddfcaf611188c9aa11c3939f9e33c94 100644 GIT binary patch delta 1628 zcmV-i2BZ0!4ABi6P)h>@KL7#%4gi^Z=TxByn&u}4006)*001PD-32F+LL`45*K@rV zG9R(pgvZ?IedlGw_-vSe8p2>b(e=VHZU?onRCG<1uDSSR*AhcIdveQhH1+H*5khr8 zC6!XJl}0}c>yKt(j3+d+k!+_it{xs%`;R?8rNT#4=;pG&ZBvK5S#YjMw}#DtlH>Ok zv@IRhzqTDXo|y-PJk_(Pp-q2@EtEqY#Q~{AcDOll?HqAWmuB5++UsUV7PFgC7It-} z5|2jHpT~8CMl8N489H2KUedms)O5Xe5bGc(MK8)t**i4JWfYr1e+a<#vJ-`!;WsgT zTpnRi8z)f-?=r7WP1JN2o{ZW}I3wk0TZg|9FMAbIj3K-k&bXST<7*o&d4=Uphww$jlNTASyG zK;;Ct9-GT8lD2^GPv{HkXjHAY96>4WLDDTGm*AqLc9gOmQ6Fk1%Ww}p+N*(#R(Bol zwzz3a27}n`&-YS|S+jU7fF(D;V~rYuK6ezTH+i=#Zs|x}n#X^B8}V)n(zLiJ!J9{@ zxZp8Uz)`~0jw07wS4k)x#?iQ=%=R+yv(;ns z&_|Az_AL@B40VC><*NbC{0|5FHmQUFfVoc@gPVgmlhXNldpPJ4u?*c7j3~a6^`{$W z6NCqMIVpkZkxhSD%d}oiVtTTf5M_qb8AmqHeF1#7MYIwayC$&0ty|*>AaM5i5QIkU zHCQ>VLuE)>Co9scKWRxY<_?z7PhC|zoMSPW=za3}p*CsK);98j%{_m^q8+zHQn>7iMgnFeiH!{gb!;&UJgjoBt3TXapWn` z62I7s_XK}zw$20JoG=J0cN)XdN7#dy0~U@_e$S7sPer56$85bO^ubb0cWWidtn?

u0@2ZwYz&PQcE)GBBB20*a(3n6dvesw~(X+?IBmRvL1gN74(RbP)u%ur9@lCY##VOxD=SN7{h0pb<*Jf4?F!pnZ=8(rOW+t66JjJL5ShG zkRpfvloiVr=lniBLC{ZCA|3d2W1~9fKU7K|dSSK(oV~aF#F}IGGFYpv7zGGWUSJ=& z{DHS)+r9DAHG&;}U7t+cshCOD1cB|sOt^o=BaqUV`d0+VSWA3}KKjQ@ZfF#5U9tLM z#8+;;!h<5HHtyVN=uLFcJWuzsd95D?%nX%>22fZUzbP~qus zY^?gTHuvUe!Zs4OV*&mfAyg0; zmus~P?{JzeifkiFt{&49aQf!o6?zMAtr~_?5xycgO(;MrJ;q-gF{5LEx>qQDnG)g9 z5-kx!I3QC%rf32C$1F%4*X8{`afm7DISXp|;nlN#T>tYBjN?#C0Rle*KL7#%4gi^Z a=TxByn&u}4006)*lgtH325ANW0000D1{HDu delta 1451 zcmV;c1yuUc4VnxXP)h>@KL7#%4gg?ta8$jLDo1by004v(kr+;YC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6>BKWR}a_II5nZ5d`mV~m0Fa)(=sU>Unec2j_k;3!Xe5X}K(MF96%hxea#k>y5 zq>k68e25WcP>?WxZ71^1DBL*+h)$AY8X{d2!1B&DTyK`rC`)R5%zmWfAD9-_+F`JbKTm=X3(-N)h~H|o&E>~c>@2kHE4AWu z#iZc_MHb082X$j{?s{=uj^>`heA)L`_U$CKpGsqSESesiWv`ahUj&1XxvsS%~4r zeopi{Pq**_yl3B5I!quc$-{0Zvx9mgNa(jiS8kKDu;BAGh*Xp~<5=_OG;0d;8}aeD zpH*ucPTMlR#{y}`n8Fd{1gXHhlVUVckw_@La<|xjtAKCvY0cVJX!R?qxMUO>LL5t0 zKu}#ifxGq;r7*%aKHdcAI+2?H9hZaU@gMl#EM{Y(SH!O$f_UF~mP2sl=@dN1i8ffV zWpx$)Rle?)d6PQvAHtU=ml13D7Sk2znGgVofg$ZRU_5x2!0rDt5v#rh0Y zgl{;EY@wmgwm>4fKUQ8kmNpcG@AN|iP2Kf>6ENjAiTaUIHRrjAQ}QKcvrx=b+)tQ{ zMfs~#)3gZ3_M7N+={K85hN{0NU}prTfHU!1?8v8Orf?~E?i5dC9HD=QG zknwiJlxgDbaEV~9ScKm`9VXGdFrKkuPVoqp_x&HA`93UgiJvirqG2sYu_1ms*@FCk zr>KcnV$*P|ZZ%lske2$^d$pj9yTPM2+4r^sn%5}67X9cRwKx}O#6Bw&MY$KN5k`(3@xPk z`b9jWE1atRr7M~V)17nX_10rt^tGFRV$Gsoz$kFh2I76WrJL5?{5I;?V%`=Vx%J4*#o^_*K=KV_-8}{8{<|1z|Ia6j8QJJrzyDpMS`irw}gUE zUasdxL-IP+v%@FqrJE;iuTW9UTFxc7UhudI7o~aoDL#NGXXk8=dbu< z@u#yj+nmVo@Dq4j?w6&p#I&N{Pqj!5oONZ_fO}7L-xNW$ zhEHj+fY@V8$lK>QnH)v8Y5ZptrE{Z$|H7ZBR-9wJGQLU=XU+QoX7!q}QrrzHr~mMu z;<->u0Rle*KL7#%4gg?ta8$jLDo1by004v(001Na0000000000004lKk_I^jvIPJD F004#k$^ifX diff --git a/tests/ast-parsing/compile/minmax-0.6.8.sol-0.7.0-compact.zip b/tests/ast-parsing/compile/minmax-0.6.8.sol-0.7.0-compact.zip index 40c8f7ae188a294f01acb38d04e78bfcb1198889..110a18177edc6704b05bfcceaf543929f5ba098e 100644 GIT binary patch delta 1668 zcmV-~27CFq41f+8P)h>@KL7#%4gi^Z=TvI-FZ@;p007!Ekr+;YAJ=oe7BU~P+Jwj4 z=zZs9#Q1EOe;UGIJ<;{TF>VL7uvBzSm9Dw?WY-cyI(u@mK4;_LscFX+y*C#pXamxhZzYY=I5r&6(x6tHP;Igl{Cww1RIn z26i6;WwdnTGA~(hJ-g?-A#n*Ma^j`~11h0cc;q90Ig^p{2y30L_aOY@Fah> ztp)~vU|=oyD3z6GND^P5Sh~XPr&}18>Bv$D1FvlaeuBFC5T}yrJVn;yx zL{QvIJDsuf#}+2DHw*z+)Ec0K=>ey=X}V`@=GddHg#tJ?0;ti-$`^7^OJ^I$G44)| zw)Su|qLUCxAL1XQ(YQrzmEuPq9|MsgI@6_pO`1UH8y}6Qi855)c=v_Xj`85zZWfdP zu*W#OT_PNU3>0jd{4v3&07n)*JC19W zbLqtB#znhpD?wAQp4QKn_ItMtQ7n7`sW&{_LEg^7BRM$6y`vB)+4!XACzk>hxi^)6 z=)7!3ZC8;3%?LYhzmT4yw~udFW|tDzE=H6J6Dx{!!euq?fPy!%5mL5deO~w|ZBqeP zx^<5!KpNWPs=rez4{oCDPXep3BYv|Q2Fx=`Pz8e$oT<%H-Qq1W0jj#DFgd3w!JSp% zS-wqVz}ow@;St8V2sz`#2anPo=}7Ng>F8#Zvt*FPzGlW9-h7r z#E7E*;Ds8F;b)=KPK|jKR;7XWvDPNwpQ8-rl=B{){U#@%I?+~tDQ|%9YW+%o3zCYj zXuIgJzri2!JW!!sh~y{;H=sXr@!VO6-?+x?oKTiANc=|JG{hd(z#OBK z(YY{6ISmF@nIU6*3iM@#>y_<)U`?=R8GBy(d4J=&*C=+7mV37g!_ZK-ptq;h;KAO# zGmP^VTdL+1XoI;JVZ&S+`FL(Lba4jd9zIpT^>2_9B4sLo(CKinwT`aTAf?qX0F;lo zH>UlFTph$X*YLVY=#xX5N(B)crAep(x;iJ@wO&63ITEl4qi0xuV6FkHPs#0< zHM-M_o}oKkapFmLi<^Kp&9E~&%c$FEUak>tc*G#s&K4SPQ1;bF&?NobZd}ZT>!2`X znL+;k7N}8?h^6nX;1y4^7X`!xT(p1QHI7mgOVTvATW6%gVS-3r0aE^eSo|4w!XYd2 zLQHB{8Mi`V9daIafqJ-Dm@lR$>HZEA2^8q=-a5|n)Kt;bHKD_ef)hBnhxv@KL7#%4gg_ua8xcHXv>ZT004Iskr+;YC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6>BKWR}a_II5nZ5d=LcR1E!1m!y>!^)gAH#(Lf@wHjww7vt2WwGj+3E9b6 z4NsLHVp^;--h=Re(nqx@c1r{6Bw50MQ<)$c&B&w5vcHxKo%g-IY+Z8PT@L&*!oGM~ z2yDwO&{t{c3bb)00;Qrn*8nVreaW}xJI=5_Z+f0Ow=#$@k~Jf(dZyeC7l*+d;0l8) z_!ciiGHT+t4!Feycr$xvJgiCe)T-btPoaxh)J?|PPk^a^3(?3(dYtgm>GD$}E(*Y& zBq`BdapkM{O+%&AH=|F;EZ_yf&#%8xkx(8JU3O4vH{6rJJ$gcocH7BE5qelTCNXLBoxIvg?y%EHo`YLvGVKPiu6ulIiZe zzl;GE{&XmwQcVkp-(~D%gmXuHa~Au=*`kC(14`Ch@y05K!$~@JQO71T!5RBgd+D%o zwFBfx(Q4qeSd-zLKswvCV+irlw?vX#eQ;%ld%eF@dHXra|GzNvhi_dJM^lJ>+2XZqpcGP@!XQE&Ij^)T@@BiB!OYa&KK>WIBpoALe)rK6EtcHtg zQ;ly3^-|d^e298Y)R*HTOyV^Du4%m;AYAEAK7-;x+H%f42}-3zgT3OP@*fQh@XmIM zTvX|^$;yH4ae~*)mb7Hu|2w=wJf$`TlU&LdHBJJ zCH8AP#Q@RNRIP9eOlho}n%rNN-FDxLX@ehbQ^9Y*$n+AK%)g8m+zY%Ru(W?_uK2Ql zTfu#Pd|3ya{FPp%a!H6~)7e&QI{rf;uaPyK9G*->2EgUZ?B6ID4HE<5;`+lscfa5l zSPQOVWC$?IRH535>tv}E(;4PSxWPM~$@$J)-*9fIvR3Fvx zQs6d0CL4vp9+`7eC{R5Fd%db2gpIk2o_n{FW`pxrQU*>7j|zW^dA;7`&Qfa`&expt zQ>QO^M15dUL#_BoL;IN~#!}h@&6uxi!!eE=L}bR6D^4khna!@I9!*Rhqbg&67RD{! zXcU@!ss8#Bq{g}@PG-3cG&2W|w;hQINhzv!2r4ii>zGL9Ik!U16q?;^Ga)*8;@} zhd~u%JTP<>m!c1wi!X$6PhMYtkYwOTei;Je?rKghUWFxvi!K+ym!P6XcFizSzau4> z=K<1wh@TRrY70u}YwZLHU;v9xF3)AImuY$>cgt*Ty_wIE;eT78GpwR{xo3#?52-du zN!j75e6nR5&U9SlIFRob#R9FV=U;-*1~(M{LY+teP)h*#A0CyCVvIa;7&;@KL7#%4gi^Z=Ty4RUp@*3004R{001PDyagwbLL`45*K@rV zG9R(pgvZ?IedlGw_-vSe8p2>b(e=VHZU?onRCG<1uDSSR*AhcIdveQhH1+H*5khr8 zC6!XJl}0}c>yKt(j3+d+k!+_it{xgTZJl5-BCTEJGz)(!dVR?7*SD*sf++B>4=w}) zs;>EnzfyblyR&N?VnGYj8Crj}6^W-x;e?5$70oO$=0Ao{qyO=}xB%PVqO2wUTBLM| z^d6nTU^UTJorD{o-?}9to-}~}VIkp?6yr%Fu4Eh{zsnilTEj{vh0L@l7fFIO zi~9$P;o*moNd#yvJfAqE)0n~)0m}>KF765%$Um+fhSn#40Cp`uja)28_wg@!;QU01OK}C{{*TOFf7Gum} zyuPJ|F2sIEqgGvA`ENAdayBDU50G=QU(K{*;_ze*`%HgmBA(}pA*N-dC%MNO=goo7r549OpRj8hgKFP@h>e6n73I`|?cwD#Auy$VW=< zTXSlNr>;C5_6v0rmftnJ1}y|er$6fFxRJUu@$XmKXT>n1---H+p+0`8djwi_y$73E zQi7!QRUdy@Im6HO$8_EoFL&@Fa|=J_(^iS3eEtapTlvcr_5%9?9ZPDRL;u%AoSmA# zDhA%;)^DXR5dwJ4I>M;%KLsN{M4q_oBUXPpq>uPZC4=Q4O3k~;L>u2-!pCeccP9`I zpDgd37i#`~N}LZ7#IfR)=w}%oyU3=V1!DM`C|Q3QX~U6|RqED9FaEZq@Bn}ekJOW0 z{Fqv5D^aEU10)LuOutDhHm71T%O&MY4`k(T50t92K<8Dv-VxCn+4bjN(2XYK`@dr@kY9EQ@~Z3AG(vK1xpxZGokW8RmK|7u0em)>PI>;38%vhFvJW)kw4O1yPs>TIKv)_ zMLAx78@7D!31%&#v4fzWgP)h>@KL7#%4gg_ua8%95M$=CP005p7kr+;YC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6>BKWR}a_II5nZ5d=LcR1E!1m!y>!^)gAH#(Lf@wHjww7vtBa#yojEjz6D zi$|0(Vx2Ot654)$;s zq{LI3%GFJr71;}}nj&S;iw(BWps(KxlXV`C<`ad87M22W5l@QYImcx2U+Mv4MQ+8j zpnD8J&TbJTEqBYsLRw|4eR65l#DavtaEIH5#%iVYlP%bPJNt?So)&0iv@R9SZ#r1% zkF=Sf((>SckvZz7sttXe6Hrq*edFln%vc+Fq(j+!#W{6?=a!N94*> zgSt|s+b+Caf(n?q5@o)`EI4n_X`ms&($N?X^rmWb3C;e{MwN}*xdzY?#A*N-p?IQs zCfMqQsoj|GYf+Gc41?G>x6~o0Q|RM+PK1Wm$>sfj4YjEwtMMc_Z8(uJ-vY5j@7DF= zlBe|Z4mDb#FU5yQP8ewbHv$cnmsB+1c$1l;1h?ubU)`ZP+jlTw=3^yj*cxh=6zK&K z<~RD|HphOaeJYLF6gqngc*%|w@?nsC+bL;Y-kt5(4LQzWrZorGNF42QAn8^(H42ae z2|fRRF*wSjn%w2VrZ$geF_6Qs#72YQ#lf*bmxTnkZrl78P zl7Exo_fa(;j{ha!NbTX_)%64r)g2)hs8o^myq52ZmlEE{FIolH?d`wme1=$S$(Cf= zw%*^ngVl&08H01@GLV(G(dAH$mH)&rq*}Ir#E2$YwbA&^)4VP$r-X#g>=qqYJ|mwV zAkKf-aUPd5#OQx^{rdL=dR5NgL{tfLhe^RJPi8kz_|f?rTL zqTU+nraQq{JG)7U`S9{VQ0*|hZ67$m-v#GUG~y#>9V6b;=I z>duL>I5>)U?cEaclN8l(!Vfy!u_aJ{4{fh^)#1rD^loI2tN%U|_FVavT#Bbl?m_Bq zhLeDjRZ>mvYrUB!bJZG?$4~eO)ZH<}npCEn2KU(NeQt$#_G-EM_disyh6w`#;A5LC z6`>s>yLdxLx2az5td*556+@>af`YETK zydl*r-Yx{luMA^8RhJYniNkUx-G<0ZylPc8_3M4_{A+h#P1NVFd6GrfYI7}&S093n ztgthVcfJ%JT8`ZMcJc~*`4f{utW*>vF+flv2@t$L?kq{4{;$ZA98ymP<8zkufah)k z9%UCw7ZE|R(hXf+^}5$v@*-GI5;L)0aYDnIUcR|T`B#)XU`3D1@KL7#%4gi^Z=Ty~8K^RyD007!Ekr+;YAJ=oe7BU~P+Jwj4 z=zZs9#Q1EOe;UGIJ<;{TF>VL7uvBzSm9Dw?WY-cyI(u@m?w7-Kf-vL^e`kae`2j{02@R8TgKY=pU781 zs0VW^mXyOL_GP&fsC*MR8d}?vsjB}5x!hTu`T+HiFv=2t3gSsnmEu5}v|g+vmMvAc zO-v0|i+f-i&KEFGg%wFs>Ps-nC{$$_WbX{fTH|7Qhw@=!^RPDL@O~jd!zL1vwSFFZ zy5PYbAthTOTuQb;RL1_Prwhy!HVC&$a6kBsiBp8TV8SL7myQ)UAY&u3n{8PhN>u3f zYwy@$bn9AwQP6vB<2@oE*7MorDhN%Z_HI=jGs}Aje7KIZ2gZLK1@WYq2i(xuEkVG^ zUV%X5Rqoz8C^8gVgrjb%y{{I9#{|o7?hdk$FE5&Khq|wUIl}&hfRj)N7-l-Fr%$Xb znH2U^G;*d!&K@HxDwYfR9ZIrUV6L|km#XSU)-nEna?X6cmrvr)7s=*j-0#saQCBI8DFl`;&6ehJmO?F<2n-jDqKr4#U@vKlH- zFTFv3Z8TaekIU`x4C09qM_hRQJT25ID%e)2O7SXIe)O1(aG#~z>s{a-AA;4SB7nETlrb1=RL>In~#usB7jAgr8-OX zP74agSgr^hY#Khx9Tgi+u2T@n6X1_S^0;uzyW#X3MGVB0&@X~U-GDZ4?X7gdQ<cSK;!y5Fi{W=4R$%PuIu$| zcdEyk<4>A1?PRp~f368`>&bcV=_#CH{^7!4`;2@w5wx>(h86ylNU*)|T9UVLux`x3 z6p}e~fEo8~Ne;2cW+IHER{uGruWx#PThU>&Tp2P&UNcC;CN%v{8PnM4$-@8Ax@S~X zM~LUjz+=_ra1n(FaD!~&w~=od?ZxJfgPJUp0}G%7cM`;I>c7eR_b5W%kPze8q&7D7 z7L^|dg9o4w7$WE5^FP1SGX1W4u=K6DQ1b0BzHY@ceW-Ympe7nYAiTeml{ZI}1IgP1tS zRahVX4iRH!ANdNMC%$f`vakH|xu{n2K3uVsLs4XlaY+sTh=!EcJ&TZe*7qLvE{>3@ zi}w_7#&(?a)RfVGF&|G_v{kO1+q;0rYn3785FZ?};Jd^B7|qdZDt1*3)g*+i64pid zrXz`1D|}=F3!GbktV@DB1)_^Fm@fJM4N;;1P)h*@KL7#%4gg_ua8yRDIM0p+004Iskr+;YC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6>BKWR}a_II5nZ5d=S>_e9`g-%#6k~Fi-!$mlMb+X)Tjm$nw+hT_UP-07e zxo}eZj!DHQGyYP4Vf+jt^ACzwXgvl>>18|amsONbPK+*MdX7LNszD?If&MYX=?_c+ zB<&;1BerT`Hk(Jcz?$SH&Y^9J^+)x$>WGR*ZJ9N}4TOjSGuIR0< zJ%&{uTz;r(ZHJ{#1naXzhUw?+1+QRS6IY@N-sC?b8&27OJS--EW>E}1&f@}X)5p`I zNDz~Poo|*&BqtT#>_tTigo z>%8A1z#(^8q~6%IU7|3NC{+Ysrt-w6KlPjzFSO)YANMo3OOlKtBDLn*JwS2{FkB$N zpmZKG)ng%hSUb}*1W^)25_}QN7%K}sl!f^9jW3OV23lmo&j0ZfX8GD57}U@+i$MbCN{2l7a0J^WuReO0QcKBV13EaU#0n=p9^LJN<7bSLUv{mA(|)1s61t zmOONS^8dT(nZzY6dS=r`$p@zgxJaj0b3isAIo5}R*57$J>WguQH4`*A4+`ClhH-4< z4>qvm+6~;Pys; z!yvf6g!K|0S4l{W813fje{T$>nA7`lGmzi6P<^;a0Nj1SM+3>NQ7TUuDG2s+Oi2W*KRJ**S|w zh})XyOxm4#J_S4mh|XdWHFQzrk1snULeiprg)_XpJ=C@f(AuU+38*ZaDDL;&YY2%} zTzG6Rs0gFvWIO`8pDcqM$3*s6v*gsS^R~TsymWn`QgHdypwcZ2dUcnW(3&V@+sPiW zDZOhDI#vUODa%8w>uLbQcpZd)>Epi@s!ZkxGgkhVo?SuHG$tgQ7w#S;GHd}1`LP0Y z#(#!*6HX%nj0B2Qx2(t9g6pG9SPTg+&CAq#=`jm+!X}k+)w&rtDQj`PE-|RXT%)+X zkB$&q^?h(Q7xi-=Ouga!yiXznn>jHqh@`py?hgILP)h*@KL7#%4gi^Z=Tx*-;6e%p004R{001PDyagwbLL`45*K@rV zG9R(pgvZ?IedlGw_-vSe8p2>b(e=VHZU?onRCG<1uDSSR*AhcIdveQhH1+H*5khr8 zC6!XJl}0}c>yKt(j3+d+k!+_it{xgTZJlF~{EzqIHoNMFXdig2XBDhX6AqOsA~4Eh ztKYM4ec(NSlLVsEXw7Fz5&nO~7?vp6=Y8C;Sg@i-2J0h-tF$LSAx;v&{tr+40p*aH zQ0Y*+aijhro3u#;-_!R|Dr&OpjdvQ~*!~&F-s8nIXv8mxT0B5?!MS#e#Q6=^fERkt zYb%m4RZy)Wr=6J$+sPkHYu9*pY|O}##!!+epN$Btq_s7X8Z&Wa=aGNh?X;t=d5Trw zJ8@WPQmL)_9L_UxF$E zA<8nB%<2WC0vRV!Vmx4>gHKcMPk0Z<2*V0;CO&|sYk74{5(`Li;?vLoy04JVC+?#t z=r$~88UB5wyH7%xxIcf}fD2?9H^)MX{v!KD&_85m^IhlP4I1d;DalEpbD%(IEW>#9 z3|MKaQf%Zp{r`Rl~blP#nkQjA21up$2yp1#ODP1%)4I53btm{{?IgD zkSqQo3T~%FupSPGBP!TJQ>^jhrV6f@tM4?Qk}($KE0HhK-?D$4%6Ukper8g+aqeiE z&N*;wZ8Uzw3sJ$E)Kr*{BtIl+-dAcsW^Ax-n32Pm&9p<4Ej!Hlwr`pPcU5AP!r{)de}@VQ$@?75yq-d>3Xmb zK*-3lIA55%-b{bg#JbLs(IZ+p(^m@^wz#eneR7Mc7BvLw?R4v!=UE?~Q_Si8C=I}z z7$=?By~N)oB@+%beaN0A)k@|J6Y9Ps+Be0YI6m(-Ln~mD?|ZUnb0M0DT7ZlYdhZDU zDRGxC@&iiS;+PirY$n{p^k{ax!`mIuDNY{9jb=-_`1f-pU9>{7`u$C?;N>=Z3z zJ5jgQqydXh9las0h*%5H3G4{aPMP!@hB2i|cMO14*GAwyIsO56T; zm@eD85q=MQG>c&j!(};xB07uhUJB4d{^(+Bk>QfZ<1?apO9W;xlc|#kHQi9`_sPM? zv8i5k=gxnEc4NOI>p!eg=`iq(z&`g2sk5EE@x75d2A}Pn5@0C7+JkBoQFg#pO%H9U;mi{D{};KL!t5;9-U#ZQc7#pYw1B-;GHij&9e~ zTb>Z;0AHx;TVj@BnhYZEKxC`sd1m1lM>id?*G*}9Ue&Jp$6&`#6~6yXD-){?ud`Hk z*!6$UM@0&`S|*Lo?Ame&1iAiw^(~(Z#k+Iyy~E%krf{jXZRqaN0BB8AR)YSCdeWUhzFnn{igu6-fz-T_(P?WZer2sF< zc7ok_@>HOAoUSoqauWQ&j&asReG)u{&Np3J1RVRUtHhIR!e=c{S>2-G$o*2=VymD1 zP795A8qynXv!U2N+&%u)h~yn(qK+k-=zM*GY)aeZ`ayAZ<6SNjwb*)RTjhyWz8Zi0 zc2N3lQm_#F!d*V*5v5GHNP)h*1%&#v4fzWgP)h>@KL7#%4gg_ua8!gyhIdZ|005p7kr+;YC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6>BKWR}a_II5nZ5d=S>_e9`g-%#6k~Fi-!$mlMb+X)Tjm$n(TF64OwPKl_ z?C(FFphlL}937;8Jp zu+`mIWBbOodN;kDULrf)BI54hvQ0Tr()V8p``bsg;ATjF4}qe|c+9u1njv+tj*9Yz z*z{GRP^gTK(*2fLCzigclHofE0a5rc39oZis#O%LWR9$2$Ogvks}AX0oB87@NUov$ zdwFd%ezR1$E;xOf=>`M!Ai_!}cAk+ho6W-yJ- zV!{`QSDN6pCPsLE`Ad_IG} z=tz>)S*Ie=3UjbF@iXSw|R*S1u*4va3}w8;9XxiYu!<#Kzr zf3zv$NbyysusY|oNSzrY{oJ7AeyM>x-yL`sE;=xOI<3jqG0f%{qFiew_h*2aiIktj9{DS-MQ!m+KQg>>}3XgFC@9Krc>{6I0{qo(gdkDD4G; zf_IC0Bq@do(D+GNyc|k_rC+i>8cC$8@s;iyn~!*fb|B^wA5txtUN&r*lo{-@J7o!( z>4{5!!M>wM{=J4!P{!__;NSlS_^a=F^mF=fm#b&-rY4C2NZ(XO?rrZSsfpbj9obrV z+{>1NTG1^P-iuQSSubY90ggzY!`)iC#_W($G92o+O5>L>^uTf?-rWqK;ilh_eQ(rW zm7mVzw$op`nCauM)tvvEO?#1D3;M#U3kIftJmCm*Kq_2_qRL;D%l#t-84HI;^<%HD z$QDbqqf)lH{`xFn-LcG)0o#Vccs`JiDc1veorvl#|ti$CT;H8&=RS}g; zjtFaQe!IfG)WKDQ!Cxoa2b;Rgc6t~CLE@-Rb;!8SucnCQe=8YDi2Ey`GxCWbfIlSQ z(p@KL7#%4gi{a=Tvh5VvSk`007!E001PD{RJnHLL`45*K@rV zG9R(pgvZ?IedlGw_-vSe8p2>b(e=VHZU?onRCG<1uDSSR*AhcIdveQhH1+H*5khr8 zC6!XJl}0}c>yKt(j3+d+k!+_it{xgTZJlPy!iRmgePW2CHMK7luVtv1T%@AN`X~S< zI-K1fM4P+wIg3KCFeCRzIWT`LzWw|~Z0ae>3te7-^d8xDw{)U8r;i>x*)N_y^^_N$ zx(84%zELV2WEqcP?^vSz95D3h5SUk$a_hjlYl;KW{N!W?VQ>agZKu7QEp1gtI*O40 zRsm9uo~^^8&*?7KA}J*ox)J~Xl>ug^Dh?kKf5s@zfu|;eIMkzz!peU${^74rt=Xo7 zW5MaXp+s4l)PEc(b|hDOc1;G7@`gX`>+ehI7EQj|ypY%lNLXbI+bIT+BRhGBTRh~# z1&&)h@?~G4NSNiy8g65`FLl1v-Xm1;_PuMX#!ocKpEwt9nx{)!*{xO-csX>x8y+$= zrVK?q-^VZCoW~kOMtXk^=ZChLciksH7&K>Px|CFbd-g3*anIR*=yHcH$Og*~BhnKi zzX~t8@x||(=@eoq(_qyNpcBM-G2GUwk|`09-HiRN9V5ZId32Fh#3D1{T7?v#B+2tZ zdP-6~h?-7==@0?0mrTLS1^;BHT)S}(FUSN$3z>1xJixWf4!3_T;ixkl_nLD1&TfPW zn>$53*p>l~sMw;q`462$l>PJIw`(}WR1(-RWLkFItpf>}4mx?d@>CfeQE^b;Sa9s* zm?s<=NN#&}d`&Val7#UPl9n94gjN1-lveghPhED~yOs3-!al9#-&l=wMYkh6yzhE_*{TQ+PQQww@q>jZ|&!IPR)BAPMU?IYe? zIV8&A(yTSizr1X`nJdMJCGI_Z3*kDiNFda(-Xc9GwNo6JKGJQHeE>E9>U4XB%$qS} z>FbT&CJ;F0R+dc;hJ9`KR$_E5Cx1eF5Y6u)@^F)NhiQLOg=^WxRl)7f9obYO7E47_ zZ-!;&<%BO5n+fWJ$BGK0F#)MYB%k+9Cm#NPnQS@lbx)W83!e3-CQP%{8bPRf4BGtm zpVU%pt)#45U^5NKnmn}Rh&I)&tts@itRN%t28S>69*ok)q(x=$7{$)@h?HOWZ z4(>I9`MHA$?xpWi+)3uie&YBYwqi_MqPJR1+*k&($Lbr(V2-HvH!G2E#&r3z}7iD z%hqJ!8PD3r+v?l0HCB+P z8V-L6p*6>{m9iz~LX*`^EQ$vRzQuo4m+cuOiwL(x&+WomF|3f!Ca^D*>DUZr zCEvIpG3phoB`Y9o0O~CGj-70;VMD(mJVrEWebYS^Uk=&_Ci+=nfgx7>sTpE|@mzlf z_p%E%y?y<`i4xJ z4sBnoKolxQ8JU(}ER0=7VmHZhHo1@11s(g6a6ppe^5&S0zU&k00ICG0GfN} ZRC54gjami(0NOK?>;*^$oCW{@003WVD-r+z delta 1469 zcmV;u1w#6S4!R5&P)h>@KL7#%4gg_ua8wz@<4TYP004Iskr+;YC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6>BKWR}a_II5nZ5d=a3~{=Cf+i}5^%X9zF@4h(Ah$-BR2Cw_4Zs>Pq5>F& z7LTUv#WZ;`5JSa(f+wA* z>Uy{-V1+#;h0PFXy@(P6A}V$nb*q|6vw32jwA4#D7;^}JYHm9ql(%a57PIUet9vNE z2m9=#c3`n#N9Pd)x#+?b;r1gW0}cFs^cGc7KW5ohk^|15GbzEd0?t^R}Byz;CjFWF?K zt(&Vll_BzfAe9VK!^b&JdI$9j?p&Ck-tDWb7QzXP8!k2gB6XpkIXgQ6#Hmdx*{aTR=>Tn+oq|2RnIKJFhn5FBEu+F4lHj8TyLlmG#<-PgG(rOiVG9Z8YiB`P z7FVA>1FhAZN*ruhtYKkB2}W;Lc$X4Ox~GXjjs5X|Lv67i*URl~M-_NjM-OUbC>Go? z*BgtrquCa0ymdR9ma*kY(fCI*|JMGe?4IQeUce|Zhj4RklxhQ#7qW2bE6W?I|ArE0Q1mY$G!5B7;7r_(zBRMv@2bK9w=@s>G^Sy`~Zx8 zv-?zkKA_sNChRz&u~?tLog}6SC0A9$4rreYs*h-AN5qRpkYZ93xS*62I7b9OlIelW zLP|guNz+9z#9Wg{w#!MsoF|tS=#N>;!6o&7`x{Ch&ZbpN9_(xvUw{cW?$Qqt#s^A$ zBctoHa%eZ{NlLCa;;7cx!_z>EcTNew!R-)E8N(W#>o&|mrPTIEs48oz*Gx1BqHI#K zgXrq?>O7Y0t9PVphtY7^B}xc=+@|5HsLii)|9iAoc`it27XGyNam2u8Q7iyk$9^`OZsr^L*a*PE#_u+9eyRldBmq1oj6M^@onfcD7>7#_f}V1{hkzIxYS+{4YXY z>-ex_uu+vV%sWe1uoQN$_|;AHi4+La%nf<8_^+*%wZmGM>}bOv0Wu>lm&}RnThOf_ zovUrdq)mZ*9G%YI#dAX82)0z|j6D((Z| zzhc}sV^tuCzanCei(et+@F_Gt#RYuokuE=GOPPf9QX+E%u05-0W8}x0Vu7`PvST&J zDtpO)A&w0f@u#f`Y7@`&)mrHvk<(#{F0q#O7BTa`+M;R1!ub!I_eKi9dOn=Z8S%=4 zLm(*Kl(eq;%c(yRj@v|8vvfpYq?Ft0Rejn3f=m5vG#r_Fy}URxQZJ~TF;G(GLPY5t zRa~nT)Zrx%c5m-zZT+?-f&RdM)0m%x$5n8qc*mi+m3|D#zyuia)vA0Y`&%f|(_uOs zFECoXd;=-Sg&K{H^H;GrrhYOxXRkWO=9$%6rf!!G6R1`j7zxYT?qF^I4iffGOuZd@ zN8k=itYpnHIHtGO)%EqhLP#L}EscVJUXCh=ivRj}`Y2FK0Rle*KL7#|01g0Qb8u7{ X#N$ek1pokd6qB|FNCwgc00000%zeae diff --git a/tests/ast-parsing/compile/minmax-0.6.8.sol-0.7.2-legacy.zip b/tests/ast-parsing/compile/minmax-0.6.8.sol-0.7.2-legacy.zip index 29d5bc9c84932e142519131109f14c5f63e3c034..f3e120bc8eba0ede78f79ac01e0751493a5cd210 100644 GIT binary patch delta 1601 zcmV-H2EO_G3$_g#P)h>@KL7#%4gi{a=Tv}j!KDla004R{001PDz6B?dLL`45*K@rV zG9R(pgvZ?IedlGw_-vSe8p2>b(e=VHZU?onRCG<1uDSSR*AhcIdveQhH1+H*5khr8 zC6!XJl}0}c>yKt(j3+d+k!+_it{xgTZJlPy!iRmgePW2CHMK7luVtv1T%@AN`X~om z=tLcSxFPFXaU;{Eo8C(ou3CRZLN6<9C@1R&AHbZ{#Qvw?OV_2p&Fia5s^)pH4Bq6; zq%oKUf#dq%;>Zxm3Hzz{A}n=;$E`-F?&PV8a)+p8vesO|@u|E*V>$&-Q^?rYis_{H*gFa$T zPDyTn?;HpGRx={&d_{z5v16n1agX+y^RYa*9xp+y!cDDG3GA&FWfl7<&h`goeR#l# z*7qZckCpIE4ap4Ixxnc&qcSNpDvz?u{Bw1epU+3Mm_)3&4L2^zG^+tBCuWl)R3!c|Gy_4JuhpLLdmP%qN721M6R|-5D>nyw;?dikG=g z>OQ^_ASIB)B>l}q@%0UaHmxMRadmARYFQu6p(6dZE)8jhpcZ&=CE$1sJN*(s-j#|0 z$PzDpWGGqYS6FY=5row=`^K{8S#4%UhHl(oE^oY7^h4#}_rBXU@FT5Y_Bk6^q6)<8 z(JIp;yqHaFS(|^gekavUw>rZ*n3EtddI4YRQ=4%Dx8#)+)QY8tr<;rlK8oy1C-|J+Rdht_$(FqxZYG$ya`vQR)+Q(ZI9i~ zwsH`H>Bi>2i;RrEfbLGuc#<&`+@~Rur+_MSE1mPMX`X8jUTp9Q#pGI*2M5c z{-;7eGL`n(MKK!D930}Do2CE7ZPa>j&;)Pd;#8%>+wwNSQVRw$pyVOXmKs-6DgTC+ zuU#6G+Niqv%1z}~l*yguhiy$0gynxUa!b68`EhFuOzQSY2VN1=r~!5z1Q5`4Tr%&P zA+Ue2(={rZbDw&eU+&~zvWNQxB zyO8B?j@`@w%g~v|o$BCK>vBFo!8m0(ZAyETZ#ONpP5!f!mIg!k&Q{@8PJF<^raKc&rxyzcO-3Xw-gMX;v_Z6k0Wzpc%kHw!@KL7#%4gg_ua8&tWoXAlH005p7kr+;YC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6>BKWR}a_II5nZ5d=a3~{=Cf+i}5^%X9zF@4h(Ah$-BR2Cx2OFncYmSe7i zWuj)&@e2`qi!MQbn6=WT(^}@Xs|aJA>O&*Hwr$ZU@?d2m6! z8<+Q?_^C&95`(d9HdT=dTrF#@W1sndKI-CKbFqq(-^1%IDiMRB&fFXP{xrQTiY#Ys zZGghb8)!GF`_rVoAy36c}ThK7DQ$ z@CEH-Qfm!JF~G5p^ilgF-E?ZDqV?OK;32+$p6)kUoC0>?k=xdEFlXC<4Q^zt-uR{V z$vzO68T{A{Io2Dp1ZiS5nFl~4jg60~;09gJ4Jxi40Ka(T!6RlKxsQ6zsvVc`Ym5TUg;iA1?pgEznt#%5c9Q3R;+J(?--YgYLY%Lj5(ps6CPt?*|e*BF4dHOx+yy~ z_UO16lR7vT8>VUe;xyYvXRVw5308*z|LA5bJTPPt8Jc0>2M5G51@*K-guAR7gE9@Y zYtt1%!5E>hy2pPyJ>~E0gsu7vG#@t9_?Hj7=|x;s*GOa0uJDQ%SV2h|-7{7@(-1+y z8OHpOc0Slq)Z$(S?Fo2gV{o=n&Bm_r$ke6?j0aK+O0Hv05Q*}T&*$=diDNvSGymza zyxKNNS&W&4t(%BiV9RB}lbiqhokY)2O928u13v%)01g0Qb8uAoVVuZO1pok^6O(8L LNCuMy00000Cd9T7 diff --git a/tests/ast-parsing/compile/minmax-0.6.8.sol-0.7.3-compact.zip b/tests/ast-parsing/compile/minmax-0.6.8.sol-0.7.3-compact.zip index 2dbf4ac6f415f6bba26ed539ff2071a5cb26e1c0..4dce33e808f9818a1767887730f61c8a4180d135 100644 GIT binary patch delta 1671 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 G0000j$h1uW diff --git a/tests/ast-parsing/compile/minmax-0.6.8.sol-0.7.4-compact.zip b/tests/ast-parsing/compile/minmax-0.6.8.sol-0.7.4-compact.zip index 0d10f765b1f6424a82bbffd23245ffc31caff6f1..0dbba1f16fe6b5c4f43e9039bb6b8d4c8c4d920c 100644 GIT binary patch delta 1675 zcmV;626Xwl41f+BP)h>@KL7#%4gi{a=Tw1Cg-BKg007!E001PD{RJnHLL`45*K@rV zG9R(pgvZ?IedlGw_-vSe8p2>b(e=VHZU?onRCG<1uDSSR*AhcIdveQhH1+H*5khr8 zC6!XJl}0}c>yKt(j3+d+k!+_it{xgTZJli>#3vwj0`S3{sKJ$$Y7mN^z+$wxjypJb z91BT9-He`1VasA#c7CMHL)Cwp+=OJ(`A$qxlG~_jiG3{7m*C?L7N4PU6pHs;a5sAW z06pZ1^RN=5H2vq7@4*OOPJBcNr3L@^Yo%}9Qe}r;OCSI(?a5#RBl{7ayb!u3lpPPfbZ@x3&ZK|4exKi}{kch`r6@*c3$AHrp`w>98`Y!r4`` zlCg2tnBt=m(0Rd*IyB%|45>Y>RzG%>)zqVb?#=XYgGT(A) zt(sgO7S$kLfj?A=0r9+H9PU>egb6>P-DVs7)|}KPbS1i2Nq92tXSn-q4TwMn5!a8C ztue#MWUFd_$%wS^u2df_)k9YrzTfG8vZ-zeMBUo^qW%Us)K9&nRT@Z}U^cWg@=0q210C~Tj z=z(5IrPEm>$G$G!zhnTm2*Y!oiVg<2vqg%ssulYQZ^gG?(?<5OAc@SUy?&^JB{F)( zG0Wo6R3(2p^x%pIcwd0?+E7+DA@F{qT;$F4Y4f}%w_qio6`95wAFb1XT+FpjjoRE? zDhh}+Dh54{V(l)Y9+qQ?_@(RL7dIX9U+bJv0!i#x`vb!B84Z!41^7)?ILI0(v~pv} zZTQpUi(@12VE0F96QAMVz%tmz)InP*dU4FF1kZng_sLg4N$Sfo1^;7Q^IqG4GqDw1{g} zU6Frat+*lbR*Frn@~JUablxYS!09_|*?eFux03d4^<|;bl%4U?uA}Gh7)F>zpo&E{ z7%?%>uFU1$u4|O1Tp%csV|LYlrIvv2D;oRF9W0?5sI{Bp@=Vu8SIYQT@g14eAuoJ* zYW64rt)FJfqj)1Y6uBV`m+AR{Us%1UW)Xh|VZSnxZ}K|%R)*R>J?cPRJ;36K2rHr5 zp@cD3a#}+c4$(i@=c~x(@(|9`TvXXQBAPxB*NPv9Le{Nc3zF9T$<|5)({=IdzT4Ju zgLp)#B^dqzi7Y|kg4}r>5LYc>OTEUB<%m1bqDHffc$gQH1v*Hh5o?GwfonIS#)^MK z*E($BH1Ls_pd&_AD0nE=v5At>b& zwWWzNo`s*`X{;=$U~?5hdd0LFnD{i6AC%}<@YE*psRyz57A9OdPMnQ0W4VWlUiI1; zM0lvxbbd4SSHlLO62S`iaQx#?z)@KG*IoL$_B@#T(rp8hVPRwMg|$Tac3zvtRr+%s zcvQYkaNh7|_OoJ8m6T#Z>yN*E*V>nP+Mss9!TfA3F;GhZ0zU&k00ICG0GfN}RDn)~ VNLB^_0NOK?>;*^$m<9j<003dIIDP;C delta 1469 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 delta 1404 zcmV-?1%vvt4f+chP)h>@KL7#%4gg_ua8y21B}GsL005p7kr+;YC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6>BKWR}a_II5nZ5d=o8{z4;bkGF+(cce6KpsA1Ug;}ep5!ufc509SEz$c$ zD{u#}XvEw9#LYZ^K&FqSar*#`O*E8B6*8+!)&D32Yn)2c8Sx(@x_v4P!1;>w=G>j0&IX>&$tf3lz#~#Pq|Gq&W)4msV#bV$5 zT=T5+84>U8x>$v%C?TLgh6*cv249v0iOwpK5E>?sHmRf9TmQI0((a+?kNm`QH%-gO zfDD_CjWGt@aQx1j3=J3Y5AxUa?CVxbs&-F0PI(Ke5m?%6AqKjy(&cz3#cVGoUzNQ@ z29s!;#3)C9IQ{R~`b`8xlnXY*?*uF(_*sMZF*L=rCztJ|yKD0@$aN z;fKueI2*7)t6jH4qZN~F7IkNCv^s;wx0`o=MdyPl!NtM~(rNo6J_+VDrhGtE9SaNi zt7x9iE7*-85xEhoK;yOwF-CDapVEi5I=H6+JVD2QbiwAjo7Z9+d~oMp{PsjhAhFq( zq%50zqvk!Tz$JdEU*Xkpz@QmDIbd6K#k)r>0(J((w`E!oQ`ifYNrz-T*}IFoc7K!M zP3{KJ@zGSJmjR+sbWYhxOw$ZU$1AXN=6$mZTjh2?MX@qv0`dIo$JjesN#3W+VCw7J z6iTOmmNfM^zIfN4?oD2g&^Wz>k`#7_o^8r@CM)~eCkiNFl4Orn!(O9x^zs=Sfa0u? zUptkgy0(HO57#?qJj+$BL@!fA0iS^EF{j5MygsXihXFhfZ>}{;?j(!HwnS7F;Hh={ zV6u&sJ_~m0ZV4QyV>n*mpNAQpXSA|)-Ty*=Mls(1nkdXeT3soPJeX29da%8Q;aw^MH8P@;d7Z8%Bs7a{E%2Kt@g$QSb z|3r*6i4}udX)f1`o{1`PZ2^aDm<{SS^{Z0O#01MJRUOUD2TgOMZso& zk;SOp?)seH*&PIG`a%-r}mg9gaQi`y&q=PXx+K!LyR6k*}_p&R(V6={%qVQC^WWiKaCn!Aymd)$Y zx!W*eyScOh$pZjWs~cH9-Sej{BFtT_v(kxXaMzLKNfPRmc$|^!rXLfWRy3VKk)=rM zLo5+nr{z{4TV~n7sCEeC*B1Iv>DOGBrWJe?zy5x2;;`tD{8UPTsT2;LaYfWjz3EP_ zCPD`*m&{^Gm{X}yVDW%joc;JaGT=~40Rle*KL7#%4gg_ua8y21B}GsL005p7lVt`- K29gB;0001PjIFEy diff --git a/tests/ast-parsing/compile/minmax-0.6.8.sol-0.7.5-compact.zip b/tests/ast-parsing/compile/minmax-0.6.8.sol-0.7.5-compact.zip index fd8c2c3aecf88002e63520cad73225a33dc0fa98..74f16709c265f9fcf77a731c4325f561049492fa 100644 GIT binary patch delta 1667 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 Q+B1{s1xN;(1^@s604aJTkN^Mx delta 1466 zcmV;r1x5OT4z~;#P)h>@KL7#%4gg_ua8ygz*Kdsl004Iskr+;YC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6>BKWR}a_II5nZ5d=$kpHX~c0g&|w(L$>bG+f_?^x=+QKps?g4m1D^sind zV0spU+g0l%ykGo(UcHC}#>~~e!L3>qwriove4Us{(ERaD8W!?LJ_&_xu>&fqUP2X5 zBQ4q@eEKz{G=$^hD0_0~I~kEvE87UY!!4?I9P6ta4(Bm5xdl|Cz^!+XzH3`OJ-a(u z`BdzUZmekN)1bHPTC84dE~+&!8br6N)*Sq%@t{-%`DG-3`!yG5V>~Pkv*w)DkCl-^ zIW|%%&URk(ifxu`s-AUjx|y+78dPBV-=6?YR5j3eB?)2H<|AzIf8FYf;m3w5CISQUjx|Hskh8+3Ev<|t#S}+L$Zpr=a-0~m`=K+kyXVtK|p-jSt z=#~EYQPqc$q4fGBh}sH_KIaf;L?Xx>DX@SmIJnDybBCV@;$9%DaD)>E>kFeiV4Ek3 zpb7onPh6+^n}4%F5|PTBG8VgWP#;w@IGax#&w7&pkuuav0aS7lV2*Q0M;BF02c^i1 zhB^EiB68ZYj=S!hWH;eyC&Ta`xE$7HJ(Pv7_V9XPn)0+ z@056d6-mTsaeOon=(`&m8Po5Z7JB|d?Kdl+RS2cr9?4iX;8#NucFuH%M8ANxTaLzA z7w>#3L;21L3j(hI5gmjM&R2P8v z_A`ZuCf1Vvl%rfqI#k)FQVf>Ztri|fsjB7SiWnHqo|f@lCSTyoi=zMK*%ONE4CC<; z3j1Upr{Sd@9!DLQ>@9k=|8o~GxD+knDpKj4invf zp#g#VXB{LgePrg~Z*c1+)v_1%?1Zi(1j^pB=s|6w)lrk+Vpfj;o!N6o6<>pv!tJ^}*2T*mQKuCmP5oleU*q7!e zgd>CZ1mka#E0yHB(vX0eJy8&UgzNZ!*^=4JBQdX#w0To`c|Tkh*JFF8rcAe(PLys% zT_YmUM>HMhNR*(>wm$9Y&z0^P-C^xcTI{EOw$x{^-%S&#D0=y+6y5a<=A!Wb!_0o(pRj+yjE^Kxu9{rDhTUi-6 zT$@2K|H1un@iNhd9Ew?~c=*#kX!B&E6$&m7pe$@KL7#%4gi~b=TymLYFi5i004R{kr+;YAJ=oe7BU~P+Jwj4 z=zZs9#Q1EOe;UGIJ<;{TF>VL7uvBzSm9Dw?WY-cyI(u@m6Qth1hMPv*Kce5+5}Yxn)(rdp7!4K{*I;U&i0u>_pQaS=@FAwJ@%>^ppXL9`!2yk?nh*0D(HD&$2v>W5Ar#Nr_^(d1r0S=KFtK4Z zbcTyTr~In*EACSKWTo{SQ(k!cb7-m%gq2srHgzHJ*6^JRL&|8EZYb}O>N`xRa~Tw> zNF)JT{%ubW`JA`Q`n-{|6G?J5NtkOZhuel9`sV+_19D+?3@8ChU=(A)#l{rsUlIXl zX^DUYH+Iy2T^05iRYc3!jhm{pCQ*sb9oEjUnY`r2X35zC{*W83yoc1A6`aTZF$NFDHM~k6yd1j3r_8mN#lE z>YGh74muvzk7~)!W2IT4ZIsHW=;aY0fcVa{a=WvCaH#Iwel*T%m7biXX&HzaB7r`E zLxgb96C2|4CW|{w;W{U!KJ4cy=Jj_nk77#Cc3jwR;ob`Y+TPLEee$W&6KL)jU**Q_ zOmih6ef_FVtTIl*(JSwS$?uv|9Ms?5xY8KeQ81)vbqWGWQ|d)qO=sdbOS(Xf-fhq8 zlLFj-Ih~4`z6Bw|Dz!QL12b;hExy(G(N!MOO0UJWFy;JYRWOPC)3-@dD)RQ2d~dRa zGV>uzc=2np>}1TdvL78EWsX4OZuMc^k%28Ndc6Q_SqlgoAfa?9!ab@r{HM_?rB&-ihJ5>{M)YGk@YAR|DQ=rxsYF_2mafM8T)(R1oy7wgGL z=;|dC1i*kN=^-H(lCguBc|VdcjE2X|9szD}xbF9Zcn6g%O6!|N@D~$g#08@j^pv`P zsTj;f3i?V?g-~d^{*s7*;OD-?sV(IeEMq7V3I)z(H9AkFQlhs>EQZp1>AprbD!lCZ zM`ful@D|m;dBHKcz+QZS3Fo5U`?+L_phi!@cIjU<{?zOK`(bE~l_m~mY#wsgwG z=o#Iu@VrYL*iBZ9kksV&gJU@8e^GINHx}X2l*`*2CoQzR8P3v zQL)GghSycH^zUu_itr*na1W7B-(r9PL=gnwEL|6KFaCR-A(3}NbS0IW49+&UlBX229XtXt zUf+PXyi2Oo{f$g!H=*>mlEO69N#xw;$yG+BiuQ)cf4{;1z%{gp=-kyKO4oYY)iD1V zgBUd6)R@jZbLY%O_Gh<8Jj%pE&H3wx6AGxsabnLiF?3DdGN|=3;FHCF8!)?d%rRfW zx@bUm=&Yw4(XT|OIO&3rHRWLvh2ULd1(ohpYt}3)-`Xv4h0I>|bNQ*C{iB#c=%T@8 z7mS#xoUbJiXe0=Hig$NAs`f)$)qmM+U7PFo#G_pyOUrc$r$uX-37Hm|NWL(IfB(L< rU6@cy0Rle*KL7#%4gi}Cd*@WiWNKRr1^@thER(7QNCr&?00000ff5on delta 1402 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 delta 1468 zcmV;t1w;CT4!H~%P)h>@KL7#%4gg_ua8x!fZ#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6>BKWR}a_II5nZ5c~_YNB3ZC%ci)XK`x2Cb0BoB{Epb6azDRjbJAyc!`Rw=ENB zLgq75v_FTzb)WNpI(L%r7AidFp4@mz@ip=%#IaAlrjI{{*iHvP3*oSRLIb-Hw!l?; z1wPoi)T0CtMq%GoY2^t>{;4ywafzH%fXDE?Cewq#5=qz{Zm1a)yA-^#mX&}lYE@@8 zrxaE*nm-uW^-735%85j(?-CUp6>IGiw$wQVwfDkxSMnu)f(A=_V+_5e$BkvfG!!w1 zQ4BC{I^>e|pOv>(-Bf@G1a9qcyP9~lE2!J=;o)exbCLlHZFq&m067uw52>Azb6oSk z39gwqdc8SEj6;13l5^R};LpLEdrY#aUZ6gy$^Q;pDF)81g7J4~%z>D;3}L?=5c)E8 zk}fDqpL<4s^{HaPY|5m&KC;phSP6bou z%7(r5jxq{|!x^7Up$W)TLKG;%0{%%k6W*mU-Hp#4aRUmc*~e>G*6XeU?ZI;1?AH4) znZ;mpD>lasuwWF^?M^?ch=+Z=4uQYpzD*af`^77NT=jJb2{Y?*1>nQYIO2R^L_$bb zjpK=Ra)!~DC^nLu+ogJlJ^)-;U&orK$Mi+zy^cdLGFhnY*rhn18c6$9UI#tWECB8QrFoH*;Wi&I+Xv z2q6uBgpGnA1w1usMP@FAvad2Z9frMK3}flp&aNjBS;gzopJwBb>vu}tu9uP*jOg8J z>VXSLfG9&|1po;|R|?3o|J{g<62to7l zl?Z_p{KR>K2>54)INS{I=;^nrj+Q4Tky)63S3KPjW|^lkVEwG-y4T~R4^jd(u#0`& z@6v`4m@67w1l~Fm?F(b?Bm8n0>54IMQSHT*G1bUJR~$%Z3z8xP_-lfdfJp0cnk?fS zv)dg;g>!&-sLPnqWp-lhe=|Ldb^__J3k&|Q|GHh;^|4T)y2h+7E*vR; z&0pag^KMUsV?HbF%xVj=^yoZ9D2twgu)*#L$X?G~3G#+po;FFOIQFdUpbp6~r+%&v zL!eAEn^~3=ex4b|#;Ug$*(~qPHka112Vc3TgAU8$h~9};+2kuzjOv<@w$Y@8+$cbT zn-|Qh--&#C!=%U5I=$(-<+qgplvy`_d+JoNCiwH&)K|)B!5tfh_15ZxWR@M}<(YS5f65|O2DM$(I9`BTy#QN+{xN7K8)lQyFw0^yi|JqZ3`#3`> z*f5ksl6x5h0YU-(;ali1*x+l&Y+0H3yD6y)Z&dZ?-Cm5VdLI3hE9J;e8;qqK!;ARg zX_c|mHOcccw5!rfE^J ze*>X~F9k6KXcwb<-LvVGl#rq`DXhIbk=8hOVk9>o$p7gT+%1P{*K_W2h~y?6mdYPato4}Krva+{xUA*|0-+j}cWdos+6tobj|Mzcgd{9dP0zU&k00ICI4gg_ua8x!f W@KL7#%4gj2c=Tx&jN-bCh008JS001PD{skwILL`45*K@rV zG9R(pgvZ?IedlGw_-vSe8p2>b(e=VHZU?onRCG<1uDSSR*AhcIdveQhH1+H*5khr8 zC6!XJl}0}c>yKt(j3+d+k!+_it{wGjrIw?hr%CYobbbqDp36tPzj{mw1-KE;Jbl>D z#iZ#FA?2|3&S!jgDOfs<$0UDIw`=>!$LI|Qkls_9Xzq_UhCE2;SIAJF$1 z1>86G^OVJ*5ou^n{q&8(uc&bQ~HZImns%Xb(2>(06Y#RXn+d;Q5dmozF`W}D1Q9y8HLWFA# zXh2kNc61GCM&F@(kM26;E*GTi?f6yrc@(iLVU5N=*9j7bd60klPH7uVWc`2d**X(o zU6k-%I}3K2%}2{zTZ>5?>ql|_p+Q|AO3yf+Bd8sz`GT`q(P=1>qz3>|BUi`a!)W)@ zMrGVrgD5Xps%%R$_8@Tu=Z2XhqK(T>mm@tg>I5YY zoj~06TeZ1Jfd7+kk#!o-QX z^?2s;^>OB$k{LwP)&_no%qLS|il17+#$wBT_09N+r@ea93UGfg2ou9&{CK$_R)&#g zdJ)Ro15lei>X13Q^9d03Wf9a|<^WF;ZhJ%7lCcqYx46uw=y8VqScWL8KOsrAl{WE+0tpVz%<6vxPqF zKftLiMl^(=AQkK+MQ!d`!3+H4hMUgY5~ z^`<`;4}8HbkgjDv{dD@0XHX{&D)_)9v!0<1vy)#&TOp&h@}`$amO$g__ZRq|xzu_P4>snvFtRVm5eFLafQ;-1Uk|xKSz!leW(nVF7_? zJ`k)r*cE?WyUw@%|Ia%8HEJBwt0h|#9R#L-&Bn4AeblF5{0IuZXuG7;lp7uS&bkO} z^MoOxCIx>N!3-mO`?o2p@%$NTow%lPms5n*ZuQpL3OsCnx!`dHyN7->=&v@DT(@wq z5$XeSy|8gb5n4N*()NeNHPMID0h;hXqSI#QORcqvlD+kHjBUJN|kzitQME61qEfIlbNV@k7e#@}|;h$b>U4XGSmGnFgWrJjE| z3zqte1i$aKGCxWRS8&ZGC z8lzh(^h{@YUjM03EM-C#nhgU6XG4z8UkiZ^w;H#a1}bj^)C2}Ba}GR0L@FUrs};O3 z^8H{$I&c8c(j?RCmTc4_TvPV13#vjRQ!Qnz=Dz;$DZVt!+w5)^!!^9(U$c>4V>w*@ z-JyAvO0exG1Lv^VcB`0J=ars)Yt35V{6pG#XA4y+x_VOeZYYZa)PRU#wBgh`kZL6s zu^eVLl}9~bRgnx&!P$ZOfJ`#AIXz}$4A_`35o?G3hBp{cO928u13v%)01g10d*@WM XJxVQD1^@u)Gn4HFNCuh)000006U;QM delta 1470 zcmV;v1ws0P4!aB(P)h>@KL7#%4gg_ua8z5Jn@f=e004Iskr+;YC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6>BKWR}a_II5nZ5c~_YNDh6QC+bwuaSbEvB7^#vK_BPQ4vk5NSnv(IO%r3@pdK z#!!1(a8!=8Uw)~7hUY(x@Ge0`zrIzA75Ox3x^_DNY`W*VJC6eNV@<0WbN{AeY?1TQ z%In4N2*;UU(4G&xXjo*bmhNOY!8>O*1$8tM>2Vtr>Fg}9$D2E_z@y$hmbs0^&QL89{R zBrU>t{=*{OGj&fXY~C+LCOyqT8HT|2zji{fjE<3nA%)ir$TdAlc8mK%%Xh_snoCw$ zbpuZTD&9wb2m9vmvOu~aTe@ruc!}e|_+B#ieOUm)<8u2k&E<;(q6>@rY_x2z5MhR4 z8KEWQ@Jo5wxok5-PG;I)ifw@O8Xt1#)*B>ME4M zm1=O4gmry_)Vmk{mL`I5##M`->&e^NB(<$EOU;G`ftk9W>|J2NiFs!%mGyg+?o0<6 zF&chd%XFRsN1L?JA^wmHP|x!YRiP(7gjZVHK5$M-zSXE20OrR0fwSJYUn%R<7&kepU-GoAYt=_(AM@|?e^H!y_yFT$v)aKgwtB;{=n(Z96=G#h#^kCUK5~JFQ-M zx@G8_5C7DqFYrJhw8PSqqlQ0Lp`u*6dkS8E(syq=v&bJDIND}!OBS4M&=~X+^DWx@ zLR;n?I^H0;F-w~^CR>DgSl%9P!eGDJ=-1JFkn2g_=HF^y2Abkc2d(?a(pj?G z$)}xIXuIyr5Z86ZuNhHK*9+jsFpxEx%RbpmA_qWi+?tT*vfcV5?LcM*N)7t!px`|8 zc0QgK7bM?@%ebg@khCP&lhvuXC{JB~@&tAElG{0xA_XdQ96>k*t0?7Sx3|$5D%${G z;q5up%fQD8YKadgCHgMjx{&By=m=KqbFN%x$(QfDw zi`=Pw>j{-l(R)ErKm{N)Rl{2FvvDI+(tN5*$OKakr>+t6%oI@Yvw~?nDPfa;Rs0p? zlNx3#G1aksGHFTx{i^)2d=H6GEcz;7(o#`_HVN@kJS5iQGwg*)3gC53#?D^qT7FnU zVEyQ48@W@oj~ddaeLq3Qc+P(SQw|Y44Pg7LFRKE=kUd>Z~VV^Esj4aJ}Q6z@5rVgyb?SzCgd0H>9PiAsRL;CI6 zKHfI?!b5Oah&0hKRSLftt`xgopl;bpH@~h(z#%1Un{qJ0q_v@Om!BCeg4Tuc2N2Tt zxpr@@$(Y5vEiyrwlnkZuO;))?JIi=OOn(8?e}Vt>!1(A;O928u13v%~0ssyGVRLX) YTb-Lrkp%z%cNCMf21o|e1poj50D7m(X#fBK diff --git a/tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.10-compact.zip b/tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.10-compact.zip index f2cd5f3b890334a20125d9e003edee1bffb37f98..139bb5a727a8555fe5342fa33951a04c003d7601 100644 GIT binary patch delta 1718 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 diff --git a/tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.11-compact.zip b/tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.11-compact.zip index 9684a559686f20d3e7e1f1521c04ff692fb25712..ad793dde63b30918ac547c193f916351e37ed245 100644 GIT binary patch delta 1719 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 BQHcNm delta 1489 zcmV;?1upuV4#x}|P)h>@KL7#%4gg|va8%@oUTvKP006`k001PD-UcU;LL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2%xr$gMTkCtB$VDN92(FoG zxWL+R>|{8Dtic2#_^yd^==KPiz4}-84jnDyGG8a0lhz-+C4-jv#;2M`u5q)$CZ!+l zD>a$SA)b>cx!7)ji*cKs?Am{#gcR6)ASUw8eSg_-d@BFnj~!AlNHHSW1jCn+qmczj zNwjmOh@m2!AKeNWPR3ZIJoRS|*Y;E2kCAXYSfTUU58doTgH@X|TtYiZQT2o(G*KYI zC%q!Iu|`b-L)#QsFr6kPK^EP)sWe$`^ktTb1p&QG;%oaNI5m7&SA$5?D0Iy z$FBVEfaIdPS3YGVPj-L#j2s^mIuxQJzKGV$N4nwWF{MP|7k}uV%K^^)owk2~vz5yCW+RvFN?mV6Ro zkvX80CK=KXW-T8+3p5SY3bA`IFF6^Wz97-02Wb zd3s;1MC3~R&*F41`qMp7_||F^+i!cxB;4t61v(x~KXGm(Uy}6!jhNS-)aMB>G!bC!P^)?|SVpxt@@#)w^yZu4u_;#yEZxslYZny=?SCEtmzNmSU=WaTL>V1Xxj>IL(+Ut= zq06uJ;j(Rn&{%{vq>A?x%agv&%s-Z-P)z&sCoH$-U`b@6F!cp}$`p2Rhi9JxCG_}u z@8-OtbKp`-OF;X9pMO+#3kkGbtRGZ4cpVJe-+gIGo%Da4Hue*JA3G8se?xb_Y=eLE@fM3%=Q%QzLWOM z3i8tiBn8C?q7V%r9TIQd3bFlD>a-#aQw09!3=sYzfMSbg)UhwCIKdTcBw`>gTjwE< z>%lnLa6Nw|X9Kd@+9U5u|^L~{Y zd5ttTaC<7w(IdOYmmm+o>zfxdR8FpBZM{7&IqO=>Cs9YFM|Mf_pH7ae_#s>FA%VK` zQp~SF{^^={$80^&1R)nQ98}=CeDUFP?UJAm6{vsSa|zCR-$ci4>@b~4fnI0()sirh zciaK%K0qxFP6Kp`%Z-G68FOm@D@l1r-jBDZgXJC!<1{i6YCV%mn;0|PB)VTqcugF~ zPT`D|L4@_}>)HD($!)?gNw{F-la_{*6eavpT zA>)6Nj+NZN>@PgIJh1vkppIWZ<*_;9@XtTulsF%;3)oH95&#Ya%7G$-WdnnQB*sjM_* z+0A9IL}J~_8mDujZkl(c0|+^#vFACqbPn03mUE1#vhBn$Mcui$rn$Xc((%^x?t%GY ziM|V!G<3G r|Gk`0O928u13v%)01g0Rb8uATh+b`-1polV6qC&cNCw{p000004d2^` diff --git a/tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.4-compact.zip b/tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.4-compact.zip index c432b7ce9e9365747096aaa35b7e514e794329e5..f8a2a13f524f845c3e3129a59779297ed8e94d59 100644 GIT binary patch delta 1707 zcmV;c22}aa44)1dP)h>@KL7#%4gj2c=Tt`Mxs!DU006Tzkr+;YAJ=oe7BU~P+Jwj4 z=zZs9#Q1EOe;UGIJ<;{TF>VL7uvBzSm9Dw?WY-cyI(u@m>JEvp7u^88;w^LAi-Z0#P^q@Q z8!Ll#z<;Di3~uf0mLh}UTjoh2nt;|^-VZZ=S*=tl!_@}O|GzDiZ4^Gp)}Y#Ej;#)4 zj3_K@7fMsY$iG8ie4_L8mA=^!fP}|BXz7=Fb_%LNws~uR?lMtg2xVG@osX*Qayd%v z0ejkISxC`@F;-}laGNU0atB{Ub9xNfFw@9#+(3gC7#qTaneq^)PWkgUbznK5YP}=* zeKHfcgfE)jtxqeaD7pDs3NFYD2BmUO2`+*9@b=($kZc04CMzq(0OST`ypDr1+w!&2 zJH_l%zWOhJ8P}P#T)3w>cH{Qh)1i<{-{Qxy?EgvS*R!oRmqGfhOCgAIp@}%$V-D;* z`FO>`2tz9yGd-MGqj#l`ppwT+Z^vO^EYe0K+WbDRY2Ds->VULpxPUd$f#;M8_(bsz z<`=BOBNPhN{2FEAskM@ciXzuU%U9Wrr6O=f4wpQCe|9ZxZO-ttv;Ax^#*)2bM$zrN zDCa|&Q#g%^K{aawRX1x45bb?)80!S}H)9%u0?m45J`y~^s&({W_9)Rb9?vURD^maB zW9oG+bQ7f+-EH!ss1RM5=L&cVncc@VwHqm%VtUBiDT@d2x2XaZJhuj7G~#z*e8Z+V zvWDJ&ZOg#RTJrXaRB?3M9cbBE_2RQeH0gQH1ZCdV(L;4F>8RGr>>gdDWg@i*EfS`1 zS?ydk3motS`ey_B*+AFHt9O29L2sMQ z>b0*HPM2jdCmE%LWnx5DDFI3Y%c8jd)Da#qcl=hcDE*zk*&aL}ukpk2L{@fcw*zw( zj+P9RxXYbX#M9uVXv(^P6BdB>-cpPE4%XqLM*}m+r7fM7K0Ib+lE$u za528Mh9PD;5nbKv1BCwn%E>V2K=LdFBS(S>|A3cF;9&q*^oacX2jLaU?#<{Syo&Zn zbdrp{i0hLR`Huz-TB`^a#Mks8^h%{EX1RCCSJ`D3)#tdY)ciGhZek^{l2zLeuT6BR zOq4jy%4C*DWhs_Ks4Wr#F?^r2%5Z3Z$;mS09_ZgSN8h47y6{DBEU0GROdn-9NMR=D z(K?vI^bE*FLu<5}HprG|(v((aC*)$^B}legW2f^EbawC8o5T}>K+t*lxK7&13v<4o zTq4Eab&WABWGLjYL7rAkzdGEMpBmn++vRl*RbyI^BQ#2^1?IOtlf@UoM5SqrUrxIhW;dIqJ-+99!TKL@}onzdZT=@BF1YuJ#z z{|rD^08mQ-0zU&k00ICG0Gxa0R7U8zlXV6F0JAgz03-ka0001!2?jt0w*~+J006p` BKzslI delta 1490 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 diff --git a/tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.7-compact.zip b/tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.7-compact.zip index 1de597e91d75bb7bd366ccf405bbb1db4ebbee6e..36ab7e423d220cd5b8f1bdea65f14bea62f755a7 100644 GIT binary patch delta 1707 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 diff --git a/tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/minmax-0.6.8.sol-0.8.8-compact.zip index 692b7992f41ab63c532ec95fdd9aed73bbffe352..478dc6ac0a02673c23ba91680c652b18019fcd38 100644 GIT binary patch delta 1707 zcmV;c22}aM44)1dP)h>@KL7#%4gj5d=Twc8uB>$i005~okr+;YAJ=oe7BU~P+Jwj4 z=zZs9#Q1EOe;UGIJ<;{TF>VL7uvBzSm9Dw?WY-cyI(u@mYUP?k~A68{J^Qxe;+dcUpD1%;z+ zZVWYy$W{ZVm#Jreqd&7JHLq75)v@UmoBcm2WgMuQBB@hHpF)Wf018cf0%>kGjGrVz zN-5K6XymOEt=GVV;P|6ZLE@uRus&94>K7cxh-Q9^w$HSG60$ToyAy3Dow+ap&YpF| zEJ6R#!*Meknb8dh%C2t%?88vj+q}jgz8B1b*hQJYWHa+SBmU~;%GUCb_TC5yHC`$Y z_XvjYsem|*xzrQvq>{VDzRJPOEy~!8>-%&jq4qW!DnV0Eb&Te@RD;j~)ECMkm&Dx9 zdY?*Q#VqT8pSOk&Uv7V}cF)DZKT8HCzy}GjvQ|f1bHw>8lr4WGFJd3dL?{^`=0Feh zWU0V*N!n#Yt3ij_^>KBEd7Hko&E9U9ZUQ$jV=pggC5}&ksDrKa$;MPdF@5`YGq>Lh zG@V)jA_ukU3!3J>ij5n>#jVX>RS}OEhApq)Qs?-8)9(zYy$xrjuQHw4LOdRCApNH3$wpxDrl!0GZ`>)w~>a!)Ev;O0Ne2#kw6pw8YDdO5nnm}89 zmE_w!8=|a_jdUpV99{1K0hY0Kg{-|emHN^d*)r`e*o??ZrJdCfU5 zrmCTT?x)5fq5u6vJ%P5YSWmVgd<`kzC}&vjBMY0r;?7q5^3&-<%T%}~0LF9tUwYcM z;w5?hwAF%#>L(~0vEmf;RyAx5<%5|lihd5=r#+{6)$ngHPkaCXxnkfLqQr%nm+=%& zJ{Gd>et=X{xrc){ZirtBgM5+|W^Er$2U!|_=kB8cd=9ryWrOOC4g^RD>3(LMY>d(M z$0w}ryOlm*s2p2n#E@wi`S&LJ26n>mVMpxV2VNh4(&<}3P>rhhFb2;{j+UrTYSiSM z+#6ZL+k22u7wEZc7OG`g)sE`mKZmcUZ@ZLohzh10ILme!B%Y$zG$2bOL6Okhg9}uD z4pOeqAQlI7kTkWTa=M;0!jImAX1wBGRfQ}=JH9Pe$idGs;{pCkK5{wV?NNa1dy=i? z6kh;sJ@@OjKmpG*#1j@*wTSjJ-|v}lta9G^9U0_4F2p$rm&7j8c43ps45RimkuI0f zC}4?--Y^sCw@ks8?0k&8x0GSKGmeaZsBi_fy=Of1VKgYYo*O7Qg1)SObt(|19i{5Y z;3QfL1_3ZE+o0t4iS40IXId*1{;I<_gRsMuz%MlMMBeyjWxvMp9ab?+AXjB1z+92j zANl7(`Fg4qLgH}228$rRvK$Kgi)p-uE}%yUsEV>UNj#65zAFONcp&D-L-kO9#Txzl zi$J(yvjI@gvLA&>N<$Z7B^F^w--R>ctTlE3lCwP}8?Wl?b9*Oc@aV-A6rrv!R3xE} zc6-|0v=s;07>jn8dd3h2wQ`dC}d~?wC}LFkP|>eKpEuXw`@)#dg9ngGqfgKdFr4iS7Ww z%b}3}3_Leqb3Sm_Z8|G_Y((->Vb2+pPh3o&#H$r^hoMczctt)hP|g2;9nXpA^agyE z+kPx`xv}lHdpkuY4ivPOyGyhK$`8324Zoz*4KXf*>Od`Vz{HQXuxR=Xw?J%av^|Hq z!(oN$iOU%CqQ+N83wYX1^P?fPWAwjB3--;`m$pWw3{xzVa~d^uk0$ndptSV4a_vOn zUNN@KL7#%4gg|va8%}`i&~cj007Ywkr+;YC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6>BKWR}a_II5nZ5d*%MmCK$#HhS_H0noakUw=Q2O58?j!{vN9jrIU z4h615zR&H2O@A@5b4<;I8l2w|trS+*css&D9=`+amhjzwM-GLSsBMVct}dJ4;?{Hx zfd#F-jo%5^AHtHKnx1l0dB9_JeB}+clT#)_lJHbv^&#N` zU@?LWX!Ciuv4BwA@aZO~Z?o+%sh*XFSL?~6>SoHQ0Gml>aOKyKwfnp6CXN1wK;zN4 zJSD-#n6bUtnLvWX{$ADg8{g!vV#`8y-m!a4u5;~wfj7%-ud;NVbXT`r*WR`x1Rvw= z_V}@OH$(;@l`7&djp!HT2!KuAI!-Y<5X!4*^TAq{{##mDaj4*}5R;W?~k9VO~Af~Pa)fm0remue1KC;d4F zk$+sLAcjXNjGgag1ve|41fIaKlqBtc=r{4D;74D^G_eCAC3gbCH@8WEY*5@@2;gk9 zD}p#sfNP=HqM@}~;}L@0A!^(YiI2T99q1~5HZkyk7`O3`NS^$Yx&@=eAW9fg_WY9(WT;W-it?6D*E1Xk7LD2Jm zqs?Qlry4gULNukoqj2wAYucq^X>CJf;0k81`FDshN0jWq^-Jxs{;V65=y7_Xx&g849dOQS2t!;G>mFV|3VKN{T@xPse(B}1*+gd zf$K{WT*trZnZk`CyB;{gA!KV|og+wp>?}>gv7X7Dyg^_xDVn5zVF_Bpjl<+@hlVZ9 z;iuifM;2q^huYP|k|hc6i@|WT0{I;kEbJ1$2A6cU%SguVOpjS2%-loPJwRc+JcK-w z-8>WEC1Bhhlv_Su3`mhu=Dx`R#u_A}GLco$ibKTydFbbGY9I(K0}*SWR@ni6jYr&^ z*kf`xO$;zK6|O9dY~I`hemmeUIi~QufZxcElDKW-&74dl*GaQ+0@@bAqz;0~)+eJg z3vQl!5ZnR|fI&58p7Tm3t}nu}nV0X`yDhroCr$j@D&Vw^KxdY~wz(U91;sXN@^eFH z?sxG4K2}Y4dxv^(Ws{G{+LfYz(GPIfej+M14#MSU9y9M7DS+?w^ov@xuG;$h6w9<< zS=nk+EdUU?GjeEfY(|FBRh$0O@-YXz!2=R#kp2kbz$#6@KL7#%4gj5d=Tw+C;5UH=005*jkr+;YAJ=oe7BU~P+Jwj4 z=zZs9#Q1EOe;UGIJ<;{TF>VL7uvBzSm9Dw?WY-cyI(u@mjNs$kBemet5$tMl`w#)F^dOLDBb`bz zM2{x$OB07A&p;G^yu7iYt}#J%NWh2d`8~Q*Pav@xTUi6ay_5zs1nfNd2H(RJ+~#bC z)wbA+Ht0=>AwM$<(4Pe`hcE|u_k)UIy?$Hts$MJNGBuBWpC&o2c`S0EC+J|&=}=&} zR=T3#y6R@IWVpqrb>#yHCI;48g%Q^YLwZ}?x=r?To5Rk3(2zEtJ17%2qBWZX?yMNDrCt=MG3-;Zua#DZzH;)SRLiH(GWt|Lesd%J)0cpl092lh=dO8NF{K zOgDdvRje)0h|G(MA(ByRQ^^z*)WUB>8U~2)GS0*j%kIc-Nrp5$zARR_YR{kzG6cJ- zEnWcVJn4z&%{3sj`$@C~+L&UFxfIu-Ge4OplSt!#l@PgbX%%52EuX4xCz*1>8$Nrq zIPE1}_MWCNgI?=;M@IIwppOfavTvLiF_B?OR4Vbq0E?H_TUbDCNJ-3&rpe>#T@Q|aE!oS2jQ&)EqJ>=4I{VyD`XO_5ZnkQTw{xj)OjKXw)6QRpn z$G50|J!VS?m-jb`^d)3-0A8E}VI65c4;mi5KPvb`!Qd^N+3s{$lvS1|ROv0vxuhJz zSZF_kWI?^NYj$6=q?Wk=5ZiMH6D&Vl9*_*KqhV(%8(lWs$Q-(us@|7v$tvJ&{qbqN zzK(2g>+V)Q>^$<6Km8whon_KEBRm~o76oE|!Smc4-m@)LlPS~pmA{!RrcKY0`SSfs zp`{J*N296hy{`eUZ&ux3fs6j!z8!3e-nMd`?c42tUN{~SoKW663{Hl8vad~}1|`m_ z1Z+?&wdLdb_jdO;7 zOBEGSr*c>6oSE0_P!YFc^3Hf#1fueU2o4E}Kw?84qOpjpe6dGnuv5zhHSgR|M_8Px z@VEQ{l5IwW6#kM@TMUW*F)-l{e)?QrmA2@vA@Dr@qY+$1ru+W{bG;(sW+kKAiqVcL zhwz+qgeu=06JYX*va0c=td4ZDHMszP=O{buRc5-`@Y>j=55x5~W?$9Zu(QT8Tk;@t zD5aU@e_1=>A?1K9-QZmY3Xa%%+FVExt_RLf&-vuSZs;3TGV>*^mo52#YLn&}`=P@D zq$+u@flh1=iH;dsiI`xCmOn;5!b7y3KR8suNZ)UTPZs1U78Apd(cNg5w&BicvDh_`I%<3%w ztV`o0EiU-TiG|Ex>y0T0H?*_wpU!|15pC^&VT7UQqvu_Ym@E1yKavuI|%)P;fhc(<|qAMb50%LMuxyFcFG0d&Gq8!k67po+$VmJ zkGdO%_9F*kafT zdvj3Ib1q)W8YlsXt!-h`I@L$TzPP7V;o6b1tg|ohMjOL0gg-JlOja@5(zwqMs&-5& z+F3}cWm9uf?Q8c_{`qQabx=zI0zU&k00ICG0G)g1RG2s5H-QEO005*jlLZDy2Ezsb G0001o;6xb! delta 1501 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 lIRCx={srLwFBad zzyJKZuJ5@Io|EVJxvpDF74%3N00a;L#)G$YAy==DTc7{{cNPG^3;+OJ9o<|l19$?qY5m;NkA&V{YkX?cnHV%j@Lr?uP#e3@`%#!T7GZJ0Z{9@!{{UpvZ1F zN0y(ok#X8oFuEDKq=i!bvXB}(|0Upti>lG}QAboYU)jt& zm6Hhe8t@dpigqn)f(Wz6Y_rH`xKQ1GS3GpTr%sdE3^k25FhqJtICHRCj21zrmpmnZ z+2UXDFa(V{NfP_z7d>wyG@aq-Ta)cCxZN5gDd;MAq0GsmZ7pN#6PiyglSQV4tUEOL zD7))zP9ohwCSRE2ufl6h+Z$Plcbde(8UO9U3k=3sgXwF8)7x*t@^5`xvmx&Xmqp3T zvD?p=1)~w73M$T{!SialI{uem#sflkrGv4!j0?mVT4gsdRb%f1X&~&5wk)!Mn_zXo zb2v3Ls*Yh;@4ln#DSZ5oWkyCx##t@813w92Io8;9op0=fU)Ot5btIf4lZUVgVoEm62EPoS%u><~-J}`o)(01uc%FnT z&DX4EO~~&k_#_Gv^^pXMx34#1W-GvfAbLC{nmheit)@G7kz=+7<5V8OP7%-3#!zCS zz!Gh~5?6G1Prn;p1Fm>8L*lZ@s^Lr*j~WzlqO%#{;k!=KFJtnd*PaA-JAFs+v))yJ zva5Svh^7*xwwq{!GrmPbj9yNz_gX$(fu}sGPZ3sGo8**uVrVo6?uc8fp{OjV194mB zVq!yPdwl~HKCl_@I7|&Ag}yj+f10A0Za;K}$FtYRoqg;(FoXX*hh)_sgV9y)8{hcx zLQPRYDFoqlwaq+KdSiNV-zZ9`Z@Ffh-0zI}>vNigm{q8}IklKgj{k!aYi zuQTmzvf@CN#}2!}<~L>(fuX<&d$;Pvk@W$;%O9n9?pN?{w8PG&N0_9Z)MTLqbh8+2GhAxNz5N`#)Bo_@`FZNH`+q1(b z_-yZQ`kss@lg_ORfZnywL3nlPhbZ3sj3wqE3};FZ7&W;fMp&onp`B0HIut4|c4?$G z-<%HTZ*i?jf~q3|Td48QS*0(TxP2@ZV7cUzH0%@=nY+x2SBx{GZ;WJ3Xw>KnU*S;< z;|3@>^+Czgvr87A)6s4cF^Ivx{%*pP8It@bkS6~q#W`Y#M8AZ(8qgEMSG+^&2n<42 zphLEL?vW1BX>*pdQ#r;7Tzf>8a@w-zCBd;{DKaH+i7nRcnb*tsVZz3!9DP^gNMw&y ztfXVHNL9nz@8*H=u*Pl196hT*r^B%e4|ok`oxv1X>ZVWBkcTL&g;QUQCqdmP^IV`+rOVMJMH%K)zSa^Hyh7)z)mb zsd=KbKc4r-Zf~Ojs4rFHVu2fqu5~SvFkiQ}>5km8-96nC0BL>b2${vu$3Z&jzM{b94n}z{&Tx*rr>_&B?QkPKoHxX*xm$W=Pg<*e8vAwOsM(n zfz@R7pTq?efG#N$iQon0_F}z&VO|N3T3R4JUqzgRE5KDYBzbK`PUO_sYsh+@ne+?i zHN8VxDcW62sZ38C!JqNNo)b7^oNgz$0v7u-ajcA`iBtJxejxeqU2q^hJ`-T&2D*Ws zIvae7?*$W{R@y_ZHsTPpzCCm6aW~X!c<^4PDZjIF#{_fNkGNeH6?84nWi^E0&QWz1 zLUnRHuLuvT(VsKmP&AKHg3#6*hJ68l#N3MD_KHl?D(7%iaS5qWFu8<#x# zpe%|%V#IXHDf}iRjareX?`83STBlSMr3)0dF(iBArV$Z%UCf+CcrNpwdK`Y|zm^&u zEO{2aPY@)Qg__v;4%Q$<8EVYSUsnSqa?i-IV?W1xyu35pRg^Nnz1&vR>k1@zV92jq~KBZN0x59 zc&V4_rE7ee-X@5T2aIHng=g|qk?Li~Tc=u|8fzD3iWQ3mAzTGG1i#sW>p#Ilr#GTfCGdCG#dJ4T2%D= zX7gWZPHgn;bryUrK8 z=J0tJ78=&k(fFD2M#)CR;I2=losZv>?dUmAG>tot&aX?vOnXUv0?3u2rT`R}HKDEP z_+Yz=GjY^C8Pj_0Hm=Ke10eO#bsu|^B8q$yi}h<2Y+2a!z%aCMuLoB|C!5Li)cI}C#k@q5e*MEVkBL7b;IIp;8Angaoii(rbgWcW2PivspkyO!W$v( z3GPL;lm`=f!0^x>jiPRL)(nY>$+)D>{Xg;%P4RK}9C?q`oBrK4)uL_O0A<-hFZ7!* z02~%dDUbPj!wL=2p+eXet<$LO#B4r3XyN~4fp7dKUcUQRPJZ7OS zRQN-BTdLK83)-IU#zF=keZZdG^av?{(aGk zNseFRD&ci~UaECyN-m#-r!vo7CHDK_u?nb_{ZL&J7ZF}ULZVJwj}qy7mNLSeg- z>;Q{9zi9v4;axC-sGoUC+keXDoa@STJe$p(BoRCs8zrDZJL! zheZE#Jo2$3K8*wsQ}WVss)kuD&iUz$fj#sh?$1a1T1$sf*FO)X{Gwv}@0TtH_6LSU zKK1b+nkA>FX*$7#FVHJnUjL}-hF$62J z-j;1OxFcm_8Euc8Ks#!S` zZemxIBKB*=udJY=ESCXiA5iNkh*8i8e}}S>Y~&TF*mhgPzgEtxDRvO;S#J_ESMi&&o%%+ZRu4CSt=Soq)n(|)C;iUX7e k{dfEOD}eu>Fr5F?|KfsLs$j@}wm5&${@ZtdT@nEJKN1HE`v3p{ literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.12-compact.zip b/tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.12-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..6a8bb427859362480c0b8d9322c6644607afe474 GIT binary patch literal 3683 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..717a270942fdf49cd0cf636f06d1856b3dadf433 GIT binary patch literal 3686 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..02d59d00c67afce73be4d6f7a0bcd64c7871f603 GIT binary patch literal 3684 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.8-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..068aae413fa446a252371e6a11b9517b70aa2582 GIT binary patch literal 3688 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.9-compact.zip b/tests/ast-parsing/compile/minmax-0.8.8.sol-0.8.9-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..fe9073e031078c00b2ccec61d64d91e4706617e1 GIT binary patch literal 3686 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.6.8-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.6.8-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.6.8-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.6.8-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.6.8-legacy.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.6.8-legacy.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.6.8-legacy.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.6.8-legacy.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.6.9-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.6.9-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.6.9-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.6.9-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.6.9-legacy.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.6.9-legacy.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.6.9-legacy.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.6.9-legacy.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.0-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.0-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.0-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.0-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.0-legacy.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.0-legacy.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.0-legacy.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.0-legacy.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.1-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.1-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.1-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.1-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.1-legacy.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.1-legacy.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.1-legacy.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.1-legacy.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.2-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.2-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.2-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.2-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.2-legacy.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.2-legacy.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.2-legacy.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.2-legacy.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.3-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.3-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.3-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.3-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.3-legacy.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.3-legacy.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.3-legacy.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.3-legacy.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.4-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.4-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.4-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.4-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.4-legacy.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.4-legacy.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.4-legacy.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.4-legacy.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.5-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.5-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.5-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.5-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.5-legacy.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.5-legacy.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.5-legacy.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.5-legacy.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.6-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.6-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.6-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.6-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.6-legacy.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.6-legacy.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.6-legacy.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.7.6-legacy.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.0-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.0-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.0-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.0-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.1-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.1-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.1-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.1-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.10-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.10-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.10-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.10-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.11-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.11-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.11-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.11-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.12-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.12-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.12-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.12-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.2-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.2-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.2-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.2-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.3-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.3-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.3-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.3-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.4-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.4-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.4-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.4-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.5-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.5-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.5-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.5-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.6-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.6-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.6-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.6-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.7-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.7-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.7-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.7-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.8-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.8-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.8-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.8-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.9-compact.json b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.9-compact.json index 228af371a..5d52aa8ce 100644 --- a/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.9-compact.json +++ b/tests/ast-parsing/expected/minmax-0.6.8.sol-0.8.9-compact.json @@ -1,5 +1,3 @@ { - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } + "MinMax": {} } \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.10-compact.json b/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.10-compact.json new file mode 100644 index 000000000..d52d0b185 --- /dev/null +++ b/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.10-compact.json @@ -0,0 +1,7 @@ +{ + "MinMax": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "min()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "max()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.11-compact.json b/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.11-compact.json new file mode 100644 index 000000000..d52d0b185 --- /dev/null +++ b/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.11-compact.json @@ -0,0 +1,7 @@ +{ + "MinMax": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "min()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "max()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.12-compact.json b/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.12-compact.json new file mode 100644 index 000000000..d52d0b185 --- /dev/null +++ b/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.12-compact.json @@ -0,0 +1,7 @@ +{ + "MinMax": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "min()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "max()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.13-compact.json b/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.13-compact.json new file mode 100644 index 000000000..d52d0b185 --- /dev/null +++ b/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.13-compact.json @@ -0,0 +1,7 @@ +{ + "MinMax": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "min()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "max()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.14-compact.json b/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.14-compact.json new file mode 100644 index 000000000..d52d0b185 --- /dev/null +++ b/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.14-compact.json @@ -0,0 +1,7 @@ +{ + "MinMax": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "min()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "max()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.15-compact.json b/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.15-compact.json new file mode 100644 index 000000000..d52d0b185 --- /dev/null +++ b/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.15-compact.json @@ -0,0 +1,7 @@ +{ + "MinMax": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "min()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "max()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.8-compact.json b/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.8-compact.json new file mode 100644 index 000000000..d52d0b185 --- /dev/null +++ b/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.8-compact.json @@ -0,0 +1,7 @@ +{ + "MinMax": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "min()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "max()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.9-compact.json b/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.9-compact.json new file mode 100644 index 000000000..d52d0b185 --- /dev/null +++ b/tests/ast-parsing/expected/minmax-0.8.8.sol-0.8.9-compact.json @@ -0,0 +1,7 @@ +{ + "MinMax": { + "constructor()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", + "min()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "max()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/minmax-0.6.8.sol b/tests/ast-parsing/minmax-0.6.8.sol index cb22b7d9b..ba5a9e6a9 100644 --- a/tests/ast-parsing/minmax-0.6.8.sol +++ b/tests/ast-parsing/minmax-0.6.8.sol @@ -1,9 +1,13 @@ -contract C{ - function f() public{ - uint a = type(uint).max; +contract MinMax { + uint a = type(uint).max; + uint b = type(uint).min; - } + int constant c = type(int).max; + int constant d = type(int).min; + + uint8 immutable i =type(uint8).max; + uint8 immutable j = type(uint8).min; } diff --git a/tests/ast-parsing/minmax-0.8.8.sol b/tests/ast-parsing/minmax-0.8.8.sol new file mode 100644 index 000000000..dc2f26665 --- /dev/null +++ b/tests/ast-parsing/minmax-0.8.8.sol @@ -0,0 +1,29 @@ +enum Enum { A, B, C, D } + +contract MinMax { + uint a = type(uint).max; + uint b = type(uint).min; + uint c = uint(type(Enum).min); + uint d = uint(type(Enum).max); + + int constant e = type(int).max; + int constant f = type(int).min; + uint constant g = uint(type(Enum).max); + uint constant h = uint(type(Enum).min); + + uint8 immutable i; + uint8 immutable j; + uint immutable k; + uint immutable l; + + constructor() { + i = type(uint8).max; + j = type(uint8).min; + k = uint(type(Enum).max); + l = uint(type(Enum).min); + } + + function min() public returns(uint) { return uint(type(Enum).min); } + function max() public returns(uint) { return uint(type(Enum).max); } +} + diff --git a/tests/test_ast_parsing.py b/tests/test_ast_parsing.py index c255f06c3..62a604979 100644 --- a/tests/test_ast_parsing.py +++ b/tests/test_ast_parsing.py @@ -310,6 +310,10 @@ ALL_TESTS = [ "minmax-0.6.8.sol", make_version(6, 8, 9) + VERSIONS_07 + VERSIONS_08, ), + Test( + "minmax-0.8.8.sol", + make_version(8, 8, 15), + ), Test("dowhile-0.4.0.sol", VERSIONS_04), Test( "dowhile-0.4.5.sol", From 167b4c0394505770eb66fcd49fd64dd38ad7adbf Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 26 Jul 2022 02:50:41 -0500 Subject: [PATCH 079/101] handle tmp call to library's custom error (#1267) * handle tmp call to library's custom error --- slither/core/cfg/node.py | 4 ++-- slither/slithir/convert.py | 18 +++++++++++++++++- .../slither_compilation_unit_solc.py | 4 ++-- ...with_state_variable.sol-0.8.10-compact.zip | Bin 1935 -> 2487 bytes ...with_state_variable.sol-0.8.11-compact.zip | Bin 1938 -> 2489 bytes ...with_state_variable.sol-0.8.12-compact.zip | Bin 1938 -> 2486 bytes ..._with_state_variable.sol-0.8.4-compact.zip | Bin 1928 -> 2467 bytes ..._with_state_variable.sol-0.8.5-compact.zip | Bin 1928 -> 2471 bytes ..._with_state_variable.sol-0.8.6-compact.zip | Bin 1927 -> 2472 bytes ..._with_state_variable.sol-0.8.7-compact.zip | Bin 1930 -> 2472 bytes ..._with_state_variable.sol-0.8.8-compact.zip | Bin 1924 -> 2473 bytes ..._with_state_variable.sol-0.8.9-compact.zip | Bin 1934 -> 2490 bytes .../custom_error_with_state_variable.sol | 11 ++++++++++- ...ith_state_variable.sol-0.8.10-compact.json | 5 ++++- ...ith_state_variable.sol-0.8.11-compact.json | 5 ++++- ...ith_state_variable.sol-0.8.12-compact.json | 5 ++++- ...with_state_variable.sol-0.8.4-compact.json | 5 ++++- ...with_state_variable.sol-0.8.5-compact.json | 5 ++++- ...with_state_variable.sol-0.8.6-compact.json | 5 ++++- ...with_state_variable.sol-0.8.7-compact.json | 5 ++++- ...with_state_variable.sol-0.8.8-compact.json | 5 ++++- ...with_state_variable.sol-0.8.9-compact.json | 5 ++++- 22 files changed, 67 insertions(+), 15 deletions(-) diff --git a/slither/core/cfg/node.py b/slither/core/cfg/node.py index a031e5a6b..5a824491b 100644 --- a/slither/core/cfg/node.py +++ b/slither/core/cfg/node.py @@ -39,12 +39,11 @@ from slither.slithir.variables import ( TupleVariable, ) from slither.all_exceptions import SlitherException -from slither.core.declarations import Contract +from slither.core.declarations import Contract, Function from slither.core.expressions.expression import Expression if TYPE_CHECKING: - from slither.core.declarations import Function from slither.slithir.variables.variable import SlithIRVariable from slither.core.compilation_unit import SlitherCompilationUnit from slither.utils.type_helpers import ( @@ -917,6 +916,7 @@ class Node(SourceMapping, ChildFunction): # pylint: disable=too-many-public-met ) elif isinstance(ir, LibraryCall): assert isinstance(ir.destination, Contract) + assert isinstance(ir.function, Function) self._high_level_calls.append((ir.destination, ir.function)) self._library_calls.append((ir.destination, ir.function)) diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index 663d96abe..50090bc04 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -817,12 +817,28 @@ def extract_tmp_call(ins: TmpCall, contract: Optional[Contract]): # pylint: dis # lib L { event E()} # ... # emit L.E(); - if str(ins.ori.variable_right) in [f.name for f in ins.ori.variable_left.events]: + if str(ins.ori.variable_right) in ins.ori.variable_left.events_as_dict: eventcall = EventCall(ins.ori.variable_right) eventcall.set_expression(ins.expression) eventcall.call_id = ins.call_id return eventcall + # lib Lib { error Error()} ... revert Lib.Error() + if str(ins.ori.variable_right) in ins.ori.variable_left.custom_errors_as_dict: + custom_error = ins.ori.variable_left.custom_errors_as_dict[ + str(ins.ori.variable_right) + ] + assert isinstance( + custom_error, + CustomError, + ) + sol_function = SolidityCustomRevert(custom_error) + solidity_call = SolidityCall( + sol_function, ins.nbr_arguments, ins.lvalue, ins.type_call + ) + solidity_call.set_expression(ins.expression) + return solidity_call + libcall = LibraryCall( ins.ori.variable_left, ins.ori.variable_right, diff --git a/slither/solc_parsing/slither_compilation_unit_solc.py b/slither/solc_parsing/slither_compilation_unit_solc.py index b7a9d4467..a2813d6df 100644 --- a/slither/solc_parsing/slither_compilation_unit_solc.py +++ b/slither/solc_parsing/slither_compilation_unit_solc.py @@ -679,12 +679,12 @@ Please rename it, this name is reserved for Slither's internals""" for func in contract.functions + contract.modifiers: try: func.generate_slithir_and_analyze() - except AttributeError: + except AttributeError as e: # This can happens for example if there is a call to an interface # And the interface is redefined due to contract's name reuse # But the available version misses some functions self._underlying_contract_to_parser[contract].log_incorrect_parsing( - f"Impossible to generate IR for {contract.name}.{func.name}" + f"Impossible to generate IR for {contract.name}.{func.name}:\n {e}" ) contract.convert_expression_to_slithir_ssa() diff --git a/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.10-compact.zip b/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.10-compact.zip index 01047e8a48f9854f508f08b3b0e0bcf1b6b64cf8..e73171e2cd24ac0bddf3e084d8995bb87941a4d8 100644 GIT binary patch delta 2354 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 Y000000Du7i005If2T2Ay2><{90D&585C8xG delta 1772 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 H00000e3Nx4 delta 1775 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 E077(wTmS$7 delta 1775 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 delta 1765 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 delta 1765 zcmV@KL7#%4ghjba#V-5@BX$1002xKkr-lsC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6*+<%2#gfSO0ICXQN(SML9qbr9NuD{b z^#p)St2C=Jc(z{2EDM!2cM)r|4N|q8>}SPrZrr#GlBW+W$X_ON5NC_0ZPk6B&8l63)n(}HwfEd z;50!4++2IAidOl$(~l2BFFq7v#uuR*M*>Q=;Q?FmX10L_kQU<-Iu=dP%g&U3rb3`9 z9^M@;2c9Su^smK;?&bYc9E98P@ykzgr*O#>!&G&mCCeCp)H<#Lp3hznawl?sb1JtR z2E(ZTbXyO;{;hsV@~X_a-+jMsXQPZy#dNDXfo144$k9aEAvPb?lMKKQ%h6J`GOr^r z{;?OJ2e#8gy%vbzu?wX04!uj@QHUFnHjzMZrv$gQJm%5R2Qqf5F+8zRPZ^EINzDiJ zf!C^hWA9dfQ8wpbLipFvtS+zr$Zd17Hnwro0X6~SdL()MzUOwtGy3#XkX!=Ye-~G| z1l{rQTf=P6ba74_jOYn-*WpNS7jYvQ^FUbA8SMeSwj1ppWHgR1N6_lPRg~Im`;++4 zyodzCAYsVp9QGS8w|E{ry~=(n8|*R#8siizn$x9!A{i1;zi_s9?N6Y)eT~LhwgV)7 zsh1*abHuh1(z#jv=BgCY8EUL=|8DoJU^3R~UeRwb1${1GnhOFCdA5h{id6x@rp$*g{@pbwCtkM7Tx-~vp{_eID=TMb ze8r4ns!%r&57rotUk9aKDjJFcnEp6z6#D9xagQ7cNoiuA<00p72S&2WB@&mw>rX^$ z712=^yv>{2malVcVAXZlnE?tH?|+D1r^Y^i9kDM2sY4{TdD$Z&N6bCkY5QSXq~%Sq z?4dPRkVq{HJHEpwv~}LgyuA0e_)>!JTpQwZXPkdTn}sd1DC;Sn0Tjh+do=MpWi_2N zD(Z^QWD|z7lWN$6%AJo%Wc*n(e(ubE)e(JwwoW}X9oRAy0bP6~s<#J9P4SX73z6@C z3GL!=#pn*8eH=jzQFohm%6AYd+8peb$S;L&e`4TwAu)TI8JLZac?=l5Un$Y&tjH0z z?R40Nvceu%`G zb-ZY*sp;9B4(1o%5LbT8)}AUbHBG92w*+6Vz>la|mBJi-nBgyMPWa}IQ76`LNWuk= z*<}CCK*1-RQ|rSTO($aUGD!5TXmOQ1p>}*6ZG#i5ll+kA0mwk!+R$d?In2ZyrSw71 zO2PAuKYmzTq_^Lq_&~@eaebIaFPSWCEF28<_9&yPJ&5d|HdWgvslLSB%zHk60$uAr zK}aK+{o?~5SXo4k+HrH}u@ea-(N)o9OMHkSmEZtv z(P=OFRXv+c@fNu-JiaCxc)7lR96H_EdlhuIFCn;J-^cHGDoZ$@z*bjX#I%PN1H726 z;v~MAk5iiaK(+{nPtresBsyA3#Y`iZ@7uNtZLBS0@0*mFsx*~%;P}-fi~cw(4sDF9 zq_@%GaE|t;G=x;O*r65=M;-(f8pM*EJGmqeJ457e>%t>?XIovM?XIwYs0&A3wP}4W z$1}6hSeejL^1~|f=nhx*tg(p_K8&vsMw7yaVLJB!A-giEaZMmu{37_q^p32Tz|$O6 zD{*8U`Ovl&%qaFHAW!1@ViLP&h>^8DkY58MRZ%oYSUPA?)oj(StBmV1eDF1fRRwdv zLFku_lz!2<_Ue{xbY}*C@AWO3ho?0QPwI?)54W^Knkeu-OinE2^SW8)&HQeku3k2= zuoUoyC~U=Da9?CY1ynG#5L|6%60)QY6v&QiRx7z~PUb*k==@qp`)NB&m}E^}(VLEr z3ug;z_LNvvobPz!3(~fj6zm;LLzx@;n!P=iP#^SfNO(WGZqH9S4QF`EW&+%6`))A8 z5Z@?grX#iPE8qk$sGI-s`4pm1O928u13v%)01g0hPjXa;w(tJ71^@s|9g{@~Tm}pW H00000GnZH_ diff --git a/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.6-compact.zip b/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.6-compact.zip index 2018f2bc021b5451236d9bbde282998092432497..f01a2afb98b99db4657423efe8cf93ec3f8dd4b1 100644 GIT binary patch delta 2313 zcmV+k3HJ7f52zCuP)h>@KL7#%4geZt=2StYrYP13000{;kr-lsAJ=oe7BU~P+Jwj4 z=zZs9#Q1EOe;UGIJ<;{TF>VL7uvBzSm9Dw?WY*}Vi0td6p*3?k_mMLIO^?h9&#>bx zTnySXNQ!hQZ#V1a!(XyZjz*_+r`@b4g5ljr`Ek}=vXbXaYzD3fjwEm+aP<3A;IPK4 zEo~l;90Iz`gz)x%NEEV4SGEeqw3vBY0#3=cD6zrcZ5F}VLnD?up7-}9TNmGQfrF%> zYMHQQ9R|OC0EvaI#bRO)=hwQ%mp9Sp6iXBN|29j5g;VYY$*c1eA_Bu2NW4$CcBw0a zQq6@(c#gRKUJRMYH#N@@e)?S=*}*c#nO8BibG}OZ${~P%3mcQ{e78{0w+BY5@DX>r zPyhMit)-?1COzA)<;>Kz!qgzQ{ObH}i>$KBc5UJ0>__p)M z%SH(wwbZc--S@T}UgvjbqNhW~6wv7qTVD#hDPX^4shdxnWjN*vqu10*xMG3^qh^1 zZcdWP_-=EkQ_{?%h}C)!vb|FBRB#^6QN`US`oMSm#SLWj8g^6yvyMOu7Z1oV1=fE3 zS3cdjD(?iOoLlP?nT=mR65I69W6l8CP1m(joiS^FFF=Jz9BjfoB(CC>FoH1(Fn{*i zCi`F4ob4&vS&B#{XR?C{SuUWI^%}uZizyujS0B%p?pH4SO2S+imN%ZwgJl|^i|U*A zgw0dWdmBzn?ep@66UZBQOZdo;?#~v2ig3dU1{^&NDsc7=i~FGD^6v$lq+rDs-XSTT zVQ2w=(b~M2=j%;NI~6vPE5p+p*&-+XQB)M&u2@c|q>RGZ?rW2;ACGxjn8F%DTU8+!M3)Ay=d0+#u zb{M$=xjp6v@M z+yM2BBlhPdRRT&|+2ZbY&9CGy%~;UOvIqx>>ZYW-Q#k~-+)pX->7{UG@awK1UU-bO z;7TWlQ3UG%j?emUvc|F_l-ST4@h_2ohvxkxzrqh{;=43a_HnP7+^w0B;Q&- zsD!p1AGOOz?@_<2M@swWmeXc1+wJp8R5{d}t0n1b(B0$CqzPTxZdOnY5>c&#CIKmL z+lc?jNI1$d&{0?O0QFVn``zb0=R(V?cgZl~$E`Nnpkg&%$obyA#)3)9j+LW-LyQWh zBBNUbJO5nFwGk)S0;C%EYcf0A&WD>k+&KBppd-fFz~OE&m;e^#Iay>a&5%VZ_zJDZ zZY*sg+46U;J-sKaurJq)xyg}1+Wkjg3$5`s+RfFlDZQ=@NB@%Ba3q<-4LBqMcZt?z z+;3PQ!1_NUQS;nX7~g$AJlVH@=rf35_WL6EgqOR8n#* z?7NHj*`~z`Ru^?5m9sWZpk|4h`rCR>dU6Q*9yw0ifo`*@iw;`3>}J<#&r~>McqP{PHQWZJMi+= z3(hckgGJ$2(sXsL>}?%LbX%$FPt;0V4Os!pn`HeO+zOgrX3a%`KDK{r68u*4mX@mC z4L2qMl8ZuZMKgTdZsgO5Y402HQVa_i5)V5@ZBxXx@e?9_#-3j&1oVGiC=H%5yTrzZVqkH9SMz8{3yBYKs1%BNRVsdvjEL1cI z+}r*1;r^m7Y6M6OVQaQbc*xUj_69`n@B3heo5JEb5c!!QYSZNR{>J&32L^()w0}yd zGn(W|08yF2e|y9AZ_NBZMKUI@d+~$;hrz=!;*{87|C;?0R!YmBW(#us5b&%PHmRGDHVuT=t$$vl77V z)Zf>gK6s{U3zs^Z3UAl;{lo~qCoB05kLZq!{u0~WhtD{`H^jZoey1EQugm}MIl+5SO928u j13v%)01f~eWad;srKTv>2mk;ZEt4e&Tm~!&000005yger delta 1764 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 delta 1767 zcmV@KL7#%4ghjba#XAyi?+B1002xKkr-lsC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6*+<%2#gfSO0ICXQN(SML9qbr9NuD{b z^#p)St2C=Jc(z{2EDM!2cM)r|4N|%@A4amcc|9ILFMyn zoOJWJ*j4E+g1p;*{`z>q8>}SPrZrr#GlBW+W$X_ON5NC_0ZPk6B&8l63)n(}HwfEd z;50!4++2IAic`MN5waj0Bwmh!w1@_`z^!ZHg&TXevsSGvd^Tiki)zvSZ3=I>?g#QH zixXquL{zF6t-aCuTqkil(659n#30b#wusj4`M`3cV0w6eC3Jft+OA#?awl?sb1JtR z2E(ZTbXyO;{;koW7Lz&49SG4P2o(!7w)#X3K*Vf3^c1OwuM~BEOv>T(`eeiA-)uxo zVc3x;zJv#}a`p)hyFYB~*zms9zjtmKr?vzYt`iST0SR(@QAU)A$!CxH=?~?z_#iK} z=8X={nz>{iG9R?-^dZVE6o-B6z-)UqN65EhTYy&iI_G%q22yy= zrmYwTJ}hN$`#Jby@V~)J9^_|8)>Oh`t~ftx%zbcwGQZ(louBs7fCGh_$+etvG8|d)Neip`=Q7V zlc%o)W5{`d8S5ch67nZ$0IY#ao^0y~|D2aMn-LD&-;&zD>mTd{o6=REiau!XBk2I# z@iPv8OVc`0yRtn*_5fRAgox7#Z>g*#=T66pr||S;h(-L?D~_u~Pc5Zrfzp&h@a@`- zB&kY@ls(aD_1tDGpH%WU%Og6h8=%Y{#;BA1?HKcXki2Dby*G=W*CU8>H1w+hz;K!pM#VVw(pc`dM~EoKez z-Q=!J^ru!3m$mJ;ZlMfdbLK9f0RM^u9TeV-e=_NqJl%M%ik9{+YIYZ69)raKcT(V34Vkp!si;JM zCfGX>Oj2%EIUK_}f!gqlS@-92rHcU@K+OMEZDnzTz0{PH{<2^Jq=t%W`h}djkmgiP z>u41bVJ$kL-w7Jq*AXSMm_=GlZv8buY-zCAf;T@ z7;w^}YcC4!8|I@&K2-u`rcVs4p5U#5+}2s5ixLNB_`MiN-x~V^+%nLMUx}c9q~ia- z2YiTo6J2!OW-JLYrV`WTsQwCR5M~HGHw(RYp2*-jEqzmSIsywKMkgd!OoY^^Hr@Ml zb_{Oz8s${b;RMahnYxa)6CDDeayAUcwViMawEDYdXcn~c1h%b!?3wQlz|WTxlp0;# zzQX%ntOqN!O4pa`B*=4UEIZVHa3bLt0iMk=p6=(0?!!(#T*EqD{BvMQtDK6|1mab( z+B*F=Wx&>VQmPTi#+gnwa>G6e)lkignjJWubWlg3Bgh^4&t<@6mkorbi_rc>31He# zuH^QBVp@%&{%ck2G3x*j6LkqhzT3ix+^)u>MgTx*`IZ*a^+wUl(q}+_i6674__P9- z?{z6v2!iUikR0>xEBaFtGy;wL2+h*AyXwwuGOD)B!WEYQHn<(ic?Qu~5RXTUf4`Xv zYkb!{1JBX9|J~1v3@k>f?bi{KfOyKMa3gp(XqG#9PWk-;cFmDfJP)>$;1#)V;dFYM zYjdID4`~ze>fz!6e*1@i-Vu_!Xp6*5VGWzh8;nt}qhM(P#fNnLsN^m?%d zE|KyUZ$*#s(ERlMa&2C7krVzrF?h=9CAXPo1+rnA(u=R8imIy_?ViT_ubW97P5FU& z+R=RT#wDqr?hKsUML(ZaN@POD=xLN%US9Fgi;Q(Gp6aNARHx57HL^wrDLfm3mu_Rg z3g-69Mjjnp=x0HLtXz-_|H)yla!^YF0zU&k00ICG0CG=qRIDD0wzviW08AZ|MhRR7 J4hH}L005T#Z*%|v diff --git a/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/custom_error_with_state_variable.sol-0.8.8-compact.zip index 9db379a5843606d8388aca0fcef2fa8e285af447..f2792f8c65668f4922edd35a002b17e2bebeccb3 100644 GIT binary patch delta 2314 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 delta 1771 zcmV@KL7#%4ghjba#Spy55>F&000LZkr-lsC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6*+<%2#gfSO0ICXQN(SML9qbr9NuD{b z^#p)St2C=Jc(z{2EDM!2cM)r|4N|_&}?FKC9=7b!&#G4PWA7xO$~;=EPniuZaOUwI;Lx2*sp5FgO+gS6fRF`ee&24G1R zPV%i*oS9xFz;4wVD*Hi52aMg5WFEt4vKw+;~cs`f6fo0AfsoLLq0fk|s_g)k`^ zVJ=BmrUT0H1b{rZzuDSmTkg9bAn!6jzLX$$x>2!zr3ZCd_X1EpT=PSE0ImiM`E8n$ zS59s~6D9Km7J?QRao%kpmDI?_OjDC(kxg9_R5uP(>Q8G;4|&uIK4XBrx@5~I*l%b86VMG75d&d+j7fDeD_rh!TyjyZ3GNJrZP3lI zCJ#G*!HSJBo#DNiG?n)?+amf6Jtl>vKO@^y9Od(Ty`Hg0)Y>qPZg=kldgvrbqP=b? z!Zj5h5LW|fghV?>rSn{YIOX9XAW7x*E|431-!`_O0%qQGhY1d)UL=Q$Z649d>GnI&+ViUv@a(R222a#fAg$S04EGgQwjm^~#(RNpddi2)X4MB*L=k$+bd!$YG|8y{#7 zyABUpA-6i}I_eq5m-kn&eaS`l$0BkSWMQ9W-^Y}?slzTC?>?Z7{HE!!hcdA=-S>Ay7&x=wM-@>3R>nZ_r zC1dZ5HkKjDBB+yy?EEdC*<$i~3XHJHu*_eaA;=8DJG+OAC4<=eA9KRec~WtOHyT9| zLm@*<=%RFgzreOZ05uAAu{hR$FL}AhJ;@556o>14{qjq;kL!aElgG9Rw;mP-jP+rG zZ?SR=0g2Iu#?y4(_rS9lA)JJNLLU8e+c-U^SLvRTtL%7f>rrno;DSe-cq6;*$$;0F zi~Fz&SkqkVuL-6yh==G|PCBb#Llr<+2qu`Ekl6+$8Qd0Q{=6TdfGAdf4cMaUa^G~J zZg3WtJ{ZUeWcX;~E}Vl#eD0ebV%l?hgi2t)gYs$~1=LoG45rju$rMO#G%H84+ z)8L#Mp@}7Y9NkuKN%9JFV}xSVP1QdMUVhp* z5x>DGHU;6z&t+v6fmDl6adh-Jn;Nvcw<-xvuIKd|G4~To=1d|#?rlbMpv#Vj@CgZ5 ztX$PH*tYCrs{D2VRgumBMXSU!|J_YuU{Ff|0zU&k00ICG0CG=qR4kqk#k>Xp00$hC NSP5JP5(fYP007|wKPdnJ diff --git a/tests/ast-parsing/custom_error_with_state_variable.sol b/tests/ast-parsing/custom_error_with_state_variable.sol index 3c38202f4..b05c2ef60 100644 --- a/tests/ast-parsing/custom_error_with_state_variable.sol +++ b/tests/ast-parsing/custom_error_with_state_variable.sol @@ -9,5 +9,14 @@ error ErrorWithParam(uint256 value); uint256 constant ONE = 1; uint256 constant TWO = ONE + 1; function foo() pure { revert ErrorWithParam(0); } -contract Bar { } + +library CustomErrors { + error LibraryError(); +} + +contract Bar { + function baz() external { + revert CustomErrors.LibraryError(); + } +} diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.10-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.10-compact.json index 4355f9aef..34f391b5c 100644 --- a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.10-compact.json +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.10-compact.json @@ -1,3 +1,6 @@ { - "Bar": {} + "CustomErrors": {}, + "Bar": { + "baz()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } } \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.11-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.11-compact.json index 4355f9aef..34f391b5c 100644 --- a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.11-compact.json +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.11-compact.json @@ -1,3 +1,6 @@ { - "Bar": {} + "CustomErrors": {}, + "Bar": { + "baz()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } } \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.12-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.12-compact.json index 4355f9aef..34f391b5c 100644 --- a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.12-compact.json +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.12-compact.json @@ -1,3 +1,6 @@ { - "Bar": {} + "CustomErrors": {}, + "Bar": { + "baz()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } } \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.4-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.4-compact.json index 4355f9aef..34f391b5c 100644 --- a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.4-compact.json +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.4-compact.json @@ -1,3 +1,6 @@ { - "Bar": {} + "CustomErrors": {}, + "Bar": { + "baz()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } } \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.5-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.5-compact.json index 4355f9aef..34f391b5c 100644 --- a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.5-compact.json +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.5-compact.json @@ -1,3 +1,6 @@ { - "Bar": {} + "CustomErrors": {}, + "Bar": { + "baz()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } } \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.6-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.6-compact.json index 4355f9aef..34f391b5c 100644 --- a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.6-compact.json +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.6-compact.json @@ -1,3 +1,6 @@ { - "Bar": {} + "CustomErrors": {}, + "Bar": { + "baz()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } } \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.7-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.7-compact.json index 4355f9aef..34f391b5c 100644 --- a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.7-compact.json +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.7-compact.json @@ -1,3 +1,6 @@ { - "Bar": {} + "CustomErrors": {}, + "Bar": { + "baz()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } } \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.8-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.8-compact.json index 4355f9aef..34f391b5c 100644 --- a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.8-compact.json +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.8-compact.json @@ -1,3 +1,6 @@ { - "Bar": {} + "CustomErrors": {}, + "Bar": { + "baz()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } } \ No newline at end of file diff --git a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.9-compact.json b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.9-compact.json index 4355f9aef..34f391b5c 100644 --- a/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.9-compact.json +++ b/tests/ast-parsing/expected/custom_error_with_state_variable.sol-0.8.9-compact.json @@ -1,3 +1,6 @@ { - "Bar": {} + "CustomErrors": {}, + "Bar": { + "baz()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } } \ No newline at end of file From 6971f3005d2d8b060e3601d95a6c6983b0c94f4e Mon Sep 17 00:00:00 2001 From: Kyle Baker Date: Tue, 26 Jul 2022 01:54:34 -0600 Subject: [PATCH 080/101] replace-initialize (#1239) --- slither/detectors/statements/unprotected_upgradeable.py | 2 +- slither/tools/upgradeability/checks/initialization.py | 6 +++--- .../detectors/uninitialized-state/0.4.25/uninitialized.sol | 6 +++--- .../detectors/uninitialized-state/0.5.16/uninitialized.sol | 6 +++--- .../detectors/uninitialized-state/0.6.11/uninitialized.sol | 6 +++--- tests/detectors/uninitialized-state/0.7.6/uninitialized.sol | 6 +++--- .../0.4.25/Buggy.sol.0.4.25.UnprotectedUpgradeable.json | 4 ++-- .../0.5.16/Buggy.sol.0.5.16.UnprotectedUpgradeable.json | 4 ++-- .../0.6.11/Buggy.sol.0.6.11.UnprotectedUpgradeable.json | 4 ++-- .../0.7.6/Buggy.sol.0.7.6.UnprotectedUpgradeable.json | 4 ++-- 10 files changed, 24 insertions(+), 24 deletions(-) diff --git a/slither/detectors/statements/unprotected_upgradeable.py b/slither/detectors/statements/unprotected_upgradeable.py index f39eb31a4..89abaa34b 100644 --- a/slither/detectors/statements/unprotected_upgradeable.py +++ b/slither/detectors/statements/unprotected_upgradeable.py @@ -102,7 +102,7 @@ class UnprotectedUpgradeable(AbstractDetector): info = ( [ contract, - " is an upgradeable contract that does not protect its initiliaze functions: ", + " is an upgradeable contract that does not protect its initialize functions: ", ] + initialize_functions + [ diff --git a/slither/tools/upgradeability/checks/initialization.py b/slither/tools/upgradeability/checks/initialization.py index d8f6876ef..2055a322a 100644 --- a/slither/tools/upgradeability/checks/initialization.py +++ b/slither/tools/upgradeability/checks/initialization.py @@ -15,7 +15,7 @@ class MultipleInitTarget(Exception): pass -def _has_initiliaze_modifier(function: Function): +def _has_initialize_modifier(function: Function): if not function.modifiers: return False return any((m.name == "initializer") for m in function.modifiers) @@ -25,7 +25,7 @@ def _get_initialize_functions(contract): return [ f for f in contract.functions - if (f.name == "initialize" or _has_initiliaze_modifier(f)) and f.is_implemented + if (f.name == "initialize" or _has_initialize_modifier(f)) and f.is_implemented ] @@ -313,7 +313,7 @@ contract DerivedDerived is Derived{ } ``` -`Base.initialize(uint)` is called two times in `DerivedDerived.initiliaze` execution, leading to a potential corruption. +`Base.initialize(uint)` is called two times in `DerivedDerived.initialize` execution, leading to a potential corruption. """ # endregion wiki_exploit_scenario diff --git a/tests/detectors/uninitialized-state/0.4.25/uninitialized.sol b/tests/detectors/uninitialized-state/0.4.25/uninitialized.sol index 26b4c9110..de0e9a7f7 100644 --- a/tests/detectors/uninitialized-state/0.4.25/uninitialized.sol +++ b/tests/detectors/uninitialized-state/0.4.25/uninitialized.sol @@ -43,16 +43,16 @@ contract Test2 { using Lib for Lib.MyStruct; Lib.MyStruct st; - Lib.MyStruct stInitiliazed; + Lib.MyStruct stinitialized; uint v; // v is used as parameter of the lib, but is never init function init(){ - stInitiliazed.set(v); + stinitialized.set(v); } function use(){ // random operation to use the structure - require(st.val == stInitiliazed.val); + require(st.val == stinitialized.val); } } diff --git a/tests/detectors/uninitialized-state/0.5.16/uninitialized.sol b/tests/detectors/uninitialized-state/0.5.16/uninitialized.sol index 7b5fbb5d9..209b28591 100644 --- a/tests/detectors/uninitialized-state/0.5.16/uninitialized.sol +++ b/tests/detectors/uninitialized-state/0.5.16/uninitialized.sol @@ -43,16 +43,16 @@ contract Test2 { using Lib for Lib.MyStruct; Lib.MyStruct st; - Lib.MyStruct stInitiliazed; + Lib.MyStruct stinitialized; uint v; // v is used as parameter of the lib, but is never init function init() public{ - stInitiliazed.set(v); + stinitialized.set(v); } function use() view public{ // random operation to use the structure - require(st.val == stInitiliazed.val); + require(st.val == stinitialized.val); } } diff --git a/tests/detectors/uninitialized-state/0.6.11/uninitialized.sol b/tests/detectors/uninitialized-state/0.6.11/uninitialized.sol index 7b5fbb5d9..209b28591 100644 --- a/tests/detectors/uninitialized-state/0.6.11/uninitialized.sol +++ b/tests/detectors/uninitialized-state/0.6.11/uninitialized.sol @@ -43,16 +43,16 @@ contract Test2 { using Lib for Lib.MyStruct; Lib.MyStruct st; - Lib.MyStruct stInitiliazed; + Lib.MyStruct stinitialized; uint v; // v is used as parameter of the lib, but is never init function init() public{ - stInitiliazed.set(v); + stinitialized.set(v); } function use() view public{ // random operation to use the structure - require(st.val == stInitiliazed.val); + require(st.val == stinitialized.val); } } diff --git a/tests/detectors/uninitialized-state/0.7.6/uninitialized.sol b/tests/detectors/uninitialized-state/0.7.6/uninitialized.sol index 7b5fbb5d9..209b28591 100644 --- a/tests/detectors/uninitialized-state/0.7.6/uninitialized.sol +++ b/tests/detectors/uninitialized-state/0.7.6/uninitialized.sol @@ -43,16 +43,16 @@ contract Test2 { using Lib for Lib.MyStruct; Lib.MyStruct st; - Lib.MyStruct stInitiliazed; + Lib.MyStruct stinitialized; uint v; // v is used as parameter of the lib, but is never init function init() public{ - stInitiliazed.set(v); + stinitialized.set(v); } function use() view public{ // random operation to use the structure - require(st.val == stInitiliazed.val); + require(st.val == stinitialized.val); } } diff --git a/tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol.0.4.25.UnprotectedUpgradeable.json b/tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol.0.4.25.UnprotectedUpgradeable.json index 28fd9cd3c..f5b7d583b 100644 --- a/tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol.0.4.25.UnprotectedUpgradeable.json +++ b/tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol.0.4.25.UnprotectedUpgradeable.json @@ -141,8 +141,8 @@ } } ], - "description": "Buggy (tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#3-15) is an upgradeable contract that does not protect its initiliaze functions: Buggy.initialize() (tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#6-9). Anyone can delete the contract with: Buggy.kill() (tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#10-13)", - "markdown": "[Buggy](tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#L3-L15) is an upgradeable contract that does not protect its initiliaze functions: [Buggy.initialize()](tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#L6-L9). Anyone can delete the contract with: [Buggy.kill()](tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#L10-L13)", + "description": "Buggy (tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#3-15) is an upgradeable contract that does not protect its initialize functions: Buggy.initialize() (tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#6-9). Anyone can delete the contract with: Buggy.kill() (tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#10-13)", + "markdown": "[Buggy](tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#L3-L15) is an upgradeable contract that does not protect its initialize functions: [Buggy.initialize()](tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#L6-L9). Anyone can delete the contract with: [Buggy.kill()](tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#L10-L13)", "first_markdown_element": "tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#L3-L15", "id": "aceca400ce0b482809a70df612af22e24d154c5c89c24d630ec0ee5a366d09fe", "check": "unprotected-upgrade", diff --git a/tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol.0.5.16.UnprotectedUpgradeable.json b/tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol.0.5.16.UnprotectedUpgradeable.json index d5452021e..4f5015bf5 100644 --- a/tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol.0.5.16.UnprotectedUpgradeable.json +++ b/tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol.0.5.16.UnprotectedUpgradeable.json @@ -141,8 +141,8 @@ } } ], - "description": "Buggy (tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#3-15) is an upgradeable contract that does not protect its initiliaze functions: Buggy.initialize() (tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#6-9). Anyone can delete the contract with: Buggy.kill() (tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#10-13)", - "markdown": "[Buggy](tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#L3-L15) is an upgradeable contract that does not protect its initiliaze functions: [Buggy.initialize()](tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#L6-L9). Anyone can delete the contract with: [Buggy.kill()](tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#L10-L13)", + "description": "Buggy (tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#3-15) is an upgradeable contract that does not protect its initialize functions: Buggy.initialize() (tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#6-9). Anyone can delete the contract with: Buggy.kill() (tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#10-13)", + "markdown": "[Buggy](tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#L3-L15) is an upgradeable contract that does not protect its initialize functions: [Buggy.initialize()](tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#L6-L9). Anyone can delete the contract with: [Buggy.kill()](tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#L10-L13)", "first_markdown_element": "tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#L3-L15", "id": "aceca400ce0b482809a70df612af22e24d154c5c89c24d630ec0ee5a366d09fe", "check": "unprotected-upgrade", diff --git a/tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol.0.6.11.UnprotectedUpgradeable.json b/tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol.0.6.11.UnprotectedUpgradeable.json index b0fe359e4..57aa43c6c 100644 --- a/tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol.0.6.11.UnprotectedUpgradeable.json +++ b/tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol.0.6.11.UnprotectedUpgradeable.json @@ -141,8 +141,8 @@ } } ], - "description": "Buggy (tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#3-15) is an upgradeable contract that does not protect its initiliaze functions: Buggy.initialize() (tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#6-9). Anyone can delete the contract with: Buggy.kill() (tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#10-13)", - "markdown": "[Buggy](tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#L3-L15) is an upgradeable contract that does not protect its initiliaze functions: [Buggy.initialize()](tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#L6-L9). Anyone can delete the contract with: [Buggy.kill()](tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#L10-L13)", + "description": "Buggy (tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#3-15) is an upgradeable contract that does not protect its initialize functions: Buggy.initialize() (tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#6-9). Anyone can delete the contract with: Buggy.kill() (tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#10-13)", + "markdown": "[Buggy](tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#L3-L15) is an upgradeable contract that does not protect its initialize functions: [Buggy.initialize()](tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#L6-L9). Anyone can delete the contract with: [Buggy.kill()](tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#L10-L13)", "first_markdown_element": "tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#L3-L15", "id": "aceca400ce0b482809a70df612af22e24d154c5c89c24d630ec0ee5a366d09fe", "check": "unprotected-upgrade", diff --git a/tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol.0.7.6.UnprotectedUpgradeable.json b/tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol.0.7.6.UnprotectedUpgradeable.json index 10f2a2b28..e2f23109e 100644 --- a/tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol.0.7.6.UnprotectedUpgradeable.json +++ b/tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol.0.7.6.UnprotectedUpgradeable.json @@ -141,8 +141,8 @@ } } ], - "description": "Buggy (tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#3-15) is an upgradeable contract that does not protect its initiliaze functions: Buggy.initialize() (tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#6-9). Anyone can delete the contract with: Buggy.kill() (tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#10-13)", - "markdown": "[Buggy](tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#L3-L15) is an upgradeable contract that does not protect its initiliaze functions: [Buggy.initialize()](tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#L6-L9). Anyone can delete the contract with: [Buggy.kill()](tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#L10-L13)", + "description": "Buggy (tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#3-15) is an upgradeable contract that does not protect its initialize functions: Buggy.initialize() (tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#6-9). Anyone can delete the contract with: Buggy.kill() (tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#10-13)", + "markdown": "[Buggy](tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#L3-L15) is an upgradeable contract that does not protect its initialize functions: [Buggy.initialize()](tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#L6-L9). Anyone can delete the contract with: [Buggy.kill()](tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#L10-L13)", "first_markdown_element": "tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#L3-L15", "id": "aceca400ce0b482809a70df612af22e24d154c5c89c24d630ec0ee5a366d09fe", "check": "unprotected-upgrade", From c4c7d5674aaf364f6c16c8c2e083ff2e8cdceb30 Mon Sep 17 00:00:00 2001 From: greenknot <43061872+greenknot@users.noreply.github.com> Date: Tue, 26 Jul 2022 09:55:49 +0200 Subject: [PATCH 081/101] Dockerfile: upgrade from Ubuntu Bionic (18.04) to Focal (20.04) (#1242) Dockerfile: upgrade from Ubuntu Bionic (18.04) to Focal (20.04) (#1242) --- Dockerfile | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 1d35709c5..369bcf865 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:bionic +FROM ubuntu:focal LABEL name=slither LABEL src="https://github.com/trailofbits/slither" @@ -6,11 +6,12 @@ LABEL creator=trailofbits LABEL dockerfile_maintenance=trailofbits LABEL desc="Static Analyzer for Solidity" -RUN apt-get update \ - && apt-get upgrade -y \ - && apt-get install -y git python3 python3-setuptools wget software-properties-common +RUN export DEBIAN_FRONTEND=noninteractive \ + && apt-get update \ + && apt-get upgrade -yq \ + && apt-get install -yq gcc git python3 python3-dev python3-setuptools wget software-properties-common -RUN wget https://github.com/ethereum/solidity/releases/download/v0.4.25/solc-static-linux \ +RUN wget -q https://github.com/ethereum/solidity/releases/download/v0.4.25/solc-static-linux \ && chmod +x solc-static-linux \ && mv solc-static-linux /usr/bin/solc From 89852f0c6f4ef59e715af7acfab71b03106d7ea7 Mon Sep 17 00:00:00 2001 From: Jean Cvllr <31145285+CJ42@users.noreply.github.com> Date: Tue, 26 Jul 2022 09:00:33 +0100 Subject: [PATCH 082/101] fix: anchor links to Vulnerability report docs (#1257) * fix: incorrect anchor links to docs --- README.md | 8 ++++---- slither/detectors/assembly/shift_parameter_mixup.py | 4 +++- slither/detectors/variables/similar_variables.py | 4 +++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f1e491103..d7b9332a2 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Num | Detector | What it Detects | Impact | Confidence --- | --- | --- | --- | --- 1 | `abiencoderv2-array` | [Storage abiencoderv2 array](https://github.com/crytic/slither/wiki/Detector-Documentation#storage-abiencoderv2-array) | High | High 2 | `array-by-reference` | [Modifying storage array by value](https://github.com/crytic/slither/wiki/Detector-Documentation#modifying-storage-array-by-value) | High | High -3 | `incorrect-shift` | [The order of parameters in a shift instruction is incorrect.](https://github.com/crytic/slither/wiki/Detector-Documentation#shift-parameter-mixup) | High | High +3 | `incorrect-shift` | [The order of parameters in a shift instruction is incorrect.](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-shift-in-assembly) | High | High 4 | `multiple-constructors` | [Multiple constructor schemes](https://github.com/crytic/slither/wiki/Detector-Documentation#multiple-constructor-schemes) | High | High 5 | `name-reused` | [Contract's name reused](https://github.com/crytic/slither/wiki/Detector-Documentation#name-reused) | High | High 6 | `public-mappings-nested` | [Public mappings with nested variables](https://github.com/crytic/slither/wiki/Detector-Documentation#public-mappings-with-nested-variables) | High | High @@ -124,7 +124,7 @@ Num | Detector | What it Detects | Impact | Confidence 70 | `costly-loop` | [Costly operations in a loop](https://github.com/crytic/slither/wiki/Detector-Documentation#costly-operations-inside-a-loop) | Informational | Medium 71 | `dead-code` | [Functions that are not used](https://github.com/crytic/slither/wiki/Detector-Documentation#dead-code) | Informational | Medium 72 | `reentrancy-unlimited-gas` | [Reentrancy vulnerabilities through send and transfer](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-4) | Informational | Medium -73 | `similar-names` | [Variable names are too similar](https://github.com/crytic/slither/wiki/Detector-Documentation#variable-names-are-too-similar) | Informational | Medium +73 | `similar-names` | [Variable names are too similar](https://github.com/crytic/slither/wiki/Detector-Documentation#variable-names-too-similar) | Informational | Medium 74 | `too-many-digits` | [Conformance to numeric notation best practices](https://github.com/crytic/slither/wiki/Detector-Documentation#too-many-digits) | Informational | Medium 75 | `constable-states` | [State variables that could be declared constant](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variables-that-could-be-declared-constant) | Optimization | High 76 | `external-function` | [Public function that could be declared external](https://github.com/crytic/slither/wiki/Detector-Documentation#public-function-that-could-be-declared-external) | Optimization | High @@ -184,7 +184,7 @@ We recommend using a Python virtual environment, as detailed in the [Developer I ### Using Docker -Use the [`eth-security-toolbox`](https://github.com/trailofbits/eth-security-toolbox/) docker image. It includes all of our security tools and every major version of Solidity in a single image. `/home/share` will be mounted to `/share` in the container. +Use the [`eth-security-toolbox`](https://github.com/trailofbits/eth-security-toolbox/) docker image. It includes all of our security tools and every major version of Solidity in a single image. `/home/share` will be mounted to `/share` in the container. ```bash docker pull trailofbits/eth-security-toolbox @@ -232,4 +232,4 @@ Title | Usage | Authors | Venue [SolType: Refinement Types for Arithmetic Overflow in Solidity](https://arxiv.org/abs/2110.00677) | Use Slither as frontend to build refinement type system | Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 [Do Not Rug on Me: Leveraging Machine Learning Techniques for Automated Scam Detection](https://www.mdpi.com/2227-7390/10/6/949) | Use Slither to extract tokens' features (mintable, pausable, ..) | Mazorra, Bruno, Victor Adan, and Vanesa Daza | Mathematics 10.6 (2022) -If you are using Slither on an academic work, consider applying to the [Crytic $10k Research Prize](https://blog.trailofbits.com/2019/11/13/announcing-the-crytic-10k-research-prize/). +If you are using Slither on an academic work, consider applying to the [Crytic $10k Research Prize](https://blog.trailofbits.com/2019/11/13/announcing-the-crytic-10k-research-prize/). \ No newline at end of file diff --git a/slither/detectors/assembly/shift_parameter_mixup.py b/slither/detectors/assembly/shift_parameter_mixup.py index a8c172ce6..65a35d8c3 100644 --- a/slither/detectors/assembly/shift_parameter_mixup.py +++ b/slither/detectors/assembly/shift_parameter_mixup.py @@ -13,7 +13,9 @@ class ShiftParameterMixup(AbstractDetector): IMPACT = DetectorClassification.HIGH CONFIDENCE = DetectorClassification.HIGH - WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#shift-parameter-mixup" + WIKI = ( + "https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-shift-in-assembly" + ) WIKI_TITLE = "Incorrect shift in assembly." WIKI_DESCRIPTION = "Detect if the values in a shift operation are reversed" diff --git a/slither/detectors/variables/similar_variables.py b/slither/detectors/variables/similar_variables.py index 0b247434c..bab2d0acc 100644 --- a/slither/detectors/variables/similar_variables.py +++ b/slither/detectors/variables/similar_variables.py @@ -17,7 +17,9 @@ class SimilarVarsDetection(AbstractDetector): IMPACT = DetectorClassification.INFORMATIONAL CONFIDENCE = DetectorClassification.MEDIUM - WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#variable-names-are-too-similar" + WIKI = ( + "https://github.com/crytic/slither/wiki/Detector-Documentation#variable-names-too-similar" + ) WIKI_TITLE = "Variable names too similar" WIKI_DESCRIPTION = "Detect variables with names that are too similar." From 8bead9347c2db89680e48839eb885374a61fe6c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= <2642849+elopez@users.noreply.github.com> Date: Tue, 26 Jul 2022 05:02:59 -0300 Subject: [PATCH 083/101] Unify path filtering across POSIX and Windows (#1196) * Unify path filtering across POSIX and Windows Path filtering is performed on absolute paths, which causes regexps to not work uniformly across OSes, due to the different path separator (forward vs backward slashes). This converts paths to POSIX-style before filtering, so that regexps can be written in a single style and work across all systems. Fixes: #1191 * Revert path behavior for "ignore comment" checks --- slither/core/slither_core.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/slither/core/slither_core.py b/slither/core/slither_core.py index 2a76f3e6e..f154ba5a4 100644 --- a/slither/core/slither_core.py +++ b/slither/core/slither_core.py @@ -4,6 +4,7 @@ import json import logging import os +import pathlib import posixpath import re from typing import Optional, Dict, List, Set, Union @@ -218,8 +219,12 @@ class SlitherCore(Context): for elem in r["elements"] if "source_mapping" in elem ] - source_mapping_elements = map( - lambda x: posixpath.normpath(x) if x else x, source_mapping_elements + + # Use POSIX-style paths so that filter_paths works across different + # OSes. Convert to a list so elements don't get consumed and are lost + # while evaluating the first pattern + source_mapping_elements = list( + map(lambda x: pathlib.Path(x).resolve().as_posix() if x else x, source_mapping_elements) ) matching = False From 2e341aee9b5cbd513552ea0a8412ae7a0cebeb24 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 26 Jul 2022 03:08:02 -0500 Subject: [PATCH 084/101] do not convert IRs with arguments to state var read (#1230) * do not convert IRs with arguments to state var read --- scripts/ci_test_truffle.sh | 2 +- slither/core/children/child_node.py | 2 +- slither/slithir/convert.py | 6 +++++- ...libraries_from_free.sol-0.8.12-compact.zip | Bin 0 -> 3062 bytes ..._function_collision.sol-0.8.12-compact.zip | Bin 0 -> 3048 bytes .../new_operator.sol-0.8.12-compact.zip | Bin 0 -> 2740 bytes ...ibraries_from_free.sol-0.8.12-compact.json | 9 +++++++++ ...function_collision.sol-0.8.12-compact.json | 9 +++++++++ .../new_operator.sol-0.8.12-compact.json | 6 ++++++ .../free_functions/libraries_from_free.sol | 18 ++++++++++++++++++ .../library_constant_function_collision.sol | 14 ++++++++++++++ .../free_functions/new_operator.sol | 13 +++++++++++++ tests/test_ast_parsing.py | 3 +++ 13 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 tests/ast-parsing/compile/free_functions/libraries_from_free.sol-0.8.12-compact.zip create mode 100644 tests/ast-parsing/compile/free_functions/library_constant_function_collision.sol-0.8.12-compact.zip create mode 100644 tests/ast-parsing/compile/free_functions/new_operator.sol-0.8.12-compact.zip create mode 100644 tests/ast-parsing/expected/free_functions/libraries_from_free.sol-0.8.12-compact.json create mode 100644 tests/ast-parsing/expected/free_functions/library_constant_function_collision.sol-0.8.12-compact.json create mode 100644 tests/ast-parsing/expected/free_functions/new_operator.sol-0.8.12-compact.json create mode 100644 tests/ast-parsing/free_functions/libraries_from_free.sol create mode 100644 tests/ast-parsing/free_functions/library_constant_function_collision.sol create mode 100644 tests/ast-parsing/free_functions/new_operator.sol diff --git a/scripts/ci_test_truffle.sh b/scripts/ci_test_truffle.sh index e9a843848..a28e1d2c3 100755 --- a/scripts/ci_test_truffle.sh +++ b/scripts/ci_test_truffle.sh @@ -15,7 +15,7 @@ npm install -g truffle truffle unbox metacoin slither . -if [ $? -eq 9 ] +if [ $? -eq 6 ] then exit 0 fi diff --git a/slither/core/children/child_node.py b/slither/core/children/child_node.py index 1c745f414..c1fffd49a 100644 --- a/slither/core/children/child_node.py +++ b/slither/core/children/child_node.py @@ -28,4 +28,4 @@ class ChildNode: @property def compilation_unit(self) -> "SlitherCompilationUnit": - return self.contract.compilation_unit + return self.node.compilation_unit diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index 50090bc04..505d5a765 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -1385,7 +1385,11 @@ def convert_type_library_call(ir: HighLevelCall, lib_contract: Contract): if len(candidates) == 1: func = candidates[0] - if func is None: + # We can discard if there are arguments here because libraries only support constant variables + # And constant variables cannot have non-value type + # i.e. "uint[2] constant arr = [1,2];" is not possible in Solidity + # If this were to change, the following condition might be broken + if func is None and not ir.arguments: # TODO: handle collision with multiple state variables/functions func = lib_contract.get_state_variable_from_name(ir.function_name) if func is None and candidates: diff --git a/tests/ast-parsing/compile/free_functions/libraries_from_free.sol-0.8.12-compact.zip b/tests/ast-parsing/compile/free_functions/libraries_from_free.sol-0.8.12-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..13d54539fb49adb5718f8a903477ea1539d094b2 GIT binary patch literal 3062 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 I=K+BK0FpPpR{#J2 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/free_functions/new_operator.sol-0.8.12-compact.zip b/tests/ast-parsing/compile/free_functions/new_operator.sol-0.8.12-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..7135e729d8e118ac7fb2deb1f3d75ba014243579 GIT binary patch literal 2740 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/expected/free_functions/libraries_from_free.sol-0.8.12-compact.json b/tests/ast-parsing/expected/free_functions/libraries_from_free.sol-0.8.12-compact.json new file mode 100644 index 000000000..a6707f586 --- /dev/null +++ b/tests/ast-parsing/expected/free_functions/libraries_from_free.sol-0.8.12-compact.json @@ -0,0 +1,9 @@ +{ + "L": { + "pub()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "inter()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + }, + "C": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/free_functions/library_constant_function_collision.sol-0.8.12-compact.json b/tests/ast-parsing/expected/free_functions/library_constant_function_collision.sol-0.8.12-compact.json new file mode 100644 index 000000000..5bfc4f471 --- /dev/null +++ b/tests/ast-parsing/expected/free_functions/library_constant_function_collision.sol-0.8.12-compact.json @@ -0,0 +1,9 @@ +{ + "ExtendedMath": {}, + "IERC20": { + "decimals()": "digraph{\n}\n" + }, + "A": { + "test(address)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/expected/free_functions/new_operator.sol-0.8.12-compact.json b/tests/ast-parsing/expected/free_functions/new_operator.sol-0.8.12-compact.json new file mode 100644 index 000000000..198cdcd9c --- /dev/null +++ b/tests/ast-parsing/expected/free_functions/new_operator.sol-0.8.12-compact.json @@ -0,0 +1,6 @@ +{ + "C": {}, + "D": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/free_functions/libraries_from_free.sol b/tests/ast-parsing/free_functions/libraries_from_free.sol new file mode 100644 index 000000000..2091ae771 --- /dev/null +++ b/tests/ast-parsing/free_functions/libraries_from_free.sol @@ -0,0 +1,18 @@ +library L { + function pub() public pure returns (uint) { + return 7; + } + function inter() internal pure returns (uint) { + return 8; + } +} + +function fu() pure returns (uint, uint) { + return (L.pub(), L.inter()); +} + +contract C { + function f() public pure returns (uint, uint) { + return fu(); + } +} diff --git a/tests/ast-parsing/free_functions/library_constant_function_collision.sol b/tests/ast-parsing/free_functions/library_constant_function_collision.sol new file mode 100644 index 000000000..8aaa2d788 --- /dev/null +++ b/tests/ast-parsing/free_functions/library_constant_function_collision.sol @@ -0,0 +1,14 @@ +library ExtendedMath { + uint256 constant decimals = 18; +} + +interface IERC20 { + function decimals() external view returns (uint8); +} + +contract A { + using ExtendedMath for *; + function test(address x) public { + uint8 decimals = IERC20(address(x)).decimals(); + } +} diff --git a/tests/ast-parsing/free_functions/new_operator.sol b/tests/ast-parsing/free_functions/new_operator.sol new file mode 100644 index 000000000..4b71d70c9 --- /dev/null +++ b/tests/ast-parsing/free_functions/new_operator.sol @@ -0,0 +1,13 @@ +contract C { + uint public x = 2; +} + +function test() returns (uint) { + return (new C()).x(); +} + +contract D { + function f() public returns (uint) { + return test(); + } +} diff --git a/tests/test_ast_parsing.py b/tests/test_ast_parsing.py index 62a604979..ed83e2b20 100644 --- a/tests/test_ast_parsing.py +++ b/tests/test_ast_parsing.py @@ -408,6 +408,9 @@ ALL_TESTS = [ # 0.8.9 crashes on our testcase Test("user_defined_types.sol", ["0.8.8"] + make_version(8, 10, 12)), Test("bytes_call.sol", ["0.8.12"]), + Test("free_functions/libraries_from_free.sol", ["0.8.12"]), + Test("free_functions/new_operator.sol", ["0.8.12"]), + Test("free_functions/library_constant_function_collision.sol", ["0.8.12"]), ] # create the output folder if needed try: From a3fa7e6c2c26defb8a80e9a6fd6c7b471b079060 Mon Sep 17 00:00:00 2001 From: h00p30 <105890602+h00p30@users.noreply.github.com> Date: Tue, 26 Jul 2022 10:10:29 +0200 Subject: [PATCH 085/101] Support of ERC1363, ERC4524 for slither-check-erc (#1274) * fix typo in `--help` output for `--print` flag (#1149) * Support of ERC1363, ERC4524 for slither-check-erc (#1263) Co-authored-by: Erick --- slither/core/declarations/contract.py | 23 +++++++++++++ slither/utils/erc.py | 49 +++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/slither/core/declarations/contract.py b/slither/core/declarations/contract.py index 2db1cd964..c82cbc446 100644 --- a/slither/core/declarations/contract.py +++ b/slither/core/declarations/contract.py @@ -21,6 +21,8 @@ from slither.utils.erc import ( ERC777_signatures, ERC1155_signatures, ERC2612_signatures, + ERC1363_signatures, + ERC4524_signatures, ERC4626_signatures, ) from slither.utils.tests_pattern import is_test_contract @@ -903,6 +905,7 @@ class Contract(SourceMapping): # pylint: disable=too-many-public-methods ("ERC721", self.is_erc721), ("ERC777", self.is_erc777), ("ERC2612", self.is_erc2612), + ("ERC1363", self.is_erc1363), ("ERC4626", self.is_erc4626), ] @@ -998,6 +1001,26 @@ class Contract(SourceMapping): # pylint: disable=too-many-public-methods full_names = self.functions_signatures return all(s in full_names for s in ERC2612_signatures) + def is_erc1363(self) -> bool: + """ + Check if the contract is an erc1363 + + Note: it does not check for correct return values + :return: Returns a true if the contract is an erc1363 + """ + full_names = self.functions_signatures + return all(s in full_names for s in ERC1363_signatures) + + def is_erc4524(self) -> bool: + """ + Check if the contract is an erc4524 + + Note: it does not check for correct return values + :return: Returns a true if the contract is an erc4524 + """ + full_names = self.functions_signatures + return all(s in full_names for s in ERC4524_signatures) + @property def is_token(self) -> bool: """ diff --git a/slither/utils/erc.py b/slither/utils/erc.py index af91886fd..0b8c99bb4 100644 --- a/slither/utils/erc.py +++ b/slither/utils/erc.py @@ -340,6 +340,53 @@ ERC2612 = [ ERC2612_signatures = erc_to_signatures(ERC2612) +# Review +# https://eips.ethereum.org/EIPS/eip-1363 +# Must have ERC20 and ERC165 + +ERC1363_EVENTS = [] +ERC1363 = ( + [ + ERC("transferAndCall", ["address", "uint256"], "bool", False, True, []), + ERC("transferAndCall", ["address", "uint256", "bytes"], "bool", False, True, []), + ERC("transferFromAndCall", ["address", "address", "uint256"], "bool", False, True, []), + ERC( + "transferFromAndCall", + ["address", "address", "uint256", "bytes"], + "bool", + False, + True, + [], + ), + ERC("approveAndCall", ["address", "uint256"], "bool", False, True, []), + ERC("approveAndCall", ["address", "uint256", "bytes"], "bool", False, True, []), + ] + + ERC20 + + ERC165 +) + +ERC1363_signatures = erc_to_signatures(ERC1363) + +# Review +# https://eips.ethereum.org/EIPS/eip-4524 +# Must have ERC20 and ERC165 + +ERC4524_EVENTS = [] +ERC4524 = ( + [ + ERC("safeTransfer", ["address", "uint256"], "bool", False, True, []), + ERC("safeTransfer", ["address", "uint256", "bytes"], "bool", False, True, []), + ERC("safeTransferFrom", ["address", "address", "uint256"], "bool", False, True, []), + ERC( + "safeTransferFrom", ["address", "address", "uint256", "bytes"], "bool", False, True, [] + ), + ] + + ERC20 + + ERC165 +) + +ERC4524_signatures = erc_to_signatures(ERC4524) + # Final # https://eips.ethereum.org/EIPS/eip-4626 # Must have ERC20 @@ -405,5 +452,7 @@ ERCS = { "ERC777": (ERC777, ERC777_EVENTS), "ERC1155": (ERC1155, ERC1155_EVENTS), "ERC2612": (ERC2612, ERC2612_EVENTS), + "ERC1363": (ERC1363, ERC1363_EVENTS), + "ERC4524": (ERC4524, ERC4524_EVENTS), "ERC4626": (ERC4626, ERC4626_EVENTS), } From bb0b04be2f95dca78f1722fac3662edd6642efe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Schoentgen?= Date: Tue, 26 Jul 2022 10:11:37 +0200 Subject: [PATCH 086/101] Fix deprecation warnings: invalid escape sequence (#1185) --- slither/detectors/attributes/incorrect_solc.py | 2 +- slither/formatters/attributes/constant_pragma.py | 2 +- slither/formatters/attributes/incorrect_solc.py | 3 +-- slither/formatters/naming_convention/naming_convention.py | 6 +++--- slither/solc_parsing/expressions/expression_parsing.py | 2 +- slither/solc_parsing/solidity_types/type_parsing.py | 6 +++--- slither/tools/kspec_coverage/analysis.py | 4 ++-- 7 files changed, 12 insertions(+), 13 deletions(-) diff --git a/slither/detectors/attributes/incorrect_solc.py b/slither/detectors/attributes/incorrect_solc.py index ad8aebdec..5292c19e3 100644 --- a/slither/detectors/attributes/incorrect_solc.py +++ b/slither/detectors/attributes/incorrect_solc.py @@ -14,7 +14,7 @@ from slither.formatters.attributes.incorrect_solc import custom_format # 4: version number # pylint: disable=anomalous-backslash-in-string -PATTERN = re.compile("(\^|>|>=|<|<=)?([ ]+)?(\d+)\.(\d+)\.(\d+)") +PATTERN = re.compile(r"(\^|>|>=|<|<=)?([ ]+)?(\d+)\.(\d+)\.(\d+)") class IncorrectSolc(AbstractDetector): diff --git a/slither/formatters/attributes/constant_pragma.py b/slither/formatters/attributes/constant_pragma.py index 572ad2fdf..251dd07ae 100644 --- a/slither/formatters/attributes/constant_pragma.py +++ b/slither/formatters/attributes/constant_pragma.py @@ -13,7 +13,7 @@ REPLACEMENT_VERSIONS = ["^0.4.25", "^0.5.3"] # 2: version number # 3: version number # 4: version number -PATTERN = re.compile("(\^|>|>=|<|<=)?([ ]+)?(\d+)\.(\d+)\.(\d+)") +PATTERN = re.compile(r"(\^|>|>=|<|<=)?([ ]+)?(\d+)\.(\d+)\.(\d+)") def custom_format(slither, result): diff --git a/slither/formatters/attributes/incorrect_solc.py b/slither/formatters/attributes/incorrect_solc.py index 0315d2285..de0025138 100644 --- a/slither/formatters/attributes/incorrect_solc.py +++ b/slither/formatters/attributes/incorrect_solc.py @@ -13,8 +13,7 @@ REPLACEMENT_VERSIONS = ["^0.4.25", "^0.5.3"] # 3: version number # 4: version number -# pylint: disable=anomalous-backslash-in-string -PATTERN = re.compile("(\^|>|>=|<|<=)?([ ]+)?(\d+)\.(\d+)\.(\d+)") +PATTERN = re.compile(r"(\^|>|>=|<|<=)?([ ]+)?(\d+)\.(\d+)\.(\d+)") def custom_format(slither, result): diff --git a/slither/formatters/naming_convention/naming_convention.py b/slither/formatters/naming_convention/naming_convention.py index daef287fa..d7720cc5a 100644 --- a/slither/formatters/naming_convention/naming_convention.py +++ b/slither/formatters/naming_convention/naming_convention.py @@ -300,10 +300,10 @@ def _patch(compilation_unit: SlitherCompilationUnit, result, element, _target): # group 2: beginning of the to type # nested mapping are within the group 1 # RE_MAPPING = '[ ]*mapping[ ]*\([ ]*([\=\>\(\) a-zA-Z0-9\._\[\]]*)[ ]*=>[ ]*([a-zA-Z0-9\._\[\]]*)\)' -RE_MAPPING_FROM = b"([a-zA-Z0-9\._\[\]]*)" -RE_MAPPING_TO = b"([\=\>\(\) a-zA-Z0-9\._\[\]\ ]*)" +RE_MAPPING_FROM = rb"([a-zA-Z0-9\._\[\]]*)" +RE_MAPPING_TO = rb"([\=\>\(\) a-zA-Z0-9\._\[\]\ ]*)" RE_MAPPING = ( - b"[ ]*mapping[ ]*\([ ]*" + RE_MAPPING_FROM + b"[ ]*" + b"=>" + b"[ ]*" + RE_MAPPING_TO + b"\)" + rb"[ ]*mapping[ ]*\([ ]*" + RE_MAPPING_FROM + b"[ ]*" + b"=>" + b"[ ]*" + RE_MAPPING_TO + rb"\)" ) diff --git a/slither/solc_parsing/expressions/expression_parsing.py b/slither/solc_parsing/expressions/expression_parsing.py index 759d3d6a2..e5c26a548 100644 --- a/slither/solc_parsing/expressions/expression_parsing.py +++ b/slither/solc_parsing/expressions/expression_parsing.py @@ -445,7 +445,7 @@ def parse_expression(expression: Dict, caller_context: CallerContextExpression) t = expression["attributes"]["type"] if t: - found = re.findall("[struct|enum|function|modifier] \(([\[\] ()a-zA-Z0-9\.,_]*)\)", t) + found = re.findall(r"[struct|enum|function|modifier] \(([\[\] ()a-zA-Z0-9\.,_]*)\)", t) assert len(found) <= 1 if found: value = value + "(" + found[0] + ")" diff --git a/slither/solc_parsing/solidity_types/type_parsing.py b/slither/solc_parsing/solidity_types/type_parsing.py index f052bba05..413339611 100644 --- a/slither/solc_parsing/solidity_types/type_parsing.py +++ b/slither/solc_parsing/solidity_types/type_parsing.py @@ -112,7 +112,7 @@ def _find_from_type_name( # pylint: disable=too-many-locals,too-many-branches,t if not var_type: if name.startswith("function "): found = re.findall( - "function \(([ ()\[\]a-zA-Z0-9\.,]*?)\)(?: payable)?(?: (?:external|internal|pure|view))?(?: returns \(([a-zA-Z0-9() \.,]*)\))?", + r"function \(([ ()\[\]a-zA-Z0-9\.,]*?)\)(?: payable)?(?: (?:external|internal|pure|view))?(?: returns \(([a-zA-Z0-9() \.,]*)\))?", name, ) assert len(found) == 1 @@ -159,10 +159,10 @@ def _find_from_type_name( # pylint: disable=too-many-locals,too-many-branches,t if name.startswith("mapping("): # nested mapping declared with var if name.count("mapping(") == 1: - found = re.findall("mapping\(([a-zA-Z0-9\.]*) => ([ a-zA-Z0-9\.\[\]]*)\)", name) + found = re.findall(r"mapping\(([a-zA-Z0-9\.]*) => ([ a-zA-Z0-9\.\[\]]*)\)", name) else: found = re.findall( - "mapping\(([a-zA-Z0-9\.]*) => (mapping\([=> a-zA-Z0-9\.\[\]]*\))\)", + r"mapping\(([a-zA-Z0-9\.]*) => (mapping\([=> a-zA-Z0-9\.\[\]]*\))\)", name, ) assert len(found) == 1 diff --git a/slither/tools/kspec_coverage/analysis.py b/slither/tools/kspec_coverage/analysis.py index 92d9e49d8..3d513d22f 100755 --- a/slither/tools/kspec_coverage/analysis.py +++ b/slither/tools/kspec_coverage/analysis.py @@ -22,8 +22,8 @@ def _get_all_covered_kspec_functions(target: str) -> Set[Tuple[str, str]]: # Create a set of our discovered functions which are covered covered_functions: Set[Tuple[str, str]] = set() - BEHAVIOUR_PATTERN = re.compile("behaviour\s+(\S+)\s+of\s+(\S+)") - INTERFACE_PATTERN = re.compile("interface\s+([^\r\n]+)") + BEHAVIOUR_PATTERN = re.compile(r"behaviour\s+(\S+)\s+of\s+(\S+)") + INTERFACE_PATTERN = re.compile(r"interface\s+([^\r\n]+)") # Read the file contents with open(target, "r", encoding="utf8") as target_file: From 033d18efae400d6b295cff06d8c81f668349e596 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 26 Jul 2022 03:15:36 -0500 Subject: [PATCH 087/101] add FAQ and useful info to contribution guidelines (#1047) * add FAQ and useful info to contribution guidelines * link to path filtering wiki, add FAQ to ToC * address josselin's feedback * update docs: --- CONTRIBUTING.md | 19 +++++++++++++++++++ README.md | 19 ++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e93b2557c..b1d78be3f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,6 +20,24 @@ Some pull request guidelines: - Fill out the pull request description with a summary of what your patch does, key changes that have been made, and any further points of discussion, if applicable. - Title your pull request with a brief description of what it's changing. "Fixes #123" is a good comment to add to the description, but makes for an unclear title on its own. +## Directory Structure + +Below is a rough outline of slither's design: +```text +. +├── analyses # Provides additional info such as data dependency +├── core # Ties everything together +├── detectors # Rules that define and identify issues +├── slither.py # Main entry point +├── slithir # Contains the semantics of slither's intermediate representation +├── solc_parsing # Responsible for parsing the solc AST +├── tools # Miscellaneous tools built on top of slither +├── visitors # Parses expressions and converts to slithir +└── ... +``` + +A code walkthrough is available [here](https://www.youtube.com/watch?v=EUl3UlYSluU). + ## Development Environment Instructions for installing a development version of Slither can be found in our [wiki](https://github.com/crytic/slither/wiki/Developer-installation). @@ -46,6 +64,7 @@ For each new detector, at least one regression tests must be present. - Create a test in `tests` - Update `ALL_TEST` in `tests/test_detectors.py` - Run `python ./tests/test_detectors.py --generate`. This will generate the json artifacts in `tests/expected_json`. Add the generated files to git. + - If updating an existing detector, identify the respective json artifacts and then delete them, or run `python ./tests/test_detectors.py --overwrite` instead. - Run `pytest ./tests/test_detectors.py` and check that everything worked. To see the tests coverage, run `pytest tests/test_detectors.py --cov=slither/detectors --cov-branch --cov-report html` diff --git a/README.md b/README.md index d7b9332a2..4290e4771 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Slither is a Solidity static analysis framework written in Python 3. It runs a s - [Tools](#tools) - [How to Install](#how-to-install) - [Getting Help](#getting-help) +- [FAQ](#faq) - [Publications](#publications) ## Features @@ -128,6 +129,8 @@ Num | Detector | What it Detects | Impact | Confidence 74 | `too-many-digits` | [Conformance to numeric notation best practices](https://github.com/crytic/slither/wiki/Detector-Documentation#too-many-digits) | Informational | Medium 75 | `constable-states` | [State variables that could be declared constant](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variables-that-could-be-declared-constant) | Optimization | High 76 | `external-function` | [Public function that could be declared external](https://github.com/crytic/slither/wiki/Detector-Documentation#public-function-that-could-be-declared-external) | Optimization | High +77 | `arbitrary-send-erc20` | [Detect when `msg.sender` is not used as `from` in transferFrom](https://github.com/trailofbits/slither/wiki/Detector-Documentation#arbitrary-send-erc20) +78 | `arbitrary-send-erc20-permit` | [Detect when `msg.sender` is not used as `from` in transferFrom in conjuction with permit](https://github.com/trailofbits/slither/wiki/Detector-Documentation#arbitrary-send-erc20-permit) For more information, see - The [Detector Documentation](https://github.com/crytic/slither/wiki/Detector-Documentation) for details on each detector @@ -146,6 +149,7 @@ For more information, see - `cfg`: [Export the CFG of each functions](https://github.com/trailofbits/slither/wiki/Printer-documentation#cfg) - `function-summary`: [Print a summary of the functions](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary) - `vars-and-auth`: [Print the state variables written and the authorization of the functions](https://github.com/crytic/slither/wiki/Printer-documentation#variables-written-and-authorization) +- `when-not-paused`: [Print functions that do not use `whenNotPaused` modifier](https://github.com/trailofbits/slither/wiki/Printer-documentation#when-not-paused). To run a printer, use `--print` and a comma-separated list of printers. @@ -158,6 +162,7 @@ See the [Printer documentation](https://github.com/crytic/slither/wiki/Printer-d - `slither-flat`: [Flatten a codebase](https://github.com/crytic/slither/wiki/Contract-Flattening) - `slither-check-erc`: [Check the ERC's conformance](https://github.com/crytic/slither/wiki/ERC-Conformance) - `slither-format`: [Automatic patch generation](https://github.com/crytic/slither/wiki/Slither-format) +- `slither-read-storage`: [Read storage values from contracts](./slither/tools/read_storage/README.md) See the [Tool documentation](https://github.com/crytic/slither/wiki/Tool-Documentation) for additional tools. @@ -208,11 +213,23 @@ Feel free to stop by our [Slack channel](https://empireslacking.herokuapp.com) ( * The [SlithIR documentation](https://github.com/trailofbits/slither/wiki/SlithIR) describes the SlithIR intermediate representation. +## FAQ + +How do I exclude mocks or tests? +- View our documentation on [path filtering](https://github.com/crytic/slither/wiki/Usage#path-filtering). + +How do I fix "unknown file" or compilation issues? +- Because slither requires the solc AST, it must have all dependencies available. +If a contract has dependencies, `slither contract.sol` will fail. +Instead, use `slither .` in the parent directory of `contracts/` (you should see `contracts/` when you run `ls`). +If you have a `node_modules/` folder, it must be in the same directory as `contracts/`. To verify that this issue is related to slither, +run the compilation command for the framework you are using e.g `npx hardhat compile`. That must work successfully; +otherwise, slither's compilation engine, crytic-compile, cannot generate the AST. + ## License Slither is licensed and distributed under the AGPLv3 license. [Contact us](mailto:opensource@trailofbits.com) if you're looking for an exception to the terms. - ## Publications ### Trail of Bits publication From 0056406b5a43a1e33892ca5012c02d01e5d93f49 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Tue, 26 Jul 2022 16:39:42 +0200 Subject: [PATCH 088/101] Fix broken tests introduced with #1239 (#1302) * Fix broken tests introduced with #1239 * Disable etherlime from the CI --- .github/workflows/ci.yml | 5 +---- .../0.4.25/Buggy.sol.0.4.25.UnprotectedUpgradeable.json | 2 +- .../0.5.16/Buggy.sol.0.5.16.UnprotectedUpgradeable.json | 2 +- .../0.6.11/Buggy.sol.0.6.11.UnprotectedUpgradeable.json | 2 +- .../0.7.6/Buggy.sol.0.7.6.UnprotectedUpgradeable.json | 2 +- 5 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f2a295452..b4d62d963 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: "data_dependency", # "embark", "erc", - "etherlime", + # "etherlime", # "etherscan" "find_paths", "flat", @@ -43,9 +43,6 @@ jobs: - os: windows-2022 type: dapp # Requires nvm - - os: windows-2022 - type: etherlime - # Requires nvm - os: windows-2022 type: truffle steps: diff --git a/tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol.0.4.25.UnprotectedUpgradeable.json b/tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol.0.4.25.UnprotectedUpgradeable.json index f5b7d583b..79ffe9eba 100644 --- a/tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol.0.4.25.UnprotectedUpgradeable.json +++ b/tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol.0.4.25.UnprotectedUpgradeable.json @@ -144,7 +144,7 @@ "description": "Buggy (tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#3-15) is an upgradeable contract that does not protect its initialize functions: Buggy.initialize() (tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#6-9). Anyone can delete the contract with: Buggy.kill() (tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#10-13)", "markdown": "[Buggy](tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#L3-L15) is an upgradeable contract that does not protect its initialize functions: [Buggy.initialize()](tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#L6-L9). Anyone can delete the contract with: [Buggy.kill()](tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#L10-L13)", "first_markdown_element": "tests/detectors/unprotected-upgrade/0.4.25/Buggy.sol#L3-L15", - "id": "aceca400ce0b482809a70df612af22e24d154c5c89c24d630ec0ee5a366d09fe", + "id": "d85b90230632a30f7ffb5140a791d4a9ae8b0be045c5b27175f3c477e189c08c", "check": "unprotected-upgrade", "impact": "High", "confidence": "High" diff --git a/tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol.0.5.16.UnprotectedUpgradeable.json b/tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol.0.5.16.UnprotectedUpgradeable.json index 4f5015bf5..d4f2addd9 100644 --- a/tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol.0.5.16.UnprotectedUpgradeable.json +++ b/tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol.0.5.16.UnprotectedUpgradeable.json @@ -144,7 +144,7 @@ "description": "Buggy (tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#3-15) is an upgradeable contract that does not protect its initialize functions: Buggy.initialize() (tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#6-9). Anyone can delete the contract with: Buggy.kill() (tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#10-13)", "markdown": "[Buggy](tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#L3-L15) is an upgradeable contract that does not protect its initialize functions: [Buggy.initialize()](tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#L6-L9). Anyone can delete the contract with: [Buggy.kill()](tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#L10-L13)", "first_markdown_element": "tests/detectors/unprotected-upgrade/0.5.16/Buggy.sol#L3-L15", - "id": "aceca400ce0b482809a70df612af22e24d154c5c89c24d630ec0ee5a366d09fe", + "id": "d85b90230632a30f7ffb5140a791d4a9ae8b0be045c5b27175f3c477e189c08c", "check": "unprotected-upgrade", "impact": "High", "confidence": "High" diff --git a/tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol.0.6.11.UnprotectedUpgradeable.json b/tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol.0.6.11.UnprotectedUpgradeable.json index 57aa43c6c..0f46e3a9a 100644 --- a/tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol.0.6.11.UnprotectedUpgradeable.json +++ b/tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol.0.6.11.UnprotectedUpgradeable.json @@ -144,7 +144,7 @@ "description": "Buggy (tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#3-15) is an upgradeable contract that does not protect its initialize functions: Buggy.initialize() (tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#6-9). Anyone can delete the contract with: Buggy.kill() (tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#10-13)", "markdown": "[Buggy](tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#L3-L15) is an upgradeable contract that does not protect its initialize functions: [Buggy.initialize()](tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#L6-L9). Anyone can delete the contract with: [Buggy.kill()](tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#L10-L13)", "first_markdown_element": "tests/detectors/unprotected-upgrade/0.6.11/Buggy.sol#L3-L15", - "id": "aceca400ce0b482809a70df612af22e24d154c5c89c24d630ec0ee5a366d09fe", + "id": "d85b90230632a30f7ffb5140a791d4a9ae8b0be045c5b27175f3c477e189c08c", "check": "unprotected-upgrade", "impact": "High", "confidence": "High" diff --git a/tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol.0.7.6.UnprotectedUpgradeable.json b/tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol.0.7.6.UnprotectedUpgradeable.json index e2f23109e..c101b3fc9 100644 --- a/tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol.0.7.6.UnprotectedUpgradeable.json +++ b/tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol.0.7.6.UnprotectedUpgradeable.json @@ -144,7 +144,7 @@ "description": "Buggy (tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#3-15) is an upgradeable contract that does not protect its initialize functions: Buggy.initialize() (tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#6-9). Anyone can delete the contract with: Buggy.kill() (tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#10-13)", "markdown": "[Buggy](tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#L3-L15) is an upgradeable contract that does not protect its initialize functions: [Buggy.initialize()](tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#L6-L9). Anyone can delete the contract with: [Buggy.kill()](tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#L10-L13)", "first_markdown_element": "tests/detectors/unprotected-upgrade/0.7.6/Buggy.sol#L3-L15", - "id": "aceca400ce0b482809a70df612af22e24d154c5c89c24d630ec0ee5a366d09fe", + "id": "d85b90230632a30f7ffb5140a791d4a9ae8b0be045c5b27175f3c477e189c08c", "check": "unprotected-upgrade", "impact": "High", "confidence": "High" From 26ad3c687220236c59fda175980fb5ad7fa719b6 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Wed, 27 Jul 2022 10:28:12 +0200 Subject: [PATCH 089/101] include enums declared in top level (#1300) * include enums used in top level * mark where parsing is incorrect * update AST tests for custom errors Co-authored-by: alpharush <0xalpharush@protonmail.com> --- .../expressions/expression_parsing.py | 1 - .../solidity_types/type_parsing.py | 6 +++++- .../custom_error-0.8.4.sol-0.8.4-compact.zip | Bin 4871 -> 5732 bytes .../custom_error-0.8.4.sol-0.8.5-compact.zip | Bin 4862 -> 5737 bytes .../custom_error-0.8.4.sol-0.8.6-compact.zip | Bin 4858 -> 5730 bytes .../custom_error-0.8.4.sol-0.8.7-compact.zip | Bin 4849 -> 5702 bytes .../custom_error-0.8.4.sol-0.8.8-compact.zip | Bin 4949 -> 5875 bytes .../custom_error-0.8.4.sol-0.8.9-compact.zip | Bin 4952 -> 5883 bytes tests/ast-parsing/custom_error-0.8.4.sol | 12 +++++++++++- .../custom_error-0.8.4.sol-0.8.4-compact.json | 6 ++++-- .../custom_error-0.8.4.sol-0.8.5-compact.json | 6 ++++-- .../custom_error-0.8.4.sol-0.8.6-compact.json | 6 ++++-- .../custom_error-0.8.4.sol-0.8.7-compact.json | 6 ++++-- .../custom_error-0.8.4.sol-0.8.8-compact.json | 6 ++++-- .../custom_error-0.8.4.sol-0.8.9-compact.json | 6 ++++-- 15 files changed, 40 insertions(+), 15 deletions(-) diff --git a/slither/solc_parsing/expressions/expression_parsing.py b/slither/solc_parsing/expressions/expression_parsing.py index e5c26a548..fe26a0ea6 100644 --- a/slither/solc_parsing/expressions/expression_parsing.py +++ b/slither/solc_parsing/expressions/expression_parsing.py @@ -455,7 +455,6 @@ def parse_expression(expression: Dict, caller_context: CallerContextExpression) referenced_declaration = expression["referencedDeclaration"] else: referenced_declaration = None - var, was_created = find_variable(value, caller_context, referenced_declaration) if was_created: var.set_offset(src, caller_context.compilation_unit) diff --git a/slither/solc_parsing/solidity_types/type_parsing.py b/slither/solc_parsing/solidity_types/type_parsing.py index 413339611..5891962d1 100644 --- a/slither/solc_parsing/solidity_types/type_parsing.py +++ b/slither/solc_parsing/solidity_types/type_parsing.py @@ -272,8 +272,12 @@ def parse_type( all_structuress = [c.structures for c in scope.contracts.values()] all_structures = [item for sublist in all_structuress for item in sublist] all_structures += structures_direct_access + enums_direct_access = [] - all_enums = scope.enums.values() + all_enumss = [c.enums for c in scope.contracts.values()] + all_enums = [item for sublist in all_enumss for item in sublist] + all_enums += scope.enums.values() + contracts = scope.contracts.values() functions = list(scope.functions) diff --git a/tests/ast-parsing/compile/custom_error-0.8.4.sol-0.8.4-compact.zip b/tests/ast-parsing/compile/custom_error-0.8.4.sol-0.8.4-compact.zip index 913457a623127423994808d764a6c5b1ed0f578f..15e749a197c35eab02e52c62ab461de0e75388f5 100644 GIT binary patch delta 5627 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 a=2S@j%*?YD008!(ld2L<2KyBN0002YCE@Y_ delta 4750 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 T6#xMCp_8T(P6qT900000so3J= delta 4753 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 delta 4737 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 Pdz11NP6mS#00000Eb|LZ diff --git a/tests/ast-parsing/compile/custom_error-0.8.4.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/custom_error-0.8.4.sol-0.8.8-compact.zip index d97e8eb0ffb1f48a873d335eea8843e879902914..d11a080ffb719edead27bc85b1d5fe869c9d071e 100644 GIT binary patch delta 5771 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 delta 4841 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 Pev_vbP6p}{00000X1`1t diff --git a/tests/ast-parsing/custom_error-0.8.4.sol b/tests/ast-parsing/custom_error-0.8.4.sol index d62f96e87..ea185de89 100644 --- a/tests/ast-parsing/custom_error-0.8.4.sol +++ b/tests/ast-parsing/custom_error-0.8.4.sol @@ -1,4 +1,8 @@ pragma solidity ^0.8.4; +interface I { + enum SomeEnum { ONE, TWO, THREE } + error ErrorWithEnum(SomeEnum e); +} struct St{ uint v; @@ -8,7 +12,8 @@ error ErrorSimple(); error ErrorWithArgs(uint, uint); error ErrorWithStruct(St s); -contract VendingMachine { + +contract VendingMachine is I { function err0() public { revert ErrorSimple(); @@ -19,10 +24,14 @@ contract VendingMachine { } function err2() public{ revert ErrorWithArgs(10+10, 10); + revert ErrorWithArgs(uint(SomeEnum.ONE), uint(SomeEnum.ONE)); } function err3() public{ revert('test'); } + function err4() public { + revert ErrorWithEnum(SomeEnum.ONE); + } } contract A{ @@ -43,3 +52,4 @@ contract B is A{ } } + diff --git a/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.4-compact.json b/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.4-compact.json index 995b49f83..0a9029979 100644 --- a/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.4-compact.json +++ b/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.4-compact.json @@ -1,9 +1,11 @@ { + "I": {}, "VendingMachine": { "err0()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", + "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.5-compact.json b/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.5-compact.json index 995b49f83..0a9029979 100644 --- a/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.5-compact.json +++ b/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.5-compact.json @@ -1,9 +1,11 @@ { + "I": {}, "VendingMachine": { "err0()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", + "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.6-compact.json b/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.6-compact.json index 995b49f83..0a9029979 100644 --- a/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.6-compact.json +++ b/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.6-compact.json @@ -1,9 +1,11 @@ { + "I": {}, "VendingMachine": { "err0()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", + "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.7-compact.json b/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.7-compact.json index 995b49f83..0a9029979 100644 --- a/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.7-compact.json +++ b/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.7-compact.json @@ -1,9 +1,11 @@ { + "I": {}, "VendingMachine": { "err0()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", + "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.8-compact.json b/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.8-compact.json index 995b49f83..0a9029979 100644 --- a/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.8-compact.json +++ b/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.8-compact.json @@ -1,9 +1,11 @@ { + "I": {}, "VendingMachine": { "err0()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", + "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.9-compact.json b/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.9-compact.json index 995b49f83..0a9029979 100644 --- a/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.9-compact.json +++ b/tests/ast-parsing/expected/custom_error-0.8.4.sol-0.8.9-compact.json @@ -1,9 +1,11 @@ { + "I": {}, "VendingMachine": { "err0()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", + "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" From f10401593ed59581ce9bb739deca2f748c3a273f Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Wed, 27 Jul 2022 10:57:39 +0200 Subject: [PATCH 090/101] Add testcase --- .../ternary-with-max.sol-0.8.15-compact.zip | Bin 0 -> 2612 bytes .../ternary-with-max.sol-0.8.15-compact.json | 5 +++++ tests/ast-parsing/ternary-with-max.sol | 7 +++++++ tests/test_ast_parsing.py | 1 + 4 files changed, 13 insertions(+) create mode 100644 tests/ast-parsing/compile/ternary-with-max.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/expected/ternary-with-max.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/ternary-with-max.sol diff --git a/tests/ast-parsing/compile/ternary-with-max.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/ternary-with-max.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..dc4cb99da1f939843c014819229ad1c2bd154b3e GIT binary patch literal 2612 zcma);`9Bj51IK6Xgpey?!sI^Y%3KLKCSz&NA*Ernm}9weA0=PPeUxLBAy?-7y1tCX z+((og$yKQw%QZZGpWmO?>-l^>uh;vR&mZuHTQjp50e}D=K*7zUn@67VL$>(#)liB+=Uc>AK6ZcgeUeF3?<*=+lAD3z7{V6)>x;xS)Na3n_D1s|uCD{!5F_fp>K1}a}MyBj^RND(Z zM4Ho*rt5QW3uUN&US}t%r$yHs`kSjRJ5T*`LjaFvea8NRf#DNNM>D)RIZ{pPRfjE$ zl82vg8oA9N?))p8gsHSbpl}XAu#;$SrPO2P2x`JC`Yh$NzK7YJ-B*CGzWBZzx&VZ3 z$bDgX6ySb?ul5J}WN{)?Z8o((vR-I^eec-#pLMA-2-jfnr>q{rgD$-e0rgLOY9jQQ z9WuFGh1o@%jP5I@$mUz(ywnV)3)_XGeSn@S8AMZE+x!6ahO!zaNQ5=PG~hP z2c0fW?ZhiOC!)OO4a(vfW7oW>1r@?YvkX^$oy;~H5O9k`+iy5op#L)-lbNIBvC=)}HbMmx=_taHS&2$nwQ z*SS+3UXYJyL8?@Se%BE%Xie;bOF*qi^u`TA2U!Zl;{9XJg7pL98vo0m>j$-45!S<1 zmZB$M(VU+LXV|?2#$TsQCiU1(+FI$Ty`5^e>3%GxHs~oW7k1SPcDZ3i>dh{#N-1*M zLszL<4Z=Sm5-GD}`LGz3kxsdfpZmc+tHQiH#j&z0^>t~u4P3ft|IMs*2Lq$XM*3?| zfA7)^3}kZW^wnh#6`o*VvfmqP&2?$LPDzt+XcuGxh(J1qY;A`>I;uaTn5mV!|F%En zA}N*-ror!w5UFj7+HbVNX3RxZfk&Ldu}vqN7aKFT%HstS7z$a8B99ru-QgF!AsbT? zScCgDO~I9TARpQU=(WI&m6hsGP+Fu)8HmheQo^omM~~67uZ@ zDebM(h2B_k|7dC@>{nbK7L2SI4R~!)u8{O-#GG`?5;(AWpz7Gw)qCVMF{kIW0Thkw_1IfAxNg+%iswvI~`9rYdGpg?TdV*Fc+1k+v`+C#)k7aw zqUikt&?!X~f7^3E0*ouuCJoyl`(a}Ca&>vX;+iQ;G4!&-K5#=})tfMb28Sss*z-7u z?o;^|Je!(c6Vh8YX;!bNeIZI+JZw&|cVd#y#|TCUtdMi-R;tTRK9O-MkRJwjd)<%<9_ICD^%P2#x~Hc1*l|bERTW+!>RW_^nOCcLPzEFLX)ugbBxK?|niWzqVf8 z4s_C3Osn`VfBacYO7+UvPj~I726Q))Ui5QnQO1~|`$moL=%qWW>%p$bvYCi@N$Yoq zF2d(4l4WH=z?b=sH^F@iFT7D_L5IAatygf_#MC(DJqn^HAN+I+@)YP&&Jj4h$u=r) za`QPXHbP*?HXe7Y)9HZa+3&M#glDeH$)R%gHXi}-%^{pQT!YgvZV#vRu;eX zgKyT?^#nj$S~X5LaW6S(cRfB zosu!dIklwDdN=Bul2`$AKHFzSBD3Y#eK+Q6XbWmj`0;r~erL5!$OhHur=Rvoil}tZ zt7GHpqnvYG#p+}2DG~@>y83x;6i9hud733`(7O+LmgaDE*V>Qh@)a0E21Sa4_uHpd zhZ(QXG*h)p(o|*2Yx@uB!hDGB8m1PN)Q=9r7t}9r0e~1o@TP?H(>UBSF*ox1O346c zX+GD8lM3HQ%b%~tMsBQdH~z%Z#|L$^t;sXtBe_-XS{*wwk2+r}3@P1Q z2+q>)GLT$H3;BHNCjyP)5=Ha}>_-fZ;7ac-4iE6O&&2+}>@kz+$m0OIF&B(@`sR}N ztk}LJ{_~6$Q*uOV?@EI1q5X?X9GR0iP`dXye*8RYQcQzYapa9lFS8{BJzT{1JBb-h zCla}H%DdbYPd_B^HL=2f48Hbn_4a(Se2+HLR*hi@&4-Yr9C%>0nxh1lVCaNq#@-O0 z6w=nHl@_y5>Yqd}ay?IubT~a>Ln*+mnSe&j|J&sL$lQMu&Gaw+U$28(v$FmBXZq7y Me@Ok~h5*2S05p5*od5s; literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/expected/ternary-with-max.sol-0.8.15-compact.json b/tests/ast-parsing/expected/ternary-with-max.sol-0.8.15-compact.json new file mode 100644 index 000000000..755f83c9e --- /dev/null +++ b/tests/ast-parsing/expected/ternary-with-max.sol-0.8.15-compact.json @@ -0,0 +1,5 @@ +{ + "TernaryWithMax": { + "f(bool)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->2;\n2[label=\"Node Type: IF 2\n\"];\n2->3[label=\"True\"];\n2->4[label=\"False\"];\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->5;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: END_IF 5\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/ternary-with-max.sol b/tests/ast-parsing/ternary-with-max.sol new file mode 100644 index 000000000..6eadf3cfd --- /dev/null +++ b/tests/ast-parsing/ternary-with-max.sol @@ -0,0 +1,7 @@ +contract TernaryWithMax { + function f( + bool condition + ) external returns(uint256 res) { + res = type(uint256).max / (condition ? 10 : 1) ; + } +} diff --git a/tests/test_ast_parsing.py b/tests/test_ast_parsing.py index ed83e2b20..15be1dd76 100644 --- a/tests/test_ast_parsing.py +++ b/tests/test_ast_parsing.py @@ -411,6 +411,7 @@ ALL_TESTS = [ Test("free_functions/libraries_from_free.sol", ["0.8.12"]), Test("free_functions/new_operator.sol", ["0.8.12"]), Test("free_functions/library_constant_function_collision.sol", ["0.8.12"]), + Test("ternary-with-max.sol", ["0.8.15"]), ] # create the output folder if needed try: From 38511dd5d57e4eb7f9f90dfa9257e74f224cec2a Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Wed, 27 Jul 2022 11:23:39 +0200 Subject: [PATCH 091/101] Make entry_point return an Optional[Node] and update the detectors Related to #1280 Fix #1279 --- examples/scripts/taint_mapping.py | 3 +++ slither/core/declarations/function.py | 2 +- slither/detectors/statements/calls_in_loop.py | 8 ++++++-- slither/detectors/statements/costly_operations_in_loop.py | 8 ++++++-- slither/detectors/statements/delegatecall_in_loop.py | 8 ++++++-- slither/detectors/statements/msg_value_in_loop.py | 8 ++++++-- .../detectors/variables/uninitialized_local_variables.py | 6 +++++- .../variables/uninitialized_storage_variables.py | 2 +- 8 files changed, 34 insertions(+), 11 deletions(-) diff --git a/examples/scripts/taint_mapping.py b/examples/scripts/taint_mapping.py index feb843b20..75ed3d8df 100644 --- a/examples/scripts/taint_mapping.py +++ b/examples/scripts/taint_mapping.py @@ -10,6 +10,9 @@ from slither.slithir.variables.temporary import TemporaryVariable def visit_node(node, visited): + if node is None: + return + if node in visited: return diff --git a/slither/core/declarations/function.py b/slither/core/declarations/function.py index 8983769cc..8ec5a00ae 100644 --- a/slither/core/declarations/function.py +++ b/slither/core/declarations/function.py @@ -538,7 +538,7 @@ class Function(SourceMapping, metaclass=ABCMeta): # pylint: disable=too-many-pu self._nodes = nodes @property - def entry_point(self) -> "Node": + def entry_point(self) -> Optional["Node"]: """ Node: Entry point of the function """ diff --git a/slither/detectors/statements/calls_in_loop.py b/slither/detectors/statements/calls_in_loop.py index 7ea83f8fd..fdd0c6732 100644 --- a/slither/detectors/statements/calls_in_loop.py +++ b/slither/detectors/statements/calls_in_loop.py @@ -1,4 +1,4 @@ -from typing import List +from typing import List, Optional from slither.core.cfg.node import NodeType, Node from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification from slither.core.declarations import Contract @@ -22,7 +22,11 @@ def detect_call_in_loop(contract: Contract) -> List[Node]: return ret -def call_in_loop(node: Node, in_loop_counter: int, visited: List[Node], ret: List[Node]) -> None: +def call_in_loop( + node: Optional[Node], in_loop_counter: int, visited: List[Node], ret: List[Node] +) -> None: + if node is None: + return if node in visited: return # shared visited diff --git a/slither/detectors/statements/costly_operations_in_loop.py b/slither/detectors/statements/costly_operations_in_loop.py index d10cfaaf0..930085cc6 100644 --- a/slither/detectors/statements/costly_operations_in_loop.py +++ b/slither/detectors/statements/costly_operations_in_loop.py @@ -1,4 +1,4 @@ -from typing import List +from typing import List, Optional from slither.core.cfg.node import NodeType, Node from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification from slither.core.declarations import Contract @@ -17,8 +17,12 @@ def detect_costly_operations_in_loop(contract: Contract) -> List[Node]: def costly_operations_in_loop( - node: Node, in_loop_counter: int, visited: List[Node], ret: List[Node] + node: Optional[Node], in_loop_counter: int, visited: List[Node], ret: List[Node] ) -> None: + + if node is None: + return + if node in visited: return # shared visited diff --git a/slither/detectors/statements/delegatecall_in_loop.py b/slither/detectors/statements/delegatecall_in_loop.py index 58de0359b..b7bf70cbc 100644 --- a/slither/detectors/statements/delegatecall_in_loop.py +++ b/slither/detectors/statements/delegatecall_in_loop.py @@ -1,4 +1,4 @@ -from typing import List +from typing import List, Optional from slither.core.cfg.node import NodeType, Node from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification from slither.slithir.operations import LowLevelCall, InternalCall @@ -15,8 +15,12 @@ def detect_delegatecall_in_loop(contract: Contract) -> List[Node]: def delegatecall_in_loop( - node: Node, in_loop_counter: int, visited: List[Node], results: List[Node] + node: Optional[Node], in_loop_counter: int, visited: List[Node], results: List[Node] ) -> None: + + if node is None: + return + if node in visited: return # shared visited diff --git a/slither/detectors/statements/msg_value_in_loop.py b/slither/detectors/statements/msg_value_in_loop.py index 5bd5c398c..bfd541201 100644 --- a/slither/detectors/statements/msg_value_in_loop.py +++ b/slither/detectors/statements/msg_value_in_loop.py @@ -1,4 +1,4 @@ -from typing import List +from typing import List, Optional from slither.core.cfg.node import NodeType, Node from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification from slither.slithir.operations import InternalCall @@ -15,8 +15,12 @@ def detect_msg_value_in_loop(contract: Contract) -> List[Node]: def msg_value_in_loop( - node: Node, in_loop_counter: int, visited: List[Node], results: List[Node] + node: Optional[Node], in_loop_counter: int, visited: List[Node], results: List[Node] ) -> None: + + if node is None: + return + if node in visited: return # shared visited diff --git a/slither/detectors/variables/uninitialized_local_variables.py b/slither/detectors/variables/uninitialized_local_variables.py index 45c86c22d..7f7cb76e0 100644 --- a/slither/detectors/variables/uninitialized_local_variables.py +++ b/slither/detectors/variables/uninitialized_local_variables.py @@ -88,7 +88,11 @@ Bob calls `transfer`. As a result, all Ether is sent to the address `0x0` and is for contract in self.compilation_unit.contracts: for function in contract.functions: - if function.is_implemented and function.contract_declarer == contract: + if ( + function.is_implemented + and function.contract_declarer == contract + and function.entry_point + ): if function.contains_assembly: continue # dont consider storage variable, as they are detected by another detector diff --git a/slither/detectors/variables/uninitialized_storage_variables.py b/slither/detectors/variables/uninitialized_storage_variables.py index a84462f38..a0c35d80d 100644 --- a/slither/detectors/variables/uninitialized_storage_variables.py +++ b/slither/detectors/variables/uninitialized_storage_variables.py @@ -96,7 +96,7 @@ Bob calls `func`. As a result, `owner` is overridden to `0`. for contract in self.compilation_unit.contracts: for function in contract.functions: - if function.is_implemented: + if function.is_implemented and function.entry_point: uninitialized_storage_variables = [ v for v in function.local_variables if v.is_storage and v.uninitialized ] From 0813789c520b2bc40e8caf8a28ea27f82b345898 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Wed, 27 Jul 2022 12:13:40 +0200 Subject: [PATCH 092/101] Fix contract_kind --- slither/solc_parsing/declarations/contract.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/solc_parsing/declarations/contract.py b/slither/solc_parsing/declarations/contract.py index efc53f2aa..1d56d5f2f 100644 --- a/slither/solc_parsing/declarations/contract.py +++ b/slither/solc_parsing/declarations/contract.py @@ -157,7 +157,7 @@ class ContractSolc(CallerContextExpression): if "contractKind" in attributes: if attributes["contractKind"] == "interface": self._contract.is_interface = True - self._contract.kind = attributes["contractKind"] + self._contract.contract_kind = attributes["contractKind"] self._linearized_base_contracts = attributes["linearizedBaseContracts"] # self._contract.fullyImplemented = attributes["fullyImplemented"] From d25ebe2acc7306636d1537ff106504341f32f708 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Thu, 28 Jul 2022 08:42:25 +0200 Subject: [PATCH 093/101] Update ci.yml --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 87b76a0f2..cc58ab718 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -74,6 +74,5 @@ jobs: PYTHONUTF8: 1 TEST_TYPE: ${{ matrix.type }} GITHUB_ETHERSCAN: ${{ secrets.GITHUB_ETHERSCAN }} - PYTHONUTF8: 1 run: | bash "scripts/ci_test_${TEST_TYPE}.sh" From f4f686e8d3f0625193b30741f15a4d88a78257d3 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Mon, 1 Aug 2022 15:13:42 +0200 Subject: [PATCH 094/101] Minor --- tests/test_detectors.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_detectors.py b/tests/test_detectors.py index 6075919af..255a4ac88 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -1331,6 +1331,7 @@ ALL_TEST_OBJECTS = [ all_detectors.SimilarVarsDetection, "similar_variables.sol", "0.7.6", + ), Test( all_detectors.MsgValueInLoop, "msg_value_loop.sol", From 2b06b49cb7b6267ee3ef7c049dfa97fa607997d4 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Mon, 1 Aug 2022 15:15:54 +0200 Subject: [PATCH 095/101] Minor --- slither/solc_parsing/slither_compilation_unit_solc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/solc_parsing/slither_compilation_unit_solc.py b/slither/solc_parsing/slither_compilation_unit_solc.py index e057d00e8..3054b4470 100644 --- a/slither/solc_parsing/slither_compilation_unit_solc.py +++ b/slither/solc_parsing/slither_compilation_unit_solc.py @@ -459,7 +459,7 @@ Please rename it, this name is reserved for Slither's internals""" txt = f"Missing inheritance {contract_parser.underlying_contract} ({contract_parser.compilation_unit.crytic_compile_compilation_unit.unique_id})\n" txt += f"Missing inheritance ID: {missing_inheritance}\n" if contract_parser.underlying_contract.inheritance: - txt += f"Inheritance found:\n" + txt += "Inheritance found:\n" for contract_inherited in contract_parser.underlying_contract.inheritance: txt += f"\t - {contract_inherited} (ID {contract_inherited.id})\n" contract_parser.log_incorrect_parsing(txt) From 6d3149a59a4560942a774826ce53ef9a0f585b65 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Mon, 1 Aug 2022 15:24:15 +0200 Subject: [PATCH 096/101] Minor --- tests/test_detectors.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/test_detectors.py b/tests/test_detectors.py index 255a4ac88..7aea45bbe 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -1257,11 +1257,12 @@ ALL_TEST_OBJECTS = [ "unimplemented_interface.sol", "0.7.6", ), - Test( - all_detectors.EnumConversion, - "enum_conversion.sol", - "0.4.2", - ), + # Does not work on the CI. Most likely because of solc 0.4.2? + # Test( + # all_detectors.EnumConversion, + # "enum_conversion.sol", + # "0.4.2", + # ), Test( all_detectors.MultipleConstructorSchemes, "multiple_constructor_schemes.sol", From 3d7344e85fd105ce76648ed1d4d2e3d4e683b6c0 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Mon, 1 Aug 2022 16:51:45 +0200 Subject: [PATCH 097/101] Re-order --- slither/core/slither_core.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/slither/core/slither_core.py b/slither/core/slither_core.py index 7d7d1ffb8..77f172c96 100644 --- a/slither/core/slither_core.py +++ b/slither/core/slither_core.py @@ -245,9 +245,7 @@ class SlitherCore(Context): if r["elements"] and matching: return False - if r["elements"] and self._exclude_dependencies: - if all(element["source_mapping"]["is_dependency"] for element in r["elements"]): - return False + if self._show_ignored_findings: return True if self.has_ignore_comment(r): @@ -255,7 +253,8 @@ class SlitherCore(Context): if r["id"] in self._previous_results_ids: return False if r["elements"] and self._exclude_dependencies: - return not all(element["source_mapping"]["is_dependency"] for element in r["elements"]) + if all(element["source_mapping"]["is_dependency"] for element in r["elements"]): + return False # Conserve previous result filtering. This is conserved for compatibility, but is meant to be removed if r["description"] in [pr["description"] for pr in self._previous_results]: return False From 74ae4909ae8b376f382a2480283b7f51a237bd2b Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Mon, 1 Aug 2022 17:08:45 +0200 Subject: [PATCH 098/101] Minor improvements --- slither/core/solidity_types/array_type.py | 1 - slither/core/solidity_types/type.py | 2 +- slither/core/solidity_types/type_alias.py | 2 +- slither/core/solidity_types/type_information.py | 4 ++++ slither/core/solidity_types/user_defined_type.py | 3 +-- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/slither/core/solidity_types/array_type.py b/slither/core/solidity_types/array_type.py index 15b53eb03..97d735c89 100644 --- a/slither/core/solidity_types/array_type.py +++ b/slither/core/solidity_types/array_type.py @@ -29,7 +29,6 @@ class ArrayType(Type): def type(self) -> Type: return self._type - @property def is_dynamic(self) -> bool: return self.length is None diff --git a/slither/core/solidity_types/type.py b/slither/core/solidity_types/type.py index bfec7d8bc..c06e5984f 100644 --- a/slither/core/solidity_types/type.py +++ b/slither/core/solidity_types/type.py @@ -18,4 +18,4 @@ class Type(SourceMapping, metaclass=abc.ABCMeta): @property @abc.abstractmethod def is_dynamic(self) -> bool: - """ True if the size of the type is dynamic""" + """True if the size of the type is dynamic""" diff --git a/slither/core/solidity_types/type_alias.py b/slither/core/solidity_types/type_alias.py index 0a1f99d23..703d0f4f6 100644 --- a/slither/core/solidity_types/type_alias.py +++ b/slither/core/solidity_types/type_alias.py @@ -15,7 +15,6 @@ class TypeAlias(Type): self.name = name self.underlying_type = underlying_type - @property def storage_size(self) -> Tuple[int, bool]: return self.underlying_type.storage_size @@ -27,6 +26,7 @@ class TypeAlias(Type): def is_dynamic(self) -> bool: return self.underlying_type.is_dynamic + class TypeAliasTopLevel(TypeAlias, TopLevel): def __init__(self, underlying_type: Type, name: str, scope: "FileScope"): super().__init__(underlying_type, name) diff --git a/slither/core/solidity_types/type_information.py b/slither/core/solidity_types/type_information.py index ccc84e8c1..0477bb7e6 100644 --- a/slither/core/solidity_types/type_information.py +++ b/slither/core/solidity_types/type_information.py @@ -35,6 +35,10 @@ class TypeInformation(Type): """ return 32, True + @property + def is_dynamic(self) -> bool: + raise NotImplementedError + def __str__(self): return f"type({self.type.name})" diff --git a/slither/core/solidity_types/user_defined_type.py b/slither/core/solidity_types/user_defined_type.py index 21f9c0911..38300cdd9 100644 --- a/slither/core/solidity_types/user_defined_type.py +++ b/slither/core/solidity_types/user_defined_type.py @@ -22,13 +22,12 @@ class UserDefinedType(Type): @property def is_dynamic(self) -> bool: - raise NotImplemented + return False @property def type(self) -> Union["Contract", "Enum", "Structure"]: return self._type - @property def storage_size(self) -> Tuple[int, bool]: from slither.core.declarations.structure import Structure From 4b7541f8e3fca3e5e3f667dbde74f40e03e5b8cb Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Wed, 3 Aug 2022 15:36:19 +0200 Subject: [PATCH 099/101] Improve generation of solidity signature - Better support nested types/array/structure/mapping - Clarify the API for full_name versus solidity_signature - Addd contract.get_function_from_full_name - Use the same API for function and variable - Add tests Replace #483 Fix #1077 --- .github/workflows/features.yml | 1 + slither/core/declarations/contract.py | 21 ++- slither/core/declarations/function.py | 14 +- slither/core/declarations/structure.py | 4 +- .../core/solidity_types/elementary_type.py | 2 +- slither/core/variables/state_variable.py | 32 +--- slither/core/variables/variable.py | 61 ++++--- .../formatters/attributes/const_functions.py | 2 +- .../formatters/functions/external_function.py | 2 +- .../naming_convention/naming_convention.py | 4 +- slither/printers/guidance/echidna.py | 5 +- slither/printers/summary/function_ids.py | 2 +- .../upgradeability/checks/functions_ids.py | 2 +- slither/utils/type.py | 164 ++++++++++++++---- tests/printers/functions_ids.sol | 64 +++++++ tests/test_functions_ids.py | 60 +++++++ 16 files changed, 338 insertions(+), 102 deletions(-) create mode 100644 tests/printers/functions_ids.sol create mode 100644 tests/test_functions_ids.py diff --git a/.github/workflows/features.yml b/.github/workflows/features.yml index 8757d654a..18d5d49b4 100644 --- a/.github/workflows/features.yml +++ b/.github/workflows/features.yml @@ -47,3 +47,4 @@ jobs: pytest tests/test_features.py pytest tests/test_constant_folding_unary.py pytest tests/slithir/test_ternary_expressions.py + pytest tests/test_functions_ids.py diff --git a/slither/core/declarations/contract.py b/slither/core/declarations/contract.py index 333d906fa..0dfaa273c 100644 --- a/slither/core/declarations/contract.py +++ b/slither/core/declarations/contract.py @@ -650,6 +650,21 @@ class Contract(SourceMapping): # pylint: disable=too-many-public-methods """ return [f for f in self.functions if f.is_writing(variable)] + def get_function_from_full_name(self, full_name: str) -> Optional["Function"]: + """ + Return a function from a full name + The full name differs from the solidity's signature are the type are conserved + For example contract type are kept, structure are not unrolled, etc + Args: + full_name (str): signature of the function (without return statement) + Returns: + Function + """ + return next( + (f for f in self.functions if f.full_name == full_name and not f.is_shadowed), + None, + ) + def get_function_from_signature(self, function_signature: str) -> Optional["Function"]: """ Return a function from a signature @@ -659,7 +674,11 @@ class Contract(SourceMapping): # pylint: disable=too-many-public-methods Function """ return next( - (f for f in self.functions if f.full_name == function_signature and not f.is_shadowed), + ( + f + for f in self.functions + if f.solidity_signature == function_signature and not f.is_shadowed + ), None, ) diff --git a/slither/core/declarations/function.py b/slither/core/declarations/function.py index 8ec5a00ae..674fe1cce 100644 --- a/slither/core/declarations/function.py +++ b/slither/core/declarations/function.py @@ -20,11 +20,11 @@ from slither.core.expressions import ( MemberAccess, UnaryOperation, ) -from slither.core.solidity_types import UserDefinedType from slither.core.solidity_types.type import Type from slither.core.source_mapping.source_mapping import SourceMapping from slither.core.variables.local_variable import LocalVariable from slither.core.variables.state_variable import StateVariable +from slither.utils.type import convert_type_for_solidity_signature_to_string from slither.utils.utils import unroll # pylint: disable=import-outside-toplevel,too-many-instance-attributes,too-many-statements,too-many-lines @@ -265,6 +265,8 @@ class Function(SourceMapping, metaclass=ABCMeta): # pylint: disable=too-many-pu """ str: func_name(type1,type2) Return the function signature without the return values + The difference between this function and solidity_function is that full_name does not translate the underlying + type (ex: structure, contract to address, ...) """ if self._full_name is None: name, parameters, _ = self.signature @@ -952,14 +954,6 @@ class Function(SourceMapping, metaclass=ABCMeta): # pylint: disable=too-many-pu ################################################################################### ################################################################################### - @staticmethod - def _convert_type_for_solidity_signature(t: Type): - from slither.core.declarations import Contract - - if isinstance(t, UserDefinedType) and isinstance(t.type, Contract): - return "address" - return str(t) - @property def solidity_signature(self) -> str: """ @@ -969,7 +963,7 @@ class Function(SourceMapping, metaclass=ABCMeta): # pylint: disable=too-many-pu """ if self._solidity_signature is None: parameters = [ - self._convert_type_for_solidity_signature(x.type) for x in self.parameters + convert_type_for_solidity_signature_to_string(x.type) for x in self.parameters ] self._solidity_signature = self.name + "(" + ",".join(parameters) + ")" return self._solidity_signature diff --git a/slither/core/declarations/structure.py b/slither/core/declarations/structure.py index eb5f5e00d..39b1948ee 100644 --- a/slither/core/declarations/structure.py +++ b/slither/core/declarations/structure.py @@ -1,4 +1,4 @@ -from typing import List, TYPE_CHECKING, Dict +from typing import List, TYPE_CHECKING, Dict, Optional from slither.core.source_mapping.source_mapping import SourceMapping @@ -10,7 +10,7 @@ if TYPE_CHECKING: class Structure(SourceMapping): def __init__(self, compilation_unit: "SlitherCompilationUnit"): super().__init__() - self._name = None + self._name: Optional[str] = None self._canonical_name = None self._elems: Dict[str, "StructureVariable"] = {} # Name of the elements in the order of declaration diff --git a/slither/core/solidity_types/elementary_type.py b/slither/core/solidity_types/elementary_type.py index ce782a5e6..24eeb39ae 100644 --- a/slither/core/solidity_types/elementary_type.py +++ b/slither/core/solidity_types/elementary_type.py @@ -151,7 +151,7 @@ class NonElementaryType(Exception): class ElementaryType(Type): - def __init__(self, t): + def __init__(self, t: str) -> None: if t not in ElementaryTypeName: raise NonElementaryType super().__init__() diff --git a/slither/core/variables/state_variable.py b/slither/core/variables/state_variable.py index 3b37d57c3..c9a90f36b 100644 --- a/slither/core/variables/state_variable.py +++ b/slither/core/variables/state_variable.py @@ -1,8 +1,7 @@ -from typing import Optional, TYPE_CHECKING, Tuple, List +from typing import Optional, TYPE_CHECKING -from slither.core.variables.variable import Variable from slither.core.children.child_contract import ChildContract -from slither.utils.type import export_nested_types_from_variable +from slither.core.variables.variable import Variable if TYPE_CHECKING: from slither.core.cfg.node import Node @@ -22,33 +21,6 @@ class StateVariable(ChildContract, Variable): """ return self.contract == contract - ################################################################################### - ################################################################################### - # region Signature - ################################################################################### - ################################################################################### - - @property - def signature(self) -> Tuple[str, List[str], str]: - """ - Return the signature of the state variable as a function signature - :return: (str, list(str), list(str)), as (name, list parameters type, list return values type) - """ - return ( - self.name, - [str(x) for x in export_nested_types_from_variable(self)], - str(self.type), - ) - - @property - def signature_str(self) -> str: - """ - Return the signature of the state variable as a function signature - :return: str: func_name(type1,type2) returns(type3) - """ - name, parameters, returnVars = self.signature - return name + "(" + ",".join(parameters) + ") returns(" + ",".join(returnVars) + ")" - # endregion ################################################################################### ################################################################################### diff --git a/slither/core/variables/variable.py b/slither/core/variables/variable.py index 5f94bc922..0558be52c 100644 --- a/slither/core/variables/variable.py +++ b/slither/core/variables/variable.py @@ -1,7 +1,7 @@ """ Variable module """ -from typing import Optional, TYPE_CHECKING, List, Union +from typing import Optional, TYPE_CHECKING, List, Union, Tuple from slither.core.source_mapping.source_mapping import SourceMapping from slither.core.solidity_types.type import Type @@ -44,7 +44,7 @@ class Variable(SourceMapping): return self._initial_expression @expression.setter - def expression(self, expr: "Expression"): + def expression(self, expr: "Expression") -> None: self._initial_expression = expr @property @@ -70,6 +70,7 @@ class Variable(SourceMapping): """ str: variable name """ + assert self._name return self._name @name.setter @@ -97,7 +98,7 @@ class Variable(SourceMapping): return self._is_reentrant @is_reentrant.setter - def is_reentrant(self, is_reentrant: bool): + def is_reentrant(self, is_reentrant: bool) -> None: self._is_reentrant = is_reentrant @property @@ -105,7 +106,7 @@ class Variable(SourceMapping): return self._write_protection @write_protection.setter - def write_protection(self, write_protection: List[str]): + def write_protection(self, write_protection: List[str]) -> None: self._write_protection = write_protection @property @@ -116,12 +117,13 @@ class Variable(SourceMapping): return self._visibility @visibility.setter - def visibility(self, v: str): + def visibility(self, v: str) -> None: self._visibility = v - def set_type(self, t): + def set_type(self, t: Optional[Union[List, Type, str]]) -> None: if isinstance(t, str): - t = ElementaryType(t) + self._type = ElementaryType(t) + return assert isinstance(t, (Type, list)) or t is None self._type = t @@ -135,27 +137,46 @@ class Variable(SourceMapping): return self._is_immutable @is_immutable.setter - def is_immutable(self, immutablility: bool): + def is_immutable(self, immutablility: bool) -> None: self._is_immutable = immutablility + ################################################################################### + ################################################################################### + # region Signature + ################################################################################### + ################################################################################### + @property - def function_name(self): + def signature(self) -> Tuple[str, List[str], List[str]]: """ - Return the name of the variable as a function signature - :return: + Return the signature of the state variable as a function signature + :return: (str, list(str), list(str)), as (name, list parameters type, list return values type) """ # pylint: disable=import-outside-toplevel - from slither.core.solidity_types import ArrayType, MappingType - from slither.utils.type import export_nested_types_from_variable + from slither.utils.type import ( + export_nested_types_from_variable, + export_return_type_from_variable, + ) - variable_getter_args = "" - return_type = self.type - assert return_type + return ( + self.name, + [str(x) for x in export_nested_types_from_variable(self)], + [str(x) for x in export_return_type_from_variable(self)], + ) - if isinstance(return_type, (ArrayType, MappingType)): - variable_getter_args = ",".join(map(str, export_nested_types_from_variable(self))) + @property + def signature_str(self) -> str: + """ + Return the signature of the state variable as a function signature + :return: str: func_name(type1,type2) returns(type3) + """ + name, parameters, returnVars = self.signature + return name + "(" + ",".join(parameters) + ") returns(" + ",".join(returnVars) + ")" - return f"{self.name}({variable_getter_args})" + @property + def solidity_signature(self) -> str: + name, parameters, _ = self.signature + return f'{name}({",".join(parameters)})' - def __str__(self): + def __str__(self) -> str: return self._name diff --git a/slither/formatters/attributes/const_functions.py b/slither/formatters/attributes/const_functions.py index 2f28ac615..7be42ac04 100644 --- a/slither/formatters/attributes/const_functions.py +++ b/slither/formatters/attributes/const_functions.py @@ -16,7 +16,7 @@ def custom_format(compilation_unit: SlitherCompilationUnit, result): element["type_specific_fields"]["parent"]["name"] ) if target_contract: - function = target_contract.get_function_from_signature( + function = target_contract.get_function_from_full_name( element["type_specific_fields"]["signature"] ) if function: diff --git a/slither/formatters/functions/external_function.py b/slither/formatters/functions/external_function.py index 07316abed..67fdf66e9 100644 --- a/slither/formatters/functions/external_function.py +++ b/slither/formatters/functions/external_function.py @@ -12,7 +12,7 @@ def custom_format(compilation_unit: SlitherCompilationUnit, result): element["type_specific_fields"]["parent"]["name"] ) if target_contract: - function = target_contract.get_function_from_signature( + function = target_contract.get_function_from_full_name( element["type_specific_fields"]["signature"] ) if function: diff --git a/slither/formatters/naming_convention/naming_convention.py b/slither/formatters/naming_convention/naming_convention.py index d7720cc5a..9b4de3830 100644 --- a/slither/formatters/naming_convention/naming_convention.py +++ b/slither/formatters/naming_convention/naming_convention.py @@ -254,7 +254,7 @@ def _patch(compilation_unit: SlitherCompilationUnit, result, element, _target): ] param_name = element["name"] contract = scope.get_contract_from_name(contract_name) - function = contract.get_function_from_signature(function_sig) + function = contract.get_function_from_full_name(function_sig) target = function.get_local_variable_from_name(param_name) elif _target in ["variable", "variable_constant"]: @@ -268,7 +268,7 @@ def _patch(compilation_unit: SlitherCompilationUnit, result, element, _target): ] var_name = element["name"] contract = scope.get_contract_from_name(contract_name) - function = contract.get_function_from_signature(function_sig) + function = contract.get_function_from_full_name(function_sig) target = function.get_local_variable_from_name(var_name) # State variable else: diff --git a/slither/printers/guidance/echidna.py b/slither/printers/guidance/echidna.py index 2ae7c4612..dbfa54121 100644 --- a/slither/printers/guidance/echidna.py +++ b/slither/printers/guidance/echidna.py @@ -37,8 +37,7 @@ def _get_name(f: Union[Function, Variable]) -> str: if isinstance(f, Function): if f.is_fallback or f.is_receive: return "()" - return f.solidity_signature - return f.function_name + return f.solidity_signature def _extract_payable(slither: SlitherCore) -> Dict[str, List[str]]: @@ -117,7 +116,7 @@ def _extract_constant_functions(slither: SlitherCore) -> Dict[str, List[str]]: for contract in slither.contracts: cst_functions = [_get_name(f) for f in contract.functions_entry_points if _is_constant(f)] cst_functions += [ - v.function_name for v in contract.state_variables if v.visibility in ["public"] + v.solidity_signature for v in contract.state_variables if v.visibility in ["public"] ] if cst_functions: ret[contract.name] = cst_functions diff --git a/slither/printers/summary/function_ids.py b/slither/printers/summary/function_ids.py index 6c998880d..c3738ac5f 100644 --- a/slither/printers/summary/function_ids.py +++ b/slither/printers/summary/function_ids.py @@ -31,7 +31,7 @@ class FunctionIds(AbstractPrinter): table.add_row([function.solidity_signature, f"{function_id:#0{10}x}"]) for variable in contract.state_variables: if variable.visibility in ["public"]: - sig = variable.function_name + sig = variable.solidity_signature function_id = get_function_id(sig) table.add_row([sig, f"{function_id:#0{10}x}"]) txt += str(table) + "\n" diff --git a/slither/tools/upgradeability/checks/functions_ids.py b/slither/tools/upgradeability/checks/functions_ids.py index 255ae01ec..a7a45f405 100644 --- a/slither/tools/upgradeability/checks/functions_ids.py +++ b/slither/tools/upgradeability/checks/functions_ids.py @@ -22,7 +22,7 @@ def get_signatures(c): def _get_function_or_variable(contract, signature): - f = contract.get_function_from_signature(signature) + f = contract.get_function_from_full_name(signature) if f: return f diff --git a/slither/utils/type.py b/slither/utils/type.py index a70ee754b..1ce5fc158 100644 --- a/slither/utils/type.py +++ b/slither/utils/type.py @@ -1,21 +1,93 @@ +import math from typing import List, Union -from slither.core.solidity_types import ArrayType, MappingType, ElementaryType +from slither.core.solidity_types import ArrayType, MappingType, ElementaryType, UserDefinedType from slither.core.solidity_types.type import Type from slither.core.variables.variable import Variable -def _add_mapping_parameter(t: Type, l: List[Type]): - while isinstance(t, MappingType): - l.append(t.type_from) - t = t.type_to - _add_array_parameter(t, l) +def _convert_type_for_solidity_signature_to_string(types: Union[Type, List[Type]]) -> str: + if isinstance(types, Type): + # Array might be struct, so we need to go again through the conversion here + # We could have this logic in convert_type_for_solidity_signature + # But the slither type system is not straightforward to manipulate here + # And it would require to create a new ArrayType, which a potential List[Type] as input + # Which is currently not supported. This comes down to (uint, uint)[] not being possible in Solidity + # While having an array of a struct of two uint leads to a (uint, uint)[] signature + if isinstance(types, ArrayType): + underlying_type = convert_type_for_solidity_signature(types.type) + underlying_type_str = _convert_type_for_solidity_signature_to_string(underlying_type) + return underlying_type_str + "[]" + return str(types) -def _add_array_parameter(t: Type, l: List[Type]): - while isinstance(t, ArrayType): - l.append(ElementaryType("uint256")) - t = t.type + first_item = True + + ret = "(" + for underlying_type in types: + if first_item: + ret += _convert_type_for_solidity_signature_to_string(underlying_type) + else: + ret += "," + _convert_type_for_solidity_signature_to_string(underlying_type) + first_item = False + + ret += ")" + return ret + + +def convert_type_for_solidity_signature_to_string(t: Type) -> str: + types = convert_type_for_solidity_signature(t) + return _convert_type_for_solidity_signature_to_string(types) + + +def convert_type_for_solidity_signature(t: Type) -> Union[Type, List[Type]]: + # pylint: disable=import-outside-toplevel + from slither.core.declarations import Contract, Enum, Structure + + if isinstance(t, UserDefinedType): + underlying_type = t.type + if isinstance(underlying_type, Contract): + return ElementaryType("address") + if isinstance(underlying_type, Enum): + number_values = len(underlying_type.values) + # IF below 65536, avoid calling log2 + if number_values <= 256: + uint = "8" + elif number_values <= 65536: + uint = "16" + else: + uint = str(int(math.log2(number_values))) + return ElementaryType(f"uint{uint}") + if isinstance(underlying_type, Structure): + # We can't have recursive types for structure, so recursion is ok here + types = [ + convert_type_for_solidity_signature(x.type) for x in underlying_type.elems_ordered + ] + return types + + return t + + +def _export_nested_types_from_variable(current_type: Type, ret: List[Type]) -> None: + """ + Export the list of nested types (mapping/array) + :param variable: + :return: list(Type) + """ + if isinstance(current_type, MappingType): + underlying_type = convert_type_for_solidity_signature(current_type.type_from) + if isinstance(underlying_type, list): + ret.extend(underlying_type) + else: + ret.append(underlying_type) + next_type = current_type.type_to + + elif isinstance(current_type, ArrayType): + ret.append(ElementaryType("uint256")) + next_type = current_type.type + else: + return + _export_nested_types_from_variable(next_type, ret) def export_nested_types_from_variable(variable: Variable) -> List[Type]: @@ -25,33 +97,67 @@ def export_nested_types_from_variable(variable: Variable) -> List[Type]: :return: list(Type) """ l: List[Type] = [] - if isinstance(variable.type, MappingType): - t = variable.type - _add_mapping_parameter(t, l) + _export_nested_types_from_variable(variable.type, l) + return l - if isinstance(variable.type, ArrayType): - v = variable - _add_array_parameter(v.type, l) - return l +def _export_return_type_from_variable(underlying_type: Type, all_types: bool) -> List[Type]: + # pylint: disable=import-outside-toplevel + from slither.core.declarations import Structure + if isinstance(underlying_type, MappingType): + if not all_types: + return [] + return export_return_type_from_variable(underlying_type.type_to) -def export_return_type_from_variable(variable: Union[Type, Variable]): + if isinstance(underlying_type, ArrayType): + if not all_types: + return [] + return export_return_type_from_variable(underlying_type.type) + + if isinstance(underlying_type, UserDefinedType) and isinstance(underlying_type.type, Structure): + ret = [] + for r in underlying_type.type.elems_ordered: + ret += export_return_type_from_variable(r, all_types=False) + + return ret + + return [underlying_type] + + +def export_return_type_from_variable( + variable_or_type: Union[Type, Variable], all_types: bool = True +) -> List[Type]: """ - Return the type returned by a variable - :param variable + Return the type returned by a variable. + If all_types set to false, filter array/mapping. This is useful as the mapping/array in a structure are not + returned by solidity + :param variable_or_type + :param all_types :return: Type """ - if isinstance(variable, MappingType): - return export_return_type_from_variable(variable.type_to) + # pylint: disable=import-outside-toplevel + from slither.core.declarations import Structure + + if isinstance(variable_or_type, Type): + return _export_return_type_from_variable(variable_or_type, all_types) - if isinstance(variable, ArrayType): - return variable.type + if isinstance(variable_or_type.type, MappingType): + if not all_types: + return [] + return export_return_type_from_variable(variable_or_type.type.type_to) - if isinstance(variable.type, MappingType): - return export_return_type_from_variable(variable.type.type_to) + if isinstance(variable_or_type.type, ArrayType): + if not all_types: + return [] + return export_return_type_from_variable(variable_or_type.type.type) - if isinstance(variable.type, ArrayType): - return variable.type.type + if isinstance(variable_or_type.type, UserDefinedType) and isinstance( + variable_or_type.type.type, Structure + ): + ret = [] + for r in variable_or_type.type.type.elems_ordered: + ret += export_return_type_from_variable(r, all_types=False) + return ret - return variable.type + return [variable_or_type.type] diff --git a/tests/printers/functions_ids.sol b/tests/printers/functions_ids.sol new file mode 100644 index 000000000..2f4eea6a7 --- /dev/null +++ b/tests/printers/functions_ids.sol @@ -0,0 +1,64 @@ +pragma experimental ABIEncoderV2; + +contract Contract{} + +contract C{ + + mapping(uint => address)[] public arrayOfMappings; + + mapping(uint => address[]) public normalMappingArrayField; + + enum State{a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60,a61,a62,a63,a64,a65,a66,a67,a68,a69,a70,a71,a72,a73,a74,a75,a76,a77,a78,a79,a80,a81,a82,a83,a84,a85,a86,a87,a88,a89,a90,a91,a92,a93,a94,a95,a96,a97,a98,a99,a100,a101,a102,a103,a104,a105,a106,a107,a108,a109,a110,a111,a112,a113,a114,a115,a116,a117,a118,a119,a120,a121,a122,a123,a124,a125,a126,a127,a128,a129,a130,a131,a132,a133,a134,a135,a136,a137,a138,a139,a140,a141,a142,a143,a144,a145,a146,a147,a148,a149,a150,a151,a152,a153,a154,a155,a156,a157,a158,a159,a160,a161,a162,a163,a164,a165,a166,a167,a168,a169,a170,a171,a172,a173,a174,a175,a176,a177,a178,a179,a180,a181,a182,a183,a184,a185,a186,a187,a188,a189,a190,a191,a192,a193,a194,a195,a196,a197,a198,a199,a200,a201,a202,a203,a204,a205,a206,a207,a208,a209,a210,a211,a212,a213,a214,a215,a216,a217,a218,a219,a220,a221,a222,a223,a224,a225,a226,a227,a228,a229,a230,a231,a232,a233,a234,a235,a236,a237,a238,a239,a240,a241,a242,a243,a244,a245,a246,a247,a248,a249,a250,a251,a252,a253,a254,a255,a256} + mapping(State => uint) public stateMap; + + mapping(Contract => uint) public contractMap; + + uint[][] public multiDimensionalArray; + + struct Simple { + uint a; + uint b; + mapping(uint => uint) c; + uint[] d; + function(uint) external returns (uint) e; + } + + Simple public simple; + + struct Inner { + uint a; + uint b; + } + + struct Outer { + Inner inner; + uint c; + } + + Outer public outer; + + + struct A { + Inner inner; + uint a; + } + struct B { + uint a; + Inner inner; + } + + A public a; + A[] public a_array; + mapping(address => B[]) public b_mapping_of_array; + + function function_with_struct(A memory a) public{} + + function function_with_array(A[] memory array, B memory b) public {} + + struct AnotherStruct{ + B b; + A[] a; + } + mapping(address => AnotherStruct[][]) public mapping_of_double_array_of_struct; +} + diff --git a/tests/test_functions_ids.py b/tests/test_functions_ids.py new file mode 100644 index 000000000..49818347f --- /dev/null +++ b/tests/test_functions_ids.py @@ -0,0 +1,60 @@ +from solc_select import solc_select +from slither import Slither + +# % solc functions_ids.sol --hashes +# ======= functions_ids.sol:C ======= +# Function signatures: +# 0dbe671f: a() +# 4a1f689d: a_array(uint256) +# 98fc2aa5: arrayOfMappings(uint256,uint256) +# 4ea7a557: b_mapping_of_array(address,uint256) +# 3c0af344: contractMap(address) +# 20969954: function_with_array(((uint256,uint256),uint256)[],(uint256,(uint256,uint256))) +# 1c039831: function_with_struct(((uint256,uint256),uint256)) +# 37e66bae: mapping_of_double_array_of_struct(address,uint256,uint256) +# f29872a8: multiDimensionalArray(uint256,uint256) +# 9539e3c8: normalMappingArrayField(uint256,uint256) +# 87c3dbb6: outer() +# df201a46: simple() +# 5a20851f: stateMap(uint16) + +# {"contracts":{"functions_ids.sol:C":{"hashes":{"a()":"0dbe671f","a_array(uint256)":"4a1f689d","arrayOfMappings(uint256,uint256)":"98fc2aa5","b_mapping_of_array(address,uint256)":"4ea7a557","contractMap(address)":"3c0af344","function_with_array(((uint256,uint256),uint256)[],(uint256,(uint256,uint256)))":"20969954","function_with_struct(((uint256,uint256),uint256))":"1c039831","mapping_of_double_array_of_struct(address,uint256,uint256)":"37e66bae","multiDimensionalArray(uint256,uint256)":"f29872a8","normalMappingArrayField(uint256,uint256)":"9539e3c8","outer()":"87c3dbb6","simple()":"df201a46","stateMap(uint16)":"5a20851f"}},"functions_ids.sol:Contract":{"hashes":{}}},"version":"0.7.0+commit.9e61f92b.Darwin.appleclang"} +from slither.utils.function import get_function_id + +signatures = { + "a()": "0dbe671f", + "a_array(uint256)": "4a1f689d", + "arrayOfMappings(uint256,uint256)": "98fc2aa5", + "b_mapping_of_array(address,uint256)": "4ea7a557", + "contractMap(address)": "3c0af344", + "function_with_array(((uint256,uint256),uint256)[],(uint256,(uint256,uint256)))": "20969954", + "function_with_struct(((uint256,uint256),uint256))": "1c039831", + "mapping_of_double_array_of_struct(address,uint256,uint256)": "37e66bae", + "multiDimensionalArray(uint256,uint256)": "f29872a8", + "normalMappingArrayField(uint256,uint256)": "9539e3c8", + "outer()": "87c3dbb6", + "simple()": "df201a46", + "stateMap(uint16)": "5a20851f", +} + + +def test_functions_ids() -> None: + solc_select.switch_global_version("0.7.0") + sl = Slither("tests/printers/functions_ids.sol") + contracts_c = sl.get_contract_from_name("C") + assert len(contracts_c) == 1 + contract_c = contracts_c[0] + + for sig, hashes in signatures.items(): + func = contract_c.get_function_from_signature(sig) + if not func: + var_name = sig[: sig.find("(")] + var = contract_c.get_state_variable_from_name(var_name) + assert var + assert get_function_id(var.solidity_signature) == int(hashes, 16) + else: + assert get_function_id(func.solidity_signature) == int(hashes, 16) + + +if __name__ == "__main__": + test_functions_ids() From ce1fc4f60a952632149b8e407b982e73d1466f79 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Wed, 3 Aug 2022 16:23:27 +0200 Subject: [PATCH 100/101] Fix type on variable.name --- slither/core/variables/variable.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/slither/core/variables/variable.py b/slither/core/variables/variable.py index 0558be52c..5fda02e93 100644 --- a/slither/core/variables/variable.py +++ b/slither/core/variables/variable.py @@ -66,11 +66,10 @@ class Variable(SourceMapping): return not self._initialized @property - def name(self) -> str: + def name(self) -> Optional[str]: """ str: variable name """ - assert self._name return self._name @name.setter From 350b26596da5c470263dac9ba05dc97b914abb81 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Wed, 3 Aug 2022 16:56:42 +0200 Subject: [PATCH 101/101] Minor --- slither/tools/erc_conformance/erc/ercs.py | 2 +- tests/test_functions_ids.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/slither/tools/erc_conformance/erc/ercs.py b/slither/tools/erc_conformance/erc/ercs.py index afc9a698a..ef459eef9 100644 --- a/slither/tools/erc_conformance/erc/ercs.py +++ b/slither/tools/erc_conformance/erc/ercs.py @@ -51,7 +51,7 @@ def _check_signature(erc_function, contract, ret): ret["missing_function"].append(missing_func.data) return - function_return_type = [export_return_type_from_variable(state_variable_as_function)] + function_return_type = export_return_type_from_variable(state_variable_as_function) function = state_variable_as_function function_view = True diff --git a/tests/test_functions_ids.py b/tests/test_functions_ids.py index 49818347f..eacbf4930 100644 --- a/tests/test_functions_ids.py +++ b/tests/test_functions_ids.py @@ -39,7 +39,7 @@ signatures = { def test_functions_ids() -> None: - solc_select.switch_global_version("0.7.0") + solc_select.switch_global_version("0.7.0", always_install=True) sl = Slither("tests/printers/functions_ids.sol") contracts_c = sl.get_contract_from_name("C") assert len(contracts_c) == 1