From d94cb4e97f6fdf039942bbee3bf15d09a1a5b358 Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Tue, 26 Jul 2022 12:20:23 +0200 Subject: [PATCH 01/87] add test suite for path filtering Signed-off-by: Pascal Marco Caversaccio --- tests/test_path_filtering/libs/ReentrancyMock1.sol | 14 ++++++++++++++ tests/test_path_filtering/libs/ReentrancyMock2.sol | 14 ++++++++++++++ tests/test_path_filtering/libs/ReentrancyMock3.sol | 14 ++++++++++++++ tests/test_path_filtering/slither.config.json | 6 ++++++ tests/test_path_filtering/src/ReentrancyMock.sol | 14 ++++++++++++++ tests/test_path_filtering/test_path_filtering.py | 6 ++++++ tests/test_path_filtering/test_path_filtering.sol | 9 +++++++++ 7 files changed, 77 insertions(+) create mode 100644 tests/test_path_filtering/libs/ReentrancyMock1.sol create mode 100644 tests/test_path_filtering/libs/ReentrancyMock2.sol create mode 100644 tests/test_path_filtering/libs/ReentrancyMock3.sol create mode 100644 tests/test_path_filtering/slither.config.json create mode 100644 tests/test_path_filtering/src/ReentrancyMock.sol create mode 100644 tests/test_path_filtering/test_path_filtering.py create mode 100644 tests/test_path_filtering/test_path_filtering.sol diff --git a/tests/test_path_filtering/libs/ReentrancyMock1.sol b/tests/test_path_filtering/libs/ReentrancyMock1.sol new file mode 100644 index 000000000..c22d0dfcc --- /dev/null +++ b/tests/test_path_filtering/libs/ReentrancyMock1.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.6.12; + +contract ReentrancyMock1 { + mapping(address => uint256) public userBalances1; + + function withdraw1() external { + uint256 userBalance = userBalances1[msg.sender]; + require(userBalance > 0); + (bool success, ) = msg.sender.call{value: userBalance}(""); + require(success); + userBalances1[msg.sender] = 0; + } +} diff --git a/tests/test_path_filtering/libs/ReentrancyMock2.sol b/tests/test_path_filtering/libs/ReentrancyMock2.sol new file mode 100644 index 000000000..67929d7eb --- /dev/null +++ b/tests/test_path_filtering/libs/ReentrancyMock2.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.6.12; + +contract ReentrancyMock2 { + mapping(address => uint256) public userBalances2; + + function withdraw2() external { + uint256 userBalance = userBalances2[msg.sender]; + require(userBalance > 0); + (bool success, ) = msg.sender.call{value: userBalance}(""); + require(success); + userBalances2[msg.sender] = 0; + } +} diff --git a/tests/test_path_filtering/libs/ReentrancyMock3.sol b/tests/test_path_filtering/libs/ReentrancyMock3.sol new file mode 100644 index 000000000..a1cfac91c --- /dev/null +++ b/tests/test_path_filtering/libs/ReentrancyMock3.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.6.12; + +contract ReentrancyMock3 { + mapping(address => uint256) public userBalances3; + + function withdraw3() external { + uint256 userBalance = userBalances3[msg.sender]; + require(userBalance > 0); + (bool success, ) = msg.sender.call{value: userBalance}(""); + require(success); + userBalances3[msg.sender] = 0; + } +} diff --git a/tests/test_path_filtering/slither.config.json b/tests/test_path_filtering/slither.config.json new file mode 100644 index 000000000..bccfbefe4 --- /dev/null +++ b/tests/test_path_filtering/slither.config.json @@ -0,0 +1,6 @@ +{ + "detectors_to_run": "all", + "exclude_informational": true, + "exclude_low": true, + "filter_paths": "filtering_paths/libs|filtering_paths/src/ReentrancyMock.sol" +} diff --git a/tests/test_path_filtering/src/ReentrancyMock.sol b/tests/test_path_filtering/src/ReentrancyMock.sol new file mode 100644 index 000000000..549befffb --- /dev/null +++ b/tests/test_path_filtering/src/ReentrancyMock.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.6.12; + +contract ReentrancyMock { + mapping(address => uint256) public userBalances; + + function withdraw() external { + uint256 userBalance = userBalances[msg.sender]; + require(userBalance > 0); + (bool success, ) = msg.sender.call{value: userBalance}(""); + require(success); + userBalances[msg.sender] = 0; + } +} diff --git a/tests/test_path_filtering/test_path_filtering.py b/tests/test_path_filtering/test_path_filtering.py new file mode 100644 index 000000000..b238fa686 --- /dev/null +++ b/tests/test_path_filtering/test_path_filtering.py @@ -0,0 +1,6 @@ +from slither import Slither +from tests.test_features import _run_all_detectors + +def test_path_filtering(): + slither = Slither("./tests/test_path_filtering/test_path_filtering.py") + _run_all_detectors(slither) diff --git a/tests/test_path_filtering/test_path_filtering.sol b/tests/test_path_filtering/test_path_filtering.sol new file mode 100644 index 000000000..c2165d59d --- /dev/null +++ b/tests/test_path_filtering/test_path_filtering.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.6.12; + +import "./src/ReentrancyMock.sol"; +import "./libs/ReentrancyMock1.sol"; +import "./libs/ReentrancyMock2.sol"; +import "./libs/ReentrancyMock3.sol"; + +contract TestPathFiltering is ReentrancyMock, ReentrancyMock1, ReentrancyMock2, ReentrancyMock3 {} From cf3d1c5365e3fc42f77f447b101ed51c73b48d9c Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Tue, 26 Jul 2022 12:28:53 +0200 Subject: [PATCH 02/87] solc version 0.8.0 Signed-off-by: Pascal Marco Caversaccio --- .github/workflows/black.yml | 2 +- .github/workflows/parser.yml | 1 + tests/test_path_filtering/libs/ReentrancyMock1.sol | 2 +- tests/test_path_filtering/libs/ReentrancyMock2.sol | 2 +- tests/test_path_filtering/libs/ReentrancyMock3.sol | 2 +- tests/test_path_filtering/src/ReentrancyMock.sol | 2 +- tests/test_path_filtering/test_path_filtering.sol | 2 +- 7 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/black.yml b/.github/workflows/black.yml index c1a999b80..2d8274380 100644 --- a/.github/workflows/black.yml +++ b/.github/workflows/black.yml @@ -8,7 +8,7 @@ defaults: on: pull_request: - branches: [master, dev] + branches: [master, dev, patch-1] schedule: # run CI every day even if no PRs/merges occur - cron: '0 12 * * *' diff --git a/.github/workflows/parser.yml b/.github/workflows/parser.yml index 4c3566904..05453b025 100644 --- a/.github/workflows/parser.yml +++ b/.github/workflows/parser.yml @@ -49,3 +49,4 @@ jobs: - name: Test with pytest run: | pytest tests/test_ast_parsing.py + pytest tests/test_path_filtering/test_path_filtering.py diff --git a/tests/test_path_filtering/libs/ReentrancyMock1.sol b/tests/test_path_filtering/libs/ReentrancyMock1.sol index c22d0dfcc..9c8599081 100644 --- a/tests/test_path_filtering/libs/ReentrancyMock1.sol +++ b/tests/test_path_filtering/libs/ReentrancyMock1.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.6.12; +pragma solidity ^0.8.0; contract ReentrancyMock1 { mapping(address => uint256) public userBalances1; diff --git a/tests/test_path_filtering/libs/ReentrancyMock2.sol b/tests/test_path_filtering/libs/ReentrancyMock2.sol index 67929d7eb..42b71c6a6 100644 --- a/tests/test_path_filtering/libs/ReentrancyMock2.sol +++ b/tests/test_path_filtering/libs/ReentrancyMock2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.6.12; +pragma solidity ^0.8.0; contract ReentrancyMock2 { mapping(address => uint256) public userBalances2; diff --git a/tests/test_path_filtering/libs/ReentrancyMock3.sol b/tests/test_path_filtering/libs/ReentrancyMock3.sol index a1cfac91c..097aea25a 100644 --- a/tests/test_path_filtering/libs/ReentrancyMock3.sol +++ b/tests/test_path_filtering/libs/ReentrancyMock3.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.6.12; +pragma solidity ^0.8.0; contract ReentrancyMock3 { mapping(address => uint256) public userBalances3; diff --git a/tests/test_path_filtering/src/ReentrancyMock.sol b/tests/test_path_filtering/src/ReentrancyMock.sol index 549befffb..02d34e6ae 100644 --- a/tests/test_path_filtering/src/ReentrancyMock.sol +++ b/tests/test_path_filtering/src/ReentrancyMock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.6.12; +pragma solidity ^0.8.0; contract ReentrancyMock { mapping(address => uint256) public userBalances; diff --git a/tests/test_path_filtering/test_path_filtering.sol b/tests/test_path_filtering/test_path_filtering.sol index c2165d59d..4e6859a02 100644 --- a/tests/test_path_filtering/test_path_filtering.sol +++ b/tests/test_path_filtering/test_path_filtering.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.6.12; +pragma solidity ^0.8.0; import "./src/ReentrancyMock.sol"; import "./libs/ReentrancyMock1.sol"; From e42bb1805649b253af0103ce952c434ccae5c5fb Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Tue, 26 Jul 2022 12:30:11 +0200 Subject: [PATCH 03/87] for testing CI Signed-off-by: Pascal Marco Caversaccio --- .github/workflows/black.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/black.yml b/.github/workflows/black.yml index 2d8274380..d3caa4234 100644 --- a/.github/workflows/black.yml +++ b/.github/workflows/black.yml @@ -7,8 +7,10 @@ defaults: shell: bash -ieo pipefail {0} on: + push: + branches: [patch-1] pull_request: - branches: [master, dev, patch-1] + branches: [master, dev] schedule: # run CI every day even if no PRs/merges occur - cron: '0 12 * * *' From 6164fb86ad97f146d664385017a7972197590ba2 Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Tue, 26 Jul 2022 12:33:44 +0200 Subject: [PATCH 04/87] parser CI Signed-off-by: Pascal Marco Caversaccio --- .github/workflows/parser.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/parser.yml b/.github/workflows/parser.yml index 05453b025..b623fdb18 100644 --- a/.github/workflows/parser.yml +++ b/.github/workflows/parser.yml @@ -7,6 +7,9 @@ defaults: shell: bash -ieo pipefail {0} on: + push: + branches: + - patch-1 pull_request: branches: [master, dev] schedule: From e2afe85b2a5722edd1c11fee2c75f8540101d358 Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Tue, 26 Jul 2022 15:25:44 +0200 Subject: [PATCH 05/87] refactor and remove CI tests Signed-off-by: Pascal Marco Caversaccio --- .github/workflows/black.yml | 2 -- .github/workflows/parser.yml | 4 ---- tests/test_path_filtering/slither.config.json | 6 ------ tests/test_path_filtering/test_path_filtering.py | 4 +--- 4 files changed, 1 insertion(+), 15 deletions(-) delete mode 100644 tests/test_path_filtering/slither.config.json diff --git a/.github/workflows/black.yml b/.github/workflows/black.yml index d3caa4234..c1a999b80 100644 --- a/.github/workflows/black.yml +++ b/.github/workflows/black.yml @@ -7,8 +7,6 @@ defaults: shell: bash -ieo pipefail {0} on: - push: - branches: [patch-1] pull_request: branches: [master, dev] schedule: diff --git a/.github/workflows/parser.yml b/.github/workflows/parser.yml index b623fdb18..4c3566904 100644 --- a/.github/workflows/parser.yml +++ b/.github/workflows/parser.yml @@ -7,9 +7,6 @@ defaults: shell: bash -ieo pipefail {0} on: - push: - branches: - - patch-1 pull_request: branches: [master, dev] schedule: @@ -52,4 +49,3 @@ jobs: - name: Test with pytest run: | pytest tests/test_ast_parsing.py - pytest tests/test_path_filtering/test_path_filtering.py diff --git a/tests/test_path_filtering/slither.config.json b/tests/test_path_filtering/slither.config.json deleted file mode 100644 index bccfbefe4..000000000 --- a/tests/test_path_filtering/slither.config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "detectors_to_run": "all", - "exclude_informational": true, - "exclude_low": true, - "filter_paths": "filtering_paths/libs|filtering_paths/src/ReentrancyMock.sol" -} diff --git a/tests/test_path_filtering/test_path_filtering.py b/tests/test_path_filtering/test_path_filtering.py index b238fa686..f90271fb3 100644 --- a/tests/test_path_filtering/test_path_filtering.py +++ b/tests/test_path_filtering/test_path_filtering.py @@ -1,6 +1,4 @@ from slither import Slither -from tests.test_features import _run_all_detectors def test_path_filtering(): - slither = Slither("./tests/test_path_filtering/test_path_filtering.py") - _run_all_detectors(slither) + return Slither("./tests/test_path_filtering/test_path_filtering.sol", filter_paths=["filtering_paths/libs", "filtering_paths/src/ReentrancyMock.sol"]) From 36875c74125003bccda191a85f6f267344451d90 Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Tue, 26 Jul 2022 17:55:37 +0200 Subject: [PATCH 06/87] using bash scripts now Signed-off-by: Pascal Marco Caversaccio --- .github/workflows/ci.yml | 1 + scripts/ci_test_path_filtering | 11 +++++++++++ tests/test_path_filtering/slither.config.json | 7 +++++++ tests/test_path_filtering/test_path_filtering.py | 4 ---- 4 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 scripts/ci_test_path_filtering create mode 100644 tests/test_path_filtering/slither.config.json delete mode 100644 tests/test_path_filtering/test_path_filtering.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f2a295452..ff3fa605d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,6 +25,7 @@ jobs: type: ["cli", "dapp", "data_dependency", + "path_filtering", # "embark", "erc", "etherlime", diff --git a/scripts/ci_test_path_filtering b/scripts/ci_test_path_filtering new file mode 100644 index 000000000..c4a714881 --- /dev/null +++ b/scripts/ci_test_path_filtering @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +### Test path filtering across POSIX and Windows + +slither "tests/test_path_filtering/test_path_filtering.sol" --config "tests/test_path_filtering/slither.config.json" --json "output.json" > "output.txt" 2>&1 + +if ! grep -q "0 result(s) found" "output.txt"; then + echo "Path filtering across POSIX and Windows failed" + rm output.txt + exit 5 +fi diff --git a/tests/test_path_filtering/slither.config.json b/tests/test_path_filtering/slither.config.json new file mode 100644 index 000000000..27d607bde --- /dev/null +++ b/tests/test_path_filtering/slither.config.json @@ -0,0 +1,7 @@ +{ + "detectors_to_run": "all", + "exclude_informational": true, + "exclude_low": true, + "ignore_return_value": true, + "filter_paths": "libs|src/ReentrancyMock.sol" +} diff --git a/tests/test_path_filtering/test_path_filtering.py b/tests/test_path_filtering/test_path_filtering.py deleted file mode 100644 index f90271fb3..000000000 --- a/tests/test_path_filtering/test_path_filtering.py +++ /dev/null @@ -1,4 +0,0 @@ -from slither import Slither - -def test_path_filtering(): - return Slither("./tests/test_path_filtering/test_path_filtering.sol", filter_paths=["filtering_paths/libs", "filtering_paths/src/ReentrancyMock.sol"]) From 11af6921374f99dd87059595b5cf163103e1416a Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Tue, 26 Jul 2022 17:57:16 +0200 Subject: [PATCH 07/87] CI test Signed-off-by: Pascal Marco Caversaccio --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ff3fa605d..afed4ba5b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,6 +10,7 @@ on: branches: - master - dev + - patch-1 pull_request: schedule: # run CI every day even if no PRs/merges occur From 25886e2e0d52a2b188e72dc15c89a1bc8e39a626 Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Tue, 26 Jul 2022 18:07:35 +0200 Subject: [PATCH 08/87] missing format identifier Signed-off-by: Pascal Marco Caversaccio --- scripts/{ci_test_path_filtering => ci_test_path_filtering.sh} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename scripts/{ci_test_path_filtering => ci_test_path_filtering.sh} (100%) diff --git a/scripts/ci_test_path_filtering b/scripts/ci_test_path_filtering.sh similarity index 100% rename from scripts/ci_test_path_filtering rename to scripts/ci_test_path_filtering.sh From 0673f89e36b5317a35b5ea9b4306db137ffa04ea Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Tue, 26 Jul 2022 18:16:04 +0200 Subject: [PATCH 09/87] remove CI test - everything works now Signed-off-by: Pascal Marco Caversaccio --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index afed4ba5b..ff3fa605d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,6 @@ on: branches: - master - dev - - patch-1 pull_request: schedule: # run CI every day even if no PRs/merges occur From 1c1b471159a9ab2c3829f78407e2667a795f4108 Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Tue, 26 Jul 2022 18:31:03 +0200 Subject: [PATCH 10/87] remove output file in any case Signed-off-by: Pascal Marco Caversaccio --- scripts/ci_test_path_filtering.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/ci_test_path_filtering.sh b/scripts/ci_test_path_filtering.sh index c4a714881..0ad13e8c2 100644 --- a/scripts/ci_test_path_filtering.sh +++ b/scripts/ci_test_path_filtering.sh @@ -4,8 +4,11 @@ slither "tests/test_path_filtering/test_path_filtering.sol" --config "tests/test_path_filtering/slither.config.json" --json "output.json" > "output.txt" 2>&1 -if ! grep -q "0 result(s) found" "output.txt"; then +if ! grep -q "0 result(s) found" "output.txt" +then echo "Path filtering across POSIX and Windows failed" rm output.txt exit 5 +else + rm output.txt fi From 3ac6f5694b94d661ec8d809ad1ca142fd88244e8 Mon Sep 17 00:00:00 2001 From: ChenYuan Date: Thu, 28 Jul 2022 16:46:40 +0800 Subject: [PATCH 11/87] Update event_call.py --- slither/slithir/operations/event_call.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/slithir/operations/event_call.py b/slither/slithir/operations/event_call.py index a04013140..6ef846d4b 100644 --- a/slither/slithir/operations/event_call.py +++ b/slither/slithir/operations/event_call.py @@ -17,4 +17,4 @@ class EventCall(Call): def __str__(self): args = [str(a) for a in self.arguments] - return f"Emit {self.name}({'.'.join(args)})" + return f"Emit {self.name}({','.join(args)})" From 9d9ec680320c0b7220cfd6fd913ff1aab2ec7a77 Mon Sep 17 00:00:00 2001 From: jmhickman Date: Wed, 3 Aug 2022 10:47:25 -0500 Subject: [PATCH 12/87] Update divide_before_multiply.py Missing space in string causes formatting issues when this detector is included in `--checklist` output. --- slither/detectors/statements/divide_before_multiply.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/detectors/statements/divide_before_multiply.py b/slither/detectors/statements/divide_before_multiply.py index 5a5132fdd..7691c3a17 100644 --- a/slither/detectors/statements/divide_before_multiply.py +++ b/slither/detectors/statements/divide_before_multiply.py @@ -189,7 +189,7 @@ In general, it's usually a good idea to re-arrange arithmetic to perform multipl nodes.sort(key=lambda x: x.node_id) for node in nodes: - info += ["\t-", node, "\n"] + info += ["\t- ", node, "\n"] res = self.generate_result(info) results.append(res) From f7e22a75e1be7c72d2b7d3a094899521b6f31b01 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 9 Aug 2022 16:27:35 -0500 Subject: [PATCH 13/87] implement detector for erc20 tokens that have function collision with DOMAIN_SEPARATOR --- .github/workflows/features.yml | 1 + slither/detectors/all_detectors.py | 1 + .../permit_domain_signature_collision.py | 55 +++++ tests/mock_permit_domain_collision.sol | 208 ++++++++++++++++++ tests/test_detectors_mocked_contract.py | 21 ++ 5 files changed, 286 insertions(+) create mode 100644 slither/detectors/functions/permit_domain_signature_collision.py create mode 100644 tests/mock_permit_domain_collision.sol create mode 100644 tests/test_detectors_mocked_contract.py diff --git a/.github/workflows/features.yml b/.github/workflows/features.yml index 7414e9ebe..8c7126dcc 100644 --- a/.github/workflows/features.yml +++ b/.github/workflows/features.yml @@ -50,3 +50,4 @@ jobs: pytest tests/test_functions_ids.py pytest tests/test_function.py pytest tests/test_source_mapping.py + pytest tests/test_detectors_mocked_contract.py diff --git a/slither/detectors/all_detectors.py b/slither/detectors/all_detectors.py index a79dcaf51..2c8d24428 100644 --- a/slither/detectors/all_detectors.py +++ b/slither/detectors/all_detectors.py @@ -84,3 +84,4 @@ 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 +from .functions.permit_domain_signature_collision import DomainSeparatorCollision diff --git a/slither/detectors/functions/permit_domain_signature_collision.py b/slither/detectors/functions/permit_domain_signature_collision.py new file mode 100644 index 000000000..95f9f658e --- /dev/null +++ b/slither/detectors/functions/permit_domain_signature_collision.py @@ -0,0 +1,55 @@ +""" +Module detecting EIP-2612 domain separator collision +""" +from slither.utils.function import get_function_id +from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification + + +class DomainSeparatorCollision(AbstractDetector): + """ + Domain separator collision + """ + + ARGUMENT = "domain-separator-collision" + HELP = "Detects ERC20 tokens that have a function whose signature collides with EIP-2612's DOMAIN_SEPARATOR()" + IMPACT = DetectorClassification.MEDIUM + CONFIDENCE = DetectorClassification.HIGH + + WIKI = ( + "https://github.com/crytic/slither/wiki/Detector-Documentation#domain-separator-collision" + ) + + WIKI_TITLE = "Domain separator collision" + WIKI_DESCRIPTION = "An ERC20 token has a function whose signature collides with EIP-2612's DOMAIN_SEPARATOR(), causing unanticipated behavior for contracts using `permit` functionality." + + # region wiki_exploit_scenario + WIKI_EXPLOIT_SCENARIO = """ +```solidity +contract Contract{ + function some_collisions() external() {} +} +``` +`some_collision` clashes with EIP-2612's DOMAIN_SEPARATOR() and will interfere with contract's using `permit`.""" + # endregion wiki_exploit_scenario + + WIKI_RECOMMENDATION = "Remove or rename the function that collides with DOMAIN_SEPARATOR()." + + def _detect(self): + results = [] + domain_sig = get_function_id("DOMAIN_SEPARATOR()") + for contract in self.compilation_unit.contracts_derived: + if contract.is_erc20(): + for func in contract.functions: + if ( + func.name != "DOMAIN_SEPARATOR" + and get_function_id(func.solidity_signature) == domain_sig + ): + info = [ + func, + "'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + ] + res = self.generate_result(info) + results.append(res) + break + + return results diff --git a/tests/mock_permit_domain_collision.sol b/tests/mock_permit_domain_collision.sol new file mode 100644 index 000000000..d766eb0bd --- /dev/null +++ b/tests/mock_permit_domain_collision.sol @@ -0,0 +1,208 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity >=0.8.0; + +/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) +/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) +/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. +abstract contract ERC20 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event Transfer(address indexed from, address indexed to, uint256 amount); + + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /*////////////////////////////////////////////////////////////// + METADATA STORAGE + //////////////////////////////////////////////////////////////*/ + + string public name; + + string public symbol; + + uint8 public immutable decimals; + + /*////////////////////////////////////////////////////////////// + ERC20 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 public totalSupply; + + mapping(address => uint256) public balanceOf; + + mapping(address => mapping(address => uint256)) public allowance; + + /*////////////////////////////////////////////////////////////// + EIP-2612 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal immutable INITIAL_CHAIN_ID; + + bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; + + mapping(address => uint256) public nonces; + + /*////////////////////////////////////////////////////////////// + CONSTRUCTOR + //////////////////////////////////////////////////////////////*/ + + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals + ) { + name = _name; + symbol = _symbol; + decimals = _decimals; + + INITIAL_CHAIN_ID = block.chainid; + INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + } + + /*////////////////////////////////////////////////////////////// + ERC20 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 amount) public virtual returns (bool) { + allowance[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + + return true; + } + + function transfer(address to, uint256 amount) public virtual returns (bool) { + balanceOf[msg.sender] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + unchecked { + balanceOf[to] += amount; + } + + emit Transfer(msg.sender, to, amount); + + return true; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public virtual returns (bool) { + uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + + if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; + + balanceOf[from] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + unchecked { + balanceOf[to] += amount; + } + + emit Transfer(from, to, amount); + + return true; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 LOGIC + //////////////////////////////////////////////////////////////*/ + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public virtual { + require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + + // Unchecked because the only math done is incrementing + // the owner's nonce which cannot realistically overflow. + unchecked { + address recoveredAddress = ecrecover( + keccak256( + abi.encodePacked( + "\x19\x01", + DOMAIN_SEPARATOR(), + keccak256( + abi.encode( + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ), + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ) + ) + ), + v, + r, + s + ); + + require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + + allowance[recoveredAddress][spender] = value; + } + + emit Approval(owner, spender, value); + } + + function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { + return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); + } + + function computeDomainSeparator() internal view virtual returns (bytes32) { + return + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256("1"), + block.chainid, + address(this) + ) + ); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 amount) internal virtual { + totalSupply += amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + unchecked { + balanceOf[to] += amount; + } + + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal virtual { + balanceOf[from] -= amount; + + // Cannot underflow because a user's balance + // will never be larger than the total supply. + unchecked { + totalSupply -= amount; + } + + emit Transfer(from, address(0), amount); + } +} + +contract Test is ERC20("TEST", "TEST", 18) {} diff --git a/tests/test_detectors_mocked_contract.py b/tests/test_detectors_mocked_contract.py new file mode 100644 index 000000000..8d8d5faa8 --- /dev/null +++ b/tests/test_detectors_mocked_contract.py @@ -0,0 +1,21 @@ +from solc_select import solc_select +from slither import Slither +from slither.detectors.all_detectors import DomainSeparatorCollision + + +def test_permit_domain_collision(): + """There is not a (known) collision for this function signature + so this test mutates a function's name to mock it. + """ + solc_select.switch_global_version("0.8.0", always_install=True) + sl = Slither("tests/mock_permit_domain_collision.sol") + assert len(sl.contracts_derived) == 1 + contract = sl.contracts_derived[0] + # This will memoize the solidity signature and mutating the name + # won't change the function selector calculated + func = contract.get_function_from_signature("DOMAIN_SEPARATOR()") + # Change the name to mock + func.name = "MOCK_COLLISION" + sl.register_detector(DomainSeparatorCollision) + results = sl.run_detectors() + assert len(results) == 1 From 085b60913a1fb2c3606d45f63c6ea9036638ccd0 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Fri, 19 Aug 2022 17:53:32 +0200 Subject: [PATCH 14/87] Use full_name for solidity signature in case of internal function Hotfix to support recursive type --- slither/core/declarations/function.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/slither/core/declarations/function.py b/slither/core/declarations/function.py index 4c88150d2..fe6c49ae9 100644 --- a/slither/core/declarations/function.py +++ b/slither/core/declarations/function.py @@ -962,10 +962,28 @@ class Function(SourceMapping, metaclass=ABCMeta): # pylint: disable=too-many-pu :return: the solidity signature """ if self._solidity_signature is None: - parameters = [ - convert_type_for_solidity_signature_to_string(x.type) for x in self.parameters - ] - self._solidity_signature = self.name + "(" + ",".join(parameters) + ")" + # Solidity allows recursive type for structure definition if its not used in public /external + # When this happens we can reach an infinite loop in convert_type_for_solidity_signature_to_string + # A quick workaround is to just return full_name for internal + # contract A{ + # + # struct St{ + # St[] a; + # uint b; + # } + # + # function f(St memory s) internal{ + # + # } + # + # } + if self.visibility in ["public", "external"]: + parameters = [ + convert_type_for_solidity_signature_to_string(x.type) for x in self.parameters + ] + self._solidity_signature = self.name + "(" + ",".join(parameters) + ")" + else: + self._solidity_signature = self.full_name return self._solidity_signature @property From 6dc5856be71951e4bfeb1700b9e403273cdf5317 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Sat, 20 Aug 2022 15:26:47 +0200 Subject: [PATCH 15/87] Use a best effort approach for internal function function-id --- slither/core/declarations/function.py | 31 +++++---------- slither/utils/type.py | 55 ++++++++++++++++++++------- tests/function_ids/rec_struct-0.8.sol | 12 ++++++ tests/test_features.py | 9 +++++ 4 files changed, 71 insertions(+), 36 deletions(-) create mode 100644 tests/function_ids/rec_struct-0.8.sol diff --git a/slither/core/declarations/function.py b/slither/core/declarations/function.py index fe6c49ae9..ea60a986b 100644 --- a/slither/core/declarations/function.py +++ b/slither/core/declarations/function.py @@ -959,31 +959,18 @@ class Function(SourceMapping, metaclass=ABCMeta): # pylint: disable=too-many-pu """ Return a signature following the Solidity Standard Contract and converted into address + + It might still keep internal types (ex: structure name) for internal functions. + The reason is that internal functions allows recursive structure definition, which + can't be converted following the Solidity stand ard + :return: the solidity signature """ if self._solidity_signature is None: - # Solidity allows recursive type for structure definition if its not used in public /external - # When this happens we can reach an infinite loop in convert_type_for_solidity_signature_to_string - # A quick workaround is to just return full_name for internal - # contract A{ - # - # struct St{ - # St[] a; - # uint b; - # } - # - # function f(St memory s) internal{ - # - # } - # - # } - if self.visibility in ["public", "external"]: - parameters = [ - convert_type_for_solidity_signature_to_string(x.type) for x in self.parameters - ] - self._solidity_signature = self.name + "(" + ",".join(parameters) + ")" - else: - self._solidity_signature = self.full_name + 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 @property diff --git a/slither/utils/type.py b/slither/utils/type.py index 1ce5fc158..5c7fcee34 100644 --- a/slither/utils/type.py +++ b/slither/utils/type.py @@ -1,12 +1,14 @@ import math -from typing import List, Union +from typing import List, Union, Set 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 _convert_type_for_solidity_signature_to_string(types: Union[Type, List[Type]]) -> str: +def _convert_type_for_solidity_signature_to_string( + types: Union[Type, List[Type]], seen: Set[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 @@ -15,8 +17,10 @@ def _convert_type_for_solidity_signature_to_string(types: Union[Type, List[Type] # 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) + underlying_type = convert_type_for_solidity_signature(types.type, seen) + underlying_type_str = _convert_type_for_solidity_signature_to_string( + underlying_type, seen + ) return underlying_type_str + "[]" return str(types) @@ -26,9 +30,9 @@ def _convert_type_for_solidity_signature_to_string(types: Union[Type, List[Type] ret = "(" for underlying_type in types: if first_item: - ret += _convert_type_for_solidity_signature_to_string(underlying_type) + ret += _convert_type_for_solidity_signature_to_string(underlying_type, seen) else: - ret += "," + _convert_type_for_solidity_signature_to_string(underlying_type) + ret += "," + _convert_type_for_solidity_signature_to_string(underlying_type, seen) first_item = False ret += ")" @@ -36,14 +40,33 @@ def _convert_type_for_solidity_signature_to_string(types: Union[Type, List[Type] 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) + seen: Set[Type] = set() + types = convert_type_for_solidity_signature(t, seen) + return _convert_type_for_solidity_signature_to_string(types, seen) -def convert_type_for_solidity_signature(t: Type) -> Union[Type, List[Type]]: +def convert_type_for_solidity_signature(t: Type, seen: Set[Type]) -> Union[Type, List[Type]]: # pylint: disable=import-outside-toplevel from slither.core.declarations import Contract, Enum, Structure + # Solidity allows recursive type for structure definition if its not used in public /external + # When this happens we can reach an infinite loop. If we detect a loop, we just stop converting the underlying type + # This is ok, because it wont happen for public/external function + # + # contract A{ + # + # struct St{ + # St[] a; + # uint b; + # } + # + # function f(St memory s) internal{} + # + # } + if t in seen: + return t + seen.add(t) + if isinstance(t, UserDefinedType): underlying_type = t.type if isinstance(underlying_type, Contract): @@ -61,21 +84,24 @@ def convert_type_for_solidity_signature(t: Type) -> Union[Type, List[Type]]: 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 + convert_type_for_solidity_signature(x.type, seen) + for x in underlying_type.elems_ordered ] return types return t -def _export_nested_types_from_variable(current_type: Type, ret: List[Type]) -> None: +def _export_nested_types_from_variable( + current_type: Type, ret: List[Type], seen: Set[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) + underlying_type = convert_type_for_solidity_signature(current_type.type_from, seen) if isinstance(underlying_type, list): ret.extend(underlying_type) else: @@ -87,7 +113,7 @@ def _export_nested_types_from_variable(current_type: Type, ret: List[Type]) -> N next_type = current_type.type else: return - _export_nested_types_from_variable(next_type, ret) + _export_nested_types_from_variable(next_type, ret, seen) def export_nested_types_from_variable(variable: Variable) -> List[Type]: @@ -97,7 +123,8 @@ def export_nested_types_from_variable(variable: Variable) -> List[Type]: :return: list(Type) """ l: List[Type] = [] - _export_nested_types_from_variable(variable.type, l) + seen: Set[Type] = set() + _export_nested_types_from_variable(variable.type, l, seen) return l diff --git a/tests/function_ids/rec_struct-0.8.sol b/tests/function_ids/rec_struct-0.8.sol new file mode 100644 index 000000000..7440a5a33 --- /dev/null +++ b/tests/function_ids/rec_struct-0.8.sol @@ -0,0 +1,12 @@ +contract A{ + + struct St{ + St[] a; + uint b; + } + + function f(St memory s) internal{ + f(s); + } + +} diff --git a/tests/test_features.py b/tests/test_features.py index 88751e324..c06ee96ce 100644 --- a/tests/test_features.py +++ b/tests/test_features.py @@ -2,6 +2,7 @@ import inspect from crytic_compile import CryticCompile from crytic_compile.platform.solc_standard_json import SolcStandardJson +from solc_select import solc_select from slither import Slither from slither.detectors import all_detectors @@ -41,3 +42,11 @@ def test_collision(): def test_cycle(): slither = Slither("./tests/test_cyclic_import/a.sol") _run_all_detectors(slither) + + +def test_funcion_id_rec_structure(): + solc_select.switch_global_version("0.8.0", always_install=True) + slither = Slither("./tests/function_ids/rec_struct-0.8.sol") + for compilation_unit in slither.compilation_units: + for function in compilation_unit.functions: + assert function.solidity_signature From a17a938a90934bcca117ab5d2f3233ca8ae95e70 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 22 Aug 2022 14:43:23 -0500 Subject: [PATCH 16/87] use standard test convention, match on sig instead of name --- .github/workflows/features.yml | 1 - .../permit_domain_signature_collision.py | 2 +- .../0.4.25/permit_domain_collision.sol} | 4 +- ...n.sol.0.4.25.DomainSeparatorCollision.json | 252 ++++++++++++++++++ .../0.5.16/permit_domain_collision.sol | 208 +++++++++++++++ ...n.sol.0.5.16.DomainSeparatorCollision.json | 252 ++++++++++++++++++ .../0.6.11/permit_domain_collision.sol | 208 +++++++++++++++ ...n.sol.0.6.11.DomainSeparatorCollision.json | 252 ++++++++++++++++++ .../0.7.6/permit_domain_collision.sol | 208 +++++++++++++++ ...on.sol.0.7.6.DomainSeparatorCollision.json | 252 ++++++++++++++++++ .../0.8.0/permit_domain_collision.sol | 208 +++++++++++++++ ...on.sol.0.8.0.DomainSeparatorCollision.json | 252 ++++++++++++++++++ tests/test_detectors.py | 25 ++ tests/test_detectors_mocked_contract.py | 21 -- 14 files changed, 2120 insertions(+), 25 deletions(-) rename tests/{mock_permit_domain_collision.sol => detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol} (98%) create mode 100644 tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol.0.4.25.DomainSeparatorCollision.json create mode 100644 tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol create mode 100644 tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol.0.5.16.DomainSeparatorCollision.json create mode 100644 tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol create mode 100644 tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol.0.6.11.DomainSeparatorCollision.json create mode 100644 tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol create mode 100644 tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol.0.7.6.DomainSeparatorCollision.json create mode 100644 tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol create mode 100644 tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol.0.8.0.DomainSeparatorCollision.json delete mode 100644 tests/test_detectors_mocked_contract.py diff --git a/.github/workflows/features.yml b/.github/workflows/features.yml index 8c7126dcc..7414e9ebe 100644 --- a/.github/workflows/features.yml +++ b/.github/workflows/features.yml @@ -50,4 +50,3 @@ jobs: pytest tests/test_functions_ids.py pytest tests/test_function.py pytest tests/test_source_mapping.py - pytest tests/test_detectors_mocked_contract.py diff --git a/slither/detectors/functions/permit_domain_signature_collision.py b/slither/detectors/functions/permit_domain_signature_collision.py index 95f9f658e..9e2301a45 100644 --- a/slither/detectors/functions/permit_domain_signature_collision.py +++ b/slither/detectors/functions/permit_domain_signature_collision.py @@ -41,7 +41,7 @@ contract Contract{ if contract.is_erc20(): for func in contract.functions: if ( - func.name != "DOMAIN_SEPARATOR" + func.solidity_signature != "DOMAIN_SEPARATOR()" and get_function_id(func.solidity_signature) == domain_sig ): info = [ diff --git a/tests/mock_permit_domain_collision.sol b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol similarity index 98% rename from tests/mock_permit_domain_collision.sol rename to tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol index d766eb0bd..303629b98 100644 --- a/tests/mock_permit_domain_collision.sol +++ b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol @@ -131,7 +131,7 @@ abstract contract ERC20 { keccak256( abi.encodePacked( "\x19\x01", - DOMAIN_SEPARATOR(), + fopwCDKKK(), keccak256( abi.encode( keccak256( @@ -159,7 +159,7 @@ abstract contract ERC20 { emit Approval(owner, spender, value); } - function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { + function fopwCDKKK() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } diff --git a/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol.0.4.25.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol.0.4.25.DomainSeparatorCollision.json new file mode 100644 index 000000000..6792ae0e9 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol.0.4.25.DomainSeparatorCollision.json @@ -0,0 +1,252 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "fopwCDKKK", + "source_mapping": { + "start": 5320, + "length": 170, + "filename_relative": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol", + "is_dependency": false, + "lines": [ + 162, + 163, + 164 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20", + "source_mapping": { + "start": 474, + "length": 6323, + "filename_relative": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol", + "is_dependency": false, + "lines": [ + 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, + 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, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "fopwCDKKK()" + } + } + ], + "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol#162-164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol#L162-L164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol#L162-L164", + "id": "89af79b93e8de48fb8f88ab4dabbc97b0bb35ab39b6544e255b16aa924286eab", + "check": "domain-separator-collision", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol new file mode 100644 index 000000000..303629b98 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol @@ -0,0 +1,208 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity >=0.8.0; + +/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) +/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) +/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. +abstract contract ERC20 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event Transfer(address indexed from, address indexed to, uint256 amount); + + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /*////////////////////////////////////////////////////////////// + METADATA STORAGE + //////////////////////////////////////////////////////////////*/ + + string public name; + + string public symbol; + + uint8 public immutable decimals; + + /*////////////////////////////////////////////////////////////// + ERC20 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 public totalSupply; + + mapping(address => uint256) public balanceOf; + + mapping(address => mapping(address => uint256)) public allowance; + + /*////////////////////////////////////////////////////////////// + EIP-2612 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal immutable INITIAL_CHAIN_ID; + + bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; + + mapping(address => uint256) public nonces; + + /*////////////////////////////////////////////////////////////// + CONSTRUCTOR + //////////////////////////////////////////////////////////////*/ + + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals + ) { + name = _name; + symbol = _symbol; + decimals = _decimals; + + INITIAL_CHAIN_ID = block.chainid; + INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + } + + /*////////////////////////////////////////////////////////////// + ERC20 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 amount) public virtual returns (bool) { + allowance[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + + return true; + } + + function transfer(address to, uint256 amount) public virtual returns (bool) { + balanceOf[msg.sender] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + unchecked { + balanceOf[to] += amount; + } + + emit Transfer(msg.sender, to, amount); + + return true; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public virtual returns (bool) { + uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + + if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; + + balanceOf[from] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + unchecked { + balanceOf[to] += amount; + } + + emit Transfer(from, to, amount); + + return true; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 LOGIC + //////////////////////////////////////////////////////////////*/ + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public virtual { + require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + + // Unchecked because the only math done is incrementing + // the owner's nonce which cannot realistically overflow. + unchecked { + address recoveredAddress = ecrecover( + keccak256( + abi.encodePacked( + "\x19\x01", + fopwCDKKK(), + keccak256( + abi.encode( + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ), + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ) + ) + ), + v, + r, + s + ); + + require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + + allowance[recoveredAddress][spender] = value; + } + + emit Approval(owner, spender, value); + } + + function fopwCDKKK() public view virtual returns (bytes32) { + return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); + } + + function computeDomainSeparator() internal view virtual returns (bytes32) { + return + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256("1"), + block.chainid, + address(this) + ) + ); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 amount) internal virtual { + totalSupply += amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + unchecked { + balanceOf[to] += amount; + } + + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal virtual { + balanceOf[from] -= amount; + + // Cannot underflow because a user's balance + // will never be larger than the total supply. + unchecked { + totalSupply -= amount; + } + + emit Transfer(from, address(0), amount); + } +} + +contract Test is ERC20("TEST", "TEST", 18) {} diff --git a/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol.0.5.16.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol.0.5.16.DomainSeparatorCollision.json new file mode 100644 index 000000000..a9140af11 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol.0.5.16.DomainSeparatorCollision.json @@ -0,0 +1,252 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "fopwCDKKK", + "source_mapping": { + "start": 5320, + "length": 170, + "filename_relative": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol", + "is_dependency": false, + "lines": [ + 162, + 163, + 164 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20", + "source_mapping": { + "start": 474, + "length": 6323, + "filename_relative": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol", + "is_dependency": false, + "lines": [ + 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, + 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, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "fopwCDKKK()" + } + } + ], + "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol#162-164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol#L162-L164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol#L162-L164", + "id": "89af79b93e8de48fb8f88ab4dabbc97b0bb35ab39b6544e255b16aa924286eab", + "check": "domain-separator-collision", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol new file mode 100644 index 000000000..303629b98 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol @@ -0,0 +1,208 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity >=0.8.0; + +/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) +/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) +/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. +abstract contract ERC20 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event Transfer(address indexed from, address indexed to, uint256 amount); + + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /*////////////////////////////////////////////////////////////// + METADATA STORAGE + //////////////////////////////////////////////////////////////*/ + + string public name; + + string public symbol; + + uint8 public immutable decimals; + + /*////////////////////////////////////////////////////////////// + ERC20 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 public totalSupply; + + mapping(address => uint256) public balanceOf; + + mapping(address => mapping(address => uint256)) public allowance; + + /*////////////////////////////////////////////////////////////// + EIP-2612 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal immutable INITIAL_CHAIN_ID; + + bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; + + mapping(address => uint256) public nonces; + + /*////////////////////////////////////////////////////////////// + CONSTRUCTOR + //////////////////////////////////////////////////////////////*/ + + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals + ) { + name = _name; + symbol = _symbol; + decimals = _decimals; + + INITIAL_CHAIN_ID = block.chainid; + INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + } + + /*////////////////////////////////////////////////////////////// + ERC20 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 amount) public virtual returns (bool) { + allowance[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + + return true; + } + + function transfer(address to, uint256 amount) public virtual returns (bool) { + balanceOf[msg.sender] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + unchecked { + balanceOf[to] += amount; + } + + emit Transfer(msg.sender, to, amount); + + return true; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public virtual returns (bool) { + uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + + if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; + + balanceOf[from] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + unchecked { + balanceOf[to] += amount; + } + + emit Transfer(from, to, amount); + + return true; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 LOGIC + //////////////////////////////////////////////////////////////*/ + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public virtual { + require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + + // Unchecked because the only math done is incrementing + // the owner's nonce which cannot realistically overflow. + unchecked { + address recoveredAddress = ecrecover( + keccak256( + abi.encodePacked( + "\x19\x01", + fopwCDKKK(), + keccak256( + abi.encode( + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ), + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ) + ) + ), + v, + r, + s + ); + + require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + + allowance[recoveredAddress][spender] = value; + } + + emit Approval(owner, spender, value); + } + + function fopwCDKKK() public view virtual returns (bytes32) { + return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); + } + + function computeDomainSeparator() internal view virtual returns (bytes32) { + return + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256("1"), + block.chainid, + address(this) + ) + ); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 amount) internal virtual { + totalSupply += amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + unchecked { + balanceOf[to] += amount; + } + + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal virtual { + balanceOf[from] -= amount; + + // Cannot underflow because a user's balance + // will never be larger than the total supply. + unchecked { + totalSupply -= amount; + } + + emit Transfer(from, address(0), amount); + } +} + +contract Test is ERC20("TEST", "TEST", 18) {} diff --git a/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol.0.6.11.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol.0.6.11.DomainSeparatorCollision.json new file mode 100644 index 000000000..42cc0058c --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol.0.6.11.DomainSeparatorCollision.json @@ -0,0 +1,252 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "fopwCDKKK", + "source_mapping": { + "start": 5320, + "length": 170, + "filename_relative": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol", + "is_dependency": false, + "lines": [ + 162, + 163, + 164 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20", + "source_mapping": { + "start": 474, + "length": 6323, + "filename_relative": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol", + "is_dependency": false, + "lines": [ + 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, + 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, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "fopwCDKKK()" + } + } + ], + "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol#162-164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol#L162-L164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol#L162-L164", + "id": "89af79b93e8de48fb8f88ab4dabbc97b0bb35ab39b6544e255b16aa924286eab", + "check": "domain-separator-collision", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol new file mode 100644 index 000000000..303629b98 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol @@ -0,0 +1,208 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity >=0.8.0; + +/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) +/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) +/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. +abstract contract ERC20 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event Transfer(address indexed from, address indexed to, uint256 amount); + + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /*////////////////////////////////////////////////////////////// + METADATA STORAGE + //////////////////////////////////////////////////////////////*/ + + string public name; + + string public symbol; + + uint8 public immutable decimals; + + /*////////////////////////////////////////////////////////////// + ERC20 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 public totalSupply; + + mapping(address => uint256) public balanceOf; + + mapping(address => mapping(address => uint256)) public allowance; + + /*////////////////////////////////////////////////////////////// + EIP-2612 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal immutable INITIAL_CHAIN_ID; + + bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; + + mapping(address => uint256) public nonces; + + /*////////////////////////////////////////////////////////////// + CONSTRUCTOR + //////////////////////////////////////////////////////////////*/ + + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals + ) { + name = _name; + symbol = _symbol; + decimals = _decimals; + + INITIAL_CHAIN_ID = block.chainid; + INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + } + + /*////////////////////////////////////////////////////////////// + ERC20 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 amount) public virtual returns (bool) { + allowance[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + + return true; + } + + function transfer(address to, uint256 amount) public virtual returns (bool) { + balanceOf[msg.sender] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + unchecked { + balanceOf[to] += amount; + } + + emit Transfer(msg.sender, to, amount); + + return true; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public virtual returns (bool) { + uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + + if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; + + balanceOf[from] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + unchecked { + balanceOf[to] += amount; + } + + emit Transfer(from, to, amount); + + return true; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 LOGIC + //////////////////////////////////////////////////////////////*/ + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public virtual { + require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + + // Unchecked because the only math done is incrementing + // the owner's nonce which cannot realistically overflow. + unchecked { + address recoveredAddress = ecrecover( + keccak256( + abi.encodePacked( + "\x19\x01", + fopwCDKKK(), + keccak256( + abi.encode( + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ), + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ) + ) + ), + v, + r, + s + ); + + require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + + allowance[recoveredAddress][spender] = value; + } + + emit Approval(owner, spender, value); + } + + function fopwCDKKK() public view virtual returns (bytes32) { + return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); + } + + function computeDomainSeparator() internal view virtual returns (bytes32) { + return + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256("1"), + block.chainid, + address(this) + ) + ); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 amount) internal virtual { + totalSupply += amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + unchecked { + balanceOf[to] += amount; + } + + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal virtual { + balanceOf[from] -= amount; + + // Cannot underflow because a user's balance + // will never be larger than the total supply. + unchecked { + totalSupply -= amount; + } + + emit Transfer(from, address(0), amount); + } +} + +contract Test is ERC20("TEST", "TEST", 18) {} diff --git a/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol.0.7.6.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol.0.7.6.DomainSeparatorCollision.json new file mode 100644 index 000000000..d43dfd2eb --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol.0.7.6.DomainSeparatorCollision.json @@ -0,0 +1,252 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "fopwCDKKK", + "source_mapping": { + "start": 5320, + "length": 170, + "filename_relative": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol", + "is_dependency": false, + "lines": [ + 162, + 163, + 164 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20", + "source_mapping": { + "start": 474, + "length": 6323, + "filename_relative": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol", + "is_dependency": false, + "lines": [ + 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, + 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, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "fopwCDKKK()" + } + } + ], + "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol#162-164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol#L162-L164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol#L162-L164", + "id": "89af79b93e8de48fb8f88ab4dabbc97b0bb35ab39b6544e255b16aa924286eab", + "check": "domain-separator-collision", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol new file mode 100644 index 000000000..303629b98 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol @@ -0,0 +1,208 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity >=0.8.0; + +/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) +/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) +/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. +abstract contract ERC20 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event Transfer(address indexed from, address indexed to, uint256 amount); + + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /*////////////////////////////////////////////////////////////// + METADATA STORAGE + //////////////////////////////////////////////////////////////*/ + + string public name; + + string public symbol; + + uint8 public immutable decimals; + + /*////////////////////////////////////////////////////////////// + ERC20 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 public totalSupply; + + mapping(address => uint256) public balanceOf; + + mapping(address => mapping(address => uint256)) public allowance; + + /*////////////////////////////////////////////////////////////// + EIP-2612 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal immutable INITIAL_CHAIN_ID; + + bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; + + mapping(address => uint256) public nonces; + + /*////////////////////////////////////////////////////////////// + CONSTRUCTOR + //////////////////////////////////////////////////////////////*/ + + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals + ) { + name = _name; + symbol = _symbol; + decimals = _decimals; + + INITIAL_CHAIN_ID = block.chainid; + INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + } + + /*////////////////////////////////////////////////////////////// + ERC20 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 amount) public virtual returns (bool) { + allowance[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + + return true; + } + + function transfer(address to, uint256 amount) public virtual returns (bool) { + balanceOf[msg.sender] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + unchecked { + balanceOf[to] += amount; + } + + emit Transfer(msg.sender, to, amount); + + return true; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public virtual returns (bool) { + uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + + if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; + + balanceOf[from] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + unchecked { + balanceOf[to] += amount; + } + + emit Transfer(from, to, amount); + + return true; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 LOGIC + //////////////////////////////////////////////////////////////*/ + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public virtual { + require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + + // Unchecked because the only math done is incrementing + // the owner's nonce which cannot realistically overflow. + unchecked { + address recoveredAddress = ecrecover( + keccak256( + abi.encodePacked( + "\x19\x01", + fopwCDKKK(), + keccak256( + abi.encode( + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ), + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ) + ) + ), + v, + r, + s + ); + + require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + + allowance[recoveredAddress][spender] = value; + } + + emit Approval(owner, spender, value); + } + + function fopwCDKKK() public view virtual returns (bytes32) { + return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); + } + + function computeDomainSeparator() internal view virtual returns (bytes32) { + return + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256("1"), + block.chainid, + address(this) + ) + ); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 amount) internal virtual { + totalSupply += amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + unchecked { + balanceOf[to] += amount; + } + + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal virtual { + balanceOf[from] -= amount; + + // Cannot underflow because a user's balance + // will never be larger than the total supply. + unchecked { + totalSupply -= amount; + } + + emit Transfer(from, address(0), amount); + } +} + +contract Test is ERC20("TEST", "TEST", 18) {} diff --git a/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol.0.8.0.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol.0.8.0.DomainSeparatorCollision.json new file mode 100644 index 000000000..9df2af573 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol.0.8.0.DomainSeparatorCollision.json @@ -0,0 +1,252 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "fopwCDKKK", + "source_mapping": { + "start": 5320, + "length": 170, + "filename_relative": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol", + "is_dependency": false, + "lines": [ + 162, + 163, + 164 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20", + "source_mapping": { + "start": 474, + "length": 6323, + "filename_relative": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol", + "is_dependency": false, + "lines": [ + 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, + 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, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "fopwCDKKK()" + } + } + ], + "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol#162-164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol#L162-L164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol#L162-L164", + "id": "89af79b93e8de48fb8f88ab4dabbc97b0bb35ab39b6544e255b16aa924286eab", + "check": "domain-separator-collision", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/test_detectors.py b/tests/test_detectors.py index 7aea45bbe..440c8a6ad 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -1443,6 +1443,31 @@ ALL_TEST_OBJECTS = [ "arbitrary_send_erc20_permit.sol", "0.8.0", ), + Test( + all_detectors.DomainSeparatorCollision, + "permit_domain_collision.sol", + "0.4.25", + ), + Test( + all_detectors.DomainSeparatorCollision, + "permit_domain_collision.sol", + "0.5.16", + ), + Test( + all_detectors.DomainSeparatorCollision, + "permit_domain_collision.sol", + "0.6.11", + ), + Test( + all_detectors.DomainSeparatorCollision, + "permit_domain_collision.sol", + "0.7.6", + ), + Test( + all_detectors.DomainSeparatorCollision, + "permit_domain_collision.sol", + "0.8.0", + ), ] diff --git a/tests/test_detectors_mocked_contract.py b/tests/test_detectors_mocked_contract.py deleted file mode 100644 index 8d8d5faa8..000000000 --- a/tests/test_detectors_mocked_contract.py +++ /dev/null @@ -1,21 +0,0 @@ -from solc_select import solc_select -from slither import Slither -from slither.detectors.all_detectors import DomainSeparatorCollision - - -def test_permit_domain_collision(): - """There is not a (known) collision for this function signature - so this test mutates a function's name to mock it. - """ - solc_select.switch_global_version("0.8.0", always_install=True) - sl = Slither("tests/mock_permit_domain_collision.sol") - assert len(sl.contracts_derived) == 1 - contract = sl.contracts_derived[0] - # This will memoize the solidity signature and mutating the name - # won't change the function selector calculated - func = contract.get_function_from_signature("DOMAIN_SEPARATOR()") - # Change the name to mock - func.name = "MOCK_COLLISION" - sl.register_detector(DomainSeparatorCollision) - results = sl.run_detectors() - assert len(results) == 1 From 0d04e17f8c0cbf5c19ce1469b1de2493cf25cb29 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 22 Aug 2022 14:52:09 -0500 Subject: [PATCH 17/87] remove pragmas and make syntax compatible --- .../0.4.25/permit_domain_collision.sol | 59 +++++++++--------- ...n.sol.0.4.25.DomainSeparatorCollision.json | 22 +++---- .../0.5.16/permit_domain_collision.sol | 61 +++++++++---------- ...n.sol.0.5.16.DomainSeparatorCollision.json | 22 +++---- .../0.6.11/permit_domain_collision.sol | 61 +++++++++---------- ...n.sol.0.6.11.DomainSeparatorCollision.json | 22 +++---- .../0.7.6/permit_domain_collision.sol | 61 +++++++++---------- ...on.sol.0.7.6.DomainSeparatorCollision.json | 22 +++---- .../0.8.0/permit_domain_collision.sol | 1 - ...on.sol.0.8.0.DomainSeparatorCollision.json | 18 +++--- 10 files changed, 172 insertions(+), 177 deletions(-) diff --git a/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol index 303629b98..854f14490 100644 --- a/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol +++ b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol @@ -1,11 +1,10 @@ // SPDX-License-Identifier: AGPL-3.0-only -pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. -abstract contract ERC20 { +contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ @@ -22,7 +21,7 @@ abstract contract ERC20 { string public symbol; - uint8 public immutable decimals; + uint8 public decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE @@ -38,9 +37,9 @@ abstract contract ERC20 { EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ - uint256 internal immutable INITIAL_CHAIN_ID; + uint256 internal INITIAL_CHAIN_ID; - bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; + bytes32 internal INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; @@ -57,7 +56,7 @@ abstract contract ERC20 { symbol = _symbol; decimals = _decimals; - INITIAL_CHAIN_ID = block.chainid; + INITIAL_CHAIN_ID = 1; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } @@ -65,7 +64,7 @@ abstract contract ERC20 { ERC20 LOGIC //////////////////////////////////////////////////////////////*/ - function approve(address spender, uint256 amount) public virtual returns (bool) { + function approve(address spender, uint256 amount) public returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); @@ -73,14 +72,14 @@ abstract contract ERC20 { return true; } - function transfer(address to, uint256 amount) public virtual returns (bool) { + function transfer(address to, uint256 amount) public returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. - unchecked { + balanceOf[to] += amount; - } + emit Transfer(msg.sender, to, amount); @@ -91,18 +90,18 @@ abstract contract ERC20 { address from, address to, uint256 amount - ) public virtual returns (bool) { + ) public returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. - if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; + if (allowed != 115792089237316195423570985008687907853269984665640564039457584007913129639935) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. - unchecked { + balanceOf[to] += amount; - } + emit Transfer(from, to, amount); @@ -121,14 +120,14 @@ abstract contract ERC20 { uint8 v, bytes32 r, bytes32 s - ) public virtual { + ) public { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. - unchecked { + address recoveredAddress = ecrecover( - keccak256( + keccak256( abi.encodePacked( "\x19\x01", fopwCDKKK(), @@ -154,23 +153,23 @@ abstract contract ERC20 { require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; - } + emit Approval(owner, spender, value); } - function fopwCDKKK() public view virtual returns (bytes32) { - return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); + function fopwCDKKK() public view returns (bytes32) { + return 1 == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } - function computeDomainSeparator() internal view virtual returns (bytes32) { + function computeDomainSeparator() internal view returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), - block.chainid, + 1, address(this) ) ); @@ -180,26 +179,26 @@ abstract contract ERC20 { INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ - function _mint(address to, uint256 amount) internal virtual { + function _mint(address to, uint256 amount) internal { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. - unchecked { - balanceOf[to] += amount; - } + + balanceOf[to] += amount; + emit Transfer(address(0), to, amount); } - function _burn(address from, uint256 amount) internal virtual { + function _burn(address from, uint256 amount) internal { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. - unchecked { - totalSupply -= amount; - } + + totalSupply -= amount; + emit Transfer(from, address(0), amount); } diff --git a/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol.0.4.25.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol.0.4.25.DomainSeparatorCollision.json index 6792ae0e9..ef58ab72b 100644 --- a/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol.0.4.25.DomainSeparatorCollision.json +++ b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol.0.4.25.DomainSeparatorCollision.json @@ -6,16 +6,16 @@ "type": "function", "name": "fopwCDKKK", "source_mapping": { - "start": 5320, - "length": 170, + "start": 5241, + "length": 150, "filename_relative": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol", "filename_absolute": "/GENERIC_PATH", "filename_short": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol", "is_dependency": false, "lines": [ + 161, 162, - 163, - 164 + 163 ], "starting_column": 5, "ending_column": 6 @@ -25,13 +25,14 @@ "type": "contract", "name": "ERC20", "source_mapping": { - "start": 474, - "length": 6323, + "start": 449, + "length": 6181, "filename_relative": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol", "filename_absolute": "/GENERIC_PATH", "filename_short": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol", "is_dependency": false, "lines": [ + 7, 8, 9, 10, @@ -229,8 +230,7 @@ 202, 203, 204, - 205, - 206 + 205 ], "starting_column": 1, "ending_column": 2 @@ -240,9 +240,9 @@ } } ], - "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol#162-164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", - "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol#L162-L164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", - "first_markdown_element": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol#L162-L164", + "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol#161-163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol#L161-L163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol#L161-L163", "id": "89af79b93e8de48fb8f88ab4dabbc97b0bb35ab39b6544e255b16aa924286eab", "check": "domain-separator-collision", "impact": "Medium", diff --git a/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol index 303629b98..f210eaa0b 100644 --- a/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol +++ b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol @@ -1,11 +1,10 @@ // SPDX-License-Identifier: AGPL-3.0-only -pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. -abstract contract ERC20 { +contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ @@ -22,7 +21,7 @@ abstract contract ERC20 { string public symbol; - uint8 public immutable decimals; + uint8 public decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE @@ -38,9 +37,9 @@ abstract contract ERC20 { EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ - uint256 internal immutable INITIAL_CHAIN_ID; + uint256 internal INITIAL_CHAIN_ID; - bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; + bytes32 internal INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; @@ -52,12 +51,12 @@ abstract contract ERC20 { string memory _name, string memory _symbol, uint8 _decimals - ) { + ) public { name = _name; symbol = _symbol; decimals = _decimals; - INITIAL_CHAIN_ID = block.chainid; + INITIAL_CHAIN_ID = 1; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } @@ -65,7 +64,7 @@ abstract contract ERC20 { ERC20 LOGIC //////////////////////////////////////////////////////////////*/ - function approve(address spender, uint256 amount) public virtual returns (bool) { + function approve(address spender, uint256 amount) public returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); @@ -73,14 +72,14 @@ abstract contract ERC20 { return true; } - function transfer(address to, uint256 amount) public virtual returns (bool) { + function transfer(address to, uint256 amount) public returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. - unchecked { + balanceOf[to] += amount; - } + emit Transfer(msg.sender, to, amount); @@ -91,18 +90,18 @@ abstract contract ERC20 { address from, address to, uint256 amount - ) public virtual returns (bool) { + ) public returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. - if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; + if (allowed != 115792089237316195423570985008687907853269984665640564039457584007913129639935) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. - unchecked { + balanceOf[to] += amount; - } + emit Transfer(from, to, amount); @@ -121,14 +120,14 @@ abstract contract ERC20 { uint8 v, bytes32 r, bytes32 s - ) public virtual { + ) public { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. - unchecked { + address recoveredAddress = ecrecover( - keccak256( + keccak256( abi.encodePacked( "\x19\x01", fopwCDKKK(), @@ -154,23 +153,23 @@ abstract contract ERC20 { require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; - } + emit Approval(owner, spender, value); } - function fopwCDKKK() public view virtual returns (bytes32) { - return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); + function fopwCDKKK() public view returns (bytes32) { + return 1 == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } - function computeDomainSeparator() internal view virtual returns (bytes32) { + function computeDomainSeparator() internal view returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), - block.chainid, + 1, address(this) ) ); @@ -180,26 +179,26 @@ abstract contract ERC20 { INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ - function _mint(address to, uint256 amount) internal virtual { + function _mint(address to, uint256 amount) internal { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. - unchecked { - balanceOf[to] += amount; - } + + balanceOf[to] += amount; + emit Transfer(address(0), to, amount); } - function _burn(address from, uint256 amount) internal virtual { + function _burn(address from, uint256 amount) internal { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. - unchecked { - totalSupply -= amount; - } + + totalSupply -= amount; + emit Transfer(from, address(0), amount); } diff --git a/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol.0.5.16.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol.0.5.16.DomainSeparatorCollision.json index a9140af11..d94ef48b9 100644 --- a/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol.0.5.16.DomainSeparatorCollision.json +++ b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol.0.5.16.DomainSeparatorCollision.json @@ -6,16 +6,16 @@ "type": "function", "name": "fopwCDKKK", "source_mapping": { - "start": 5320, - "length": 170, + "start": 5248, + "length": 150, "filename_relative": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol", "filename_absolute": "/GENERIC_PATH", "filename_short": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol", "is_dependency": false, "lines": [ + 161, 162, - 163, - 164 + 163 ], "starting_column": 5, "ending_column": 6 @@ -25,13 +25,14 @@ "type": "contract", "name": "ERC20", "source_mapping": { - "start": 474, - "length": 6323, + "start": 449, + "length": 6188, "filename_relative": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol", "filename_absolute": "/GENERIC_PATH", "filename_short": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol", "is_dependency": false, "lines": [ + 7, 8, 9, 10, @@ -229,8 +230,7 @@ 202, 203, 204, - 205, - 206 + 205 ], "starting_column": 1, "ending_column": 2 @@ -240,9 +240,9 @@ } } ], - "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol#162-164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", - "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol#L162-L164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", - "first_markdown_element": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol#L162-L164", + "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol#161-163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol#L161-L163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol#L161-L163", "id": "89af79b93e8de48fb8f88ab4dabbc97b0bb35ab39b6544e255b16aa924286eab", "check": "domain-separator-collision", "impact": "Medium", diff --git a/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol index 303629b98..f210eaa0b 100644 --- a/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol +++ b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol @@ -1,11 +1,10 @@ // SPDX-License-Identifier: AGPL-3.0-only -pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. -abstract contract ERC20 { +contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ @@ -22,7 +21,7 @@ abstract contract ERC20 { string public symbol; - uint8 public immutable decimals; + uint8 public decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE @@ -38,9 +37,9 @@ abstract contract ERC20 { EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ - uint256 internal immutable INITIAL_CHAIN_ID; + uint256 internal INITIAL_CHAIN_ID; - bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; + bytes32 internal INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; @@ -52,12 +51,12 @@ abstract contract ERC20 { string memory _name, string memory _symbol, uint8 _decimals - ) { + ) public { name = _name; symbol = _symbol; decimals = _decimals; - INITIAL_CHAIN_ID = block.chainid; + INITIAL_CHAIN_ID = 1; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } @@ -65,7 +64,7 @@ abstract contract ERC20 { ERC20 LOGIC //////////////////////////////////////////////////////////////*/ - function approve(address spender, uint256 amount) public virtual returns (bool) { + function approve(address spender, uint256 amount) public returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); @@ -73,14 +72,14 @@ abstract contract ERC20 { return true; } - function transfer(address to, uint256 amount) public virtual returns (bool) { + function transfer(address to, uint256 amount) public returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. - unchecked { + balanceOf[to] += amount; - } + emit Transfer(msg.sender, to, amount); @@ -91,18 +90,18 @@ abstract contract ERC20 { address from, address to, uint256 amount - ) public virtual returns (bool) { + ) public returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. - if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; + if (allowed != 115792089237316195423570985008687907853269984665640564039457584007913129639935) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. - unchecked { + balanceOf[to] += amount; - } + emit Transfer(from, to, amount); @@ -121,14 +120,14 @@ abstract contract ERC20 { uint8 v, bytes32 r, bytes32 s - ) public virtual { + ) public { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. - unchecked { + address recoveredAddress = ecrecover( - keccak256( + keccak256( abi.encodePacked( "\x19\x01", fopwCDKKK(), @@ -154,23 +153,23 @@ abstract contract ERC20 { require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; - } + emit Approval(owner, spender, value); } - function fopwCDKKK() public view virtual returns (bytes32) { - return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); + function fopwCDKKK() public view returns (bytes32) { + return 1 == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } - function computeDomainSeparator() internal view virtual returns (bytes32) { + function computeDomainSeparator() internal view returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), - block.chainid, + 1, address(this) ) ); @@ -180,26 +179,26 @@ abstract contract ERC20 { INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ - function _mint(address to, uint256 amount) internal virtual { + function _mint(address to, uint256 amount) internal { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. - unchecked { - balanceOf[to] += amount; - } + + balanceOf[to] += amount; + emit Transfer(address(0), to, amount); } - function _burn(address from, uint256 amount) internal virtual { + function _burn(address from, uint256 amount) internal { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. - unchecked { - totalSupply -= amount; - } + + totalSupply -= amount; + emit Transfer(from, address(0), amount); } diff --git a/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol.0.6.11.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol.0.6.11.DomainSeparatorCollision.json index 42cc0058c..5039fdc19 100644 --- a/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol.0.6.11.DomainSeparatorCollision.json +++ b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol.0.6.11.DomainSeparatorCollision.json @@ -6,16 +6,16 @@ "type": "function", "name": "fopwCDKKK", "source_mapping": { - "start": 5320, - "length": 170, + "start": 5248, + "length": 150, "filename_relative": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol", "filename_absolute": "/GENERIC_PATH", "filename_short": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol", "is_dependency": false, "lines": [ + 161, 162, - 163, - 164 + 163 ], "starting_column": 5, "ending_column": 6 @@ -25,13 +25,14 @@ "type": "contract", "name": "ERC20", "source_mapping": { - "start": 474, - "length": 6323, + "start": 449, + "length": 6188, "filename_relative": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol", "filename_absolute": "/GENERIC_PATH", "filename_short": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol", "is_dependency": false, "lines": [ + 7, 8, 9, 10, @@ -229,8 +230,7 @@ 202, 203, 204, - 205, - 206 + 205 ], "starting_column": 1, "ending_column": 2 @@ -240,9 +240,9 @@ } } ], - "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol#162-164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", - "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol#L162-L164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", - "first_markdown_element": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol#L162-L164", + "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol#161-163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol#L161-L163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol#L161-L163", "id": "89af79b93e8de48fb8f88ab4dabbc97b0bb35ab39b6544e255b16aa924286eab", "check": "domain-separator-collision", "impact": "Medium", diff --git a/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol index 303629b98..f210eaa0b 100644 --- a/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol +++ b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol @@ -1,11 +1,10 @@ // SPDX-License-Identifier: AGPL-3.0-only -pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. -abstract contract ERC20 { +contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ @@ -22,7 +21,7 @@ abstract contract ERC20 { string public symbol; - uint8 public immutable decimals; + uint8 public decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE @@ -38,9 +37,9 @@ abstract contract ERC20 { EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ - uint256 internal immutable INITIAL_CHAIN_ID; + uint256 internal INITIAL_CHAIN_ID; - bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; + bytes32 internal INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; @@ -52,12 +51,12 @@ abstract contract ERC20 { string memory _name, string memory _symbol, uint8 _decimals - ) { + ) public { name = _name; symbol = _symbol; decimals = _decimals; - INITIAL_CHAIN_ID = block.chainid; + INITIAL_CHAIN_ID = 1; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } @@ -65,7 +64,7 @@ abstract contract ERC20 { ERC20 LOGIC //////////////////////////////////////////////////////////////*/ - function approve(address spender, uint256 amount) public virtual returns (bool) { + function approve(address spender, uint256 amount) public returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); @@ -73,14 +72,14 @@ abstract contract ERC20 { return true; } - function transfer(address to, uint256 amount) public virtual returns (bool) { + function transfer(address to, uint256 amount) public returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. - unchecked { + balanceOf[to] += amount; - } + emit Transfer(msg.sender, to, amount); @@ -91,18 +90,18 @@ abstract contract ERC20 { address from, address to, uint256 amount - ) public virtual returns (bool) { + ) public returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. - if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; + if (allowed != 115792089237316195423570985008687907853269984665640564039457584007913129639935) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. - unchecked { + balanceOf[to] += amount; - } + emit Transfer(from, to, amount); @@ -121,14 +120,14 @@ abstract contract ERC20 { uint8 v, bytes32 r, bytes32 s - ) public virtual { + ) public { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. - unchecked { + address recoveredAddress = ecrecover( - keccak256( + keccak256( abi.encodePacked( "\x19\x01", fopwCDKKK(), @@ -154,23 +153,23 @@ abstract contract ERC20 { require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; - } + emit Approval(owner, spender, value); } - function fopwCDKKK() public view virtual returns (bytes32) { - return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); + function fopwCDKKK() public view returns (bytes32) { + return 1 == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } - function computeDomainSeparator() internal view virtual returns (bytes32) { + function computeDomainSeparator() internal view returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), - block.chainid, + 1, address(this) ) ); @@ -180,26 +179,26 @@ abstract contract ERC20 { INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ - function _mint(address to, uint256 amount) internal virtual { + function _mint(address to, uint256 amount) internal { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. - unchecked { - balanceOf[to] += amount; - } + + balanceOf[to] += amount; + emit Transfer(address(0), to, amount); } - function _burn(address from, uint256 amount) internal virtual { + function _burn(address from, uint256 amount) internal { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. - unchecked { - totalSupply -= amount; - } + + totalSupply -= amount; + emit Transfer(from, address(0), amount); } diff --git a/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol.0.7.6.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol.0.7.6.DomainSeparatorCollision.json index d43dfd2eb..9f0c1db41 100644 --- a/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol.0.7.6.DomainSeparatorCollision.json +++ b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol.0.7.6.DomainSeparatorCollision.json @@ -6,16 +6,16 @@ "type": "function", "name": "fopwCDKKK", "source_mapping": { - "start": 5320, - "length": 170, + "start": 5248, + "length": 150, "filename_relative": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol", "filename_absolute": "/GENERIC_PATH", "filename_short": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol", "is_dependency": false, "lines": [ + 161, 162, - 163, - 164 + 163 ], "starting_column": 5, "ending_column": 6 @@ -25,13 +25,14 @@ "type": "contract", "name": "ERC20", "source_mapping": { - "start": 474, - "length": 6323, + "start": 449, + "length": 6188, "filename_relative": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol", "filename_absolute": "/GENERIC_PATH", "filename_short": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol", "is_dependency": false, "lines": [ + 7, 8, 9, 10, @@ -229,8 +230,7 @@ 202, 203, 204, - 205, - 206 + 205 ], "starting_column": 1, "ending_column": 2 @@ -240,9 +240,9 @@ } } ], - "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol#162-164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", - "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol#L162-L164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", - "first_markdown_element": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol#L162-L164", + "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol#161-163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol#L161-L163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol#L161-L163", "id": "89af79b93e8de48fb8f88ab4dabbc97b0bb35ab39b6544e255b16aa924286eab", "check": "domain-separator-collision", "impact": "Medium", diff --git a/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol index 303629b98..04583c515 100644 --- a/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol +++ b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol @@ -1,5 +1,4 @@ // SPDX-License-Identifier: AGPL-3.0-only -pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) diff --git a/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol.0.8.0.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol.0.8.0.DomainSeparatorCollision.json index 9df2af573..bc816b0d6 100644 --- a/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol.0.8.0.DomainSeparatorCollision.json +++ b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol.0.8.0.DomainSeparatorCollision.json @@ -6,16 +6,16 @@ "type": "function", "name": "fopwCDKKK", "source_mapping": { - "start": 5320, + "start": 5295, "length": 170, "filename_relative": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol", "filename_absolute": "/GENERIC_PATH", "filename_short": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol", "is_dependency": false, "lines": [ + 161, 162, - 163, - 164 + 163 ], "starting_column": 5, "ending_column": 6 @@ -25,13 +25,14 @@ "type": "contract", "name": "ERC20", "source_mapping": { - "start": 474, + "start": 449, "length": 6323, "filename_relative": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol", "filename_absolute": "/GENERIC_PATH", "filename_short": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol", "is_dependency": false, "lines": [ + 7, 8, 9, 10, @@ -229,8 +230,7 @@ 202, 203, 204, - 205, - 206 + 205 ], "starting_column": 1, "ending_column": 2 @@ -240,9 +240,9 @@ } } ], - "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol#162-164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", - "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol#L162-L164)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", - "first_markdown_element": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol#L162-L164", + "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol#161-163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol#L161-L163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol#L161-L163", "id": "89af79b93e8de48fb8f88ab4dabbc97b0bb35ab39b6544e255b16aa924286eab", "check": "domain-separator-collision", "impact": "Medium", From 0ab3d50fa36625c6520be3b6e8683f6c3749389a Mon Sep 17 00:00:00 2001 From: Boyan-MILANOV Date: Tue, 23 Aug 2022 16:06:14 +0200 Subject: [PATCH 18/87] Add --no-fail-pedantic flag and make failing the default behavior --- slither/__main__.py | 12 ++++++++++++ slither/utils/command_line.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/slither/__main__.py b/slither/__main__.py index b27c8ae75..f1f334be4 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -288,6 +288,12 @@ def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-s usage += "\t- 0x.. // a contract on mainet\n" usage += f"\t- NETWORK:0x.. // a contract on a different network. Supported networks: {','.join(x[:-1] for x in SUPPORTED_NETWORK)}\n" + class NoFailPedanticAction(argparse.Action): + """Custom argparse action that sets args.fail_pedantic to False if --no-fail-pedantic is used""" + + def __call__(self, parser, namespace, values, option_string=None): + setattr(namespace, "fail_pedantic", False) + parser = argparse.ArgumentParser( description="For usage information, see https://github.com/crytic/slither/wiki/Usage", usage=usage, @@ -402,6 +408,12 @@ def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-s default=defaults_flag_in_config["fail_pedantic"], ) + group_detector.add_argument( + "--no-fail-pedantic", + help="Don't fail immediately if a finding is detected", + action=NoFailPedanticAction, + ) + group_detector.add_argument( "--fail-low", help="Fail if low or greater impact finding is detected", diff --git a/slither/utils/command_line.py b/slither/utils/command_line.py index d0d77c45f..d264e65ea 100644 --- a/slither/utils/command_line.py +++ b/slither/utils/command_line.py @@ -34,7 +34,7 @@ defaults_flag_in_config = { "exclude_low": False, "exclude_medium": False, "exclude_high": False, - "fail_pedantic": False, + "fail_pedantic": True, "fail_low": False, "fail_medium": False, "fail_high": False, From 40534e1a307c545aa70eef55814b4722f02f3a61 Mon Sep 17 00:00:00 2001 From: Boyan-MILANOV Date: Wed, 24 Aug 2022 09:20:14 +0200 Subject: [PATCH 19/87] Fix --no-fail-pedantic option parsing --- slither/__main__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/slither/__main__.py b/slither/__main__.py index f1f334be4..ecd529142 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -411,7 +411,9 @@ def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-s group_detector.add_argument( "--no-fail-pedantic", help="Don't fail immediately if a finding is detected", + nargs=0, action=NoFailPedanticAction, + required=False, ) group_detector.add_argument( From 1127eb5c49fada7288f95039a0805efe9c2dbdb5 Mon Sep 17 00:00:00 2001 From: Boyan-MILANOV Date: Wed, 24 Aug 2022 09:20:44 +0200 Subject: [PATCH 20/87] Force --no-fail-pedantic on some CI tests --- scripts/ci_test_cli.sh | 2 +- scripts/ci_test_truffle.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/ci_test_cli.sh b/scripts/ci_test_cli.sh index 56e6ff0a4..757fca076 100755 --- a/scripts/ci_test_cli.sh +++ b/scripts/ci_test_cli.sh @@ -4,7 +4,7 @@ solc-select use 0.7.0 -if ! slither "tests/config/test.sol" --solc-ast; then +if ! slither "tests/config/test.sol" --solc-ast --no-fail-pedantic; then echo "--solc-ast failed" exit 1 fi diff --git a/scripts/ci_test_truffle.sh b/scripts/ci_test_truffle.sh index da1a350c9..0246470f8 100755 --- a/scripts/ci_test_truffle.sh +++ b/scripts/ci_test_truffle.sh @@ -14,9 +14,9 @@ nvm use --lts npm install -g truffle truffle unbox metacoin -if ! slither .; then +if ! slither . --no-fail-pedantic; then echo "Truffle test failed" exit 1 fi -exit 0 \ No newline at end of file +exit 0 From 32599e0d2c39691d8d34c8ec9d2237d582365954 Mon Sep 17 00:00:00 2001 From: Boyan-MILANOV Date: Wed, 24 Aug 2022 09:28:03 +0200 Subject: [PATCH 21/87] Fix cli CI test --- scripts/ci_test_cli.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/ci_test_cli.sh b/scripts/ci_test_cli.sh index 757fca076..e35bf3ff5 100755 --- a/scripts/ci_test_cli.sh +++ b/scripts/ci_test_cli.sh @@ -9,12 +9,12 @@ if ! slither "tests/config/test.sol" --solc-ast --no-fail-pedantic; then exit 1 fi -if ! slither "tests/config/test.sol" --solc-disable-warnings; then +if ! slither "tests/config/test.sol" --solc-disable-warnings --no-fail-pedantic; then echo "--solc-disable-warnings failed" exit 1 fi -if ! slither "tests/config/test.sol" --disable-color; then +if ! slither "tests/config/test.sol" --disable-color --no-fail-pedantic; then echo "--disable-color failed" exit 1 fi From 994c4438f6298d386fe300d52ec79b386a7b45c9 Mon Sep 17 00:00:00 2001 From: Boyan-MILANOV Date: Wed, 24 Aug 2022 10:18:01 +0200 Subject: [PATCH 22/87] Remove custom argparse action --- slither/__main__.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/slither/__main__.py b/slither/__main__.py index ecd529142..aab334592 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -288,12 +288,6 @@ def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-s usage += "\t- 0x.. // a contract on mainet\n" usage += f"\t- NETWORK:0x.. // a contract on a different network. Supported networks: {','.join(x[:-1] for x in SUPPORTED_NETWORK)}\n" - class NoFailPedanticAction(argparse.Action): - """Custom argparse action that sets args.fail_pedantic to False if --no-fail-pedantic is used""" - - def __call__(self, parser, namespace, values, option_string=None): - setattr(namespace, "fail_pedantic", False) - parser = argparse.ArgumentParser( description="For usage information, see https://github.com/crytic/slither/wiki/Usage", usage=usage, @@ -411,8 +405,8 @@ def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-s group_detector.add_argument( "--no-fail-pedantic", help="Don't fail immediately if a finding is detected", - nargs=0, - action=NoFailPedanticAction, + dest="fail_pedantic", + action="store_false", required=False, ) From 082dd94e67983a02216aa98d190f63017f0c0cc0 Mon Sep 17 00:00:00 2001 From: Boyan-MILANOV Date: Wed, 24 Aug 2022 11:56:45 +0200 Subject: [PATCH 23/87] Improve help messages --- slither/__main__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/slither/__main__.py b/slither/__main__.py index aab334592..4cf148f13 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -397,14 +397,14 @@ def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-s group_detector.add_argument( "--fail-pedantic", - help="Fail if any finding is detected", + help="Return the number of findings in the exit code", action="store_true", default=defaults_flag_in_config["fail_pedantic"], ) group_detector.add_argument( "--no-fail-pedantic", - help="Don't fail immediately if a finding is detected", + help="Do not return the number of findings in the exit code. Opposite of --fail-pedantic", dest="fail_pedantic", action="store_false", required=False, From aa4a57d05015a8e5e103e7d5c8d25a76a58216c0 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Wed, 31 Aug 2022 11:48:13 +0200 Subject: [PATCH 24/87] Add more types --- plugin_example/slither_my_plugin/__init__.py | 9 +- slither/__main__.py | 96 ++++++++++++------- slither/core/declarations/structure.py | 14 +-- slither/core/expressions/tuple_expression.py | 4 +- slither/core/source_mapping/source_mapping.py | 8 +- slither/slither.py | 12 ++- slither/slithir/operations/call.py | 8 +- slither/slithir/tmp_operations/tmp_call.py | 8 +- .../tmp_operations/tmp_new_elementary_type.py | 12 ++- slither/tools/demo/__main__.py | 4 +- slither/tools/erc_conformance/__main__.py | 9 +- slither/tools/erc_conformance/erc/ercs.py | 15 ++- slither/tools/flattening/__main__.py | 4 +- slither/tools/kspec_coverage/__main__.py | 4 +- .../tools/kspec_coverage/kspec_coverage.py | 4 +- slither/tools/mutator/__main__.py | 13 ++- slither/tools/possible_paths/__main__.py | 7 +- .../tools/possible_paths/possible_paths.py | 45 ++++++--- slither/tools/properties/__main__.py | 19 ++-- slither/tools/properties/platforms/truffle.py | 8 +- slither/tools/properties/utils.py | 2 +- slither/tools/similarity/__main__.py | 4 +- slither/tools/similarity/encode.py | 2 +- slither/tools/similarity/info.py | 3 +- slither/tools/similarity/plot.py | 3 +- slither/tools/similarity/train.py | 3 +- slither/tools/slither_format/__main__.py | 4 +- .../tools/slither_format/slither_format.py | 18 ++-- slither/tools/upgradeability/__main__.py | 75 ++++++++++----- .../upgradeability/utils/command_line.py | 20 ++-- slither/utils/command_line.py | 57 +++++++---- slither/utils/output.py | 4 +- slither/utils/output_capture.py | 8 +- 33 files changed, 323 insertions(+), 183 deletions(-) diff --git a/plugin_example/slither_my_plugin/__init__.py b/plugin_example/slither_my_plugin/__init__.py index eabdb147e..9379ac833 100644 --- a/plugin_example/slither_my_plugin/__init__.py +++ b/plugin_example/slither_my_plugin/__init__.py @@ -1,8 +1,13 @@ +from typing import Tuple, List, Type + from slither_my_plugin.detectors.example import Example +from slither.detectors.abstract_detector import AbstractDetector +from slither.printers.abstract_printer import AbstractPrinter + -def make_plugin(): +def make_plugin() -> Tuple[List[Type[AbstractDetector]], List[Type[AbstractPrinter]]]: plugin_detectors = [Example] - plugin_printers = [] + plugin_printers: List[Type[AbstractPrinter]] = [] return plugin_detectors, plugin_printers diff --git a/slither/__main__.py b/slither/__main__.py index 4cf148f13..98320c76a 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -10,11 +10,11 @@ import os import pstats import sys import traceback -from typing import Tuple, Optional, List, Dict +from typing import Tuple, Optional, List, Dict, Type, Union, Any, Sequence from pkg_resources import iter_entry_points, require -from crytic_compile import cryticparser +from crytic_compile import cryticparser, CryticCompile from crytic_compile.platform.standard import generate_standard_export from crytic_compile.platform.etherscan import SUPPORTED_NETWORK from crytic_compile import compile_all, is_supported @@ -55,10 +55,10 @@ logger = logging.getLogger("Slither") def process_single( - target: str, + target: Union[str, CryticCompile], args: argparse.Namespace, - detector_classes: List[AbstractDetector], - printer_classes: List[AbstractPrinter], + detector_classes: List[Type[AbstractDetector]], + printer_classes: List[Type[AbstractPrinter]], ) -> Tuple[Slither, List[Dict], List[Dict], int]: """ The core high-level code for running Slither static analysis. @@ -80,8 +80,8 @@ def process_single( def process_all( target: str, args: argparse.Namespace, - detector_classes: List[AbstractDetector], - printer_classes: List[AbstractPrinter], + detector_classes: List[Type[AbstractDetector]], + printer_classes: List[Type[AbstractPrinter]], ) -> Tuple[List[Slither], List[Dict], List[Dict], int]: compilations = compile_all(target, **vars(args)) slither_instances = [] @@ -109,8 +109,8 @@ def process_all( def _process( slither: Slither, - detector_classes: List[AbstractDetector], - printer_classes: List[AbstractPrinter], + detector_classes: List[Type[AbstractDetector]], + printer_classes: List[Type[AbstractPrinter]], ) -> Tuple[Slither, List[Dict], List[Dict], int]: for detector_cls in detector_classes: slither.register_detector(detector_cls) @@ -137,13 +137,14 @@ def _process( return slither, results_detectors, results_printers, analyzed_contracts_count +# TODO: delete me? def process_from_asts( filenames: List[str], args: argparse.Namespace, - detector_classes: List[AbstractDetector], - printer_classes: List[AbstractPrinter], -): - all_contracts = [] + detector_classes: List[Type[AbstractDetector]], + printer_classes: List[Type[AbstractPrinter]], +) -> Tuple[Slither, List[Dict], List[Dict], int]: + all_contracts: List[str] = [] for filename in filenames: with open(filename, encoding="utf8") as file_open: @@ -162,13 +163,15 @@ def process_from_asts( ################################################################################### -def get_detectors_and_printers(): +def get_detectors_and_printers() -> Tuple[ + List[Type[AbstractDetector]], List[Type[AbstractPrinter]] +]: - detectors = [getattr(all_detectors, name) for name in dir(all_detectors)] - detectors = [d for d in detectors if inspect.isclass(d) and issubclass(d, AbstractDetector)] + detectors_ = [getattr(all_detectors, name) for name in dir(all_detectors)] + detectors = [d for d in detectors_ if inspect.isclass(d) and issubclass(d, AbstractDetector)] - printers = [getattr(all_printers, name) for name in dir(all_printers)] - printers = [p for p in printers if inspect.isclass(p) and issubclass(p, AbstractPrinter)] + printers_ = [getattr(all_printers, name) for name in dir(all_printers)] + printers = [p for p in printers_ if inspect.isclass(p) and issubclass(p, AbstractPrinter)] # Handle plugins! for entry_point in iter_entry_points(group="slither_analyzer.plugin", name=None): @@ -194,8 +197,8 @@ def get_detectors_and_printers(): # pylint: disable=too-many-branches def choose_detectors( - args: argparse.Namespace, all_detector_classes: List[AbstractDetector] -) -> List[AbstractDetector]: + args: argparse.Namespace, all_detector_classes: List[Type[AbstractDetector]] +) -> List[Type[AbstractDetector]]: # If detectors are specified, run only these ones detectors_to_run = [] @@ -245,8 +248,8 @@ def choose_detectors( def choose_printers( - args: argparse.Namespace, all_printer_classes: List[AbstractPrinter] -) -> List[AbstractPrinter]: + args: argparse.Namespace, all_printer_classes: List[Type[AbstractPrinter]] +) -> List[Type[AbstractPrinter]]: printers_to_run = [] # disable default printer @@ -273,13 +276,16 @@ def choose_printers( ################################################################################### -def parse_filter_paths(args): +def parse_filter_paths(args: argparse.Namespace) -> List[str]: if args.filter_paths: return args.filter_paths.split(",") return [] -def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-statements +# pylint: disable=too-many-statements +def parse_args( + detector_classes: List[Type[AbstractDetector]], printer_classes: List[Type[AbstractPrinter]] +) -> argparse.Namespace: usage = "slither target [flag]\n" usage += "\ntarget can be:\n" @@ -622,7 +628,9 @@ class ListDetectors(argparse.Action): # pylint: disable=too-few-public-methods class ListDetectorsJson(argparse.Action): # pylint: disable=too-few-public-methods - def __call__(self, parser, *args, **kwargs): # pylint: disable=signature-differs + def __call__( + self, parser: Any, *args: Any, **kwargs: Any + ) -> None: # pylint: disable=signature-differs detectors, _ = get_detectors_and_printers() detector_types_json = output_detectors_json(detectors) print(json.dumps(detector_types_json)) @@ -630,22 +638,38 @@ class ListDetectorsJson(argparse.Action): # pylint: disable=too-few-public-meth class ListPrinters(argparse.Action): # pylint: disable=too-few-public-methods - def __call__(self, parser, *args, **kwargs): # pylint: disable=signature-differs + def __call__( + self, parser: Any, *args: Any, **kwargs: Any + ) -> None: # pylint: disable=signature-differs _, printers = get_detectors_and_printers() output_printers(printers) parser.exit() class OutputMarkdown(argparse.Action): # pylint: disable=too-few-public-methods - def __call__(self, parser, args, values, option_string=None): + def __call__( + self, + parser: Any, + args: Any, + values: Optional[Union[str, Sequence[Any]]], + option_string: Any = None, + ) -> None: detectors, printers = get_detectors_and_printers() + assert isinstance(values, str) output_to_markdown(detectors, printers, values) parser.exit() class OutputWiki(argparse.Action): # pylint: disable=too-few-public-methods - def __call__(self, parser, args, values, option_string=None): + def __call__( + self, + parser: Any, + args: Any, + values: Optional[Union[str, Sequence[Any]]], + option_string: Any = None, + ) -> None: detectors, _ = get_detectors_and_printers() + assert isinstance(values, str) output_wiki(detectors, values) parser.exit() @@ -678,7 +702,7 @@ class FormatterCryticCompile(logging.Formatter): ################################################################################### -def main(): +def main() -> None: # Codebase with complex domninators can lead to a lot of SSA recursive call sys.setrecursionlimit(1500) @@ -689,8 +713,9 @@ def main(): # pylint: disable=too-many-statements,too-many-branches,too-many-locals def main_impl( - all_detector_classes: List[AbstractDetector], all_printer_classes: List[AbstractPrinter] -): + all_detector_classes: List[Type[AbstractDetector]], + all_printer_classes: List[Type[AbstractPrinter]], +) -> None: """ :param all_detector_classes: A list of all detectors that can be included/excluded. :param all_printer_classes: A list of all printers that can be included. @@ -756,8 +781,8 @@ def main_impl( crytic_compile_error.propagate = False crytic_compile_error.setLevel(logging.INFO) - results_detectors = [] - results_printers = [] + results_detectors: List[Dict] = [] + results_printers: List[Dict] = [] try: filename = args.filename @@ -806,6 +831,7 @@ def main_impl( if "compilations" in args.json_types: compilation_results = [] for slither_instance in slither_instances: + assert slither_instance.crytic_compile compilation_results.append( generate_standard_export(slither_instance.crytic_compile) ) @@ -856,7 +882,7 @@ def main_impl( except Exception: # pylint: disable=broad-except output_error = traceback.format_exc() - logging.error(traceback.print_exc()) + traceback.print_exc() logging.error(f"Error in {args.filename}") # pylint: disable=logging-fstring-interpolation logging.error(output_error) @@ -879,7 +905,7 @@ def main_impl( if outputting_zip: output_to_zip(args.zip, output_error, json_results, args.zip_type) - if args.perf: + if args.perf and cp: cp.disable() stats = pstats.Stats(cp).sort_stats("cumtime") stats.print_stats() diff --git a/slither/core/declarations/structure.py b/slither/core/declarations/structure.py index 39b1948ee..8f6d8c50a 100644 --- a/slither/core/declarations/structure.py +++ b/slither/core/declarations/structure.py @@ -8,10 +8,10 @@ if TYPE_CHECKING: class Structure(SourceMapping): - def __init__(self, compilation_unit: "SlitherCompilationUnit"): + def __init__(self, compilation_unit: "SlitherCompilationUnit") -> None: super().__init__() self._name: Optional[str] = None - self._canonical_name = None + self._canonical_name: Optional[str] = None self._elems: Dict[str, "StructureVariable"] = {} # Name of the elements in the order of declaration self._elems_ordered: List[str] = [] @@ -19,25 +19,27 @@ class Structure(SourceMapping): @property def canonical_name(self) -> str: + assert self._canonical_name return self._canonical_name @canonical_name.setter - def canonical_name(self, name: str): + def canonical_name(self, name: str) -> None: self._canonical_name = name @property def name(self) -> str: + assert self._name return self._name @name.setter - def name(self, new_name: str): + def name(self, new_name: str) -> None: self._name = new_name @property def elems(self) -> Dict[str, "StructureVariable"]: return self._elems - def add_elem_in_order(self, s: str): + def add_elem_in_order(self, s: str) -> None: self._elems_ordered.append(s) @property @@ -47,5 +49,5 @@ class Structure(SourceMapping): ret.append(self._elems[e]) return ret - def __str__(self): + def __str__(self) -> str: return self.name diff --git a/slither/core/expressions/tuple_expression.py b/slither/core/expressions/tuple_expression.py index 7f14601f4..1fd8fc795 100644 --- a/slither/core/expressions/tuple_expression.py +++ b/slither/core/expressions/tuple_expression.py @@ -4,7 +4,7 @@ from slither.core.expressions.expression import Expression class TupleExpression(Expression): - def __init__(self, expressions): + def __init__(self, expressions: List[Expression]) -> None: assert all(isinstance(x, Expression) for x in expressions if x) super().__init__() self._expressions = expressions @@ -13,6 +13,6 @@ class TupleExpression(Expression): def expressions(self) -> List[Expression]: return self._expressions - def __str__(self): + def __str__(self) -> str: expressions_str = [str(e) for e in self.expressions] return "(" + ",".join(expressions_str) + ")" diff --git a/slither/core/source_mapping/source_mapping.py b/slither/core/source_mapping/source_mapping.py index 7ceabd568..ee5211c7c 100644 --- a/slither/core/source_mapping/source_mapping.py +++ b/slither/core/source_mapping/source_mapping.py @@ -162,13 +162,15 @@ def _convert_source_mapping( class SourceMapping(Context, metaclass=ABCMeta): - def __init__(self): + def __init__(self) -> None: super().__init__() # self._source_mapping: Optional[Dict] = None self.source_mapping: Source = Source() self.references: List[Source] = [] - def set_offset(self, offset: Union["Source", str], compilation_unit: "SlitherCompilationUnit"): + def set_offset( + self, offset: Union["Source", str], compilation_unit: "SlitherCompilationUnit" + ) -> None: if isinstance(offset, Source): self.source_mapping.start = offset.start self.source_mapping.length = offset.length @@ -184,6 +186,6 @@ class SourceMapping(Context, metaclass=ABCMeta): def add_reference_from_raw_source( self, offset: str, compilation_unit: "SlitherCompilationUnit" - ): + ) -> None: s = _convert_source_mapping(offset, compilation_unit) self.references.append(s) diff --git a/slither/slither.py b/slither/slither.py index 59bbf8a5f..dcfc0ad7e 100644 --- a/slither/slither.py +++ b/slither/slither.py @@ -1,5 +1,5 @@ import logging -from typing import Union, List, ValuesView +from typing import Union, List, ValuesView, Type, Dict from crytic_compile import CryticCompile, InvalidCompilation @@ -19,7 +19,9 @@ logger_detector = logging.getLogger("Detectors") logger_printer = logging.getLogger("Printers") -def _check_common_things(thing_name, cls, base_cls, instances_list): +def _check_common_things( + thing_name: str, cls: Type, base_cls: Type, instances_list: List[Type[AbstractDetector]] +) -> None: if not issubclass(cls, base_cls) or cls is base_cls: raise Exception( @@ -178,7 +180,7 @@ class Slither(SlitherCore): # pylint: disable=too-many-instance-attributes def detectors_optimization(self): return [d for d in self.detectors if d.IMPACT == DetectorClassification.OPTIMIZATION] - def register_detector(self, detector_class): + def register_detector(self, detector_class: Type[AbstractDetector]) -> None: """ :param detector_class: Class inheriting from `AbstractDetector`. """ @@ -188,7 +190,7 @@ class Slither(SlitherCore): # pylint: disable=too-many-instance-attributes instance = detector_class(compilation_unit, self, logger_detector) self._detectors.append(instance) - def register_printer(self, printer_class): + def register_printer(self, printer_class: Type[AbstractPrinter]) -> None: """ :param printer_class: Class inheriting from `AbstractPrinter`. """ @@ -197,7 +199,7 @@ class Slither(SlitherCore): # pylint: disable=too-many-instance-attributes instance = printer_class(self, logger_printer) self._printers.append(instance) - def run_detectors(self): + def run_detectors(self) -> List[Dict]: """ :return: List of registered detectors results. """ diff --git a/slither/slithir/operations/call.py b/slither/slithir/operations/call.py index cff2767cd..07304fa99 100644 --- a/slither/slithir/operations/call.py +++ b/slither/slithir/operations/call.py @@ -1,8 +1,10 @@ +from typing import Optional, List + from slither.slithir.operations.operation import Operation class Call(Operation): - def __init__(self): + def __init__(self) -> None: super().__init__() self._arguments = [] @@ -14,14 +16,14 @@ class Call(Operation): def arguments(self, v): self._arguments = v - def can_reenter(self, _callstack=None): # pylint: disable=no-self-use + def can_reenter(self, _callstack: Optional[List] = None) -> bool: # pylint: disable=no-self-use """ Must be called after slithIR analysis pass :return: bool """ return False - def can_send_eth(self): # pylint: disable=no-self-use + def can_send_eth(self) -> bool: # pylint: disable=no-self-use """ Must be called after slithIR analysis pass :return: bool diff --git a/slither/slithir/tmp_operations/tmp_call.py b/slither/slithir/tmp_operations/tmp_call.py index e9562b1c1..fb6641139 100644 --- a/slither/slithir/tmp_operations/tmp_call.py +++ b/slither/slithir/tmp_operations/tmp_call.py @@ -63,14 +63,14 @@ class TmpCall(OperationWithLValue): # pylint: disable=too-many-instance-attribu def call_id(self): return self._callid - @property - def read(self): - return [self.called] - @call_id.setter def call_id(self, c): self._callid = c + @property + def read(self): + return [self.called] + @property def called(self): return self._called diff --git a/slither/slithir/tmp_operations/tmp_new_elementary_type.py b/slither/slithir/tmp_operations/tmp_new_elementary_type.py index 357c063a7..d7a4f5e1b 100644 --- a/slither/slithir/tmp_operations/tmp_new_elementary_type.py +++ b/slither/slithir/tmp_operations/tmp_new_elementary_type.py @@ -1,21 +1,23 @@ +from typing import List + from slither.slithir.operations.lvalue import OperationWithLValue from slither.core.solidity_types.elementary_type import ElementaryType class TmpNewElementaryType(OperationWithLValue): - def __init__(self, new_type, lvalue): + def __init__(self, new_type: ElementaryType, lvalue): assert isinstance(new_type, ElementaryType) super().__init__() - self._type = new_type + self._type: ElementaryType = new_type self._lvalue = lvalue @property - def read(self): + def read(self) -> List: return [] @property - def type(self): + def type(self) -> ElementaryType: return self._type - def __str__(self): + def __str__(self) -> str: return f"{self.lvalue} = new {self._type}" diff --git a/slither/tools/demo/__main__.py b/slither/tools/demo/__main__.py index 37d265bb1..5bc2c7c8e 100644 --- a/slither/tools/demo/__main__.py +++ b/slither/tools/demo/__main__.py @@ -9,7 +9,7 @@ logging.getLogger("Slither").setLevel(logging.INFO) logger = logging.getLogger("Slither-demo") -def parse_args(): +def parse_args() -> argparse.Namespace: """ Parse the underlying arguments for the program. :return: Returns the arguments for the program. @@ -26,7 +26,7 @@ def parse_args(): return parser.parse_args() -def main(): +def main() -> None: args = parse_args() # Perform slither analysis on the given filename diff --git a/slither/tools/erc_conformance/__main__.py b/slither/tools/erc_conformance/__main__.py index 45e57b55c..ef594a7c6 100644 --- a/slither/tools/erc_conformance/__main__.py +++ b/slither/tools/erc_conformance/__main__.py @@ -1,6 +1,7 @@ import argparse import logging from collections import defaultdict +from typing import Any, Dict, List from crytic_compile import cryticparser from slither import Slither @@ -26,7 +27,7 @@ logger.propagate = False ADDITIONAL_CHECKS = {"ERC20": check_erc20, "ERC1155": check_erc1155} -def parse_args(): +def parse_args() -> argparse.Namespace: """ Parse the underlying arguments for the program. :return: Returns the arguments for the program. @@ -63,20 +64,20 @@ def parse_args(): return parser.parse_args() -def _log_error(err, args): +def _log_error(err: Any, args: argparse.Namespace) -> None: if args.json: output_to_json(args.json, str(err), {"upgradeability-check": []}) logger.error(err) -def main(): +def main() -> None: args = parse_args() # Perform slither analysis on the given filename slither = Slither(args.project, **vars(args)) - ret = defaultdict(list) + ret: Dict[str, List] = defaultdict(list) if args.erc.upper() in ERCS: diff --git a/slither/tools/erc_conformance/erc/ercs.py b/slither/tools/erc_conformance/erc/ercs.py index ef459eef9..a6b9050ae 100644 --- a/slither/tools/erc_conformance/erc/ercs.py +++ b/slither/tools/erc_conformance/erc/ercs.py @@ -1,7 +1,10 @@ import logging +from typing import Dict, List, Optional, Set +from slither.core.declarations import Contract from slither.slithir.operations import EventCall from slither.utils import output +from slither.utils.erc import ERC, ERC_EVENT from slither.utils.type import ( export_nested_types_from_variable, export_return_type_from_variable, @@ -11,7 +14,7 @@ logger = logging.getLogger("Slither-conformance") # pylint: disable=too-many-locals,too-many-branches,too-many-statements -def _check_signature(erc_function, contract, ret): +def _check_signature(erc_function: ERC, contract: Contract, ret: Dict) -> None: name = erc_function.name parameters = erc_function.parameters return_type = erc_function.return_type @@ -146,7 +149,7 @@ def _check_signature(erc_function, contract, ret): ret["missing_event_emmited"].append(missing_event_emmited.data) -def _check_events(erc_event, contract, ret): +def _check_events(erc_event: ERC_EVENT, contract: Contract, ret: Dict[str, List]) -> None: name = erc_event.name parameters = erc_event.parameters indexes = erc_event.indexes @@ -180,7 +183,13 @@ def _check_events(erc_event, contract, ret): ret["missing_event_index"].append(missing_event_index.data) -def generic_erc_checks(contract, erc_functions, erc_events, ret, explored=None): +def generic_erc_checks( + contract: Contract, + erc_functions: List[ERC], + erc_events: List[ERC_EVENT], + ret: Dict[str, List], + explored: Optional[Set[Contract]] = None, +) -> None: if explored is None: explored = set() diff --git a/slither/tools/flattening/__main__.py b/slither/tools/flattening/__main__.py index 977b84896..bf9856fe8 100644 --- a/slither/tools/flattening/__main__.py +++ b/slither/tools/flattening/__main__.py @@ -18,7 +18,7 @@ logger = logging.getLogger("Slither") logger.setLevel(logging.INFO) -def parse_args(): +def parse_args() -> argparse.Namespace: """ Parse the underlying arguments for the program. :return: Returns the arguments for the program. @@ -106,7 +106,7 @@ def parse_args(): return parser.parse_args() -def main(): +def main() -> None: args = parse_args() slither = Slither(args.filename, **vars(args)) diff --git a/slither/tools/kspec_coverage/__main__.py b/slither/tools/kspec_coverage/__main__.py index b6ce0f81b..19933e0fe 100644 --- a/slither/tools/kspec_coverage/__main__.py +++ b/slither/tools/kspec_coverage/__main__.py @@ -16,7 +16,7 @@ logger.handlers[0].setFormatter(formatter) logger.propagate = False -def parse_args(): +def parse_args() -> argparse.Namespace: """ Parse the underlying arguments for the program. :return: Returns the arguments for the program. @@ -56,7 +56,7 @@ def parse_args(): return parser.parse_args() -def main(): +def main() -> None: # ------------------------------ # Usage: slither-kspec-coverage contract kspec # Example: slither-kspec-coverage contract.sol kspec.md diff --git a/slither/tools/kspec_coverage/kspec_coverage.py b/slither/tools/kspec_coverage/kspec_coverage.py index 569a35cf1..f8c2d8cf2 100755 --- a/slither/tools/kspec_coverage/kspec_coverage.py +++ b/slither/tools/kspec_coverage/kspec_coverage.py @@ -1,8 +1,10 @@ +import argparse + from slither.tools.kspec_coverage.analysis import run_analysis from slither import Slither -def kspec_coverage(args): +def kspec_coverage(args: argparse.Namespace) -> None: contract = args.contract kspec = args.kspec diff --git a/slither/tools/mutator/__main__.py b/slither/tools/mutator/__main__.py index 442b4849d..78b86d681 100644 --- a/slither/tools/mutator/__main__.py +++ b/slither/tools/mutator/__main__.py @@ -2,6 +2,7 @@ import argparse import inspect import logging import sys +from typing import Type, List, Any from crytic_compile import cryticparser @@ -22,7 +23,7 @@ logger.setLevel(logging.INFO) ################################################################################### -def parse_args(): +def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( description="Experimental smart contract mutator. Based on https://arxiv.org/abs/2006.11597", usage="slither-mutate target", @@ -48,14 +49,16 @@ def parse_args(): return parser.parse_args() -def _get_mutators(): - detectors = [getattr(all_mutators, name) for name in dir(all_mutators)] - detectors = [c for c in detectors if inspect.isclass(c) and issubclass(c, AbstractMutator)] +def _get_mutators() -> List[Type[AbstractMutator]]: + detectors_ = [getattr(all_mutators, name) for name in dir(all_mutators)] + detectors = [c for c in detectors_ if inspect.isclass(c) and issubclass(c, AbstractMutator)] return detectors class ListMutators(argparse.Action): # pylint: disable=too-few-public-methods - def __call__(self, parser, *args, **kwargs): # pylint: disable=signature-differs + def __call__( + self, parser: Any, *args: Any, **kwargs: Any + ) -> None: # pylint: disable=signature-differs checks = _get_mutators() output_mutators(checks) parser.exit() diff --git a/slither/tools/possible_paths/__main__.py b/slither/tools/possible_paths/__main__.py index 29cd05c46..b993d266a 100644 --- a/slither/tools/possible_paths/__main__.py +++ b/slither/tools/possible_paths/__main__.py @@ -5,6 +5,7 @@ from argparse import ArgumentParser, Namespace from crytic_compile import cryticparser from slither import Slither +from slither.core.declarations import FunctionContract from slither.utils.colors import red from slither.tools.possible_paths.possible_paths import ( find_target_paths, @@ -58,7 +59,11 @@ def main() -> None: # Print out all target functions. print("Target functions:") for target in targets: - print(f"- {target.contract_declarer.name}.{target.full_name}") + if isinstance(target, FunctionContract): + print(f"- {target.contract_declarer.name}.{target.full_name}") + else: + pass + # TODO implement me print("\n") # Obtain all paths which reach the target functions. diff --git a/slither/tools/possible_paths/possible_paths.py b/slither/tools/possible_paths/possible_paths.py index 9e52ed6b7..6e836e76a 100644 --- a/slither/tools/possible_paths/possible_paths.py +++ b/slither/tools/possible_paths/possible_paths.py @@ -1,8 +1,15 @@ +from typing import List, Tuple, Union, Optional, Set + +from slither import Slither +from slither.core.declarations import Function, FunctionContract +from slither.core.slither_core import SlitherCore + + class ResolveFunctionException(Exception): pass -def resolve_function(slither, contract_name, function_name): +def resolve_function(slither: SlitherCore, contract_name: str, function_name: str) -> Function: """ Resolves a function instance, given a contract name and function. :param contract_name: The name of the contract the function is declared in. @@ -32,7 +39,9 @@ def resolve_function(slither, contract_name, function_name): return target_function -def resolve_functions(slither, functions): +def resolve_functions( + slither: Slither, functions: List[Union[str, Tuple[str, str]]] +) -> List[Function]: """ Resolves the provided function descriptors. :param functions: A list of tuples (contract_name, function_name) or str (of form "ContractName.FunctionName") @@ -40,7 +49,7 @@ def resolve_functions(slither, functions): :return: Returns a list of resolved functions. """ # Create the resolved list. - resolved = [] + resolved: List[Function] = [] # Verify that the provided argument is a list. if not isinstance(functions, list): @@ -72,24 +81,31 @@ def resolve_functions(slither, functions): return resolved -def all_function_definitions(function): +def all_function_definitions(function: Function) -> List[Function]: """ Obtains a list of representing this function and any base definitions :param function: The function to obtain all definitions at and beneath. :return: Returns a list composed of the provided function definition and any base definitions. """ - return [function] + [ + # TODO implement me + if not isinstance(function, FunctionContract): + return [] + ret: List[Function] = [function] + ret += [ f for c in function.contract.inheritance for f in c.functions_and_modifiers_declared if f.full_name == function.full_name ] + return ret -def __find_target_paths(slither, target_function, current_path=None): +def __find_target_paths( + slither: SlitherCore, target_function: Function, current_path: Optional[List[Function]] = None +) -> Set[Tuple[Function, ...]]: current_path = current_path if current_path else [] # Create our results list - results = set() + results: Set[Tuple[Function, ...]] = set() # Add our current function to the path. current_path = [target_function] + current_path @@ -106,9 +122,12 @@ def __find_target_paths(slither, target_function, current_path=None): continue # Find all function calls in this function (except for low level) - called_functions = [f for (_, f) in function.high_level_calls + function.library_calls] - called_functions += function.internal_calls - called_functions = set(called_functions) + called_functions_list = [ + f for (_, f) in function.high_level_calls if isinstance(f, Function) + ] + called_functions_list += [f for (_, f) in function.library_calls] + called_functions_list += [f for f in function.internal_calls if isinstance(f, Function)] + called_functions = set(called_functions_list) # If any of our target functions are reachable from this function, it's a result. if all_target_functions.intersection(called_functions): @@ -123,14 +142,16 @@ def __find_target_paths(slither, target_function, current_path=None): return results -def find_target_paths(slither, target_functions): +def find_target_paths( + slither: SlitherCore, target_functions: List[Function] +) -> Set[Tuple[Function, ...]]: """ Obtains all functions which can lead to any of the target functions being called. :param target_functions: The functions we are interested in reaching. :return: Returns a list of all functions which can reach any of the target_functions. """ # Create our results list - results = set() + results: Set[Tuple[Function, ...]] = set() # Loop for each target function for target_function in target_functions: diff --git a/slither/tools/properties/__main__.py b/slither/tools/properties/__main__.py index 91c990669..10837bb4b 100644 --- a/slither/tools/properties/__main__.py +++ b/slither/tools/properties/__main__.py @@ -1,6 +1,7 @@ import argparse import logging import sys +from typing import Any from crytic_compile import cryticparser @@ -26,7 +27,7 @@ logger.handlers[0].setFormatter(formatter) logger.propagate = False -def _all_scenarios(): +def _all_scenarios() -> str: txt = "\n" txt += "#################### ERC20 ####################\n" for k, value in ERC20_PROPERTIES.items(): @@ -35,29 +36,33 @@ def _all_scenarios(): return txt -def _all_properties(): +def _all_properties() -> MyPrettyTable: table = MyPrettyTable(["Num", "Description", "Scenario"]) idx = 0 for scenario, value in ERC20_PROPERTIES.items(): for prop in value.properties: - table.add_row([idx, prop.description, scenario]) + table.add_row([str(idx), prop.description, scenario]) idx = idx + 1 return table class ListScenarios(argparse.Action): # pylint: disable=too-few-public-methods - def __call__(self, parser, *args, **kwargs): # pylint: disable=signature-differs + def __call__( + self, parser: Any, *args: Any, **kwargs: Any + ) -> None: # pylint: disable=signature-differs logger.info(_all_scenarios()) parser.exit() class ListProperties(argparse.Action): # pylint: disable=too-few-public-methods - def __call__(self, parser, *args, **kwargs): # pylint: disable=signature-differs + def __call__( + self, parser: Any, *args: Any, **kwargs: Any + ) -> None: # pylint: disable=signature-differs logger.info(_all_properties()) parser.exit() -def parse_args(): +def parse_args() -> argparse.Namespace: """ Parse the underlying arguments for the program. :return: Returns the arguments for the program. @@ -120,7 +125,7 @@ def parse_args(): return parser.parse_args() -def main(): +def main() -> None: args = parse_args() # Perform slither analysis on the given filename diff --git a/slither/tools/properties/platforms/truffle.py b/slither/tools/properties/platforms/truffle.py index dc83eb273..7d2f3d9b6 100644 --- a/slither/tools/properties/platforms/truffle.py +++ b/slither/tools/properties/platforms/truffle.py @@ -15,7 +15,7 @@ PATTERN_TRUFFLE_MIGRATION = re.compile("^[0-9]*_") logger = logging.getLogger("Slither") -def _extract_caller(p: PropertyCaller): +def _extract_caller(p: PropertyCaller) -> List[str]: if p == PropertyCaller.OWNER: return ["owner"] if p == PropertyCaller.SENDER: @@ -28,7 +28,7 @@ def _extract_caller(p: PropertyCaller): return ["user"] -def _helpers(): +def _helpers() -> str: """ Generate two functions: - catchRevertThrowReturnFalse: check if the call revert/throw or return false @@ -75,7 +75,7 @@ def generate_unit_test( # pylint: disable=too-many-arguments,too-many-branches output_dir: Path, addresses: Addresses, assert_message: str = "", -): +) -> Path: """ Generate unit tests files :param test_contract: @@ -134,7 +134,7 @@ def generate_unit_test( # pylint: disable=too-many-arguments,too-many-branches return output_dir -def generate_migration(test_contract: str, output_dir: Path, owner_address: str): +def generate_migration(test_contract: str, output_dir: Path, owner_address: str) -> None: """ Generate migration file :param test_contract: diff --git a/slither/tools/properties/utils.py b/slither/tools/properties/utils.py index bdc5bdd68..5a0153211 100644 --- a/slither/tools/properties/utils.py +++ b/slither/tools/properties/utils.py @@ -12,7 +12,7 @@ def write_file( content: str, allow_overwrite: bool = True, discard_if_exist: bool = False, -): +) -> None: """ Write the content into output_dir/filename :param output_dir: diff --git a/slither/tools/similarity/__main__.py b/slither/tools/similarity/__main__.py index 21ba88681..86673fccd 100755 --- a/slither/tools/similarity/__main__.py +++ b/slither/tools/similarity/__main__.py @@ -17,7 +17,7 @@ logger = logging.getLogger("Slither-simil") modes = ["info", "test", "train", "plot"] -def parse_args(): +def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( description="Code similarity detection tool. For usage, see https://github.com/crytic/slither/wiki/Code-Similarity-detector" ) @@ -78,7 +78,7 @@ def parse_args(): ################################################################################### -def main(): +def main() -> None: args = parse_args() default_log = logging.INFO diff --git a/slither/tools/similarity/encode.py b/slither/tools/similarity/encode.py index c69de91b8..9889644fb 100644 --- a/slither/tools/similarity/encode.py +++ b/slither/tools/similarity/encode.py @@ -74,7 +74,7 @@ def parse_target(target): return None -def load_and_encode(infile, vmodel, ext=None, nsamples=None, **kwargs): +def load_and_encode(infile: str, vmodel, ext=None, nsamples=None, **kwargs): r = {} if infile.endswith(".npz"): r = load_cache(infile, nsamples=nsamples) diff --git a/slither/tools/similarity/info.py b/slither/tools/similarity/info.py index 95aadea6a..c9f9753d1 100644 --- a/slither/tools/similarity/info.py +++ b/slither/tools/similarity/info.py @@ -1,3 +1,4 @@ +import argparse import logging import sys import os.path @@ -10,7 +11,7 @@ logging.basicConfig() logger = logging.getLogger("Slither-simil") -def info(args): +def info(args: argparse.Namespace) -> None: try: diff --git a/slither/tools/similarity/plot.py b/slither/tools/similarity/plot.py index bbdeec2cf..f11e92129 100644 --- a/slither/tools/similarity/plot.py +++ b/slither/tools/similarity/plot.py @@ -1,3 +1,4 @@ +import argparse import logging import random import sys @@ -23,7 +24,7 @@ except ImportError: logger = logging.getLogger("Slither-simil") -def plot(args): # pylint: disable=too-many-locals +def plot(args: argparse.Namespace) -> None: # pylint: disable=too-many-locals if decomposition is None or plt is None: logger.error( diff --git a/slither/tools/similarity/train.py b/slither/tools/similarity/train.py index a0d06c944..ccadf4926 100755 --- a/slither/tools/similarity/train.py +++ b/slither/tools/similarity/train.py @@ -1,3 +1,4 @@ +import argparse import logging import os import sys @@ -10,7 +11,7 @@ from slither.tools.similarity.model import train_unsupervised logger = logging.getLogger("Slither-simil") -def train(args): # pylint: disable=too-many-locals +def train(args: argparse.Namespace) -> None: # pylint: disable=too-many-locals try: last_data_train_filename = "last_data_train.txt" diff --git a/slither/tools/slither_format/__main__.py b/slither/tools/slither_format/__main__.py index a3d63d922..85c0a3917 100644 --- a/slither/tools/slither_format/__main__.py +++ b/slither/tools/slither_format/__main__.py @@ -23,7 +23,7 @@ available_detectors = [ ] -def parse_args(): +def parse_args() -> argparse.Namespace: """ Parse the underlying arguments for the program. :return: Returns the arguments for the program. @@ -90,7 +90,7 @@ def parse_args(): return parser.parse_args() -def main(): +def main() -> None: # ------------------------------ # Usage: python3 -m slither_format filename # Example: python3 -m slither_format contract.sol diff --git a/slither/tools/slither_format/slither_format.py b/slither/tools/slither_format/slither_format.py index 794307100..c165b3fbb 100644 --- a/slither/tools/slither_format/slither_format.py +++ b/slither/tools/slither_format/slither_format.py @@ -1,5 +1,9 @@ import logging from pathlib import Path +from typing import Type, List, Dict + +from slither import Slither +from slither.detectors.abstract_detector import AbstractDetector from slither.detectors.variables.unused_state_variables import UnusedStateVars from slither.detectors.attributes.incorrect_solc import IncorrectSolc from slither.detectors.attributes.constant_pragma import ConstantPragma @@ -13,7 +17,7 @@ from slither.utils.colors import yellow logging.basicConfig(level=logging.INFO) logger = logging.getLogger("Slither.Format") -all_detectors = { +all_detectors: Dict[str, Type[AbstractDetector]] = { "unused-state": UnusedStateVars, "solc-version": IncorrectSolc, "pragma": ConstantPragma, @@ -25,7 +29,7 @@ all_detectors = { } -def slither_format(slither, **kwargs): # pylint: disable=too-many-locals +def slither_format(slither: Slither, **kwargs: Dict) -> None: # pylint: disable=too-many-locals """' Keyword Args: detectors_to_run (str): Comma-separated list of detectors, defaults to all @@ -85,9 +89,11 @@ def slither_format(slither, **kwargs): # pylint: disable=too-many-locals ################################################################################### -def choose_detectors(detectors_to_run, detectors_to_exclude): +def choose_detectors( + detectors_to_run: str, detectors_to_exclude: str +) -> List[Type[AbstractDetector]]: # If detectors are specified, run only these ones - cls_detectors_to_run = [] + cls_detectors_to_run: List[Type[AbstractDetector]] = [] exclude = detectors_to_exclude.split(",") if detectors_to_run == "all": for key, detector in all_detectors.items(): @@ -114,7 +120,7 @@ def choose_detectors(detectors_to_run, detectors_to_exclude): ################################################################################### -def print_patches(number_of_slither_results, patches): +def print_patches(number_of_slither_results: int, patches: Dict) -> None: logger.info("Number of Slither results: " + str(number_of_slither_results)) number_of_patches = 0 for file in patches: @@ -130,7 +136,7 @@ def print_patches(number_of_slither_results, patches): logger.info("Location end: " + str(patch["end"])) -def print_patches_json(number_of_slither_results, patches): +def print_patches_json(number_of_slither_results: int, patches: Dict) -> None: print("{", end="") print('"Number of Slither results":' + '"' + str(number_of_slither_results) + '",') print('"Number of patchlets":' + '"' + str(len(patches)) + '"', ",") diff --git a/slither/tools/upgradeability/__main__.py b/slither/tools/upgradeability/__main__.py index 6cc953015..d772029d0 100644 --- a/slither/tools/upgradeability/__main__.py +++ b/slither/tools/upgradeability/__main__.py @@ -3,10 +3,13 @@ import inspect import json import logging import sys +from typing import List, Any, Type, Dict, Tuple, Union, Sequence, Optional from crytic_compile import cryticparser + from slither import Slither +from slither.core.declarations import Contract from slither.exceptions import SlitherException from slither.utils.colors import red from slither.utils.output import output_to_json @@ -24,7 +27,7 @@ logger: logging.Logger = logging.getLogger("Slither") logger.setLevel(logging.INFO) -def parse_args(): +def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( description="Slither Upgradeability Checks. For usage information see https://github.com/crytic/slither/wiki/Upgradeability-Checks.", usage="slither-check-upgradeability contract.sol ContractName", @@ -93,21 +96,27 @@ def parse_args(): ################################################################################### -def _get_checks(): - detectors = [getattr(all_checks, name) for name in dir(all_checks)] - detectors = [c for c in detectors if inspect.isclass(c) and issubclass(c, AbstractCheck)] +def _get_checks() -> List[Type[AbstractCheck]]: + detectors_ = [getattr(all_checks, name) for name in dir(all_checks)] + detectors: List[Type[AbstractCheck]] = [ + c for c in detectors_ if inspect.isclass(c) and issubclass(c, AbstractCheck) + ] return detectors class ListDetectors(argparse.Action): # pylint: disable=too-few-public-methods - def __call__(self, parser, *args, **kwargs): # pylint: disable=signature-differs + def __call__( + self, parser: Any, *args: Any, **kwargs: Any + ) -> None: # pylint: disable=signature-differs checks = _get_checks() output_detectors(checks) parser.exit() class ListDetectorsJson(argparse.Action): # pylint: disable=too-few-public-methods - def __call__(self, parser, *args, **kwargs): # pylint: disable=signature-differs + def __call__( + self, parser: Any, *args: Any, **kwargs: Any + ) -> None: # pylint: disable=signature-differs checks = _get_checks() detector_types_json = output_detectors_json(checks) print(json.dumps(detector_types_json)) @@ -116,48 +125,64 @@ class ListDetectorsJson(argparse.Action): # pylint: disable=too-few-public-meth class OutputMarkdown(argparse.Action): # pylint: disable=too-few-public-methods def __call__( - self, parser, args, values, option_string=None - ): # pylint: disable=signature-differs + self, + parser: Any, + args: Any, + values: Optional[Union[str, Sequence[Any]]], + option_string: Any = None, + ) -> None: # pylint: disable=signature-differs checks = _get_checks() + assert isinstance(values, str) output_to_markdown(checks, values) parser.exit() class OutputWiki(argparse.Action): # pylint: disable=too-few-public-methods def __call__( - self, parser, args, values, option_string=None - ): # pylint: disable=signature-differs + self, + parser: Any, + args: Any, + values: Optional[Union[str, Sequence[Any]]], + option_string: Any = None, + ) -> Any: # pylint: disable=signature-differs checks = _get_checks() + assert isinstance(values, str) output_wiki(checks, values) parser.exit() -def _run_checks(detectors): - results = [d.check() for d in detectors] - results = [r for r in results if r] - results = [item for sublist in results for item in sublist] # flatten +def _run_checks(detectors: List[AbstractCheck]) -> List[Dict]: + results_ = [d.check() for d in detectors] + results_ = [r for r in results_ if r] + results = [item for sublist in results_ for item in sublist] # flatten return results -def _checks_on_contract(detectors, contract): - detectors = [ +def _checks_on_contract( + detectors: List[Type[AbstractCheck]], contract: Contract +) -> Tuple[List[Dict], int]: + detectors_ = [ d(logger, contract) for d in detectors if (not d.REQUIRE_PROXY and not d.REQUIRE_CONTRACT_V2) ] - return _run_checks(detectors), len(detectors) + return _run_checks(detectors_), len(detectors) -def _checks_on_contract_update(detectors, contract_v1, contract_v2): - detectors = [ +def _checks_on_contract_update( + detectors: List[Type[AbstractCheck]], contract_v1: Contract, contract_v2: Contract +) -> Tuple[List[Dict], int]: + detectors_ = [ d(logger, contract_v1, contract_v2=contract_v2) for d in detectors if d.REQUIRE_CONTRACT_V2 ] - return _run_checks(detectors), len(detectors) + return _run_checks(detectors_), len(detectors) -def _checks_on_contract_and_proxy(detectors, contract, proxy): - detectors = [d(logger, contract, proxy=proxy) for d in detectors if d.REQUIRE_PROXY] - return _run_checks(detectors), len(detectors) +def _checks_on_contract_and_proxy( + detectors: List[Type[AbstractCheck]], contract: Contract, proxy: Contract +) -> Tuple[List[Dict], int]: + detectors_ = [d(logger, contract, proxy=proxy) for d in detectors if d.REQUIRE_PROXY] + return _run_checks(detectors_), len(detectors) # endregion @@ -168,8 +193,8 @@ def _checks_on_contract_and_proxy(detectors, contract, proxy): ################################################################################### # pylint: disable=too-many-statements,too-many-branches,too-many-locals -def main(): - json_results = { +def main() -> None: + json_results: Dict = { "proxy-present": False, "contract_v2-present": False, "detectors": [], diff --git a/slither/tools/upgradeability/utils/command_line.py b/slither/tools/upgradeability/utils/command_line.py index 6ab3f82f9..88b61ceed 100644 --- a/slither/tools/upgradeability/utils/command_line.py +++ b/slither/tools/upgradeability/utils/command_line.py @@ -1,8 +1,10 @@ -from slither.tools.upgradeability.checks.abstract_checks import classification_txt +from typing import List, Union, Dict, Type + +from slither.tools.upgradeability.checks.abstract_checks import classification_txt, AbstractCheck from slither.utils.myprettytable import MyPrettyTable -def output_wiki(detector_classes, filter_wiki): +def output_wiki(detector_classes: List[Type[AbstractCheck]], filter_wiki: str) -> None: # Sort by impact, confidence, and name detectors_list = sorted( detector_classes, key=lambda element: (element.IMPACT, element.ARGUMENT) @@ -31,7 +33,7 @@ def output_wiki(detector_classes, filter_wiki): print(recommendation) -def output_detectors(detector_classes): +def output_detectors(detector_classes: List[Type[AbstractCheck]]) -> None: detectors_list = [] for detector in detector_classes: argument = detector.ARGUMENT @@ -48,7 +50,7 @@ def output_detectors(detector_classes): for (argument, help_info, impact, proxy, v2) in detectors_list: table.add_row( [ - idx, + str(idx), argument, help_info, classification_txt[impact], @@ -60,8 +62,8 @@ def output_detectors(detector_classes): print(table) -def output_to_markdown(detector_classes, _filter_wiki): - def extract_help(cls): +def output_to_markdown(detector_classes: List[Type[AbstractCheck]], _filter_wiki: str) -> None: + def extract_help(cls: AbstractCheck) -> str: if cls.WIKI == "": return cls.HELP return f"[{cls.HELP}]({cls.WIKI})" @@ -85,7 +87,9 @@ def output_to_markdown(detector_classes, _filter_wiki): idx = idx + 1 -def output_detectors_json(detector_classes): +def output_detectors_json( + detector_classes: List[Type[AbstractCheck]], +) -> List[Dict[str, Union[str, int]]]: detectors_list = [] for detector in detector_classes: argument = detector.ARGUMENT @@ -110,7 +114,7 @@ def output_detectors_json(detector_classes): # Sort by impact, confidence, and name detectors_list = sorted(detectors_list, key=lambda element: (element[2], element[0])) idx = 1 - table = [] + table: List[Dict[str, Union[str, int]]] = [] for ( argument, help_info, diff --git a/slither/utils/command_line.py b/slither/utils/command_line.py index d264e65ea..c2fef5eca 100644 --- a/slither/utils/command_line.py +++ b/slither/utils/command_line.py @@ -1,13 +1,17 @@ +import argparse import json import os import re import logging from collections import defaultdict +from typing import Dict, List, Type, Union + from crytic_compile.cryticparser.defaults import ( DEFAULTS_FLAG_IN_CONFIG as DEFAULTS_FLAG_IN_CONFIG_CRYTIC_COMPILE, ) -from slither.detectors.abstract_detector import classification_txt +from slither.detectors.abstract_detector import classification_txt, AbstractDetector +from slither.printers.abstract_printer import AbstractPrinter from slither.utils.colors import yellow, red from slither.utils.myprettytable import MyPrettyTable @@ -54,7 +58,7 @@ defaults_flag_in_config = { } -def read_config_file(args): +def read_config_file(args: argparse.Namespace) -> None: # No config file was provided as an argument if args.config_file is None: # Check wether the default config file is present @@ -83,8 +87,12 @@ def read_config_file(args): logger.error(yellow("Falling back to the default settings...")) -def output_to_markdown(detector_classes, printer_classes, filter_wiki): - def extract_help(cls): +def output_to_markdown( + detector_classes: List[Type[AbstractDetector]], + printer_classes: List[Type[AbstractPrinter]], + filter_wiki: str, +) -> None: + def extract_help(cls: Union[Type[AbstractDetector], Type[AbstractPrinter]]) -> str: if cls.WIKI == "": return cls.HELP return f"[{cls.HELP}]({cls.WIKI})" @@ -127,7 +135,7 @@ def output_to_markdown(detector_classes, printer_classes, filter_wiki): idx = idx + 1 -def get_level(l): +def get_level(l: str) -> int: tab = l.count("\t") + 1 if l.replace("\t", "").startswith(" -"): tab = tab + 1 @@ -136,7 +144,7 @@ def get_level(l): return tab -def convert_result_to_markdown(txt): +def convert_result_to_markdown(txt: str) -> str: # -1 to remove the last \n lines = txt[0:-1].split("\n") ret = [] @@ -154,16 +162,21 @@ def convert_result_to_markdown(txt): return "".join(ret) -def output_results_to_markdown(all_results, checklistlimit: str): +def output_results_to_markdown(all_results: List[Dict], checklistlimit: str) -> None: checks = defaultdict(list) - info = defaultdict(dict) - for results in all_results: - checks[results["check"]].append(results) - info[results["check"]] = {"impact": results["impact"], "confidence": results["confidence"]} + info: Dict = defaultdict(dict) + for results_ in all_results: + checks[results_["check"]].append(results_) + info[results_["check"]] = { + "impact": results_["impact"], + "confidence": results_["confidence"], + } print("Summary") - for check in checks: - print(f" - [{check}](#{check}) ({len(checks[check])} results) ({info[check]['impact']})") + for check_ in checks: + print( + f" - [{check_}](#{check_}) ({len(checks[check_])} results) ({info[check_]['impact']})" + ) counter = 0 for (check, results) in checks.items(): @@ -185,8 +198,7 @@ def output_results_to_markdown(all_results, checklistlimit: str): print(f"**More results were found, check [{checklistlimit}]({checklistlimit})**") -def output_wiki(detector_classes, filter_wiki): - detectors_list = [] +def output_wiki(detector_classes: List[Type[AbstractDetector]], filter_wiki: str) -> None: # Sort by impact, confidence, and name detectors_list = sorted( @@ -223,7 +235,7 @@ def output_wiki(detector_classes, filter_wiki): print(recommendation) -def output_detectors(detector_classes): +def output_detectors(detector_classes: List[Type[AbstractDetector]]) -> None: detectors_list = [] for detector in detector_classes: argument = detector.ARGUMENT @@ -242,12 +254,15 @@ def output_detectors(detector_classes): ) idx = 1 for (argument, help_info, impact, confidence) in detectors_list: - table.add_row([idx, argument, help_info, classification_txt[impact], confidence]) + table.add_row([str(idx), argument, help_info, classification_txt[impact], confidence]) idx = idx + 1 print(table) -def output_detectors_json(detector_classes): # pylint: disable=too-many-locals +# pylint: disable=too-many-locals +def output_detectors_json( + detector_classes: List[Type[AbstractDetector]], +) -> List[Dict]: detectors_list = [] for detector in detector_classes: argument = detector.ARGUMENT @@ -307,7 +322,7 @@ def output_detectors_json(detector_classes): # pylint: disable=too-many-locals return table -def output_printers(printer_classes): +def output_printers(printer_classes: List[Type[AbstractPrinter]]) -> None: printers_list = [] for printer in printer_classes: argument = printer.ARGUMENT @@ -319,12 +334,12 @@ def output_printers(printer_classes): printers_list = sorted(printers_list, key=lambda element: (element[0])) idx = 1 for (argument, help_info) in printers_list: - table.add_row([idx, argument, help_info]) + table.add_row([str(idx), argument, help_info]) idx = idx + 1 print(table) -def output_printers_json(printer_classes): +def output_printers_json(printer_classes: List[Type[AbstractPrinter]]) -> List[Dict]: printers_list = [] for printer in printer_classes: argument = printer.ARGUMENT diff --git a/slither/utils/output.py b/slither/utils/output.py index 6296e35d3..5db6492db 100644 --- a/slither/utils/output.py +++ b/slither/utils/output.py @@ -4,7 +4,7 @@ import json import logging import zipfile from collections import OrderedDict -from typing import Optional, Dict, List, Union, Any, TYPE_CHECKING +from typing import Optional, Dict, List, Union, Any, TYPE_CHECKING, Type from zipfile import ZipFile from pkg_resources import require @@ -129,7 +129,7 @@ def _output_result_to_sarif( def output_to_sarif( - filename: Optional[str], results: Dict, detectors_classes: List["AbstractDetector"] + filename: Optional[str], results: Dict, detectors_classes: List[Type["AbstractDetector"]] ) -> None: """ diff --git a/slither/utils/output_capture.py b/slither/utils/output_capture.py index 5282afb91..aec170d7f 100644 --- a/slither/utils/output_capture.py +++ b/slither/utils/output_capture.py @@ -28,7 +28,7 @@ class StandardOutputCapture: original_logger_handlers = None @staticmethod - def enable(block_original=True): + def enable(block_original: bool = True) -> None: """ Redirects stdout and stderr to a capturable StringIO. :param block_original: If True, blocks all output to the original stream. If False, duplicates output. @@ -54,7 +54,7 @@ class StandardOutputCapture: root_logger.handlers = [logging.StreamHandler(sys.stderr)] @staticmethod - def disable(): + def disable() -> None: """ Disables redirection of stdout/stderr, if previously enabled. :return: None @@ -78,7 +78,7 @@ class StandardOutputCapture: StandardOutputCapture.original_logger_handlers = None @staticmethod - def get_stdout_output(): + def get_stdout_output() -> str: """ Obtains the output from the currently set stdout :return: Returns stdout output as a string @@ -87,7 +87,7 @@ class StandardOutputCapture: return sys.stdout.read() @staticmethod - def get_stderr_output(): + def get_stderr_output() -> str: """ Obtains the output from the currently set stderr :return: Returns stderr output as a string From 0e264b3b84b90d08b03c44183331d0cf2bc8503f Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 2 Sep 2022 20:34:42 -0500 Subject: [PATCH 25/87] consider state variable collisions and incorrect return type --- slither/core/variables/state_variable.py | 44 ++- .../permit_domain_signature_collision.py | 27 +- ...n.sol.0.4.25.DomainSeparatorCollision.json | 6 +- .../permit_domain_state_var_collision.sol | 205 ++++++++++++++ ...n.sol.0.4.25.DomainSeparatorCollision.json | 247 +++++++++++++++++ .../permit_domain_wrong_return_type.sol | 207 ++++++++++++++ ...e.sol.0.4.25.DomainSeparatorCollision.json | 252 ++++++++++++++++++ ...n.sol.0.5.16.DomainSeparatorCollision.json | 6 +- .../permit_domain_state_var_collision.sol | 205 ++++++++++++++ ...n.sol.0.5.16.DomainSeparatorCollision.json | 247 +++++++++++++++++ .../permit_domain_wrong_return_type.sol | 207 ++++++++++++++ ...e.sol.0.5.16.DomainSeparatorCollision.json | 252 ++++++++++++++++++ ...n.sol.0.6.11.DomainSeparatorCollision.json | 6 +- .../permit_domain_state_var_collision.sol | 205 ++++++++++++++ ...n.sol.0.6.11.DomainSeparatorCollision.json | 247 +++++++++++++++++ .../permit_domain_wrong_return_type.sol | 207 ++++++++++++++ ...e.sol.0.6.11.DomainSeparatorCollision.json | 252 ++++++++++++++++++ ...on.sol.0.7.6.DomainSeparatorCollision.json | 6 +- .../permit_domain_state_var_collision.sol | 205 ++++++++++++++ ...on.sol.0.7.6.DomainSeparatorCollision.json | 247 +++++++++++++++++ .../0.7.6/permit_domain_wrong_return_type.sol | 207 ++++++++++++++ ...pe.sol.0.7.6.DomainSeparatorCollision.json | 252 ++++++++++++++++++ ...on.sol.0.8.0.DomainSeparatorCollision.json | 6 +- .../permit_domain_state_var_collision.sol | 205 ++++++++++++++ ...on.sol.0.8.0.DomainSeparatorCollision.json | 247 +++++++++++++++++ .../0.8.0/permit_domain_wrong_return_type.sol | 207 ++++++++++++++ ...pe.sol.0.8.0.DomainSeparatorCollision.json | 252 ++++++++++++++++++ tests/test_detectors.py | 50 ++++ tests/test_function.py | 18 +- tests/test_function.sol | 1 + 30 files changed, 4696 insertions(+), 29 deletions(-) create mode 100644 tests/detectors/domain-separator-collision/0.4.25/permit_domain_state_var_collision.sol create mode 100644 tests/detectors/domain-separator-collision/0.4.25/permit_domain_state_var_collision.sol.0.4.25.DomainSeparatorCollision.json create mode 100644 tests/detectors/domain-separator-collision/0.4.25/permit_domain_wrong_return_type.sol create mode 100644 tests/detectors/domain-separator-collision/0.4.25/permit_domain_wrong_return_type.sol.0.4.25.DomainSeparatorCollision.json create mode 100644 tests/detectors/domain-separator-collision/0.5.16/permit_domain_state_var_collision.sol create mode 100644 tests/detectors/domain-separator-collision/0.5.16/permit_domain_state_var_collision.sol.0.5.16.DomainSeparatorCollision.json create mode 100644 tests/detectors/domain-separator-collision/0.5.16/permit_domain_wrong_return_type.sol create mode 100644 tests/detectors/domain-separator-collision/0.5.16/permit_domain_wrong_return_type.sol.0.5.16.DomainSeparatorCollision.json create mode 100644 tests/detectors/domain-separator-collision/0.6.11/permit_domain_state_var_collision.sol create mode 100644 tests/detectors/domain-separator-collision/0.6.11/permit_domain_state_var_collision.sol.0.6.11.DomainSeparatorCollision.json create mode 100644 tests/detectors/domain-separator-collision/0.6.11/permit_domain_wrong_return_type.sol create mode 100644 tests/detectors/domain-separator-collision/0.6.11/permit_domain_wrong_return_type.sol.0.6.11.DomainSeparatorCollision.json create mode 100644 tests/detectors/domain-separator-collision/0.7.6/permit_domain_state_var_collision.sol create mode 100644 tests/detectors/domain-separator-collision/0.7.6/permit_domain_state_var_collision.sol.0.7.6.DomainSeparatorCollision.json create mode 100644 tests/detectors/domain-separator-collision/0.7.6/permit_domain_wrong_return_type.sol create mode 100644 tests/detectors/domain-separator-collision/0.7.6/permit_domain_wrong_return_type.sol.0.7.6.DomainSeparatorCollision.json create mode 100644 tests/detectors/domain-separator-collision/0.8.0/permit_domain_state_var_collision.sol create mode 100644 tests/detectors/domain-separator-collision/0.8.0/permit_domain_state_var_collision.sol.0.8.0.DomainSeparatorCollision.json create mode 100644 tests/detectors/domain-separator-collision/0.8.0/permit_domain_wrong_return_type.sol create mode 100644 tests/detectors/domain-separator-collision/0.8.0/permit_domain_wrong_return_type.sol.0.8.0.DomainSeparatorCollision.json diff --git a/slither/core/variables/state_variable.py b/slither/core/variables/state_variable.py index c9a90f36b..5fd600be0 100644 --- a/slither/core/variables/state_variable.py +++ b/slither/core/variables/state_variable.py @@ -1,7 +1,9 @@ -from typing import Optional, TYPE_CHECKING +from typing import Optional, TYPE_CHECKING, Tuple, List from slither.core.children.child_contract import ChildContract from slither.core.variables.variable import Variable +from slither.utils.type import export_nested_types_from_variable +from slither.core.solidity_types.type import Type if TYPE_CHECKING: from slither.core.cfg.node import Node @@ -21,6 +23,46 @@ class StateVariable(ChildContract, Variable): """ return self.contract == contract + ################################################################################### + ################################################################################### + # region Signature and return type of state variable getters + ################################################################################### + ################################################################################### + + @property + def signature(self) -> Tuple[str, List[str], List[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) + ")" + + @property + def solidity_signature(self) -> Optional[str]: + if self.visibility in ["public", "external"]: + name, parameters, _ = self.signature + return f"{name}({','.join(parameters)})" + return None + + @property + def return_type(self) -> Optional[List[Type]]: + if self.visibility in ["public", "external"]: + return [self.type] + return None + # endregion ################################################################################### ################################################################################### diff --git a/slither/detectors/functions/permit_domain_signature_collision.py b/slither/detectors/functions/permit_domain_signature_collision.py index 9e2301a45..3a4fdd2f9 100644 --- a/slither/detectors/functions/permit_domain_signature_collision.py +++ b/slither/detectors/functions/permit_domain_signature_collision.py @@ -3,6 +3,7 @@ Module detecting EIP-2612 domain separator collision """ from slither.utils.function import get_function_id from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification +from slither.core.solidity_types.elementary_type import ElementaryType class DomainSeparatorCollision(AbstractDetector): @@ -35,21 +36,29 @@ contract Contract{ WIKI_RECOMMENDATION = "Remove or rename the function that collides with DOMAIN_SEPARATOR()." def _detect(self): - results = [] domain_sig = get_function_id("DOMAIN_SEPARATOR()") for contract in self.compilation_unit.contracts_derived: if contract.is_erc20(): - for func in contract.functions: - if ( + for func in contract.functions_entry_points + contract.state_variables: + # Skip internal and private variables + if func.solidity_signature is None: + continue + # External/ public function names should not collide with DOMAIN_SEPARATOR() + hash_collision = ( func.solidity_signature != "DOMAIN_SEPARATOR()" and get_function_id(func.solidity_signature) == domain_sig - ): + ) + # DOMAIN_SEPARATOR() should return bytes32 + incorrect_return_type = ( + func.solidity_signature == "DOMAIN_SEPARATOR()" + and func.return_type[0] != ElementaryType("bytes32") + ) + if hash_collision or incorrect_return_type: info = [ + "The function signature of ", func, - "'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + " collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", ] res = self.generate_result(info) - results.append(res) - break - - return results + return [res] + return [] diff --git a/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol.0.4.25.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol.0.4.25.DomainSeparatorCollision.json index ef58ab72b..7b89af4a8 100644 --- a/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol.0.4.25.DomainSeparatorCollision.json +++ b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol.0.4.25.DomainSeparatorCollision.json @@ -240,10 +240,10 @@ } } ], - "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol#161-163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", - "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol#L161-L163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "description": "The function signature of ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol#161-163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "The function signature of [ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol#L161-L163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", "first_markdown_element": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_collision.sol#L161-L163", - "id": "89af79b93e8de48fb8f88ab4dabbc97b0bb35ab39b6544e255b16aa924286eab", + "id": "cb8ae27add92ad3163cbe9c0fb29a2a0032ba46384bbd5541d1d750251f5c83e", "check": "domain-separator-collision", "impact": "Medium", "confidence": "High" diff --git a/tests/detectors/domain-separator-collision/0.4.25/permit_domain_state_var_collision.sol b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_state_var_collision.sol new file mode 100644 index 000000000..0faf421a6 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_state_var_collision.sol @@ -0,0 +1,205 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) +/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) +/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. +contract ERC20 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event Transfer(address indexed from, address indexed to, uint256 amount); + + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /*////////////////////////////////////////////////////////////// + METADATA STORAGE + //////////////////////////////////////////////////////////////*/ + + string public name; + + string public symbol; + + uint8 public decimals; + + /*////////////////////////////////////////////////////////////// + ERC20 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 public totalSupply; + + mapping(address => uint256) public balanceOf; + + mapping(address => mapping(address => uint256)) public allowance; + + /*////////////////////////////////////////////////////////////// + EIP-2612 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal INITIAL_CHAIN_ID; + + bytes32 internal INITIAL_DOMAIN_SEPARATOR; + + mapping(address => uint256) public nonces; + + bytes32 public fopwCDKKK; + + /*////////////////////////////////////////////////////////////// + CONSTRUCTOR + //////////////////////////////////////////////////////////////*/ + + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals + ) { + name = _name; + symbol = _symbol; + decimals = _decimals; + + INITIAL_CHAIN_ID = 1; + INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + } + + /*////////////////////////////////////////////////////////////// + ERC20 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 amount) public returns (bool) { + allowance[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + + return true; + } + + function transfer(address to, uint256 amount) public returns (bool) { + balanceOf[msg.sender] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(msg.sender, to, amount); + + return true; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public returns (bool) { + uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + + if (allowed != 115792089237316195423570985008687907853269984665640564039457584007913129639935) allowance[from][msg.sender] = allowed - amount; + + balanceOf[from] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(from, to, amount); + + return true; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 LOGIC + //////////////////////////////////////////////////////////////*/ + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public { + require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + + // Unchecked because the only math done is incrementing + // the owner's nonce which cannot realistically overflow. + + address recoveredAddress = ecrecover( + keccak256( + abi.encodePacked( + "\x19\x01", + fopwCDKKK, + keccak256( + abi.encode( + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ), + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ) + ) + ), + v, + r, + s + ); + + require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + + allowance[recoveredAddress][spender] = value; + + + emit Approval(owner, spender, value); + } + + function computeDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256("1"), + 1, + address(this) + ) + ); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 amount) internal { + totalSupply += amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal { + balanceOf[from] -= amount; + + // Cannot underflow because a user's balance + // will never be larger than the total supply. + + totalSupply -= amount; + + + emit Transfer(from, address(0), amount); + } +} + +contract Test is ERC20("TEST", "TEST", 18) {} diff --git a/tests/detectors/domain-separator-collision/0.4.25/permit_domain_state_var_collision.sol.0.4.25.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_state_var_collision.sol.0.4.25.DomainSeparatorCollision.json new file mode 100644 index 000000000..5d4c00817 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_state_var_collision.sol.0.4.25.DomainSeparatorCollision.json @@ -0,0 +1,247 @@ +[ + [ + { + "elements": [ + { + "type": "variable", + "name": "fopwCDKKK", + "source_mapping": { + "start": 1735, + "length": 24, + "filename_relative": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_state_var_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_state_var_collision.sol", + "is_dependency": false, + "lines": [ + 46 + ], + "starting_column": 5, + "ending_column": 29 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20", + "source_mapping": { + "start": 449, + "length": 6054, + "filename_relative": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_state_var_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_state_var_collision.sol", + "is_dependency": false, + "lines": [ + 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, + 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, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + } + ], + "description": "The function signature of ERC20.fopwCDKKK (tests/detectors/domain-separator-collision/0.4.25/permit_domain_state_var_collision.sol#46) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "The function signature of [ERC20.fopwCDKKK](tests/detectors/domain-separator-collision/0.4.25/permit_domain_state_var_collision.sol#L46) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_state_var_collision.sol#L46", + "id": "8d18da367a9cfe0bee2ee48ee8a76072af23567d852cc81ed75dd90531cbe3d5", + "check": "domain-separator-collision", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/domain-separator-collision/0.4.25/permit_domain_wrong_return_type.sol b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_wrong_return_type.sol new file mode 100644 index 000000000..5d3401871 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_wrong_return_type.sol @@ -0,0 +1,207 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) +/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) +/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. +contract ERC20 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event Transfer(address indexed from, address indexed to, uint256 amount); + + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /*////////////////////////////////////////////////////////////// + METADATA STORAGE + //////////////////////////////////////////////////////////////*/ + + string public name; + + string public symbol; + + uint8 public decimals; + + /*////////////////////////////////////////////////////////////// + ERC20 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 public totalSupply; + + mapping(address => uint256) public balanceOf; + + mapping(address => mapping(address => uint256)) public allowance; + + /*////////////////////////////////////////////////////////////// + EIP-2612 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal INITIAL_CHAIN_ID; + + bytes32 internal INITIAL_DOMAIN_SEPARATOR; + + mapping(address => uint256) public nonces; + + /*////////////////////////////////////////////////////////////// + CONSTRUCTOR + //////////////////////////////////////////////////////////////*/ + + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals + ) { + name = _name; + symbol = _symbol; + decimals = _decimals; + + INITIAL_CHAIN_ID = 1; + INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + } + + /*////////////////////////////////////////////////////////////// + ERC20 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 amount) public returns (bool) { + allowance[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + + return true; + } + + function transfer(address to, uint256 amount) public returns (bool) { + balanceOf[msg.sender] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(msg.sender, to, amount); + + return true; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public returns (bool) { + uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + + if (allowed != 115792089237316195423570985008687907853269984665640564039457584007913129639935) allowance[from][msg.sender] = allowed - amount; + + balanceOf[from] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(from, to, amount); + + return true; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 LOGIC + //////////////////////////////////////////////////////////////*/ + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public { + require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + + // Unchecked because the only math done is incrementing + // the owner's nonce which cannot realistically overflow. + + address recoveredAddress = ecrecover( + keccak256( + abi.encodePacked( + "\x19\x01", + DOMAIN_SEPARATOR(), + keccak256( + abi.encode( + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ), + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ) + ) + ), + v, + r, + s + ); + + require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + + allowance[recoveredAddress][spender] = value; + + + emit Approval(owner, spender, value); + } + + function DOMAIN_SEPARATOR() public view returns (uint64) { + return uint64(1); + } + + function computeDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256("1"), + 1, + address(this) + ) + ); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 amount) internal { + totalSupply += amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal { + balanceOf[from] -= amount; + + // Cannot underflow because a user's balance + // will never be larger than the total supply. + + totalSupply -= amount; + + + emit Transfer(from, address(0), amount); + } +} + +contract Test is ERC20("TEST", "TEST", 18) {} diff --git a/tests/detectors/domain-separator-collision/0.4.25/permit_domain_wrong_return_type.sol.0.4.25.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_wrong_return_type.sol.0.4.25.DomainSeparatorCollision.json new file mode 100644 index 000000000..f5a460429 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.4.25/permit_domain_wrong_return_type.sol.0.4.25.DomainSeparatorCollision.json @@ -0,0 +1,252 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "DOMAIN_SEPARATOR", + "source_mapping": { + "start": 5248, + "length": 90, + "filename_relative": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_wrong_return_type.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_wrong_return_type.sol", + "is_dependency": false, + "lines": [ + 161, + 162, + 163 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20", + "source_mapping": { + "start": 449, + "length": 6128, + "filename_relative": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_wrong_return_type.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_wrong_return_type.sol", + "is_dependency": false, + "lines": [ + 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, + 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, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "DOMAIN_SEPARATOR()" + } + } + ], + "description": "The function signature of ERC20.DOMAIN_SEPARATOR() (tests/detectors/domain-separator-collision/0.4.25/permit_domain_wrong_return_type.sol#161-163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "The function signature of [ERC20.DOMAIN_SEPARATOR()](tests/detectors/domain-separator-collision/0.4.25/permit_domain_wrong_return_type.sol#L161-L163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.4.25/permit_domain_wrong_return_type.sol#L161-L163", + "id": "17ee24b60ef7d108871021639c374d6711feb1c8e3aad52ab266a680c03831cb", + "check": "domain-separator-collision", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol.0.5.16.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol.0.5.16.DomainSeparatorCollision.json index d94ef48b9..23f93fd7e 100644 --- a/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol.0.5.16.DomainSeparatorCollision.json +++ b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol.0.5.16.DomainSeparatorCollision.json @@ -240,10 +240,10 @@ } } ], - "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol#161-163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", - "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol#L161-L163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "description": "The function signature of ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol#161-163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "The function signature of [ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol#L161-L163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", "first_markdown_element": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_collision.sol#L161-L163", - "id": "89af79b93e8de48fb8f88ab4dabbc97b0bb35ab39b6544e255b16aa924286eab", + "id": "cb8ae27add92ad3163cbe9c0fb29a2a0032ba46384bbd5541d1d750251f5c83e", "check": "domain-separator-collision", "impact": "Medium", "confidence": "High" diff --git a/tests/detectors/domain-separator-collision/0.5.16/permit_domain_state_var_collision.sol b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_state_var_collision.sol new file mode 100644 index 000000000..2c63161f4 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_state_var_collision.sol @@ -0,0 +1,205 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) +/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) +/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. +contract ERC20 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event Transfer(address indexed from, address indexed to, uint256 amount); + + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /*////////////////////////////////////////////////////////////// + METADATA STORAGE + //////////////////////////////////////////////////////////////*/ + + string public name; + + string public symbol; + + uint8 public decimals; + + /*////////////////////////////////////////////////////////////// + ERC20 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 public totalSupply; + + mapping(address => uint256) public balanceOf; + + mapping(address => mapping(address => uint256)) public allowance; + + /*////////////////////////////////////////////////////////////// + EIP-2612 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal INITIAL_CHAIN_ID; + + bytes32 internal INITIAL_DOMAIN_SEPARATOR; + + mapping(address => uint256) public nonces; + + bytes32 public fopwCDKKK; + + /*////////////////////////////////////////////////////////////// + CONSTRUCTOR + //////////////////////////////////////////////////////////////*/ + + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals + ) public { + name = _name; + symbol = _symbol; + decimals = _decimals; + + INITIAL_CHAIN_ID = 1; + INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + } + + /*////////////////////////////////////////////////////////////// + ERC20 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 amount) public returns (bool) { + allowance[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + + return true; + } + + function transfer(address to, uint256 amount) public returns (bool) { + balanceOf[msg.sender] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(msg.sender, to, amount); + + return true; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public returns (bool) { + uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + + if (allowed != 115792089237316195423570985008687907853269984665640564039457584007913129639935) allowance[from][msg.sender] = allowed - amount; + + balanceOf[from] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(from, to, amount); + + return true; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 LOGIC + //////////////////////////////////////////////////////////////*/ + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public { + require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + + // Unchecked because the only math done is incrementing + // the owner's nonce which cannot realistically overflow. + + address recoveredAddress = ecrecover( + keccak256( + abi.encodePacked( + "\x19\x01", + fopwCDKKK, + keccak256( + abi.encode( + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ), + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ) + ) + ), + v, + r, + s + ); + + require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + + allowance[recoveredAddress][spender] = value; + + + emit Approval(owner, spender, value); + } + + function computeDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256("1"), + 1, + address(this) + ) + ); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 amount) internal { + totalSupply += amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal { + balanceOf[from] -= amount; + + // Cannot underflow because a user's balance + // will never be larger than the total supply. + + totalSupply -= amount; + + + emit Transfer(from, address(0), amount); + } +} + +contract Test is ERC20("TEST", "TEST", 18) {} diff --git a/tests/detectors/domain-separator-collision/0.5.16/permit_domain_state_var_collision.sol.0.5.16.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_state_var_collision.sol.0.5.16.DomainSeparatorCollision.json new file mode 100644 index 000000000..5cc2627ae --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_state_var_collision.sol.0.5.16.DomainSeparatorCollision.json @@ -0,0 +1,247 @@ +[ + [ + { + "elements": [ + { + "type": "variable", + "name": "fopwCDKKK", + "source_mapping": { + "start": 1735, + "length": 24, + "filename_relative": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_state_var_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_state_var_collision.sol", + "is_dependency": false, + "lines": [ + 46 + ], + "starting_column": 5, + "ending_column": 29 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20", + "source_mapping": { + "start": 449, + "length": 6061, + "filename_relative": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_state_var_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_state_var_collision.sol", + "is_dependency": false, + "lines": [ + 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, + 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, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + } + ], + "description": "The function signature of ERC20.fopwCDKKK (tests/detectors/domain-separator-collision/0.5.16/permit_domain_state_var_collision.sol#46) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "The function signature of [ERC20.fopwCDKKK](tests/detectors/domain-separator-collision/0.5.16/permit_domain_state_var_collision.sol#L46) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_state_var_collision.sol#L46", + "id": "8d18da367a9cfe0bee2ee48ee8a76072af23567d852cc81ed75dd90531cbe3d5", + "check": "domain-separator-collision", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/domain-separator-collision/0.5.16/permit_domain_wrong_return_type.sol b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_wrong_return_type.sol new file mode 100644 index 000000000..c3f31e5f8 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_wrong_return_type.sol @@ -0,0 +1,207 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) +/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) +/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. +contract ERC20 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event Transfer(address indexed from, address indexed to, uint256 amount); + + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /*////////////////////////////////////////////////////////////// + METADATA STORAGE + //////////////////////////////////////////////////////////////*/ + + string public name; + + string public symbol; + + uint8 public decimals; + + /*////////////////////////////////////////////////////////////// + ERC20 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 public totalSupply; + + mapping(address => uint256) public balanceOf; + + mapping(address => mapping(address => uint256)) public allowance; + + /*////////////////////////////////////////////////////////////// + EIP-2612 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal INITIAL_CHAIN_ID; + + bytes32 internal INITIAL_DOMAIN_SEPARATOR; + + mapping(address => uint256) public nonces; + + /*////////////////////////////////////////////////////////////// + CONSTRUCTOR + //////////////////////////////////////////////////////////////*/ + + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals + ) public { + name = _name; + symbol = _symbol; + decimals = _decimals; + + INITIAL_CHAIN_ID = 1; + INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + } + + /*////////////////////////////////////////////////////////////// + ERC20 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 amount) public returns (bool) { + allowance[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + + return true; + } + + function transfer(address to, uint256 amount) public returns (bool) { + balanceOf[msg.sender] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(msg.sender, to, amount); + + return true; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public returns (bool) { + uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + + if (allowed != 115792089237316195423570985008687907853269984665640564039457584007913129639935) allowance[from][msg.sender] = allowed - amount; + + balanceOf[from] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(from, to, amount); + + return true; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 LOGIC + //////////////////////////////////////////////////////////////*/ + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public { + require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + + // Unchecked because the only math done is incrementing + // the owner's nonce which cannot realistically overflow. + + address recoveredAddress = ecrecover( + keccak256( + abi.encodePacked( + "\x19\x01", + DOMAIN_SEPARATOR(), + keccak256( + abi.encode( + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ), + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ) + ) + ), + v, + r, + s + ); + + require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + + allowance[recoveredAddress][spender] = value; + + + emit Approval(owner, spender, value); + } + + function DOMAIN_SEPARATOR() public view returns (uint64) { + return uint64(1); + } + + function computeDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256("1"), + 1, + address(this) + ) + ); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 amount) internal { + totalSupply += amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal { + balanceOf[from] -= amount; + + // Cannot underflow because a user's balance + // will never be larger than the total supply. + + totalSupply -= amount; + + + emit Transfer(from, address(0), amount); + } +} + +contract Test is ERC20("TEST", "TEST", 18) {} diff --git a/tests/detectors/domain-separator-collision/0.5.16/permit_domain_wrong_return_type.sol.0.5.16.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_wrong_return_type.sol.0.5.16.DomainSeparatorCollision.json new file mode 100644 index 000000000..20ab9665d --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.5.16/permit_domain_wrong_return_type.sol.0.5.16.DomainSeparatorCollision.json @@ -0,0 +1,252 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "DOMAIN_SEPARATOR", + "source_mapping": { + "start": 5255, + "length": 90, + "filename_relative": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_wrong_return_type.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_wrong_return_type.sol", + "is_dependency": false, + "lines": [ + 161, + 162, + 163 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20", + "source_mapping": { + "start": 449, + "length": 6135, + "filename_relative": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_wrong_return_type.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_wrong_return_type.sol", + "is_dependency": false, + "lines": [ + 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, + 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, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "DOMAIN_SEPARATOR()" + } + } + ], + "description": "The function signature of ERC20.DOMAIN_SEPARATOR() (tests/detectors/domain-separator-collision/0.5.16/permit_domain_wrong_return_type.sol#161-163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "The function signature of [ERC20.DOMAIN_SEPARATOR()](tests/detectors/domain-separator-collision/0.5.16/permit_domain_wrong_return_type.sol#L161-L163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.5.16/permit_domain_wrong_return_type.sol#L161-L163", + "id": "17ee24b60ef7d108871021639c374d6711feb1c8e3aad52ab266a680c03831cb", + "check": "domain-separator-collision", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol.0.6.11.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol.0.6.11.DomainSeparatorCollision.json index 5039fdc19..8bbb29bb9 100644 --- a/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol.0.6.11.DomainSeparatorCollision.json +++ b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol.0.6.11.DomainSeparatorCollision.json @@ -240,10 +240,10 @@ } } ], - "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol#161-163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", - "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol#L161-L163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "description": "The function signature of ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol#161-163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "The function signature of [ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol#L161-L163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", "first_markdown_element": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_collision.sol#L161-L163", - "id": "89af79b93e8de48fb8f88ab4dabbc97b0bb35ab39b6544e255b16aa924286eab", + "id": "cb8ae27add92ad3163cbe9c0fb29a2a0032ba46384bbd5541d1d750251f5c83e", "check": "domain-separator-collision", "impact": "Medium", "confidence": "High" diff --git a/tests/detectors/domain-separator-collision/0.6.11/permit_domain_state_var_collision.sol b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_state_var_collision.sol new file mode 100644 index 000000000..2c63161f4 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_state_var_collision.sol @@ -0,0 +1,205 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) +/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) +/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. +contract ERC20 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event Transfer(address indexed from, address indexed to, uint256 amount); + + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /*////////////////////////////////////////////////////////////// + METADATA STORAGE + //////////////////////////////////////////////////////////////*/ + + string public name; + + string public symbol; + + uint8 public decimals; + + /*////////////////////////////////////////////////////////////// + ERC20 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 public totalSupply; + + mapping(address => uint256) public balanceOf; + + mapping(address => mapping(address => uint256)) public allowance; + + /*////////////////////////////////////////////////////////////// + EIP-2612 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal INITIAL_CHAIN_ID; + + bytes32 internal INITIAL_DOMAIN_SEPARATOR; + + mapping(address => uint256) public nonces; + + bytes32 public fopwCDKKK; + + /*////////////////////////////////////////////////////////////// + CONSTRUCTOR + //////////////////////////////////////////////////////////////*/ + + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals + ) public { + name = _name; + symbol = _symbol; + decimals = _decimals; + + INITIAL_CHAIN_ID = 1; + INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + } + + /*////////////////////////////////////////////////////////////// + ERC20 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 amount) public returns (bool) { + allowance[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + + return true; + } + + function transfer(address to, uint256 amount) public returns (bool) { + balanceOf[msg.sender] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(msg.sender, to, amount); + + return true; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public returns (bool) { + uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + + if (allowed != 115792089237316195423570985008687907853269984665640564039457584007913129639935) allowance[from][msg.sender] = allowed - amount; + + balanceOf[from] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(from, to, amount); + + return true; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 LOGIC + //////////////////////////////////////////////////////////////*/ + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public { + require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + + // Unchecked because the only math done is incrementing + // the owner's nonce which cannot realistically overflow. + + address recoveredAddress = ecrecover( + keccak256( + abi.encodePacked( + "\x19\x01", + fopwCDKKK, + keccak256( + abi.encode( + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ), + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ) + ) + ), + v, + r, + s + ); + + require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + + allowance[recoveredAddress][spender] = value; + + + emit Approval(owner, spender, value); + } + + function computeDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256("1"), + 1, + address(this) + ) + ); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 amount) internal { + totalSupply += amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal { + balanceOf[from] -= amount; + + // Cannot underflow because a user's balance + // will never be larger than the total supply. + + totalSupply -= amount; + + + emit Transfer(from, address(0), amount); + } +} + +contract Test is ERC20("TEST", "TEST", 18) {} diff --git a/tests/detectors/domain-separator-collision/0.6.11/permit_domain_state_var_collision.sol.0.6.11.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_state_var_collision.sol.0.6.11.DomainSeparatorCollision.json new file mode 100644 index 000000000..ace6f711a --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_state_var_collision.sol.0.6.11.DomainSeparatorCollision.json @@ -0,0 +1,247 @@ +[ + [ + { + "elements": [ + { + "type": "variable", + "name": "fopwCDKKK", + "source_mapping": { + "start": 1735, + "length": 24, + "filename_relative": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_state_var_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_state_var_collision.sol", + "is_dependency": false, + "lines": [ + 46 + ], + "starting_column": 5, + "ending_column": 29 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20", + "source_mapping": { + "start": 449, + "length": 6061, + "filename_relative": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_state_var_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_state_var_collision.sol", + "is_dependency": false, + "lines": [ + 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, + 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, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + } + ], + "description": "The function signature of ERC20.fopwCDKKK (tests/detectors/domain-separator-collision/0.6.11/permit_domain_state_var_collision.sol#46) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "The function signature of [ERC20.fopwCDKKK](tests/detectors/domain-separator-collision/0.6.11/permit_domain_state_var_collision.sol#L46) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_state_var_collision.sol#L46", + "id": "8d18da367a9cfe0bee2ee48ee8a76072af23567d852cc81ed75dd90531cbe3d5", + "check": "domain-separator-collision", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/domain-separator-collision/0.6.11/permit_domain_wrong_return_type.sol b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_wrong_return_type.sol new file mode 100644 index 000000000..c3f31e5f8 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_wrong_return_type.sol @@ -0,0 +1,207 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) +/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) +/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. +contract ERC20 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event Transfer(address indexed from, address indexed to, uint256 amount); + + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /*////////////////////////////////////////////////////////////// + METADATA STORAGE + //////////////////////////////////////////////////////////////*/ + + string public name; + + string public symbol; + + uint8 public decimals; + + /*////////////////////////////////////////////////////////////// + ERC20 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 public totalSupply; + + mapping(address => uint256) public balanceOf; + + mapping(address => mapping(address => uint256)) public allowance; + + /*////////////////////////////////////////////////////////////// + EIP-2612 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal INITIAL_CHAIN_ID; + + bytes32 internal INITIAL_DOMAIN_SEPARATOR; + + mapping(address => uint256) public nonces; + + /*////////////////////////////////////////////////////////////// + CONSTRUCTOR + //////////////////////////////////////////////////////////////*/ + + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals + ) public { + name = _name; + symbol = _symbol; + decimals = _decimals; + + INITIAL_CHAIN_ID = 1; + INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + } + + /*////////////////////////////////////////////////////////////// + ERC20 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 amount) public returns (bool) { + allowance[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + + return true; + } + + function transfer(address to, uint256 amount) public returns (bool) { + balanceOf[msg.sender] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(msg.sender, to, amount); + + return true; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public returns (bool) { + uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + + if (allowed != 115792089237316195423570985008687907853269984665640564039457584007913129639935) allowance[from][msg.sender] = allowed - amount; + + balanceOf[from] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(from, to, amount); + + return true; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 LOGIC + //////////////////////////////////////////////////////////////*/ + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public { + require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + + // Unchecked because the only math done is incrementing + // the owner's nonce which cannot realistically overflow. + + address recoveredAddress = ecrecover( + keccak256( + abi.encodePacked( + "\x19\x01", + DOMAIN_SEPARATOR(), + keccak256( + abi.encode( + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ), + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ) + ) + ), + v, + r, + s + ); + + require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + + allowance[recoveredAddress][spender] = value; + + + emit Approval(owner, spender, value); + } + + function DOMAIN_SEPARATOR() public view returns (uint64) { + return uint64(1); + } + + function computeDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256("1"), + 1, + address(this) + ) + ); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 amount) internal { + totalSupply += amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal { + balanceOf[from] -= amount; + + // Cannot underflow because a user's balance + // will never be larger than the total supply. + + totalSupply -= amount; + + + emit Transfer(from, address(0), amount); + } +} + +contract Test is ERC20("TEST", "TEST", 18) {} diff --git a/tests/detectors/domain-separator-collision/0.6.11/permit_domain_wrong_return_type.sol.0.6.11.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_wrong_return_type.sol.0.6.11.DomainSeparatorCollision.json new file mode 100644 index 000000000..7da702ba4 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.6.11/permit_domain_wrong_return_type.sol.0.6.11.DomainSeparatorCollision.json @@ -0,0 +1,252 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "DOMAIN_SEPARATOR", + "source_mapping": { + "start": 5255, + "length": 90, + "filename_relative": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_wrong_return_type.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_wrong_return_type.sol", + "is_dependency": false, + "lines": [ + 161, + 162, + 163 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20", + "source_mapping": { + "start": 449, + "length": 6135, + "filename_relative": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_wrong_return_type.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_wrong_return_type.sol", + "is_dependency": false, + "lines": [ + 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, + 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, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "DOMAIN_SEPARATOR()" + } + } + ], + "description": "The function signature of ERC20.DOMAIN_SEPARATOR() (tests/detectors/domain-separator-collision/0.6.11/permit_domain_wrong_return_type.sol#161-163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "The function signature of [ERC20.DOMAIN_SEPARATOR()](tests/detectors/domain-separator-collision/0.6.11/permit_domain_wrong_return_type.sol#L161-L163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.6.11/permit_domain_wrong_return_type.sol#L161-L163", + "id": "17ee24b60ef7d108871021639c374d6711feb1c8e3aad52ab266a680c03831cb", + "check": "domain-separator-collision", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol.0.7.6.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol.0.7.6.DomainSeparatorCollision.json index 9f0c1db41..6f42fc7a6 100644 --- a/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol.0.7.6.DomainSeparatorCollision.json +++ b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol.0.7.6.DomainSeparatorCollision.json @@ -240,10 +240,10 @@ } } ], - "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol#161-163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", - "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol#L161-L163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "description": "The function signature of ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol#161-163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "The function signature of [ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol#L161-L163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", "first_markdown_element": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_collision.sol#L161-L163", - "id": "89af79b93e8de48fb8f88ab4dabbc97b0bb35ab39b6544e255b16aa924286eab", + "id": "cb8ae27add92ad3163cbe9c0fb29a2a0032ba46384bbd5541d1d750251f5c83e", "check": "domain-separator-collision", "impact": "Medium", "confidence": "High" diff --git a/tests/detectors/domain-separator-collision/0.7.6/permit_domain_state_var_collision.sol b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_state_var_collision.sol new file mode 100644 index 000000000..2c63161f4 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_state_var_collision.sol @@ -0,0 +1,205 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) +/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) +/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. +contract ERC20 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event Transfer(address indexed from, address indexed to, uint256 amount); + + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /*////////////////////////////////////////////////////////////// + METADATA STORAGE + //////////////////////////////////////////////////////////////*/ + + string public name; + + string public symbol; + + uint8 public decimals; + + /*////////////////////////////////////////////////////////////// + ERC20 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 public totalSupply; + + mapping(address => uint256) public balanceOf; + + mapping(address => mapping(address => uint256)) public allowance; + + /*////////////////////////////////////////////////////////////// + EIP-2612 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal INITIAL_CHAIN_ID; + + bytes32 internal INITIAL_DOMAIN_SEPARATOR; + + mapping(address => uint256) public nonces; + + bytes32 public fopwCDKKK; + + /*////////////////////////////////////////////////////////////// + CONSTRUCTOR + //////////////////////////////////////////////////////////////*/ + + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals + ) public { + name = _name; + symbol = _symbol; + decimals = _decimals; + + INITIAL_CHAIN_ID = 1; + INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + } + + /*////////////////////////////////////////////////////////////// + ERC20 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 amount) public returns (bool) { + allowance[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + + return true; + } + + function transfer(address to, uint256 amount) public returns (bool) { + balanceOf[msg.sender] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(msg.sender, to, amount); + + return true; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public returns (bool) { + uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + + if (allowed != 115792089237316195423570985008687907853269984665640564039457584007913129639935) allowance[from][msg.sender] = allowed - amount; + + balanceOf[from] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(from, to, amount); + + return true; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 LOGIC + //////////////////////////////////////////////////////////////*/ + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public { + require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + + // Unchecked because the only math done is incrementing + // the owner's nonce which cannot realistically overflow. + + address recoveredAddress = ecrecover( + keccak256( + abi.encodePacked( + "\x19\x01", + fopwCDKKK, + keccak256( + abi.encode( + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ), + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ) + ) + ), + v, + r, + s + ); + + require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + + allowance[recoveredAddress][spender] = value; + + + emit Approval(owner, spender, value); + } + + function computeDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256("1"), + 1, + address(this) + ) + ); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 amount) internal { + totalSupply += amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal { + balanceOf[from] -= amount; + + // Cannot underflow because a user's balance + // will never be larger than the total supply. + + totalSupply -= amount; + + + emit Transfer(from, address(0), amount); + } +} + +contract Test is ERC20("TEST", "TEST", 18) {} diff --git a/tests/detectors/domain-separator-collision/0.7.6/permit_domain_state_var_collision.sol.0.7.6.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_state_var_collision.sol.0.7.6.DomainSeparatorCollision.json new file mode 100644 index 000000000..9c246aca1 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_state_var_collision.sol.0.7.6.DomainSeparatorCollision.json @@ -0,0 +1,247 @@ +[ + [ + { + "elements": [ + { + "type": "variable", + "name": "fopwCDKKK", + "source_mapping": { + "start": 1735, + "length": 24, + "filename_relative": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_state_var_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_state_var_collision.sol", + "is_dependency": false, + "lines": [ + 46 + ], + "starting_column": 5, + "ending_column": 29 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20", + "source_mapping": { + "start": 449, + "length": 6061, + "filename_relative": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_state_var_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_state_var_collision.sol", + "is_dependency": false, + "lines": [ + 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, + 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, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + } + ], + "description": "The function signature of ERC20.fopwCDKKK (tests/detectors/domain-separator-collision/0.7.6/permit_domain_state_var_collision.sol#46) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "The function signature of [ERC20.fopwCDKKK](tests/detectors/domain-separator-collision/0.7.6/permit_domain_state_var_collision.sol#L46) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_state_var_collision.sol#L46", + "id": "8d18da367a9cfe0bee2ee48ee8a76072af23567d852cc81ed75dd90531cbe3d5", + "check": "domain-separator-collision", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/domain-separator-collision/0.7.6/permit_domain_wrong_return_type.sol b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_wrong_return_type.sol new file mode 100644 index 000000000..5d3401871 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_wrong_return_type.sol @@ -0,0 +1,207 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) +/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) +/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. +contract ERC20 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event Transfer(address indexed from, address indexed to, uint256 amount); + + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /*////////////////////////////////////////////////////////////// + METADATA STORAGE + //////////////////////////////////////////////////////////////*/ + + string public name; + + string public symbol; + + uint8 public decimals; + + /*////////////////////////////////////////////////////////////// + ERC20 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 public totalSupply; + + mapping(address => uint256) public balanceOf; + + mapping(address => mapping(address => uint256)) public allowance; + + /*////////////////////////////////////////////////////////////// + EIP-2612 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal INITIAL_CHAIN_ID; + + bytes32 internal INITIAL_DOMAIN_SEPARATOR; + + mapping(address => uint256) public nonces; + + /*////////////////////////////////////////////////////////////// + CONSTRUCTOR + //////////////////////////////////////////////////////////////*/ + + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals + ) { + name = _name; + symbol = _symbol; + decimals = _decimals; + + INITIAL_CHAIN_ID = 1; + INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + } + + /*////////////////////////////////////////////////////////////// + ERC20 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 amount) public returns (bool) { + allowance[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + + return true; + } + + function transfer(address to, uint256 amount) public returns (bool) { + balanceOf[msg.sender] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(msg.sender, to, amount); + + return true; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public returns (bool) { + uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + + if (allowed != 115792089237316195423570985008687907853269984665640564039457584007913129639935) allowance[from][msg.sender] = allowed - amount; + + balanceOf[from] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(from, to, amount); + + return true; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 LOGIC + //////////////////////////////////////////////////////////////*/ + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public { + require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + + // Unchecked because the only math done is incrementing + // the owner's nonce which cannot realistically overflow. + + address recoveredAddress = ecrecover( + keccak256( + abi.encodePacked( + "\x19\x01", + DOMAIN_SEPARATOR(), + keccak256( + abi.encode( + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ), + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ) + ) + ), + v, + r, + s + ); + + require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + + allowance[recoveredAddress][spender] = value; + + + emit Approval(owner, spender, value); + } + + function DOMAIN_SEPARATOR() public view returns (uint64) { + return uint64(1); + } + + function computeDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256("1"), + 1, + address(this) + ) + ); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 amount) internal { + totalSupply += amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal { + balanceOf[from] -= amount; + + // Cannot underflow because a user's balance + // will never be larger than the total supply. + + totalSupply -= amount; + + + emit Transfer(from, address(0), amount); + } +} + +contract Test is ERC20("TEST", "TEST", 18) {} diff --git a/tests/detectors/domain-separator-collision/0.7.6/permit_domain_wrong_return_type.sol.0.7.6.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_wrong_return_type.sol.0.7.6.DomainSeparatorCollision.json new file mode 100644 index 000000000..957ae1920 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.7.6/permit_domain_wrong_return_type.sol.0.7.6.DomainSeparatorCollision.json @@ -0,0 +1,252 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "DOMAIN_SEPARATOR", + "source_mapping": { + "start": 5248, + "length": 90, + "filename_relative": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_wrong_return_type.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_wrong_return_type.sol", + "is_dependency": false, + "lines": [ + 161, + 162, + 163 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20", + "source_mapping": { + "start": 449, + "length": 6128, + "filename_relative": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_wrong_return_type.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_wrong_return_type.sol", + "is_dependency": false, + "lines": [ + 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, + 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, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "DOMAIN_SEPARATOR()" + } + } + ], + "description": "The function signature of ERC20.DOMAIN_SEPARATOR() (tests/detectors/domain-separator-collision/0.7.6/permit_domain_wrong_return_type.sol#161-163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "The function signature of [ERC20.DOMAIN_SEPARATOR()](tests/detectors/domain-separator-collision/0.7.6/permit_domain_wrong_return_type.sol#L161-L163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.7.6/permit_domain_wrong_return_type.sol#L161-L163", + "id": "17ee24b60ef7d108871021639c374d6711feb1c8e3aad52ab266a680c03831cb", + "check": "domain-separator-collision", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol.0.8.0.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol.0.8.0.DomainSeparatorCollision.json index bc816b0d6..5d6f68aa9 100644 --- a/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol.0.8.0.DomainSeparatorCollision.json +++ b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol.0.8.0.DomainSeparatorCollision.json @@ -240,10 +240,10 @@ } } ], - "description": "ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol#161-163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", - "markdown": "[ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol#L161-L163)'s function signature collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "description": "The function signature of ERC20.fopwCDKKK() (tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol#161-163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "The function signature of [ERC20.fopwCDKKK()](tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol#L161-L163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", "first_markdown_element": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_collision.sol#L161-L163", - "id": "89af79b93e8de48fb8f88ab4dabbc97b0bb35ab39b6544e255b16aa924286eab", + "id": "cb8ae27add92ad3163cbe9c0fb29a2a0032ba46384bbd5541d1d750251f5c83e", "check": "domain-separator-collision", "impact": "Medium", "confidence": "High" diff --git a/tests/detectors/domain-separator-collision/0.8.0/permit_domain_state_var_collision.sol b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_state_var_collision.sol new file mode 100644 index 000000000..2c63161f4 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_state_var_collision.sol @@ -0,0 +1,205 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) +/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) +/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. +contract ERC20 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event Transfer(address indexed from, address indexed to, uint256 amount); + + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /*////////////////////////////////////////////////////////////// + METADATA STORAGE + //////////////////////////////////////////////////////////////*/ + + string public name; + + string public symbol; + + uint8 public decimals; + + /*////////////////////////////////////////////////////////////// + ERC20 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 public totalSupply; + + mapping(address => uint256) public balanceOf; + + mapping(address => mapping(address => uint256)) public allowance; + + /*////////////////////////////////////////////////////////////// + EIP-2612 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal INITIAL_CHAIN_ID; + + bytes32 internal INITIAL_DOMAIN_SEPARATOR; + + mapping(address => uint256) public nonces; + + bytes32 public fopwCDKKK; + + /*////////////////////////////////////////////////////////////// + CONSTRUCTOR + //////////////////////////////////////////////////////////////*/ + + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals + ) public { + name = _name; + symbol = _symbol; + decimals = _decimals; + + INITIAL_CHAIN_ID = 1; + INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + } + + /*////////////////////////////////////////////////////////////// + ERC20 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 amount) public returns (bool) { + allowance[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + + return true; + } + + function transfer(address to, uint256 amount) public returns (bool) { + balanceOf[msg.sender] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(msg.sender, to, amount); + + return true; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public returns (bool) { + uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + + if (allowed != 115792089237316195423570985008687907853269984665640564039457584007913129639935) allowance[from][msg.sender] = allowed - amount; + + balanceOf[from] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(from, to, amount); + + return true; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 LOGIC + //////////////////////////////////////////////////////////////*/ + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public { + require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + + // Unchecked because the only math done is incrementing + // the owner's nonce which cannot realistically overflow. + + address recoveredAddress = ecrecover( + keccak256( + abi.encodePacked( + "\x19\x01", + fopwCDKKK, + keccak256( + abi.encode( + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ), + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ) + ) + ), + v, + r, + s + ); + + require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + + allowance[recoveredAddress][spender] = value; + + + emit Approval(owner, spender, value); + } + + function computeDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256("1"), + 1, + address(this) + ) + ); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 amount) internal { + totalSupply += amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal { + balanceOf[from] -= amount; + + // Cannot underflow because a user's balance + // will never be larger than the total supply. + + totalSupply -= amount; + + + emit Transfer(from, address(0), amount); + } +} + +contract Test is ERC20("TEST", "TEST", 18) {} diff --git a/tests/detectors/domain-separator-collision/0.8.0/permit_domain_state_var_collision.sol.0.8.0.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_state_var_collision.sol.0.8.0.DomainSeparatorCollision.json new file mode 100644 index 000000000..dc39ccea9 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_state_var_collision.sol.0.8.0.DomainSeparatorCollision.json @@ -0,0 +1,247 @@ +[ + [ + { + "elements": [ + { + "type": "variable", + "name": "fopwCDKKK", + "source_mapping": { + "start": 1735, + "length": 24, + "filename_relative": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_state_var_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_state_var_collision.sol", + "is_dependency": false, + "lines": [ + 46 + ], + "starting_column": 5, + "ending_column": 29 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20", + "source_mapping": { + "start": 449, + "length": 6061, + "filename_relative": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_state_var_collision.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_state_var_collision.sol", + "is_dependency": false, + "lines": [ + 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, + 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, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + } + ], + "description": "The function signature of ERC20.fopwCDKKK (tests/detectors/domain-separator-collision/0.8.0/permit_domain_state_var_collision.sol#46) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "The function signature of [ERC20.fopwCDKKK](tests/detectors/domain-separator-collision/0.8.0/permit_domain_state_var_collision.sol#L46) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_state_var_collision.sol#L46", + "id": "8d18da367a9cfe0bee2ee48ee8a76072af23567d852cc81ed75dd90531cbe3d5", + "check": "domain-separator-collision", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/detectors/domain-separator-collision/0.8.0/permit_domain_wrong_return_type.sol b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_wrong_return_type.sol new file mode 100644 index 000000000..5d3401871 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_wrong_return_type.sol @@ -0,0 +1,207 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) +/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) +/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. +contract ERC20 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event Transfer(address indexed from, address indexed to, uint256 amount); + + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /*////////////////////////////////////////////////////////////// + METADATA STORAGE + //////////////////////////////////////////////////////////////*/ + + string public name; + + string public symbol; + + uint8 public decimals; + + /*////////////////////////////////////////////////////////////// + ERC20 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 public totalSupply; + + mapping(address => uint256) public balanceOf; + + mapping(address => mapping(address => uint256)) public allowance; + + /*////////////////////////////////////////////////////////////// + EIP-2612 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal INITIAL_CHAIN_ID; + + bytes32 internal INITIAL_DOMAIN_SEPARATOR; + + mapping(address => uint256) public nonces; + + /*////////////////////////////////////////////////////////////// + CONSTRUCTOR + //////////////////////////////////////////////////////////////*/ + + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals + ) { + name = _name; + symbol = _symbol; + decimals = _decimals; + + INITIAL_CHAIN_ID = 1; + INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + } + + /*////////////////////////////////////////////////////////////// + ERC20 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 amount) public returns (bool) { + allowance[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + + return true; + } + + function transfer(address to, uint256 amount) public returns (bool) { + balanceOf[msg.sender] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(msg.sender, to, amount); + + return true; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public returns (bool) { + uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. + + if (allowed != 115792089237316195423570985008687907853269984665640564039457584007913129639935) allowance[from][msg.sender] = allowed - amount; + + balanceOf[from] -= amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(from, to, amount); + + return true; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 LOGIC + //////////////////////////////////////////////////////////////*/ + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public { + require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + + // Unchecked because the only math done is incrementing + // the owner's nonce which cannot realistically overflow. + + address recoveredAddress = ecrecover( + keccak256( + abi.encodePacked( + "\x19\x01", + DOMAIN_SEPARATOR(), + keccak256( + abi.encode( + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ), + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ) + ) + ), + v, + r, + s + ); + + require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + + allowance[recoveredAddress][spender] = value; + + + emit Approval(owner, spender, value); + } + + function DOMAIN_SEPARATOR() public view returns (uint64) { + return uint64(1); + } + + function computeDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256("1"), + 1, + address(this) + ) + ); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 amount) internal { + totalSupply += amount; + + // Cannot overflow because the sum of all user + // balances can't exceed the max uint256 value. + + balanceOf[to] += amount; + + + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal { + balanceOf[from] -= amount; + + // Cannot underflow because a user's balance + // will never be larger than the total supply. + + totalSupply -= amount; + + + emit Transfer(from, address(0), amount); + } +} + +contract Test is ERC20("TEST", "TEST", 18) {} diff --git a/tests/detectors/domain-separator-collision/0.8.0/permit_domain_wrong_return_type.sol.0.8.0.DomainSeparatorCollision.json b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_wrong_return_type.sol.0.8.0.DomainSeparatorCollision.json new file mode 100644 index 000000000..c224777b6 --- /dev/null +++ b/tests/detectors/domain-separator-collision/0.8.0/permit_domain_wrong_return_type.sol.0.8.0.DomainSeparatorCollision.json @@ -0,0 +1,252 @@ +[ + [ + { + "elements": [ + { + "type": "function", + "name": "DOMAIN_SEPARATOR", + "source_mapping": { + "start": 5248, + "length": 90, + "filename_relative": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_wrong_return_type.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_wrong_return_type.sol", + "is_dependency": false, + "lines": [ + 161, + 162, + 163 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20", + "source_mapping": { + "start": 449, + "length": 6128, + "filename_relative": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_wrong_return_type.sol", + "filename_absolute": "/GENERIC_PATH", + "filename_short": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_wrong_return_type.sol", + "is_dependency": false, + "lines": [ + 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, + 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, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "DOMAIN_SEPARATOR()" + } + } + ], + "description": "The function signature of ERC20.DOMAIN_SEPARATOR() (tests/detectors/domain-separator-collision/0.8.0/permit_domain_wrong_return_type.sol#161-163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "markdown": "The function signature of [ERC20.DOMAIN_SEPARATOR()](tests/detectors/domain-separator-collision/0.8.0/permit_domain_wrong_return_type.sol#L161-L163) collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", + "first_markdown_element": "tests/detectors/domain-separator-collision/0.8.0/permit_domain_wrong_return_type.sol#L161-L163", + "id": "17ee24b60ef7d108871021639c374d6711feb1c8e3aad52ab266a680c03831cb", + "check": "domain-separator-collision", + "impact": "Medium", + "confidence": "High" + } + ] +] \ No newline at end of file diff --git a/tests/test_detectors.py b/tests/test_detectors.py index 440c8a6ad..970c1c1a0 100644 --- a/tests/test_detectors.py +++ b/tests/test_detectors.py @@ -1468,6 +1468,56 @@ ALL_TEST_OBJECTS = [ "permit_domain_collision.sol", "0.8.0", ), + Test( + all_detectors.DomainSeparatorCollision, + "permit_domain_wrong_return_type.sol", + "0.4.25", + ), + Test( + all_detectors.DomainSeparatorCollision, + "permit_domain_wrong_return_type.sol", + "0.5.16", + ), + Test( + all_detectors.DomainSeparatorCollision, + "permit_domain_wrong_return_type.sol", + "0.6.11", + ), + Test( + all_detectors.DomainSeparatorCollision, + "permit_domain_wrong_return_type.sol", + "0.7.6", + ), + Test( + all_detectors.DomainSeparatorCollision, + "permit_domain_wrong_return_type.sol", + "0.8.0", + ), + Test( + all_detectors.DomainSeparatorCollision, + "permit_domain_state_var_collision.sol", + "0.4.25", + ), + Test( + all_detectors.DomainSeparatorCollision, + "permit_domain_state_var_collision.sol", + "0.5.16", + ), + Test( + all_detectors.DomainSeparatorCollision, + "permit_domain_state_var_collision.sol", + "0.6.11", + ), + Test( + all_detectors.DomainSeparatorCollision, + "permit_domain_state_var_collision.sol", + "0.7.6", + ), + Test( + all_detectors.DomainSeparatorCollision, + "permit_domain_state_var_collision.sol", + "0.8.0", + ), ] diff --git a/tests/test_function.py b/tests/test_function.py index 19fa596ab..632096a97 100644 --- a/tests/test_function.py +++ b/tests/test_function.py @@ -15,10 +15,7 @@ def test_functions(): # pylint: disable=too-many-statements solc_select.switch_global_version("0.6.12", always_install=True) slither = Slither("tests/test_function.sol") - compilation_unit = slither.compilation_units[0] - functions = compilation_unit.get_contract_from_name("TestFunction")[ - 0 - ].available_functions_as_dict() + functions = slither.get_contract_from_name("TestFunction")[0].available_functions_as_dict() f = functions["external_payable(uint256)"] assert f.name == "external_payable" @@ -267,3 +264,16 @@ def test_function_can_send_eth(): assert functions["transfer_via_external()"].can_send_eth() is False assert functions["call_via_external()"].can_send_eth() is False assert functions["highlevel_call_via_external()"].can_send_eth() is False + + +def test_public_variable(): + solc_select.switch_global_version("0.6.12", always_install=True) + slither = Slither("tests/test_function.sol") + contracts = slither.get_contract_from_name("TestFunction") + assert len(contracts) == 1 + contract = contracts[0] + var = contract.get_state_variable_from_name("info") + assert var.solidity_signature == "info()" + assert var.signature_str == "info() returns(bytes32)" + assert var.visibility == "public" + assert var.return_type[0] == ElementaryType("bytes32") diff --git a/tests/test_function.sol b/tests/test_function.sol index 6ea6b9d8a..aca9fc93d 100644 --- a/tests/test_function.sol +++ b/tests/test_function.sol @@ -7,6 +7,7 @@ pragma solidity ^0.6.12; contract TestFunction { bool entered = false; + bytes32 public info; function external_payable(uint _a) external payable returns (uint) { return 1; From f5f4cb11e994d97eaf8264c819c64447c8de110b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Tue, 6 Sep 2022 20:19:13 -0300 Subject: [PATCH 26/87] Dockerfile: add x86_64 libc on non-intel containers This assists in running x86_64 dynamic binaries, such as certain solc 0.8.x releases, in ARM containers. This can be useful when working on machines with certain emulation configuration, such as M1 Macs with Docker Desktop. --- Dockerfile | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Dockerfile b/Dockerfile index 2f3251592..71bb9f57f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -26,6 +26,14 @@ RUN export DEBIAN_FRONTEND=noninteractive \ && apt-get install -y --no-install-recommends python3-pip \ && rm -rf /var/lib/apt/lists/* +# improve compatibility with amd64 solc in non-amd64 environments (e.g. Docker Desktop on M1 Mac) +ENV QEMU_LD_PREFIX=/usr/x86_64-linux-gnu +RUN if [ ! "$(uname -m)" = "x86_64" ]; then \ + export DEBIAN_FRONTEND=noninteractive \ + && apt-get update \ + && apt-get install -y --no-install-recommends libc6-amd64-cross \ + && rm -rf /var/lib/apt/lists/*; fi + RUN useradd -m slither USER slither From efe103c79c100a7a0cd100681b58b477240bed84 Mon Sep 17 00:00:00 2001 From: JorgeAtPaladin Date: Fri, 16 Sep 2022 20:48:44 +0000 Subject: [PATCH 27/87] Constants detector: Also detect Contract types --- .../variables/possible_const_state_variables.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/slither/detectors/variables/possible_const_state_variables.py b/slither/detectors/variables/possible_const_state_variables.py index 47af9741b..245f81a91 100644 --- a/slither/detectors/variables/possible_const_state_variables.py +++ b/slither/detectors/variables/possible_const_state_variables.py @@ -3,8 +3,10 @@ Module detecting state variables that could be declared as constant """ from slither.core.compilation_unit import SlitherCompilationUnit from slither.core.solidity_types.elementary_type import ElementaryType +from slither.core.solidity_types.user_defined_type import UserDefinedType from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification from slither.visitors.expression.export_values import ExportValues +from slither.core.declarations import Contract from slither.core.declarations.solidity_variables import SolidityFunction from slither.core.variables.state_variable import StateVariable from slither.formatters.variables.possible_const_state_variables import custom_format @@ -29,9 +31,22 @@ class ConstCandidateStateVars(AbstractDetector): WIKI_DESCRIPTION = "Constant state variables should be declared constant to save gas." WIKI_RECOMMENDATION = "Add the `constant` attributes to state variables that never change." + + @staticmethod + def _is_valid_type(v): + t = v.type + if isinstance(t, ElementaryType): + return True + if isinstance(t, UserDefinedType): + type_t = t.type + if isinstance(type_t, Contract): + return True + return False + + @staticmethod def _valid_candidate(v): - return isinstance(v.type, ElementaryType) and not (v.is_constant or v.is_immutable) + return _is_valid_type(v) and not (v.is_constant or v.is_immutable) # https://solidity.readthedocs.io/en/v0.5.2/contracts.html#constant-state-variables valid_solidity_function = [ From b563be7af9c2d2bcab9c8b7baa94ad7342dc23a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Sun, 18 Sep 2022 10:39:14 -0300 Subject: [PATCH 28/87] Add tests for rational and scientific notation constants --- tests/constant_folding_rational.sol | 7 +++++++ tests/test_constant_folding.py | 30 ++++++++++++++++++++++++++++ tests/test_constant_folding_unary.py | 5 ----- 3 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 tests/constant_folding_rational.sol create mode 100644 tests/test_constant_folding.py delete mode 100644 tests/test_constant_folding_unary.py diff --git a/tests/constant_folding_rational.sol b/tests/constant_folding_rational.sol new file mode 100644 index 000000000..36c44fb35 --- /dev/null +++ b/tests/constant_folding_rational.sol @@ -0,0 +1,7 @@ +contract C { + uint256 constant a = 2.5 + 7 + 0.5; + int128 b = 6 / 3.0; + int64 constant c = 5 * 0.5 + 0.5; + int256 d = 1e3 + 5E2; + uint256 e = 2 ** 255; +} \ No newline at end of file diff --git a/tests/test_constant_folding.py b/tests/test_constant_folding.py new file mode 100644 index 000000000..8a7f882af --- /dev/null +++ b/tests/test_constant_folding.py @@ -0,0 +1,30 @@ +from slither import Slither +from slither.visitors.expression.constants_folding import ConstantFolding + + +def test_constant_folding_unary(): + Slither("./tests/constant_folding_unary.sol") + +def test_constant_folding_rational(): + s = Slither("./tests/constant_folding_rational.sol") + contract = s.get_contract_from_name("C")[0] + + variable_a = contract.get_state_variable_from_name("a") + assert str(variable_a.type) == "uint256" + assert str(ConstantFolding(variable_a.expression, "uint256").result()) == "10" + + variable_b = contract.get_state_variable_from_name("b") + assert str(variable_b.type) == "int128" + assert str(ConstantFolding(variable_b.expression, "int128").result()) == "2" + + variable_c = contract.get_state_variable_from_name("c") + assert str(variable_c.type) == "int64" + assert str(ConstantFolding(variable_c.expression, "int64").result()) == "3" + + variable_d = contract.get_state_variable_from_name("d") + assert str(variable_d.type) == "int256" + assert str(ConstantFolding(variable_d.expression, "int256").result()) == "1500" + + variable_e = contract.get_state_variable_from_name("e") + assert str(variable_e.type) == "uint256" + assert str(ConstantFolding(variable_e.expression, "uint256").result()) == "57896044618658097711785492504343953926634992332820282019728792003956564819968" \ No newline at end of file diff --git a/tests/test_constant_folding_unary.py b/tests/test_constant_folding_unary.py deleted file mode 100644 index fa51d0934..000000000 --- a/tests/test_constant_folding_unary.py +++ /dev/null @@ -1,5 +0,0 @@ -from slither import Slither - - -def test_constant_folding_unary(): - Slither("./tests/constant_folding_unary.sol") From 01baf01860c3f9df5582f065dd9f85d46bbb6eef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Sun, 18 Sep 2022 10:41:59 -0300 Subject: [PATCH 29/87] Configure decimal precision to a value able to represent 2**256 The default decimal precision is able to handle up to 28 significant digits, which is not enough to represent large numbers. This raises the precision to 80 digits, which should fit 2**256. --- slither/utils/__init__.py | 3 +++ slither/utils/arithmetic.py | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/slither/utils/__init__.py b/slither/utils/__init__.py index e69de29bb..86427ca2e 100644 --- a/slither/utils/__init__.py +++ b/slither/utils/__init__.py @@ -0,0 +1,3 @@ +from slither.utils.arithmetic import configure_decimal_precision + +configure_decimal_precision() \ No newline at end of file diff --git a/slither/utils/arithmetic.py b/slither/utils/arithmetic.py index 06e8956dd..83c5be544 100644 --- a/slither/utils/arithmetic.py +++ b/slither/utils/arithmetic.py @@ -1,7 +1,13 @@ -from decimal import Decimal +from decimal import Decimal, getcontext from slither.exceptions import SlitherException +def configure_decimal_precision(): + # Configure decimal precision high enough for 2 ** 256 + # Otherwise, large constant arithmetic may get truncated + if getcontext().prec < 80: + getcontext().prec = 80 + # pylint: disable=too-many-branches def convert_subdenomination( value: str, sub: str From 98611e3ae744d117a2287055b667fa53697a0654 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Sun, 18 Sep 2022 10:50:16 -0300 Subject: [PATCH 30/87] Fix parsing of constants Fixes: #1376 --- slither/core/expressions/literal.py | 4 ++-- slither/core/solidity_types/array_type.py | 2 +- slither/visitors/expression/constants_folding.py | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/slither/core/expressions/literal.py b/slither/core/expressions/literal.py index 3303a9aa8..d8bb59077 100644 --- a/slither/core/expressions/literal.py +++ b/slither/core/expressions/literal.py @@ -2,6 +2,7 @@ from typing import Optional, Union, TYPE_CHECKING from slither.core.expressions.expression import Expression from slither.utils.arithmetic import convert_subdenomination +from slither.utils.integer_conversion import convert_string_to_int if TYPE_CHECKING: from slither.core.solidity_types.type import Type @@ -29,8 +30,7 @@ class Literal(Expression): def __str__(self): if self.subdenomination: return str(convert_subdenomination(self._value, self.subdenomination)) - # be sure to handle any character - return str(self._value) + return str(convert_string_to_int(self._value)) def __eq__(self, other): if not isinstance(other, Literal): diff --git a/slither/core/solidity_types/array_type.py b/slither/core/solidity_types/array_type.py index 97d735c89..59a15dcc6 100644 --- a/slither/core/solidity_types/array_type.py +++ b/slither/core/solidity_types/array_type.py @@ -53,7 +53,7 @@ class ArrayType(Type): def storage_size(self) -> Tuple[int, bool]: if self._length_value: elem_size, _ = self._type.storage_size - return elem_size * int(self._length_value.value), True + return elem_size * int(str(self._length_value)), True return 32, True def __str__(self): diff --git a/slither/visitors/expression/constants_folding.py b/slither/visitors/expression/constants_folding.py index 61c98d65f..27ff9b592 100644 --- a/slither/visitors/expression/constants_folding.py +++ b/slither/visitors/expression/constants_folding.py @@ -1,3 +1,4 @@ +from decimal import Decimal, InvalidOperation from slither.core.expressions import BinaryOperationType, Literal, UnaryOperationType from slither.utils.integer_conversion import convert_string_to_int from slither.visitors.expression.expression import ExpressionVisitor @@ -77,9 +78,9 @@ class ConstantFolding(ExpressionVisitor): raise NotConstant def _post_literal(self, expression): - if expression.value.isdigit(): - set_val(expression, int(expression.value)) - else: + try: + set_val(expression, Decimal(expression.value)) + except InvalidOperation: raise NotConstant def _post_assignement_operation(self, expression): From 036f7d62f418ce55fd845df1ef8fbf472314a6ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Sun, 18 Sep 2022 10:56:34 -0300 Subject: [PATCH 31/87] Replace Decimal with Fraction Fractions are arbitrary-precision and will not cause truncated values. --- slither/slithir/variables/constant.py | 4 ++-- slither/utils/__init__.py | 3 --- slither/utils/arithmetic.py | 12 +++--------- slither/utils/integer_conversion.py | 10 +++++----- slither/visitors/expression/constants_folding.py | 6 +++--- 5 files changed, 13 insertions(+), 22 deletions(-) diff --git a/slither/slithir/variables/constant.py b/slither/slithir/variables/constant.py index 09a5ee34f..52cabf701 100644 --- a/slither/slithir/variables/constant.py +++ b/slither/slithir/variables/constant.py @@ -1,4 +1,4 @@ -from decimal import Decimal +from fractions import Fraction from functools import total_ordering from slither.core.solidity_types.elementary_type import ElementaryType, Int, Uint @@ -33,7 +33,7 @@ class Constant(SlithIRVariable): else: if val.isdigit(): self._type = ElementaryType("uint256") - self._val = int(Decimal(val)) + self._val = int(Fraction(val)) else: self._type = ElementaryType("string") self._val = val diff --git a/slither/utils/__init__.py b/slither/utils/__init__.py index 86427ca2e..e69de29bb 100644 --- a/slither/utils/__init__.py +++ b/slither/utils/__init__.py @@ -1,3 +0,0 @@ -from slither.utils.arithmetic import configure_decimal_precision - -configure_decimal_precision() \ No newline at end of file diff --git a/slither/utils/arithmetic.py b/slither/utils/arithmetic.py index 83c5be544..69684d103 100644 --- a/slither/utils/arithmetic.py +++ b/slither/utils/arithmetic.py @@ -1,13 +1,7 @@ -from decimal import Decimal, getcontext +from fractions import Fraction from slither.exceptions import SlitherException -def configure_decimal_precision(): - # Configure decimal precision high enough for 2 ** 256 - # Otherwise, large constant arithmetic may get truncated - if getcontext().prec < 80: - getcontext().prec = 80 - # pylint: disable=too-many-branches def convert_subdenomination( value: str, sub: str @@ -15,9 +9,9 @@ def convert_subdenomination( # to allow 0.1 ether conversion if value[0:2] == "0x": - decimal_value = Decimal(int(value, 16)) + decimal_value = Fraction(int(value, 16)) else: - decimal_value = Decimal(value) + decimal_value = Fraction(value) if sub == "wei": return int(decimal_value) if sub == "gwei": diff --git a/slither/utils/integer_conversion.py b/slither/utils/integer_conversion.py index 8481e8641..a410a956b 100644 --- a/slither/utils/integer_conversion.py +++ b/slither/utils/integer_conversion.py @@ -1,4 +1,4 @@ -from decimal import Decimal +from fractions import Fraction from typing import Union from slither.exceptions import SlitherError @@ -12,17 +12,17 @@ def convert_string_to_int(val: Union[str, int]) -> int: if "e" in val or "E" in val: base, expo = val.split("e") if "e" in val else val.split("E") - base, expo = Decimal(base), int(expo) + base, expo = Fraction(base), int(expo) # The resulting number must be < 2**256-1, otherwise solc # Would not be able to compile it # 10**77 is the largest exponent that fits # See https://github.com/ethereum/solidity/blob/9e61f92bd4d19b430cb8cb26f1c7cf79f1dff380/libsolidity/ast/Types.cpp#L1281-L1290 if expo > 77: - if base != Decimal(0): + if base != Fraction(0): raise SlitherError( 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(Fraction(base) * Fraction(10**expo)) - return int(Decimal(val)) + return int(Fraction(val)) diff --git a/slither/visitors/expression/constants_folding.py b/slither/visitors/expression/constants_folding.py index 27ff9b592..2da1d7304 100644 --- a/slither/visitors/expression/constants_folding.py +++ b/slither/visitors/expression/constants_folding.py @@ -1,4 +1,4 @@ -from decimal import Decimal, InvalidOperation +from fractions import Fraction from slither.core.expressions import BinaryOperationType, Literal, UnaryOperationType from slither.utils.integer_conversion import convert_string_to_int from slither.visitors.expression.expression import ExpressionVisitor @@ -79,8 +79,8 @@ class ConstantFolding(ExpressionVisitor): def _post_literal(self, expression): try: - set_val(expression, Decimal(expression.value)) - except InvalidOperation: + set_val(expression, Fraction(expression.value)) + except ValueError: raise NotConstant def _post_assignement_operation(self, expression): From ce801942abf9dc84da9a19a88dbed8bb4f93a87c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Sun, 18 Sep 2022 11:47:04 -0300 Subject: [PATCH 32/87] Unify parsing of integers with convert_string_to_int/fraction --- slither/slithir/variables/constant.py | 3 +- slither/utils/arithmetic.py | 29 +++++++++---------- slither/utils/integer_conversion.py | 16 ++++++---- .../visitors/expression/constants_folding.py | 9 +++--- 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/slither/slithir/variables/constant.py b/slither/slithir/variables/constant.py index 52cabf701..5da2d9cc0 100644 --- a/slither/slithir/variables/constant.py +++ b/slither/slithir/variables/constant.py @@ -1,4 +1,3 @@ -from fractions import Fraction from functools import total_ordering from slither.core.solidity_types.elementary_type import ElementaryType, Int, Uint @@ -33,7 +32,7 @@ class Constant(SlithIRVariable): else: if val.isdigit(): self._type = ElementaryType("uint256") - self._val = int(Fraction(val)) + self._val = convert_string_to_int(val) else: self._type = ElementaryType("string") self._val = val diff --git a/slither/utils/arithmetic.py b/slither/utils/arithmetic.py index 69684d103..d14958541 100644 --- a/slither/utils/arithmetic.py +++ b/slither/utils/arithmetic.py @@ -1,38 +1,35 @@ from fractions import Fraction from slither.exceptions import SlitherException +from slither.utils.integer_conversion import convert_string_to_int # pylint: disable=too-many-branches def convert_subdenomination( value: str, sub: str ) -> int: # pylint: disable=too-many-return-statements - # to allow 0.1 ether conversion - if value[0:2] == "0x": - decimal_value = Fraction(int(value, 16)) - else: - decimal_value = Fraction(value) + decimal_value = convert_string_to_int(value) if sub == "wei": - return int(decimal_value) + return decimal_value if sub == "gwei": - return int(decimal_value * int(1e9)) + return decimal_value * 1e9 if sub == "szabo": - return int(decimal_value * int(1e12)) + return decimal_value * 1e12 if sub == "finney": - return int(decimal_value * int(1e15)) + return decimal_value * 1e15 if sub == "ether": - return int(decimal_value * int(1e18)) + return decimal_value * 1e18 if sub == "seconds": - return int(decimal_value) + return decimal_value if sub == "minutes": - return int(decimal_value * 60) + return decimal_value * 60 if sub == "hours": - return int(decimal_value * 60 * 60) + return decimal_value * 60 * 60 if sub == "days": - return int(decimal_value * 60 * 60 * 24) + return decimal_value * 60 * 60 * 24 if sub == "weeks": - return int(decimal_value * 60 * 60 * 24 * 7) + return decimal_value * 60 * 60 * 24 * 7 if sub == "years": - return int(decimal_value * 60 * 60 * 24 * 7 * 365) + return decimal_value * 60 * 60 * 24 * 7 * 365 raise SlitherException(f"Subdemonination conversion impossible {decimal_value} {sub}") diff --git a/slither/utils/integer_conversion.py b/slither/utils/integer_conversion.py index a410a956b..b7e2e98ff 100644 --- a/slither/utils/integer_conversion.py +++ b/slither/utils/integer_conversion.py @@ -4,11 +4,14 @@ from typing import Union from slither.exceptions import SlitherError -def convert_string_to_int(val: Union[str, int]) -> int: +def convert_string_to_fraction(val: Union[str, int]) -> Fraction: if isinstance(val, int): - return val + return Fraction(val) if val.startswith(("0x", "0X")): - return int(val, 16) + return Fraction(int(val, 16)) + + # Fractions do not support underscore separators (on Python <3.11) + val = val.replace('_', '') if "e" in val or "E" in val: base, expo = val.split("e") if "e" in val else val.split("E") @@ -23,6 +26,9 @@ 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(Fraction(base) * Fraction(10**expo)) + return Fraction(base) * Fraction(10**expo) - return int(Fraction(val)) + return Fraction(val) + +def convert_string_to_int(val: Union[str, int]) -> int: + return int(convert_string_to_fraction(val)) diff --git a/slither/visitors/expression/constants_folding.py b/slither/visitors/expression/constants_folding.py index 2da1d7304..34ab34ffd 100644 --- a/slither/visitors/expression/constants_folding.py +++ b/slither/visitors/expression/constants_folding.py @@ -1,6 +1,5 @@ -from fractions import Fraction from slither.core.expressions import BinaryOperationType, Literal, UnaryOperationType -from slither.utils.integer_conversion import convert_string_to_int +from slither.utils.integer_conversion import convert_string_to_fraction, convert_string_to_int from slither.visitors.expression.expression import ExpressionVisitor @@ -73,13 +72,13 @@ class ConstantFolding(ExpressionVisitor): cf = ConstantFolding(expr, self._type) expr = cf.result() assert isinstance(expr, Literal) - set_val(expression, int(expr.value)) + set_val(expression, -convert_string_to_fraction(expr.value)) else: raise NotConstant def _post_literal(self, expression): try: - set_val(expression, Fraction(expression.value)) + set_val(expression, convert_string_to_fraction(expression.value)) except ValueError: raise NotConstant @@ -116,7 +115,7 @@ class ConstantFolding(ExpressionVisitor): cf = ConstantFolding(expression.expressions[0], self._type) expr = cf.result() assert isinstance(expr, Literal) - set_val(expression, int(expr.value)) + set_val(expression, convert_string_to_fraction(expr.value)) return raise NotConstant From 2879514f23ad058abb0bd3c42259507eb06ba4b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Sun, 18 Sep 2022 11:48:31 -0300 Subject: [PATCH 33/87] Add tests for large and negative constants --- tests/constant_folding_rational.sol | 2 ++ tests/test_constant_folding.py | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/tests/constant_folding_rational.sol b/tests/constant_folding_rational.sol index 36c44fb35..193133824 100644 --- a/tests/constant_folding_rational.sol +++ b/tests/constant_folding_rational.sol @@ -4,4 +4,6 @@ contract C { int64 constant c = 5 * 0.5 + 0.5; int256 d = 1e3 + 5E2; uint256 e = 2 ** 255; + uint256 f = 115792089237316195423570985008687907853269984665640564039457584_007_913_129_639_935; + int64 constant g = -7.0; } \ No newline at end of file diff --git a/tests/test_constant_folding.py b/tests/test_constant_folding.py index 8a7f882af..2106c5fa6 100644 --- a/tests/test_constant_folding.py +++ b/tests/test_constant_folding.py @@ -27,4 +27,12 @@ def test_constant_folding_rational(): variable_e = contract.get_state_variable_from_name("e") assert str(variable_e.type) == "uint256" - assert str(ConstantFolding(variable_e.expression, "uint256").result()) == "57896044618658097711785492504343953926634992332820282019728792003956564819968" \ No newline at end of file + assert str(ConstantFolding(variable_e.expression, "uint256").result()) == "57896044618658097711785492504343953926634992332820282019728792003956564819968" + + variable_f = contract.get_state_variable_from_name("f") + assert str(variable_f.type) == "uint256" + assert str(ConstantFolding(variable_f.expression, "uint256").result()) == "115792089237316195423570985008687907853269984665640564039457584007913129639935" + + variable_g = contract.get_state_variable_from_name("g") + assert str(variable_g.type) == "int64" + assert str(ConstantFolding(variable_g.expression, "int64").result()) == "-7" From 237bb535918b524ae20b14b0b1f31aebd5e6b09f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Sun, 18 Sep 2022 12:08:45 -0300 Subject: [PATCH 34/87] Fix non-numeric literals --- slither/core/expressions/literal.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/slither/core/expressions/literal.py b/slither/core/expressions/literal.py index d8bb59077..26081c72c 100644 --- a/slither/core/expressions/literal.py +++ b/slither/core/expressions/literal.py @@ -1,6 +1,7 @@ from typing import Optional, Union, TYPE_CHECKING from slither.core.expressions.expression import Expression +from slither.core.solidity_types.elementary_type import Byte, Fixed, Int, Ufixed, Uint from slither.utils.arithmetic import convert_subdenomination from slither.utils.integer_conversion import convert_string_to_int @@ -30,7 +31,11 @@ class Literal(Expression): def __str__(self): if self.subdenomination: return str(convert_subdenomination(self._value, self.subdenomination)) - return str(convert_string_to_int(self._value)) + elif self.type in Int + Uint + Fixed + Ufixed + ["address"]: + return str(convert_string_to_int(self._value)) + + # be sure to handle any character + return str(self._value) def __eq__(self, other): if not isinstance(other, Literal): From e7e411ba0edaa342ad2dbc6618ed96ad6e78c309 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Sun, 18 Sep 2022 12:50:52 -0300 Subject: [PATCH 35/87] Fix detector output Floats were being used by mistake, so the output ended up being in scientific notation. --- slither/core/expressions/literal.py | 2 +- slither/utils/arithmetic.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/slither/core/expressions/literal.py b/slither/core/expressions/literal.py index 26081c72c..289cb8958 100644 --- a/slither/core/expressions/literal.py +++ b/slither/core/expressions/literal.py @@ -1,7 +1,7 @@ from typing import Optional, Union, TYPE_CHECKING from slither.core.expressions.expression import Expression -from slither.core.solidity_types.elementary_type import Byte, Fixed, Int, Ufixed, Uint +from slither.core.solidity_types.elementary_type import Fixed, Int, Ufixed, Uint from slither.utils.arithmetic import convert_subdenomination from slither.utils.integer_conversion import convert_string_to_int diff --git a/slither/utils/arithmetic.py b/slither/utils/arithmetic.py index d14958541..cc88a5898 100644 --- a/slither/utils/arithmetic.py +++ b/slither/utils/arithmetic.py @@ -12,13 +12,13 @@ def convert_subdenomination( if sub == "wei": return decimal_value if sub == "gwei": - return decimal_value * 1e9 + return decimal_value * int(1e9) if sub == "szabo": - return decimal_value * 1e12 + return decimal_value * int(1e12) if sub == "finney": - return decimal_value * 1e15 + return decimal_value * int(1e15) if sub == "ether": - return decimal_value * 1e18 + return decimal_value * int(1e18) if sub == "seconds": return decimal_value if sub == "minutes": From 3112f157cad5cd5964468766f430105be1714b8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Sun, 18 Sep 2022 12:57:49 -0300 Subject: [PATCH 36/87] Fix test reference in CI --- .github/workflows/features.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/features.yml b/.github/workflows/features.yml index 7414e9ebe..49db14793 100644 --- a/.github/workflows/features.yml +++ b/.github/workflows/features.yml @@ -45,7 +45,7 @@ jobs: - name: Test with pytest run: | pytest tests/test_features.py - pytest tests/test_constant_folding_unary.py + pytest tests/test_constant_folding.py pytest tests/slithir/test_ternary_expressions.py pytest tests/test_functions_ids.py pytest tests/test_function.py From d47dd66579279c37a1012742f4720daef7028ccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Sun, 18 Sep 2022 16:32:20 -0300 Subject: [PATCH 37/87] Fix linting errors --- slither/core/expressions/literal.py | 3 ++- slither/utils/arithmetic.py | 2 -- slither/utils/integer_conversion.py | 3 ++- slither/visitors/expression/constants_folding.py | 4 ++-- tests/test_constant_folding.py | 11 +++++++++-- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/slither/core/expressions/literal.py b/slither/core/expressions/literal.py index 289cb8958..87090b93f 100644 --- a/slither/core/expressions/literal.py +++ b/slither/core/expressions/literal.py @@ -31,7 +31,8 @@ class Literal(Expression): def __str__(self): if self.subdenomination: return str(convert_subdenomination(self._value, self.subdenomination)) - elif self.type in Int + Uint + Fixed + Ufixed + ["address"]: + + if self.type in Int + Uint + Fixed + Ufixed + ["address"]: return str(convert_string_to_int(self._value)) # be sure to handle any character diff --git a/slither/utils/arithmetic.py b/slither/utils/arithmetic.py index cc88a5898..de0ff69e9 100644 --- a/slither/utils/arithmetic.py +++ b/slither/utils/arithmetic.py @@ -1,5 +1,3 @@ -from fractions import Fraction - from slither.exceptions import SlitherException from slither.utils.integer_conversion import convert_string_to_int diff --git a/slither/utils/integer_conversion.py b/slither/utils/integer_conversion.py index b7e2e98ff..e4dff333c 100644 --- a/slither/utils/integer_conversion.py +++ b/slither/utils/integer_conversion.py @@ -11,7 +11,7 @@ def convert_string_to_fraction(val: Union[str, int]) -> Fraction: return Fraction(int(val, 16)) # Fractions do not support underscore separators (on Python <3.11) - val = val.replace('_', '') + val = val.replace("_", "") if "e" in val or "E" in val: base, expo = val.split("e") if "e" in val else val.split("E") @@ -30,5 +30,6 @@ def convert_string_to_fraction(val: Union[str, int]) -> Fraction: return Fraction(val) + def convert_string_to_int(val: Union[str, int]) -> int: return int(convert_string_to_fraction(val)) diff --git a/slither/visitors/expression/constants_folding.py b/slither/visitors/expression/constants_folding.py index 34ab34ffd..b324ed842 100644 --- a/slither/visitors/expression/constants_folding.py +++ b/slither/visitors/expression/constants_folding.py @@ -79,8 +79,8 @@ class ConstantFolding(ExpressionVisitor): def _post_literal(self, expression): try: set_val(expression, convert_string_to_fraction(expression.value)) - except ValueError: - raise NotConstant + except ValueError as e: + raise NotConstant from e def _post_assignement_operation(self, expression): raise NotConstant diff --git a/tests/test_constant_folding.py b/tests/test_constant_folding.py index 2106c5fa6..efc3119a8 100644 --- a/tests/test_constant_folding.py +++ b/tests/test_constant_folding.py @@ -5,6 +5,7 @@ from slither.visitors.expression.constants_folding import ConstantFolding def test_constant_folding_unary(): Slither("./tests/constant_folding_unary.sol") + def test_constant_folding_rational(): s = Slither("./tests/constant_folding_rational.sol") contract = s.get_contract_from_name("C")[0] @@ -27,11 +28,17 @@ def test_constant_folding_rational(): variable_e = contract.get_state_variable_from_name("e") assert str(variable_e.type) == "uint256" - assert str(ConstantFolding(variable_e.expression, "uint256").result()) == "57896044618658097711785492504343953926634992332820282019728792003956564819968" + assert ( + str(ConstantFolding(variable_e.expression, "uint256").result()) + == "57896044618658097711785492504343953926634992332820282019728792003956564819968" + ) variable_f = contract.get_state_variable_from_name("f") assert str(variable_f.type) == "uint256" - assert str(ConstantFolding(variable_f.expression, "uint256").result()) == "115792089237316195423570985008687907853269984665640564039457584007913129639935" + assert ( + str(ConstantFolding(variable_f.expression, "uint256").result()) + == "115792089237316195423570985008687907853269984665640564039457584007913129639935" + ) variable_g = contract.get_state_variable_from_name("g") assert str(variable_g.type) == "int64" From c09aa50c18803bcc9d7199f1dfb7e5a7687a985f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Mon, 19 Sep 2022 15:49:08 -0300 Subject: [PATCH 38/87] Fix early truncation If we cast to int too early, we may lose precision (e.g. "0.1 ether") --- slither/utils/arithmetic.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/slither/utils/arithmetic.py b/slither/utils/arithmetic.py index de0ff69e9..18ffaec51 100644 --- a/slither/utils/arithmetic.py +++ b/slither/utils/arithmetic.py @@ -1,33 +1,33 @@ from slither.exceptions import SlitherException -from slither.utils.integer_conversion import convert_string_to_int +from slither.utils.integer_conversion import convert_string_to_fraction # pylint: disable=too-many-branches def convert_subdenomination( value: str, sub: str ) -> int: # pylint: disable=too-many-return-statements - decimal_value = convert_string_to_int(value) + decimal_value = convert_string_to_fraction(value) if sub == "wei": - return decimal_value + return int(decimal_value) if sub == "gwei": - return decimal_value * int(1e9) + return int(decimal_value * int(1e9)) if sub == "szabo": - return decimal_value * int(1e12) + return int(decimal_value * int(1e12)) if sub == "finney": - return decimal_value * int(1e15) + return int(decimal_value * int(1e15)) if sub == "ether": - return decimal_value * int(1e18) + return int(decimal_value * int(1e18)) if sub == "seconds": - return decimal_value + return int(decimal_value) if sub == "minutes": - return decimal_value * 60 + return int(decimal_value * 60) if sub == "hours": - return decimal_value * 60 * 60 + return int(decimal_value * 60 * 60) if sub == "days": - return decimal_value * 60 * 60 * 24 + return int(decimal_value * 60 * 60 * 24) if sub == "weeks": - return decimal_value * 60 * 60 * 24 * 7 + return int(decimal_value * 60 * 60 * 24 * 7) if sub == "years": - return decimal_value * 60 * 60 * 24 * 7 * 365 + return int(decimal_value * 60 * 60 * 24 * 7 * 365) raise SlitherException(f"Subdemonination conversion impossible {decimal_value} {sub}") From f6de01afb1583cc238131f9d6d36b9cfedda5869 Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Mon, 26 Sep 2022 15:02:30 +0200 Subject: [PATCH 39/87] Update tests/test_path_filtering/slither.config.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Emilio López <2642849+elopez@users.noreply.github.com> --- tests/test_path_filtering/slither.config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_path_filtering/slither.config.json b/tests/test_path_filtering/slither.config.json index 27d607bde..95aac92b0 100644 --- a/tests/test_path_filtering/slither.config.json +++ b/tests/test_path_filtering/slither.config.json @@ -2,6 +2,6 @@ "detectors_to_run": "all", "exclude_informational": true, "exclude_low": true, - "ignore_return_value": true, + "fail_pedantic": false, "filter_paths": "libs|src/ReentrancyMock.sol" } From f78798292227be3fe8d1c5c1ed2b79a9ed5ac9af Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Mon, 26 Sep 2022 15:02:46 +0200 Subject: [PATCH 40/87] Update scripts/ci_test_path_filtering.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Emilio López <2642849+elopez@users.noreply.github.com> --- scripts/ci_test_path_filtering.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ci_test_path_filtering.sh b/scripts/ci_test_path_filtering.sh index 0ad13e8c2..92f87b2a1 100644 --- a/scripts/ci_test_path_filtering.sh +++ b/scripts/ci_test_path_filtering.sh @@ -2,7 +2,7 @@ ### Test path filtering across POSIX and Windows -slither "tests/test_path_filtering/test_path_filtering.sol" --config "tests/test_path_filtering/slither.config.json" --json "output.json" > "output.txt" 2>&1 +slither "tests/test_path_filtering/test_path_filtering.sol" --config "tests/test_path_filtering/slither.config.json" > "output.txt" 2>&1 if ! grep -q "0 result(s) found" "output.txt" then From b1ed6b3ad8d472ce872a85485fd06e0037dd63da Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Mon, 26 Sep 2022 16:21:47 +0200 Subject: [PATCH 41/87] use solc 0.8.0 for path filtering test Signed-off-by: Pascal Marco Caversaccio --- scripts/ci_test_path_filtering.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/ci_test_path_filtering.sh b/scripts/ci_test_path_filtering.sh index 92f87b2a1..fb2a18842 100644 --- a/scripts/ci_test_path_filtering.sh +++ b/scripts/ci_test_path_filtering.sh @@ -2,6 +2,7 @@ ### Test path filtering across POSIX and Windows +solc-select use 0.8.0 slither "tests/test_path_filtering/test_path_filtering.sol" --config "tests/test_path_filtering/slither.config.json" > "output.txt" 2>&1 if ! grep -q "0 result(s) found" "output.txt" From 7e6ccbb58d4b403cb1f04d58dfb370d21e0beee4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Mon, 26 Sep 2022 13:08:06 -0300 Subject: [PATCH 42/87] Initial slither-doctor structure --- setup.py | 1 + slither/tools/doctor/README.md | 3 +++ slither/tools/doctor/__init__.py | 0 slither/tools/doctor/__main__.py | 46 ++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+) create mode 100644 slither/tools/doctor/README.md create mode 100644 slither/tools/doctor/__init__.py create mode 100644 slither/tools/doctor/__main__.py diff --git a/setup.py b/setup.py index 4b0c5e8e0..608bed3ea 100644 --- a/setup.py +++ b/setup.py @@ -45,6 +45,7 @@ setup( "slither-prop = slither.tools.properties.__main__:main", "slither-mutate = slither.tools.mutator.__main__:main", "slither-read-storage = slither.tools.read_storage.__main__:main", + "slither-doctor = slither.tools.doctor.__main__:main", ] }, ) diff --git a/slither/tools/doctor/README.md b/slither/tools/doctor/README.md new file mode 100644 index 000000000..ce724f109 --- /dev/null +++ b/slither/tools/doctor/README.md @@ -0,0 +1,3 @@ +# Slither doctor + +Slither doctor is a tool designed to troubleshoot running Slither on a project. \ No newline at end of file diff --git a/slither/tools/doctor/__init__.py b/slither/tools/doctor/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/slither/tools/doctor/__main__.py b/slither/tools/doctor/__main__.py new file mode 100644 index 000000000..25d764d47 --- /dev/null +++ b/slither/tools/doctor/__main__.py @@ -0,0 +1,46 @@ +import argparse +import logging + +from crytic_compile import cryticparser + + +logging.basicConfig() +logging.getLogger("Slither").setLevel(logging.INFO) + +logger = logging.getLogger("Slither-doctor") +logger.setLevel(logging.INFO) + +ch = logging.StreamHandler() +ch.setLevel(logging.INFO) +formatter = logging.Formatter("%(message)s") +logger.addHandler(ch) +logger.handlers[0].setFormatter(formatter) +logger.propagate = False + + +def parse_args(): + """ + Parse the underlying arguments for the program. + :return: Returns the arguments for the program. + """ + parser = argparse.ArgumentParser( + description="Troubleshoot running Slither on your project", + usage="slither-doctor project", + ) + + parser.add_argument("project", help="The codebase to be tested.") + + # Add default arguments from crytic-compile + cryticparser.init(parser) + + return parser.parse_args() + + +def main(): + args = parse_args() + + print("Hello world") + + +if __name__ == "__main__": + main() From de1b7618b7624d792410b4486fd96cb5ee5aa68c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Mon, 26 Sep 2022 13:46:00 -0300 Subject: [PATCH 43/87] Platform detection check --- slither/tools/doctor/__main__.py | 65 ++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 16 deletions(-) diff --git a/slither/tools/doctor/__main__.py b/slither/tools/doctor/__main__.py index 25d764d47..410fabd33 100644 --- a/slither/tools/doctor/__main__.py +++ b/slither/tools/doctor/__main__.py @@ -1,21 +1,9 @@ import argparse -import logging +from pathlib import Path from crytic_compile import cryticparser - - -logging.basicConfig() -logging.getLogger("Slither").setLevel(logging.INFO) - -logger = logging.getLogger("Slither-doctor") -logger.setLevel(logging.INFO) - -ch = logging.StreamHandler() -ch.setLevel(logging.INFO) -formatter = logging.Formatter("%(message)s") -logger.addHandler(ch) -logger.handlers[0].setFormatter(formatter) -logger.propagate = False +import crytic_compile.crytic_compile as crytic_compile +from slither.utils.colors import red, yellow, green def parse_args(): @@ -36,10 +24,55 @@ def parse_args(): return parser.parse_args() +def detect_platform(project: str, **kwargs): + print("## Project platform") + print() + + path = Path(project) + if path.is_file(): + print( + yellow( + f"{project!r} is a file. Using it as target will manually compile your code with solc and _not_ use a compilation framework. Is that what you meant to do?" + ) + ) + return + + print(f"Trying to detect project type for {project!r}") + + supported_platforms = crytic_compile.get_platforms() + skip_platforms = {"solc", "solc-json", "archive", "standard", "etherscan"} + detected_platforms = { + platform.NAME: platform.is_supported(project, **kwargs) + for platform in supported_platforms + if platform.NAME.lower() not in skip_platforms + } + platform_qty = len([platform for platform, state in detected_platforms.items() if state]) + + print("Is this project using...") + for platform, state in detected_platforms.items(): + print(f" => {platform + '?':<15}{state and green('Yes') or red('No')}") + print() + + if platform_qty == 0: + print(red("No platform was detected! This doesn't sound right.")) + print( + yellow( + "Are you trying to analyze a folder with standalone solidity files, without using a compilation framework? If that's the case, then this is okay." + ) + ) + elif platform_qty > 1: + print(red("More than one platform was detected! This doesn't sound right.")) + print(red("Please use `--compile-force-framework` in Slither to force the correct framework.")) + else: + print(green("A single platform was detected."), yellow("Is it the one you expected?")) + + def main(): args = parse_args() - print("Hello world") + detect_platform(args.project) + + # TODO other checks if __name__ == "__main__": From a97085e8ad61d39096693728b6480b7b06785de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Mon, 26 Sep 2022 14:20:53 -0300 Subject: [PATCH 44/87] Compilation check --- slither/tools/doctor/__main__.py | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/slither/tools/doctor/__main__.py b/slither/tools/doctor/__main__.py index 410fabd33..74f854672 100644 --- a/slither/tools/doctor/__main__.py +++ b/slither/tools/doctor/__main__.py @@ -1,4 +1,5 @@ import argparse +import logging from pathlib import Path from crytic_compile import cryticparser @@ -62,15 +63,39 @@ def detect_platform(project: str, **kwargs): ) elif platform_qty > 1: print(red("More than one platform was detected! This doesn't sound right.")) - print(red("Please use `--compile-force-framework` in Slither to force the correct framework.")) + print( + red("Please use `--compile-force-framework` in Slither to force the correct framework.") + ) else: print(green("A single platform was detected."), yellow("Is it the one you expected?")) + print(end="\n\n") + + +def compile_project(project: str, **kwargs): + print("## Project compilation") + print() + + print("Invoking crytic-compile on the project, please wait...") + + try: + crytic_compile.CryticCompile(project, **kwargs) + except Exception as e: + print(red("Project compilation failed :( The following error was generated:"), end="\n\n") + print(yellow("---- snip 8< ----")) + logging.exception(e) + print(yellow("---- >8 snip ----")) + + print(end="\n\n") + def main(): args = parse_args() - detect_platform(args.project) + kwargs = vars(args) + + detect_platform(**kwargs) + compile_project(**kwargs) # TODO other checks From 531b75572f9b9943bc574f2fbe9a540c91c403d2 Mon Sep 17 00:00:00 2001 From: bohendo Date: Mon, 26 Sep 2022 15:58:46 -0400 Subject: [PATCH 45/87] add block arg to slither-read-storage --- slither/tools/read_storage/README.md | 1 + slither/tools/read_storage/__main__.py | 12 ++++++++++++ slither/tools/read_storage/read_storage.py | 4 ++-- slither/tools/read_storage/utils/utils.py | 5 +++-- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/slither/tools/read_storage/README.md b/slither/tools/read_storage/README.md index 91491a364..f8d4cc466 100644 --- a/slither/tools/read_storage/README.md +++ b/slither/tools/read_storage/README.md @@ -21,6 +21,7 @@ optional arguments: --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. + --block BLOCK_NUMBER Block number to retrieve storage from (requires archive rpc node) ``` ### Examples diff --git a/slither/tools/read_storage/__main__.py b/slither/tools/read_storage/__main__.py index f3cc90efc..b10a74a1e 100644 --- a/slither/tools/read_storage/__main__.py +++ b/slither/tools/read_storage/__main__.py @@ -98,6 +98,12 @@ def parse_args() -> argparse.Namespace: parser.add_argument("--max-depth", help="Max depth to search in data structure.", default=20) + parser.add_argument( + "--block", + help="The block number to read storage from. Requires an archive node to be provided as the RPC url.", + default="latest", + ) + cryticparser.init(parser) return parser.parse_args() @@ -122,6 +128,12 @@ def main() -> None: srs = SlitherReadStorage(contracts, args.max_depth) + if args.block: + try: + srs.block = int(args.block) + except ValueError: + srs.block = str(args.block) + if args.rpc_url: # Remove target prefix e.g. rinkeby:0x0 -> 0x0. address = target[target.find(":") + 1 :] diff --git a/slither/tools/read_storage/read_storage.py b/slither/tools/read_storage/read_storage.py index c9523f733..e7ace41fb 100644 --- a/slither/tools/read_storage/read_storage.py +++ b/slither/tools/read_storage/read_storage.py @@ -231,7 +231,7 @@ class SlitherReadStorage: :param slot_info: """ hex_bytes = get_storage_data( - self.web3, self.checksum_address, int.to_bytes(slot_info.slot, 32, byteorder="big") + self.web3, self.checksum_address, int.to_bytes(slot_info.slot, 32, byteorder="big"), self.block ) slot_info.value = self.convert_value_to_type( hex_bytes, slot_info.size, slot_info.offset, slot_info.type_string @@ -609,7 +609,7 @@ class SlitherReadStorage: # Convert from hexadecimal to decimal. val = int( get_storage_data( - self.web3, self.checksum_address, int.to_bytes(slot, 32, byteorder="big") + self.web3, self.checksum_address, int.to_bytes(slot, 32, byteorder="big"), self.block ).hex(), 16, ) diff --git a/slither/tools/read_storage/utils/utils.py b/slither/tools/read_storage/utils/utils.py index db2052286..bb354eea4 100644 --- a/slither/tools/read_storage/utils/utils.py +++ b/slither/tools/read_storage/utils/utils.py @@ -55,16 +55,17 @@ def coerce_type( return value.hex() -def get_storage_data(web3, checksum_address: ChecksumAddress, slot: bytes) -> bytes: +def get_storage_data(web3, checksum_address: ChecksumAddress, slot: bytes, block: Union[int, str]) -> bytes: """ 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. + block (optional int|str): The block number to retrieve data from Returns: (HexBytes): The slot's storage data. """ - return bytes(web3.eth.get_storage_at(checksum_address, slot)).rjust( + return bytes(web3.eth.get_storage_at(checksum_address, slot, block)).rjust( 32, bytes(1) ) # pad to 32 bytes From 4d3e5f6cc7060debcea1081a5e946e25a1094449 Mon Sep 17 00:00:00 2001 From: bohendo Date: Mon, 26 Sep 2022 17:32:19 -0400 Subject: [PATCH 46/87] update readme & usage message to reference up-to-date flags --- slither/tools/read_storage/README.md | 10 +++++----- slither/tools/read_storage/__main__.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/slither/tools/read_storage/README.md b/slither/tools/read_storage/README.md index 91491a364..82381c527 100644 --- a/slither/tools/read_storage/README.md +++ b/slither/tools/read_storage/README.md @@ -18,7 +18,7 @@ optional arguments: --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. + --json FILE Write the entire storage layout in JSON format to the specified FILE --value Toggle used to include values in output. --max-depth MAX_DEPTH Max depth to search in data structure. ``` @@ -28,19 +28,19 @@ optional arguments: Retrieve the storage slots of a local contract: ```shell -slither-read-storage file.sol 0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 --layout +slither-read-storage file.sol 0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 --json storage_layout.json ``` Retrieve the storage slots of a contract verified on an Etherscan-like platform: ```shell -slither-read-storage 0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 --layout +slither-read-storage 0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 --json storage_layout.json ``` To retrieve the values as well, pass `--value` and `--rpc-url $RPC_URL`: ```shell -slither-read-storage 0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 --layout --rpc-url $RPC_URL --value +slither-read-storage 0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 --json storage_layout.json --rpc-url $RPC_URL --value ``` To view only the slot of the `slot0` structure variable, pass `--variable-name slot0`: @@ -79,7 +79,7 @@ slither-read-storage 0xa2327a938Febf5FEC13baCFb16Ae10EcBc4cbDCF --variable-name Take Avalanche, for instance: ```shell - slither-read-storage avax:0x0000000000000000000000000000000000000000 --layout --value --rpc-url $AVAX_RPC_URL + slither-read-storage avax:0x0000000000000000000000000000000000000000 --json storage_layout.json --value --rpc-url $AVAX_RPC_URL ``` ## Limitations diff --git a/slither/tools/read_storage/__main__.py b/slither/tools/read_storage/__main__.py index f3cc90efc..c899b9eb7 100644 --- a/slither/tools/read_storage/__main__.py +++ b/slither/tools/read_storage/__main__.py @@ -21,9 +21,9 @@ def parse_args() -> argparse.Namespace: "\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" + + "\tslither-read-storage $TARGET address --contract-name $NAME --json storage_layout.json\n" + "To retrieve a contract's storage layout and values:\n" - + "\tslither-read-storage $TARGET address --contract-name $NAME --layout --value\n" + + "\tslither-read-storage $TARGET address --contract-name $NAME --json storage_layout.json --value\n" + "TARGET can be a contract address or project directory" ), ) From d7396ec62e22d3d501e8d81aeab64d13668d9343 Mon Sep 17 00:00:00 2001 From: bohendo Date: Mon, 26 Sep 2022 17:39:59 -0400 Subject: [PATCH 47/87] run black code reformatter --- slither/tools/read_storage/read_storage.py | 10 ++++++++-- slither/tools/read_storage/utils/utils.py | 4 +++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/slither/tools/read_storage/read_storage.py b/slither/tools/read_storage/read_storage.py index e7ace41fb..f71719c9c 100644 --- a/slither/tools/read_storage/read_storage.py +++ b/slither/tools/read_storage/read_storage.py @@ -231,7 +231,10 @@ class SlitherReadStorage: :param slot_info: """ hex_bytes = get_storage_data( - self.web3, self.checksum_address, int.to_bytes(slot_info.slot, 32, byteorder="big"), self.block + self.web3, + self.checksum_address, + int.to_bytes(slot_info.slot, 32, byteorder="big"), + self.block, ) slot_info.value = self.convert_value_to_type( hex_bytes, slot_info.size, slot_info.offset, slot_info.type_string @@ -609,7 +612,10 @@ class SlitherReadStorage: # Convert from hexadecimal to decimal. val = int( get_storage_data( - self.web3, self.checksum_address, int.to_bytes(slot, 32, byteorder="big"), self.block + self.web3, + self.checksum_address, + int.to_bytes(slot, 32, byteorder="big"), + self.block, ).hex(), 16, ) diff --git a/slither/tools/read_storage/utils/utils.py b/slither/tools/read_storage/utils/utils.py index bb354eea4..3e51e2181 100644 --- a/slither/tools/read_storage/utils/utils.py +++ b/slither/tools/read_storage/utils/utils.py @@ -55,7 +55,9 @@ def coerce_type( return value.hex() -def get_storage_data(web3, checksum_address: ChecksumAddress, slot: bytes, block: Union[int, str]) -> bytes: +def get_storage_data( + web3, checksum_address: ChecksumAddress, slot: bytes, block: Union[int, str] +) -> bytes: """ Retrieves the storage data from the blockchain at target address and slot. Args: From f0c87149f710ed80674e2b5136bb7f6657264054 Mon Sep 17 00:00:00 2001 From: bohendo Date: Mon, 26 Sep 2022 17:51:50 -0400 Subject: [PATCH 48/87] fix test --- .gitignore | 1 + tests/test_read_storage.py | 1 + 2 files changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index fe1019a11..2234f5618 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,7 @@ coverage.xml *.cover .hypothesis/ .vscode/ +storage_layout.json # Translations *.mo *.pot diff --git a/tests/test_read_storage.py b/tests/test_read_storage.py index 67a89dae8..61ebc0653 100644 --- a/tests/test_read_storage.py +++ b/tests/test_read_storage.py @@ -112,6 +112,7 @@ def test_read_storage(web3, ganache) -> None: srs = SlitherReadStorage(contracts, 100) srs.rpc = ganache.provider + srs.block = "latest" srs.storage_address = address srs.get_all_storage_variables() srs.get_storage_layout() From 7261715b0c78ddd426125cda290c28cb3de8cffe Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Tue, 27 Sep 2022 11:55:04 +0200 Subject: [PATCH 49/87] Improve support for virtual modifier --- slither/solc_parsing/declarations/modifier.py | 2 +- .../modifier-0.7.0.sol-0.7.0-compact.zip | Bin 0 -> 1639 bytes .../modifier-0.7.0.sol-0.7.0-legacy.zip | Bin 0 -> 1601 bytes .../modifier-0.7.0.sol-0.7.1-compact.zip | Bin 0 -> 1641 bytes .../modifier-0.7.0.sol-0.7.1-legacy.zip | Bin 0 -> 1602 bytes .../modifier-0.7.0.sol-0.7.2-compact.zip | Bin 0 -> 1640 bytes .../modifier-0.7.0.sol-0.7.2-legacy.zip | Bin 0 -> 1602 bytes .../modifier-0.7.0.sol-0.7.3-compact.zip | Bin 0 -> 1642 bytes .../modifier-0.7.0.sol-0.7.3-legacy.zip | Bin 0 -> 1602 bytes .../modifier-0.7.0.sol-0.7.4-compact.zip | Bin 0 -> 1639 bytes .../modifier-0.7.0.sol-0.7.4-legacy.zip | Bin 0 -> 1603 bytes .../modifier-0.7.0.sol-0.7.5-compact.zip | Bin 0 -> 1642 bytes .../modifier-0.7.0.sol-0.7.5-legacy.zip | Bin 0 -> 1603 bytes .../modifier-0.7.0.sol-0.7.6-compact.zip | Bin 0 -> 1642 bytes .../modifier-0.7.0.sol-0.7.6-legacy.zip | Bin 0 -> 1603 bytes .../modifier-0.7.0.sol-0.8.0-compact.zip | Bin 0 -> 1612 bytes .../modifier-0.7.0.sol-0.8.1-compact.zip | Bin 0 -> 1615 bytes .../modifier-0.7.0.sol-0.8.10-compact.zip | Bin 0 -> 1671 bytes .../modifier-0.7.0.sol-0.8.11-compact.zip | Bin 0 -> 1675 bytes .../modifier-0.7.0.sol-0.8.12-compact.zip | Bin 0 -> 1669 bytes .../modifier-0.7.0.sol-0.8.13-compact.zip | Bin 0 -> 1673 bytes .../modifier-0.7.0.sol-0.8.14-compact.zip | Bin 0 -> 1674 bytes .../modifier-0.7.0.sol-0.8.15-compact.zip | Bin 0 -> 1672 bytes .../modifier-0.7.0.sol-0.8.2-compact.zip | Bin 0 -> 1653 bytes .../modifier-0.7.0.sol-0.8.3-compact.zip | Bin 0 -> 1660 bytes .../modifier-0.7.0.sol-0.8.4-compact.zip | Bin 0 -> 1662 bytes .../modifier-0.7.0.sol-0.8.5-compact.zip | Bin 0 -> 1667 bytes .../modifier-0.7.0.sol-0.8.6-compact.zip | Bin 0 -> 1665 bytes .../modifier-0.7.0.sol-0.8.7-compact.zip | Bin 0 -> 1666 bytes .../modifier-0.7.0.sol-0.8.8-compact.zip | Bin 0 -> 1660 bytes .../modifier-0.7.0.sol-0.8.9-compact.zip | Bin 0 -> 1671 bytes .../modifier-all.sol-0.4.0-compact.zip | Bin 1080 -> 1098 bytes .../compile/modifier-all.sol-0.4.0-legacy.zip | Bin 1081 -> 1094 bytes .../modifier-all.sol-0.4.1-compact.zip | Bin 1084 -> 1093 bytes .../compile/modifier-all.sol-0.4.1-legacy.zip | Bin 1083 -> 1092 bytes .../modifier-all.sol-0.4.10-compact.zip | Bin 1121 -> 1116 bytes .../modifier-all.sol-0.4.10-legacy.zip | Bin 1121 -> 1116 bytes .../modifier-all.sol-0.4.11-compact.zip | Bin 1170 -> 1165 bytes .../modifier-all.sol-0.4.11-legacy.zip | Bin 1170 -> 1165 bytes .../modifier-all.sol-0.4.12-compact.zip | Bin 1265 -> 1265 bytes .../modifier-all.sol-0.4.12-legacy.zip | Bin 1265 -> 1265 bytes .../modifier-all.sol-0.4.13-compact.zip | Bin 1297 -> 1296 bytes .../modifier-all.sol-0.4.13-legacy.zip | Bin 1264 -> 1265 bytes .../modifier-all.sol-0.4.14-compact.zip | Bin 1294 -> 1292 bytes .../modifier-all.sol-0.4.14-legacy.zip | Bin 1262 -> 1261 bytes .../modifier-all.sol-0.4.15-compact.zip | Bin 1294 -> 1292 bytes .../modifier-all.sol-0.4.15-legacy.zip | Bin 1262 -> 1262 bytes .../modifier-all.sol-0.4.16-compact.zip | Bin 1296 -> 1293 bytes .../modifier-all.sol-0.4.16-legacy.zip | Bin 1264 -> 1263 bytes .../modifier-all.sol-0.4.17-compact.zip | Bin 1290 -> 1288 bytes .../modifier-all.sol-0.4.17-legacy.zip | Bin 1258 -> 1257 bytes .../modifier-all.sol-0.4.18-compact.zip | Bin 1289 -> 1286 bytes .../modifier-all.sol-0.4.18-legacy.zip | Bin 1256 -> 1254 bytes .../modifier-all.sol-0.4.19-compact.zip | Bin 1293 -> 1289 bytes .../modifier-all.sol-0.4.19-legacy.zip | Bin 1259 -> 1258 bytes .../modifier-all.sol-0.4.2-compact.zip | Bin 1076 -> 1095 bytes .../compile/modifier-all.sol-0.4.2-legacy.zip | Bin 1081 -> 1093 bytes .../modifier-all.sol-0.4.20-compact.zip | Bin 1292 -> 1289 bytes .../modifier-all.sol-0.4.20-legacy.zip | Bin 1259 -> 1258 bytes .../modifier-all.sol-0.4.21-compact.zip | Bin 1298 -> 1296 bytes .../modifier-all.sol-0.4.21-legacy.zip | Bin 1262 -> 1260 bytes .../modifier-all.sol-0.4.22-compact.zip | Bin 1321 -> 1318 bytes .../modifier-all.sol-0.4.22-legacy.zip | Bin 1286 -> 1283 bytes .../modifier-all.sol-0.4.23-compact.zip | Bin 1320 -> 1317 bytes .../modifier-all.sol-0.4.23-legacy.zip | Bin 1285 -> 1282 bytes .../modifier-all.sol-0.4.24-compact.zip | Bin 1321 -> 1318 bytes .../modifier-all.sol-0.4.24-legacy.zip | Bin 1285 -> 1282 bytes .../modifier-all.sol-0.4.25-compact.zip | Bin 1319 -> 1317 bytes .../modifier-all.sol-0.4.25-legacy.zip | Bin 1284 -> 1281 bytes .../modifier-all.sol-0.4.26-compact.zip | Bin 1321 -> 1318 bytes .../modifier-all.sol-0.4.26-legacy.zip | Bin 1286 -> 1284 bytes .../modifier-all.sol-0.4.3-compact.zip | Bin 1078 -> 1092 bytes .../compile/modifier-all.sol-0.4.3-legacy.zip | Bin 1080 -> 1093 bytes .../modifier-all.sol-0.4.4-compact.zip | Bin 1080 -> 1092 bytes .../compile/modifier-all.sol-0.4.4-legacy.zip | Bin 1083 -> 1092 bytes .../modifier-all.sol-0.4.5-compact.zip | Bin 1084 -> 1096 bytes .../compile/modifier-all.sol-0.4.5-legacy.zip | Bin 1079 -> 1097 bytes .../modifier-all.sol-0.4.6-compact.zip | Bin 1083 -> 1095 bytes .../compile/modifier-all.sol-0.4.6-legacy.zip | Bin 1085 -> 1092 bytes .../modifier-all.sol-0.4.7-compact.zip | Bin 1150 -> 1161 bytes .../compile/modifier-all.sol-0.4.7-legacy.zip | Bin 1154 -> 1159 bytes .../modifier-all.sol-0.4.8-compact.zip | Bin 1149 -> 1166 bytes .../compile/modifier-all.sol-0.4.8-legacy.zip | Bin 1151 -> 1164 bytes .../modifier-all.sol-0.4.9-compact.zip | Bin 1118 -> 1119 bytes .../compile/modifier-all.sol-0.4.9-legacy.zip | Bin 1118 -> 1119 bytes .../modifier-all.sol-0.5.0-compact.zip | Bin 1322 -> 1319 bytes .../compile/modifier-all.sol-0.5.0-legacy.zip | Bin 1286 -> 1284 bytes .../modifier-all.sol-0.5.1-compact.zip | Bin 1317 -> 1314 bytes .../compile/modifier-all.sol-0.5.1-legacy.zip | Bin 1281 -> 1279 bytes .../modifier-all.sol-0.5.10-compact.zip | Bin 1331 -> 1329 bytes .../modifier-all.sol-0.5.10-legacy.zip | Bin 1296 -> 1294 bytes .../modifier-all.sol-0.5.11-compact.zip | Bin 1333 -> 1330 bytes .../modifier-all.sol-0.5.11-legacy.zip | Bin 1298 -> 1295 bytes .../modifier-all.sol-0.5.12-compact.zip | Bin 1333 -> 1331 bytes .../modifier-all.sol-0.5.12-legacy.zip | Bin 1299 -> 1296 bytes .../modifier-all.sol-0.5.13-compact.zip | Bin 1334 -> 1332 bytes .../modifier-all.sol-0.5.13-legacy.zip | Bin 1299 -> 1296 bytes .../modifier-all.sol-0.5.14-compact.zip | Bin 1333 -> 1331 bytes .../modifier-all.sol-0.5.14-legacy.zip | Bin 1298 -> 1296 bytes .../modifier-all.sol-0.5.15-compact.zip | Bin 1333 -> 1332 bytes .../modifier-all.sol-0.5.15-legacy.zip | Bin 1299 -> 1297 bytes .../modifier-all.sol-0.5.16-compact.zip | Bin 1331 -> 1328 bytes .../modifier-all.sol-0.5.16-legacy.zip | Bin 1296 -> 1294 bytes .../modifier-all.sol-0.5.17-compact.zip | Bin 1334 -> 1331 bytes .../modifier-all.sol-0.5.17-legacy.zip | Bin 1300 -> 1297 bytes .../modifier-all.sol-0.5.2-compact.zip | Bin 1322 -> 1319 bytes .../compile/modifier-all.sol-0.5.2-legacy.zip | Bin 1287 -> 1284 bytes .../modifier-all.sol-0.5.3-compact.zip | Bin 1319 -> 1317 bytes .../compile/modifier-all.sol-0.5.3-legacy.zip | Bin 1283 -> 1281 bytes .../modifier-all.sol-0.5.4-compact.zip | Bin 1325 -> 1322 bytes .../compile/modifier-all.sol-0.5.4-legacy.zip | Bin 1289 -> 1287 bytes .../modifier-all.sol-0.5.5-compact.zip | Bin 1317 -> 1314 bytes .../compile/modifier-all.sol-0.5.5-legacy.zip | Bin 1282 -> 1279 bytes .../modifier-all.sol-0.5.6-compact.zip | Bin 1319 -> 1316 bytes .../compile/modifier-all.sol-0.5.6-legacy.zip | Bin 1283 -> 1281 bytes .../modifier-all.sol-0.5.7-compact.zip | Bin 1322 -> 1318 bytes .../compile/modifier-all.sol-0.5.7-legacy.zip | Bin 1286 -> 1285 bytes .../modifier-all.sol-0.5.8-compact.zip | Bin 1322 -> 1318 bytes .../compile/modifier-all.sol-0.5.8-legacy.zip | Bin 1285 -> 1283 bytes .../modifier-all.sol-0.5.9-compact.zip | Bin 1333 -> 1330 bytes .../compile/modifier-all.sol-0.5.9-legacy.zip | Bin 1297 -> 1295 bytes .../modifier-all.sol-0.6.0-compact.zip | Bin 1357 -> 1355 bytes .../compile/modifier-all.sol-0.6.0-legacy.zip | Bin 1322 -> 1320 bytes .../modifier-all.sol-0.6.1-compact.zip | Bin 1356 -> 1354 bytes .../compile/modifier-all.sol-0.6.1-legacy.zip | Bin 1322 -> 1320 bytes .../modifier-all.sol-0.6.10-compact.zip | Bin 1356 -> 1353 bytes .../modifier-all.sol-0.6.10-legacy.zip | Bin 1317 -> 1316 bytes .../modifier-all.sol-0.6.11-compact.zip | Bin 1354 -> 1352 bytes .../modifier-all.sol-0.6.11-legacy.zip | Bin 1316 -> 1315 bytes .../modifier-all.sol-0.6.12-compact.zip | Bin 1351 -> 1349 bytes .../modifier-all.sol-0.6.12-legacy.zip | Bin 1314 -> 1313 bytes .../modifier-all.sol-0.6.2-compact.zip | Bin 1356 -> 1353 bytes .../compile/modifier-all.sol-0.6.2-legacy.zip | Bin 1322 -> 1319 bytes .../modifier-all.sol-0.6.3-compact.zip | Bin 1367 -> 1364 bytes .../compile/modifier-all.sol-0.6.3-legacy.zip | Bin 1332 -> 1329 bytes .../modifier-all.sol-0.6.4-compact.zip | Bin 1364 -> 1361 bytes .../compile/modifier-all.sol-0.6.4-legacy.zip | Bin 1329 -> 1326 bytes .../modifier-all.sol-0.6.5-compact.zip | Bin 1364 -> 1361 bytes .../compile/modifier-all.sol-0.6.5-legacy.zip | Bin 1329 -> 1326 bytes .../modifier-all.sol-0.6.6-compact.zip | Bin 1375 -> 1372 bytes .../compile/modifier-all.sol-0.6.6-legacy.zip | Bin 1339 -> 1336 bytes .../modifier-all.sol-0.6.7-compact.zip | Bin 1375 -> 1372 bytes .../compile/modifier-all.sol-0.6.7-legacy.zip | Bin 1339 -> 1335 bytes .../modifier-all.sol-0.6.8-compact.zip | Bin 1379 -> 1376 bytes .../compile/modifier-all.sol-0.6.8-legacy.zip | Bin 1342 -> 1338 bytes .../modifier-all.sol-0.6.9-compact.zip | Bin 1356 -> 1352 bytes .../compile/modifier-all.sol-0.6.9-legacy.zip | Bin 1317 -> 1315 bytes .../modifier-all.sol-0.7.0-compact.zip | Bin 1310 -> 0 bytes .../compile/modifier-all.sol-0.7.0-legacy.zip | Bin 1278 -> 0 bytes .../modifier-all.sol-0.7.1-compact.zip | Bin 1313 -> 0 bytes .../compile/modifier-all.sol-0.7.1-legacy.zip | Bin 1282 -> 0 bytes .../modifier-all.sol-0.7.2-compact.zip | Bin 1314 -> 0 bytes .../compile/modifier-all.sol-0.7.2-legacy.zip | Bin 1282 -> 0 bytes .../modifier-all.sol-0.7.3-compact.zip | Bin 1310 -> 0 bytes .../compile/modifier-all.sol-0.7.3-legacy.zip | Bin 1278 -> 0 bytes .../modifier-all.sol-0.7.4-compact.zip | Bin 1312 -> 0 bytes .../compile/modifier-all.sol-0.7.4-legacy.zip | Bin 1281 -> 0 bytes .../modifier-all.sol-0.7.5-compact.zip | Bin 1311 -> 0 bytes .../compile/modifier-all.sol-0.7.5-legacy.zip | Bin 1280 -> 0 bytes .../modifier-all.sol-0.7.6-compact.zip | Bin 1314 -> 0 bytes .../compile/modifier-all.sol-0.7.6-legacy.zip | Bin 1282 -> 0 bytes .../modifier-all.sol-0.8.0-compact.zip | Bin 1311 -> 0 bytes .../modifier-all.sol-0.8.1-compact.zip | Bin 1313 -> 0 bytes .../modifier-all.sol-0.8.10-compact.zip | Bin 1349 -> 0 bytes .../modifier-all.sol-0.8.11-compact.zip | Bin 1350 -> 0 bytes .../modifier-all.sol-0.8.12-compact.zip | Bin 1350 -> 0 bytes .../modifier-all.sol-0.8.13-compact.zip | Bin 1350 -> 0 bytes .../modifier-all.sol-0.8.14-compact.zip | Bin 1350 -> 0 bytes .../modifier-all.sol-0.8.15-compact.zip | Bin 1349 -> 0 bytes .../modifier-all.sol-0.8.2-compact.zip | Bin 1346 -> 0 bytes .../modifier-all.sol-0.8.3-compact.zip | Bin 1344 -> 0 bytes .../modifier-all.sol-0.8.4-compact.zip | Bin 1353 -> 0 bytes .../modifier-all.sol-0.8.5-compact.zip | Bin 1354 -> 0 bytes .../modifier-all.sol-0.8.6-compact.zip | Bin 1353 -> 0 bytes .../modifier-all.sol-0.8.7-compact.zip | Bin 1351 -> 0 bytes .../modifier-all.sol-0.8.8-compact.zip | Bin 1339 -> 0 bytes .../modifier-all.sol-0.8.9-compact.zip | Bin 1347 -> 0 bytes ...fier_identifier_path.sol-0.8.0-compact.zip | Bin 1507 -> 1504 bytes ...fier_identifier_path.sol-0.8.1-compact.zip | Bin 1506 -> 1503 bytes ...ier_identifier_path.sol-0.8.10-compact.zip | Bin 1547 -> 1547 bytes ...ier_identifier_path.sol-0.8.11-compact.zip | Bin 1546 -> 1545 bytes ...ier_identifier_path.sol-0.8.12-compact.zip | Bin 1544 -> 1545 bytes ...ier_identifier_path.sol-0.8.13-compact.zip | Bin 1543 -> 1543 bytes ...ier_identifier_path.sol-0.8.14-compact.zip | Bin 1546 -> 1545 bytes ...ier_identifier_path.sol-0.8.15-compact.zip | Bin 1547 -> 1545 bytes ...fier_identifier_path.sol-0.8.2-compact.zip | Bin 1535 -> 1532 bytes ...fier_identifier_path.sol-0.8.3-compact.zip | Bin 1537 -> 1536 bytes ...fier_identifier_path.sol-0.8.4-compact.zip | Bin 1540 -> 1539 bytes ...fier_identifier_path.sol-0.8.5-compact.zip | Bin 1540 -> 1538 bytes ...fier_identifier_path.sol-0.8.6-compact.zip | Bin 1540 -> 1537 bytes ...fier_identifier_path.sol-0.8.7-compact.zip | Bin 1542 -> 1539 bytes ...fier_identifier_path.sol-0.8.8-compact.zip | Bin 1533 -> 1532 bytes ...fier_identifier_path.sol-0.8.9-compact.zip | Bin 1545 -> 1543 bytes .../modifier-0.7.0.sol-0.7.0-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.7.0-legacy.json | 12 ++++++++ .../modifier-0.7.0.sol-0.7.1-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.7.1-legacy.json | 12 ++++++++ .../modifier-0.7.0.sol-0.7.2-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.7.2-legacy.json | 12 ++++++++ .../modifier-0.7.0.sol-0.7.3-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.7.3-legacy.json | 12 ++++++++ .../modifier-0.7.0.sol-0.7.4-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.7.4-legacy.json | 12 ++++++++ .../modifier-0.7.0.sol-0.7.5-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.7.5-legacy.json | 12 ++++++++ .../modifier-0.7.0.sol-0.7.6-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.7.6-legacy.json | 12 ++++++++ .../modifier-0.7.0.sol-0.8.0-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.8.1-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.8.10-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.8.11-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.8.12-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.8.13-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.8.14-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.8.15-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.8.2-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.8.3-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.8.4-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.8.5-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.8.6-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.8.7-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.8.8-compact.json | 12 ++++++++ .../modifier-0.7.0.sol-0.8.9-compact.json | 12 ++++++++ tests/ast-parsing/modifier-0.7.0.sol | 27 ++++++++++++++++++ tests/test_ast_parsing.py | 20 +++++++------ 225 files changed, 400 insertions(+), 9 deletions(-) create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.0-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.0-legacy.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.1-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.1-legacy.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.2-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.2-legacy.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.3-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.3-legacy.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.4-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.4-legacy.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.5-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.5-legacy.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.6-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.6-legacy.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.0-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.1-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.10-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.11-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.12-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.13-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.14-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.15-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.2-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.3-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.4-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.5-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.6-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.7-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.8-compact.zip create mode 100644 tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.9-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.7.0-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.7.0-legacy.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.7.1-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.7.1-legacy.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.7.2-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.7.2-legacy.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.7.3-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.7.3-legacy.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.7.4-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.7.4-legacy.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.7.5-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.7.5-legacy.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.7.6-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.7.6-legacy.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.0-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.1-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.10-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.11-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.12-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.13-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.14-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.15-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.2-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.3-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.4-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.5-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.6-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.7-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.8-compact.zip delete mode 100644 tests/ast-parsing/compile/modifier-all.sol-0.8.9-compact.zip create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.0-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.0-legacy.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.1-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.1-legacy.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.2-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.2-legacy.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.3-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.3-legacy.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.4-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.4-legacy.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.5-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.5-legacy.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.6-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.6-legacy.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.0-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.1-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.10-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.11-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.12-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.13-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.14-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.15-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.2-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.3-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.4-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.5-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.6-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.7-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.8-compact.json create mode 100644 tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.9-compact.json create mode 100644 tests/ast-parsing/modifier-0.7.0.sol diff --git a/slither/solc_parsing/declarations/modifier.py b/slither/solc_parsing/declarations/modifier.py index 3fdc22d4e..a3f07da7f 100644 --- a/slither/solc_parsing/declarations/modifier.py +++ b/slither/solc_parsing/declarations/modifier.py @@ -62,7 +62,7 @@ class ModifierSolc(FunctionSolc): self._content_was_analyzed = True if self.is_compact_ast: - body = self._functionNotParsed["body"] + body = self._functionNotParsed.get("body", None) if body and body[self.get_key()] == "Block": self._function.is_implemented = True diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.0-compact.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.0-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..eab87a486fd03f9c9184f25333a769c391873ac1 GIT binary patch literal 1639 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.1-compact.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.1-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..3d960b6b494858192ebbe241e3180effd9827b54 GIT binary patch literal 1641 zcma*oYdq5n0|)RwGBie>aN1nLEIJy?nK(kG3#L${wmP|NXNb+*3C(07my*lS(@CNW zF|BDhbE`!Pk-5y}v>cbph9+XMr}MmjKA-3Jd+~eod;j&uDs6KH6affu?3{z2r-s8~ zi!uPT?E(M<000pbLg??I#HfAN$OA}gWHcrG0x=(W2i>8p(wkZSW z0e}Voj+vPxo9{N%iow1{2aQ{Na;RCGVMgvrsFTr1G*1^L{dDI&FsD5HbqJz(I0dcB z#cYX@>84ivo{gnTn`ue-fQ_zTj8Z%z%kY~c%RxK7@HO)an>qmNKH{LcQl{GnHjvNh z1cq>=r6-;J3eKs1rFLvQY^%ugZ;;9ddGOIO{6!tqP1Ls!S^QEy>5(jw?2(FFenVr| zD6zDZ55U2%t}{mVFXl8&O1ALk^M6lK-??TBUdsCL=bFOiq6y^pFqQ1hsWsc}45ew9 zOwKLSDnmdkH;)MPtxp!*cxBa3~HxxzkEnJ z72DNhk|;G_%$=z_{wNSde$wG-ro3K8^=8IvU3-}*b;;XiMJD=tdAl9#{HXpHtuhm;qlVQ8KP{@4 zr&Eha*phJgQN}1rMhjN7mMo;@456h3LEy>e#*~n%hWhzZTqt;N=w6p;B3c~<99g@v z+t|$Q^U6`(c6Mo-Tk6H4fA5dk6AYUdrh)?eSRZ4-F0HL|$xZaIKA62@{$h7=bOx!V z{~a%~@VVF*eX7PXQ&`}_xl|+Rg3~+ju5xh=236pYe9C)c&u!lDvO51cXj+f_#ju=C z$o1SY?VhYf!;C)s6c%Nw8|>xse)KP5k?m|rZ@N&|U5dHTq{&h~ z7^PMP7DPU?W}GlRiu9i}svD130o)`)Ht}2YeW2(My3f z(`~eTD;7@Y7X1RvPP*$8D;$niy`~Yxo4wC@F`K6So#10(GTwnFq(0LX?woLJ+%1mj z2*^aJy;`@mBzZy$LB)+@OyBkF&h*+VCXqOR8X=2)8^-K+?adfyz{X$RpDY`WUL)B~ zb$?pVb#Ur}D5~&lZo970)F>RQoP1tG?Z7XPxaF@e8Y*R1ajx~8rx)2=^_4Ql6o1L; zkmw>2=XFyfAm}Z_ZGYi8XZ=XJ;jVi>)ioqO*&HbcnJ*_{mo~g#k>*dEuJMiqCgF2>*?bb<~i5(ACz;P1;&>5cD zuF;JP2i+^4Pp+W`E&3|0jyY?VFYIgljv)>zznhnqJy8v(kDI=i_spr_ld3(M&bH~r z3Uc#Bd75kPXF~U6vY#%=rg9b!8F-xFP)os(6FZvDbAKDtcZC=({kcvdT zgmJhT_?0?WE=UGFn7 z9HOBxAkvG+?{-t30tn?M_r07fW116i)U)6l_sp#=^~7;iq~vCT>*h=Fc5keLqO;Qf h2H=MQ{|!yypZWhd@Wv{G{&_3>sPB)J{{RI5{sW(c4VVA` literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.1-legacy.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.1-legacy.zip new file mode 100644 index 0000000000000000000000000000000000000000..c19cda4795b13962c74dd412b11649869a2585d8 GIT binary patch literal 1602 zcma)-eLT|%0LFi#o#kcRI`jT^hP>QN-sXlO)_JMOwRxGhGuoV&SYFDh8JUifmvoAj zBqSzTM~u3>=Fr%TU6d=!5i#?&(7F5nKA(G@Kc0V{|DMn1`}lgx?!y8y02DYv#GIT6 z9bYQ}1Awz802l)R5SKurL{p-YzCj`FktifJAvP>3?Q}xYnXrhYNHQfQ3K>I9h~K{t z41@px4FH^Sb5B`sTPIeI4nM{ymG{I`jJk9$UOu7etS6vy;8v^ix8DHo!Q*Q@sEm7t zEu__LcM+LoXxZ~Zx}3g~c`i6y+8602n`(SXchji}14}I#{3ZKQB3G;51EVat0UuV- z`TSlrg3MkmJApk}M1-s*K9kmURbC-HT>U)CK}<{r|EShhDgZ|ts^~^AOFqe)Wq)SL zjZBMex)=<`v7wM#eEv^H=(^GmK4~jUe|>;Ha5KKoz+(ejgs>^cP)yAIFpfIGuuppC z;i78JTlvLJ+JjyIZ0<=;I%RUJJ76k@$g85a%=x$mq#d$6vcHW-pcn_l36fiDZe(cv zYF8cg8v$v8lcz_I>4j*eXO1fm9^q;yR;%239@)!3|5gW7q#Uv2z)n%S{gYV^z2L{{ zEHB8l@Sg8lZj$K_zbAnGyHj7m;Ydgw&vueKxo#>ub-d8~=9An=k3JX2e(W#WC?hhR zr1(i~vfW$5@%NgMG3i*YXkX&Y(UFw`n!848uPEOgOe=V+AgpCB45)d`WrsFA<=yGX z9nm*(BArxGMnTcB-x>?LpXQ~{f%J%0>UL!}5cJYB`p7-AJPsUdmNItfqd%eK(rr63)S&S>a5@BWVbQ0ad9;)CKbu_4pm>?l)-hAmqrGLFu z7G&G{`27h!*$M>pJB4&$Oxp53vHQogsdvHXf{t|y2neSk;XTTy=A)3`iO5y?H{0t2 z-@fQj5-YhoI6(&N-DJpwXTznB-(@=IupwxIU&=OkjqZ0YwA#r=cTVl0v%-`9rD9J* zkH(jh9g4wL&)%AsJW_WbwGYC*{l4NiX$9eF!_!w{8=BiLoGRfu1RS=neFyEVfR_-J zWJ}8!SqAyV{dn_X&A9zO<}YcIuKPt73{0DLF$AA??rQNxVAwRezAxA^y5X5aO65lw z5z;M0>-ft23Eplf9y_}-ze8V^9te%KD_>Bbxi_SfnqAZ;zak%|mmU_5JRFPf6u(D) zb?vX$tscc&vCW&(Lgnk%mmFi5zS7#Q^L=clo~Y2mDe>2%mz}jmbK8ttHE{W{K01O@3}*xYo6yXzC>>!L8)l07E){X|}71VB5KX=b{$NSA(=ZL^8z|ea<8a4jFLL51 z&vFNg#rGEAUQbv^mMu-ZaCBDR0AJ&iCR2^rPs7gUJNef)Ql>Mx8p%m7(H*mk?~A*x zrVyRVEuw_ky871Dfl3RqCCjT-ALTYXujbB7i>W3;fv#gR^AFH@eP;%49^E2J4D{=-lKVKSBAO(M^VJW8wuD=ij tzq~80Q1|r)$zWywo9ugV|5r57Kk@%K@9Pcz;-5BX&)@Im#NJZ?z~9|h>HPoz literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.2-compact.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.2-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..065df29b34b6833b65d8b2fc9d39b3b6eead0eaf GIT binary patch literal 1640 zcma)-eLT~N1INF!&3R1ij-2H(jF1_MJj*1_!>!GjO~y{=wlLdd9y1&_BNY8qo;nYA zNy$U;w5;PJNrU;+R@G&6$!BmFGf5{~`gLsRzLRE|FouqN{9V>Xyq@bp3Fo1X^~Qg1%mGW#$q#?*QSwYZ zs?zSU`wo?9WF_q1UQ1S_CsD$-dw=i%b4_x-+j41if^mxnuKwJ@8ik8aIBC7Vt}~>r z|9MF}{HNB9Yj}4{EvcxH)xBN!_}BcPrj5^I4~?HsQO;>w7g=x3=LoL}BX7xLW3U&< zGBK~E9^AMWYHzIGSC}oaS^Tb8D=1=7r!?{`i&)QQ%(qr=1sI)Dm1FN; z`2FAVh?k+28W1_#FAO!Zkfbc@8X&y)F>9epiuZ+(=HaHsFT#{57oi373au(B!U5}+ zkyn<$Ursx~q4R1h=40blCOMeuoCP%54mDI6{7c9QcNOI5;&SHZn>okr zqNkCj@kLv*Q^E^T8serSCMT(8Hpz7?=Xbnf0nN%Rge7GX#MG)^UBzr zbd5SB_7NnCj^(NRu1AZ1!cC5LqMb7^Fd{vPH=5lckaCYP#@7FAn{;OXOMG2*Z}b_$ zUGOUVNJ7xLG190;r6P=5YPb~fZqA!O~7}XIU5ox(1r-e4zNl~*BBlkFiB$tTAN*S(_*C75(;slPEZ54p35nZL{kort^`88^uaIdT$8a|2IN+P( zBkgkuBT*{kn$d=X`?|9ImjHKX z5Syg)F8ikGt(O52%5QS|6)@&G~}XndP&QTr@ME8{$%X-}a6 z(pP4ObktUiwO^`sbBBv9&Z6T^bHxrPX#DBU5=#s-XnGXr5E(rEjYz4m9h_+}upMoL zp<~6boQ#^Fq+#oWg(>0UBS-X->=8Gw#PqyoFyG7YzKiO5qC#_3=RPTnn&&8J`ITfK4W+>^Z`Bab(k@`v&)R8nNKMdtU>5JtBy+@@Tz{T zaCg5!dAF0&@z*!>ok`+e&`CiOWUZ`RD2ZdK<Md1{{A#FtP7GHftw50L3ih#7Kf$bsXsC8+25iCZ-Nd7o1M%3zkLnlO%-yNW z46xT|RI95>f2rs^JaTd(AEhE^xMHm+raEqt%2NAjTw4z;_BWR--R9R8Nd;fc65H<0 zZmnuk7Eq&kRL<4DZjYVa+=@ACQt8`0xM! fivs>19_TOpGaKN1pvr%(L0=m1g}YyT0s#L5fOYi8 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.2-legacy.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.2-legacy.zip new file mode 100644 index 0000000000000000000000000000000000000000..4f749c9ca9aac77864eb612e8a117a9d6b767c50 GIT binary patch literal 1602 zcma)-X*|;n0LTAxAeQ+O?S%t$kZx%FbH`Ah5N8-9LG23~t9ZuR$}G zB-i-l`riRjeaEnvP@R$|KJyv=)8(nHZ;_{ch$cqoBs!Kr`9d0sfAt+yeRWSzk1-lkjx@SB^ z+<6=MgFX>f{F}8wgwcGo*R_K8%fBXgNVusm##mb>3-$3DC1sAhY~#mTp~~FyA?Hmh zIdk(if04#!5R*K3ZVxEScp<}-zT=7uJKN|KkFT@8Q7b=8>@%0f{XDq}c2KwF3%y|+ z8Tak7#?P_+-sz!7=eAHX2Dm<+NPKyogHS^>g1IF)`{HQ0;!hh*V&;*-**jQ?ZL?QuX@GUik^*w!~HU7PaShxD_u_r z1fAJP)rSp82We&N%Q}xXau&XsB}O$yiTcaVK`k*VOV7Ieytm zS!nn2raBdFU$F0|6D4uc7FS<4O2@Hm>>j0M{X}59O*?jRMX=zGhxx-dxk;o)m+5gd zY;eA+5#hSkLo+AgkLwYU9*bz>C36Ky8~f8izFh_ym47--9KP99(9Pg)VDrE(Ae}Io z9Cv-l9)SUiJ%Z~QpX)P>mAKW^uAn}NJgk<7lu}2HYwkPVy_I&6nH7SNl9qj=QF=SV zW(ljW4j0k&P_fGs?sQalE5d126z@q@y3D}!eGcUfD{qNu*|d6AJKEz7Tak~lKIrM@x>!-X%6K*GE_3JKZiY$DiX3X8-K5* z_X9&Ukjun>b=ZNP^N)%;u<+jEd@4>9Q_iNM4KNOvS=N#kumqCGE2cjitz;J!=j1H+ zz=-EdP3_AY+D;zB!E44OU0}WX!M7q`Qsoaem*7OieXMx>0Zj~xvA*+-_>$ru*d!e} zPbkc5WzR{qO1{#4yeZD+6hv>Dmnz47(M{l|yfiq%ufX}68*8iU{(Mi@<@RdF;2}Hf zvQM3ulD)e8;)rUl37$GUw_{Y*$we4j5YuaQ7s+aSeP(c_I61LhT}?N-?w5N|Kng^f;;*R%ZYbrbecrsZ>MSMOg@vvMqm&g`%n4H=ZNs9lk(smhi!BP*RjkQM z;$zLU$l?*E1i`i}qSc~@uA1K-!6Z}t4f7vG)&0R92|^W}m7 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.3-compact.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.3-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..24b6863ae4fa37f585f96f515c78903b15b97b03 GIT binary patch literal 1642 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.4-compact.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.4-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..bcd70d56af11fe41b30127487d5f44c4cbc44714 GIT binary patch literal 1639 zcma)-X*|;n0LTB#+DfQLjyaR_X&IrKJ2x?BcrcBaCdb+)w?2;49Ghb$XDKb(N>NJ4 zinK+!x=fE~k69|$tj8$!=z0HqKF{y>;``?J`uFwq1j*O~(ttd01Z^Go_JfW5BQOB4 zU;tnM06+phIyNR2OEfk`9732PNceaRHuV&qn1qQWM&V+Uv51o-eBxFaFc1y^*#KZm zCZ90>X->F0I{3g^uC^~RR-dJnPw`i?(|%8Sth|5uOZ^le0KfbGMqb)E>j1RfabpgV zr)$#JzqXjMo|7IHvBr*a1f>`hXo+p_TK|@EVW9HtJ;I1O$HiJfRINNHt0@sEMdI3) ztNb0_uWl5Pqt4`cpYcd)1NuAPMY>FnCuX6}6S__U*4pHo-LQ7g==MY3OHa+^VikO< zd&6&Jt*g|qb?!LN@Q_Ltu-hYL4T3B4QpwQnJ+WL|Hg%9q+TBHeAqPhY9Hw;m~TBNcEp$0 z&qjU|=S;duS-#pD(3zxBa+0py2n1hxsa7I~m1B5m=6%m91)KQk^37#Rho_7uMBxs1 zC*WqEFz$#1n~PM^J0QQBK(z;|4w00*tpT z?W>m5nV6Swgsb~rw)d-~R+*6{(ipd?HLKAUHV?n#=15Cq$p`gG&RQ9Lds^}-@sv_~6B@R<{;fnoz%SMs zv-YR+67=h9A!$2kW3$h50v7naRYH9

`*a_s<$(po{3VngkBDo0BbXYHLEZfy0y zKd)8Mp8kSMpQr&1HJa2QD`kfl@rFe+e;J*S6ya*Or@@PIJ|Fd;()RZ@_7M(@q`?hk zlBXiQay+saNHF^PlYFidqfJ!E3WXr*0=14(MZ zigtZX*@LI^zi3@SWzjRrbg4JXIe*kRyj4uTMAAPS;(f(piNg{rP3jbvTrSn?rc|lk z69TO!Ue0eC%BuJV3btPN(r8P^MXf^&jpe6GIn6J7)*q`%GVY_1+p$@vOYRfvx(p`> zsDwBjcDC7T5pJe1$hZqnabv%b5 z=f6k=xznP!z<5bV9qd^7wL60Sdvr~eCYe4Qxroc{-ip$P_fg}(8=%4;J@9CqXcdh9 z>*CZgyU_Wd)2WN0xZOvUfpY@*%xGw{Yn!ilUcGK2e}O#U1Ljy_{#>Myt;VIBW7O+# z=X4HU3pu>4dxaW6^H)QH^~M7dk*wap&L9DK#AfgQLFuLU;j%S~9^3;hOmbYrIHhji zk&TSL$>{9R5AFXG=qX3y&>=>IaC$AhKienjt}G& z{RY}2j8ZDKP<c6V7 zCEyv=>BF4jh?%xJ)R3Rq7UPsdhkzD88OW0dmUnZH#gw|-J)WsHm1lggzNNszh++X| zni%;a*{XBZh0ogEkk#Q`JT$Y(p)38oayx&>Hq)X!2<-TxTW+w^>B52^RCSqppdJRX ze3qM6gYEb%>gFRf-7jq;2R=;iqP7$eP}>T2p~3`gZte$}Zp=JK#S-#D!r7w9vzku2 zzr3z@voG6dFc~AxYJm)O4Y#U|nsg?Bs01{&qD*oNdd0Cg0PAW#5ze=2id0{X36hkj zJaWIanvQ<~g(;+@N!)~xPnWmlM|^!4U=-XbKdvE@5}r7_hQi?8D~Hm*bI1wA%bdh1gs)303fvh z015y=9F-Is6?^2kxh32dZV5j@B_BR=@=xmVgu{g6#F*H`Bk-dqs1yYmFc1y^GyrhQ z&W^TTvyLz44%|m5)7g~R9i4hvc{nYk{>X{P8deL_WuE{(cvv*FS=ue#M*g9zL;%k; zwqW;)=Tg^CryPn9cN1MfNzfdpOz9Dk5+IBA#G%n~uRM?74E5 zT{mLWtZeow-r{2`%I0!*=~e3rrrOzvQTiL}Tu6BcWSQ(Q928aB9}rkn$!@+7Q4=+b z%yAM0_cGC*1Q@a`!ZGVMjWoGk*GFHRyI2Q6w(#6=56r)>B!Oiytx$wQgh5u}TOz?Z zWtwuyZ5FzbrpTzb(Elrh{lvlKxb(Y#IrR{Atd3tna69U9(*2_d8W#$W_Qcypr!CM; zUU!Ux)f#%fikIS_fGKgHt|oont|HW{-0Kw1N}=zjy=|D3Lis+pQHf~E1JAI(d!2^b z*7DJS<>q>NH)(%EMK3E+I(&lh?R}6!cXCJt7;VAHO}iMrl9*!P+DPxlns;4^Tl-{# zpHvMnzQafI3eTr0(5Oac)2PVL5lM=>AYNA) z+>%LL>6HD;FDmuWcQBJo?`M-doYodA-P%+LlK4UVaN-D@UGbuA2$X&d5vs?%2}rFPvH-B&u)(SJx zaXgN!>D1PJgvYB`9XDz}b$_0nK3#KS2%>D$k6!mMd&SOvnG@+1 zl%sTvS7bvVq=%9GNRV~2TvjsmE~&b68~1!w05 znhv_LoX^c~R4&bS>AJ<$AKN}}rjcaHhb@U}SF^+@;;qtTp&h~Budf|5-WKV#;Sm#Kj!sYZAoBX5-T4 z{F)%3kJJzPLC@lZ7~x=f=m6tuC9c}3tt7l_^7QH+LzT|<%{r1;#{m(c!*+1|r{Py$ z+t4ky8O3--D@e1y8q$BcIAbwWJo?T6m8jcjm4fi=h?}r06 zCpa$S>(S=g)gxr7#bL`5|LZOD#aFB~JLOn4Oy3zT@a2{rK5AP>bAOB$Lmm26q!;x3 zoKeI0ZBYECV^LfEmS~?*>gT&{^-eb0pUwOGN=sTzgi+m${(Sw65H)iKsk4#C2TZVN lDQRcWf2;kM-Tw_u>NozM=&@+9?C-VIuLk}i@7GlTz&}p?>xuvX literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.5-compact.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.5-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..1e5f938ad036e7e3426fdfa27b604179bf3dcc5a GIT binary patch literal 1642 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 literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.6-compact.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.6-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..c69f3f42673d943d1099b6a57623d6b10b0570c9 GIT binary patch literal 1642 zcma)-c|6k%0LFi2bG&kH70IZOa^J_8sS&1wqJx@+m}|_i*PJPamgCK}XuwymlZpIWZmEOa;r8Z-E8K#Fv)}Aas(Y4C}y;RipGh z#=TEPe9HH<1Ydtqf4~9Bc-<_x(4h{Y5`T?da;Y);h5CRqLUE10ZCFlYb73nkgefTX zI+#SrUkbhJ1q6e~WiIb8TpTo`J=L1I3ydD$cj6WZ-RYFZh+xqk#6`$^d+NEuc z+$4tz_}9CvVFr_4YfIY7TgwJNzv{}Nr&zE>uG_n@%ZNs{SSqy+)-IkJ-@^klkn6M! zDsHvSRXKLKXhF1BwoKar34;k8P>d5tWv46Js5NYsu2OdY!c6%$)vz)Mo{TEjPvt1J z*4fn`yzw%=n!DvXIb=d$`vHk2MeZ1j(`g`GnG(xe!mdFO?DSh3^PV-f??Tg4=Vul3 z)x{6%{1zR1bIfZz{=wGm^Lg7o$xt_K-?XSs=>Dsy;WKA{zW&K|g>Kn|`bl&eB~;8# zOgc2OZe64D3NyP@ML;{@leGj=BtaqF{^s3;C&Sfx7b=>vb7tPiWwku$UmR0|6Gpc3 zUu&WtS$fW#*T`zAn3{M)dq(FQlx36^#J^ufd0T?UddMUJue9w(iA$54>abAzn|SZp zD#%>tn1pYNg?5Nd>dhyWEAZQWvvDb!Rfky~Ju}&>!=;p_OADgNP~RNzMkYVc@R)bs z?WivT$6zT_BW-CM(%4a%%=Ac{beQvf-q5VQ*aS&3{PuOaFHkabVwO^}yYFO!w>wsb z@bm!heBxnJh$Lxm63O!8Tpf*~xg!@p#Msdx&P(NX$}rior_NVdc&2X~wrx)c?HvjR zeDvsRN41I`91ff(Qx$V10r#j`E&Kl9f!WpBp-yWDd!IS(&*y z$Hvs_?NxSU;?6bn-VX9{Pe317iN?XMgBvv9 zTr4|7wz{y~3LxIQnhr&U?_?Q~rCTB1c8Q;=b&H$m2|e|Z!54)C@d}ono#uajbhXb5 z@^P(*i@kc#4Vf&YZH}y9aVJ-do9^=r2e}2nn>o^j!gD>U3&weFcaI$Mn(}A7@K}|5 z|LO^K47ZPaN{ih+$(g;8r?lj)z-&cTgnIJqz^i{aV|Q+<(+WLCTB+;KnB-;*5y*Ty z$D*Hqn4c{vafym;!G?3$UD;_I%PuK_o6U+jfhxRwbknbFq_BVzN0AQ5Us0x@t&)cpak4GBh2&40>?$6S}YC_7zpN)`XO7{o*a$T5@Mj>X~ULf$^;uiy4Wzjq3~c z(fszP2?>R@O7lcaL2d4qL8Z5+(T|W&Ja|=6iK^GF!8H8t5t&G=^-^z+OsDUHJ+RqX zXUs6wck;OyiM06O96gi4n-`i{&deKPwC!*xyZCUk;H&SyO*M+|ll3JKQ5b~TnIc26 zW9IJWX{^PpbARQXUSIA*my|s3Y`6XqQzI+DrrV(WhY$=dIEIk`IZFOF0e(W@w^Aj3 V#sA~MF$_fN*IVMJPy8ys*S{)!0YCr% literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.6-legacy.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.7.6-legacy.zip new file mode 100644 index 0000000000000000000000000000000000000000..db8047403a9eeec08a214b884338708db41666f4 GIT binary patch literal 1603 zcma)-X*|;n0LTB1cI;k@;T&c%W_C8x2oViG(&HM ziD9j(?cEWrtiyNQ_Io7Zh^M3cnFKPk&l-fe=w5L*06GMt<(A2Q74B z97B_haN7Y(=F)tgh^0%4)}W~N#oAr;?Q{I`IRh!|X7JA^*8cA&k8mWD_>cD;yuZA9 z1?dFKN}hHueXcH2k@oB+*;*)ZFKQDuqB4(g>2THHrZit~iVk&M23VNGV~U_CoKA~h zUUmRSSF6;ZDAN7js=XaNR4~P6j1@bjdJJOy)l4YK~#T(rL{o zS_};mUnb$d$e5g~m0FvmNQztfB;5|J9AC?Knd`E+6yB%o>Os-6oo?4k9bw0BzuZSv zOqb3vsVrbHbEsbUooSrKA^4#bl3MGV7QZv?37?q>?Y^A_8vXirw5O~ro;4>utXsbf zlhRoxWfdE~6YVmH-gxkRA-!4@<5&Iz6Gq&wD*f9w{HY})=4Zz`rY^04cg4QSjD(O- zmrpl0^EFDcywNnTx1OxnlL=;sVfyDdK=0>XSVcxC?a&ZBIJ42YI7E(M>;rqeZW@dYV| z6hYkB6SgFwn#M+gn1$J;^~H=XR`V~D#(Ac7k>kQi67AUh2rg!W-02}A?zLouc7WZj zU=2{O_2M#=n5wqBny8@}3&a^z?+5j=X%0ij%4I(UJ67^Fzx%ix7be%yP&c;s+NKfc z?sVl%u+H{cMu=M5*p2V85u^*$*OK)*CBW6=#0G=B zHxN8$tEht*$JybEwy{0lVeNN0x@EH-%HOsJ1exM$7;D)teBb0N$d(m%Lz|#P1NQ_k zeTrrSvbR8VGv5+fb1Ns&KVWt;Z&9snS(_v&~zTl-j`Ayw75|d zeRE4C1=)D&N@um|iwA8@9|C5#gVe^Hv?byvR!Pe#|rpo9r9L58a`xI5Al z>G~I|8hQP0gZr}PtH;KwN7pk&$8oJmONk2Xj`&bv{Bo%Jv9e)bO>5sz=L=5UnhTR2 zevLiXe?ZBA(Hpoav=YzfsMfWn9#v8oK;$?Sw#jNOp_+q#6sKgv_*{B|^&BVU1oY}* zEu>ozvFVJ!jsT1tB{Q*GIpycBQEKK#Q+(=-!F>!9w4f;J+{cnO$XbiCL`K-1zY*3y zRlWDhV+LZlmZb799jlO?=xkqb*-OE*lbkPn!KM?HFeHWgQ8ibhZ7-N>Z1Pg3WsP{a zYteA5`xcoWZF3DQxxLMj qOY>MX7q=ks~)=&@+fzCUZO-*x!S$=_E20RI4^wC>>m literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.0-compact.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.0-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..9d472762d8b78b2987ae62d9e8b16a8f8436546e GIT binary patch literal 1612 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 H$iM4vJlYq} literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.13-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..c56bc86aad5e9c5175bb653436e01ee04ec99693 GIT binary patch literal 1673 zcma)-dotaY#H+de#=(;s? zy`#+QYPPm064DK=hez^`jB&g7|9j5;e*gHK?>XQ9KX@0gv^@X<6ajBP8&A{@Aoo@V z0E*!Npa%c|IW{!nVni6l7-eE*f-*^njV6Xs<6)&&5X9^lb zYF=S%wBPI9_gppuY?##b8^qtfqTg^1aSMt#)HgJEqhU?U z)(d?gN~!lJHk&~n7cEUy4~h&5_p|bh2&uNuYWVd&d_X<9-5gSfj#}bX)@cA|EZNudsx5Rf!8$0Te2Qg60?7pAt+__RGb4cibYNvc;DX$jZ-;#3wo}lXr zqivt*;Uuv8bfmn>Gf))cKqN;kLO*jDt!mF;9R$~p)++RO$iQ8z=-CrWkIu*Ss~{l875*6M?)MAW;foxlnhBWA?6Rg$LSgz% z$KYt46wk+}sz;v4jWu{B`VNX?#M*R2RvHeOQV?vC0l~=M?+ho9~?|>#sZdHgI8ZV&-g+k^J#b_%k63F(P&N!yEx~E!%xY zM+~p@W=VuBB6<#WHDKmb6{kF4g%$@&%)6z=+>jTRSZHZKP;2-i3Ncjx%T9GEXvb@X z(u{5aNm)Jl)HdOJl{v4%@fPcueQj1d0YkF0@pLH)lInHNMh`Q4mpIfih;D7?XDJ6c z;Im|>|7!frasXBaluu;NV+Pk9=doL#H|W$S^R{KSbzlGN)8cpp}`Q(&+{ zv`m2x*_sr=?%mBf;ISUMI+@fKgorFc1qjN_4JDQw1QOkWRIY_R;pdK@HiWLy!iAi} z56(C&Ji>G}m(9xw)V}#rEVkA>KyI6mCpc2PhO3+bq7|KRF1GV<(}Vr zJ3V>GDoqwK{6=i-!?wGb)FPM7b%v;zklc`K^Z+^Sz$xUR`NraS^A;*S{2LVm zcVcYctwX<;B_NxwvR!h=?RZeK4QXMl7xFStWjRpsxpE8d{fh=|g5LxUjqAu`9ehW6 ztk#JQ_V$~uH=y?|vG*3_Z$Lkfr&6Q7{*KbWb<1q{Dp|3=S^rXr>GNrNmWPF|QD0u1 z>#^<;g%|J}l%mhZmQ=nt;KVBf6j`~F!Td?!HtmqlORo=ef-Vp$yFB5EPQ+190;QW_ zL2_A?Ye;TAr6X7@KAUqw=px@(7uBNL3y~BMrKxM4LXS)O2W;g%R`E5Tl=UOmzpP}f zxnrrWl_%{!c>A7q40eLt@C}shZdXfBBg83R7xHRr$_5bosPs&uIbYR2z0W2+IMhXhG H|E|9QgLnj{ literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.14-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..d833db7923213a8de78fc9b5f9094af2547ad93b GIT binary patch literal 1674 zcma)-dpOez1IK^6$o+CQm)wR`lFQs?yp5w&+GErr_0HUKTMKP$%stjz)}q9yBe&dN z4oVn@Ivq(YL@o=Rm>5!WT#tjjo%8?uJn#4W$LIMz&-eci0S|#X0$@N1AbMjxDazy7 zQ&Ir%KobBA0RRZ622nyN!I5SbC|i^TicSsl3yz^tBN={IA_K2dqJvS_=+x`7P$|F% z0FnW~AtQrqy=xs&Iy}&VReaceopR(kA~n-p>qotDdZ)VO+EU3hAeI{27*PVBPPCEX zJMDi#-8^L8-M8~CelI1Ch9MzD z@$$JQVuK4Mn78f(P3k4}6mdI@;ejXHj0>}??Ctzaq@{;;ciW*gGrk;6$KGSe=o?F? zpyh1eyZ3BDKPQB(ieszg(M3zft9ZF#Pf=WC0!giWP5FcZiUPlQXJ)bk(5a}4Q~c@n z@f^EqS6;g%%CzjEx;lHm=q+cH^a<-st>z3$OD1V*=7~E>GPP0jH7@qtYVs?Y6|JZ1 zUQ6+2_M)tc*nIG%Kb$78EYWR-l-CL$7E_|JDE*-k%WhbbD_n!lqylu3Bj-SS703>(jYBGa1zJFZ-?;F{)Zy*wY-Q)tp3Y zP9H%oYwR@lZmw+VCOnX|Zh&Lhushvd6dm^z^vIjx{xlGbOg{aGxPpYqKAP^+C+UkG z?LGO19dO^k_>;&eNJcM5JAjenFD|^mLuz`P?k$B4d|q&OnSPPK+5@8h;I0}md%eX@!^-p4 zW5!<`q=$&pD>4^CFTHb&x~q|u^|4mdT~s70-92K+iXo&muy&bG0=CMTL2h!sl=8q4oJzLi zxXel?C+M)fs!DuqRD;tYr2_koS7c?bviFOD(d{lYQQc?i zUTjrQ+i>y*4SK3Q2tsl@T9cU-K<7vn4@DxsbRJ|*M4V;S{z!x0P+c8DxVer0`eItB zn=yC%#n84Ig3vwY;IYR=LoZ~VraV; zGL5fMGzUR0xkeRZ*7vbYHQvBlO;lA{^t5fsF;-u!kbOgrtX(%@rK|$O3_0yU)^d0p z{YN{+6g>~3WsKEd#HDW+5d@c3OsU}$q~pYF31?7aGtcu7t201VHQ`l@!Y6sHZ@$qf z^UwVa!Z7PSTWCStES+Z*s^kJw%SiOzYA>$w!7dDaUT!PU8k}r%)?Gi0U+ea`oTqv= z-~Of?t?z{Q@n(CLT;{>DO=@64nh^2yxL4V4EA%-JPn6Yz%HJ?mb@C6n;~V$v>DEsx z5Nt~#8rS-}mdnDzaAS%TGx%$|q<>H$iGT-z9U=eQ5Z@*7Pm)1@Fds KFMg-~KkL6}egvTa literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.15-compact.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.15-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..466a99699dae0a1cf35c33165f2fb8f9442cf38f GIT binary patch literal 1672 zcma)-X*Ao30>%F!64cUKn|6ZI#-5;4Oa+mlPh%co&{si)iKPfd#1?H;J5s!2s5QjS zi)~0lRntdDEorq>XeomRty(HEwvm{2zQ1$cy&rz(o^!wd@GjC|dq4_M0xtX7c;z9K zGp1w!pcn=K2mk;gqkakt4kN{wnjx)_X2{s6h%2Oo=%|>uE5w+f(6D$C@@i}pSq>}% z_yNET0IyLm+LN)5HOxgT%sF6LX5x==B`HVR zIoU3(WDR*s57j@s|2bKFGl>weKM;hKrXuKCyS8mMD%5;lQF_O<(UXHtHp*Ki8Y4&G zhs)~3&4Q`zGr^D=r40YqL zuY3=#N%zmmI~V>bC1P_qvEj(K;&OM4Hbje{<5;d&EN}x=sFAQ{Y#FKblN%BNSFp#__u7mL$0%+IJIKw;fphr z$7`CGZcCVaC!ugQkiT3N9@-YH!7^CXC&yHtdJy$Ko@JFZ725PGs?4M`B%*)l`gb+o zJt&IyGaGLlH?`P>gG7;=h}JsD@N`Y)kJFJ&7g~_BZkI(`QhY=s-PsOz_TJ#Tl$_55n37OLbv%4_ zyVgOfzvLf5*y86W*cfd}ki)9ke|-f)r`H9G8cg&UJMd7~uh*d^OMWxhBUqebmtGX; zrm~5mb|^AGgG)C=QBp~-UR&wNL+c|*BRv?gX|MNs9@tu29}PG3UD0`&ZB8t>WX zV=o$fTL}Cfz0>$y;~a(dzABE&k^Bkw;-ed{J41TK&D_CW*xfa^)Vikuxt1p4C2w!J zNAF^@AI}TcVI0Shg!N`O9Rh+ix2F)7$GoXT_DY1(R1b1m^4z_O_#z&*n*td$W z(;xm;iR>+ZF3~csmkKUchKT8A~j({R6EU0IkvjP z-9Hj7nnFKi1pYdiH6iQsW`c*5&Qp{daA&MJQo`g7O>haFZ~w)|?jM>=?!V`nAn1&m zmSW${DlyG?>6Sb_Im1Qx;%(B1rqI)Q(kIo`)=Nl+(Jii4lrtcng>O4Pcom1@p z#<&pN3prj1l32{$m}E$+{r0Cq)um$P+#omaYCk2w1VNcD}Y(b?sv z9+p0(+-IL)1^m2i$hx-Y4_zs$ZrE$|v00I-8U>dtsUD|tW_cO4`GSj|4#uQd{y(qk zuuOM4?&=dxA>XUcvUb~G!2VGmN)_vOPv}dU-TYpYo;}fomEG1EXi9(_yK>)HPdaZn zo;;x2uE*$nwb2X#E(;B`ZTxgwHUgZQ-%THrdC9!`N8~jQc5u~wR=+iiM0G6qNh^iu zhnNWqGL!2N$#gSzo6VlE9lc>LW_ zc(;vhkR6lk+iDfu@J}i{YkhD=G5{~ZyMUzZrT@1dz9{1F+yH&W|7Q!liwxxJ8}y}~ JU#Ru>`U~6+4E_KB literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.2-compact.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.2-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..59e68af7ae0146e24ed29642605607257141024a GIT binary patch literal 1653 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 C8X`{s literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.6-compact.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.6-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..e0358444c074c932afbaae1d564c03dd861aac65 GIT binary patch literal 1665 zcma)-X*Ao30>%GCh}zdNwv1gF(UwY7i`qJBZ5hTkNNUN{nh~srm;q*GvD7i@7@o;bI-Zof1WNN5gR}lkOr;>TK#CbxyT#? z13;!K0O$h%5FL9B9gYsen4E&aVW(i&*r?#J>2- zZ^E*4Ob6Z^?4h~?y$h{Y@=2uM%d*?!->VHeTFG$9%5Nn!1Z<_y z$Y-Amdd~>lZwlg_GUdqdmP=_c+(|o0I@-_@Nd!FxV3zxyp%H`h5Aq{#K#16(&d9A4}+4uvO-OD zbO-)0KT`KzVq6(E(aG_LX1!defeZkUg}NabpKABsoaqPc|;89h=de^n9#v z&vomZ5v1Ly%=afn;7ga8pn{`-`}gu%9W5!dWp(XA54UqdR<7<@$C^kMQV&WgYPO@z zPqRFwb<*s%w(-(}CCT(r0-!~G$_a>de}xPN11$6f*dXrP9dA|8|=L)5Ds zAAGBWc3V9Z-G_ZTztvzmlJS@jM(cYG`T)rWxYJ(D@k>_Qfq`oM8z|0H$^-hj7 zqne9sznI{;s^BOd5qOs`1=7sBHDUUlLu2kNiw;yn4wK>RPU+u}D@3-`Zb%bu+uPc-o zZ!lU(EL}hC`a+&g=c`eoDOJay$#En9&a`~p-wY{%3MwQgi4uZHrPHO#=ES1DsUyXk zg}Ub~w~dpmlKU-ub-m4qG)S%DPLD7TZaUj!itws@K{;0<5TGMcFM6I|L) z9P-VOVvYl{HX^4}w_>s?%N|`7Y@ilC;%q;V4b1aU&EUS}H%iiZ6%Ks<<1dxbHAM5_ zAtHVyj(eJ408wSK+n@rrY`Z(01RIl?Tu4-F=+e?axbaiMRZ`AfTe`jUS(v z-K#{n*(aC(*(1K$<5)sRVIc|ONLjgJl(1Ag%sVOBLQot^l~BYaKntT2@%7@1O$FT( zR;5m}_nnV#DQH#|YZc4AQma{oF2Aph=y7?bS9K^v>%Ln!m(pNsF4w&NwAQ#1xEg;V z%W;dEc8{@i2lq;6yJrHLy+>#_Ij_@?OcYzMhSvR8P_!iI$V)j}FV3VJ8;f3cE@GJv zTzFyg7ZUbHk#J~%I<|F@e>;|nD(S=9x=p@{3VGkP7Wdq`U%V`8CoX)qzuKV_Bbggy zVm-Z*#833ts5qaT`O2eogO|r*889n%KppaEs(n?`!33QJAq}|>BXK|!?Re9vhNHyv zVGsBg)t@}ECeEE%?9KBhgji))tu3_F$w)gc&F&`d8D`gKsO-hun%DRSg1l5{^`EGB z+8?Loa+}gSmaFb~IrrqcBP6l8+iPd&t%l!i^v3J(E+4g}oh0Jw`Ve;Env!YQ&0x{B zyN-+VtIl-rlQMPRQWU6|)2INd=j+O=s(_-Xv zk;Rzpu(t6EtKq>EWBfjvScT)1Eunj$Q>_d&RX-}xTC zao?((Y5UdBBF0a!THER6=^`X-1Nz@$`09p#lOgmE{y$B4x`0Lhc?*55_g8-N@A@0! C{~RI! literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.7-compact.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.7-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..f9d8875462c938fd9a0c397dcc7aa7c3364be03c GIT binary patch literal 1666 zcma)-X*8P&1BKs6W1CW<)EYHPS42pSZ3smaMNaKiYhvFbQ(LK0Be6so)n+V}&<=bm%_KQ0d7BNl)NAPr!ynYzgks0~~Q z0AwfwfHnXCQ8B?`xG*eU2d-U_YegXKP(6Ad=-SGIBXo({bz!w10 z0l=I{3^CXx~Z6V!^WVG0H!ykHtS%&|h1u`~ZA{jBaqHMJ}Zx#Tixy zE4rDQdc6ZX!j%2n$v*x&eL+^>1Z@&*%lw%sG@*F#!JU@45tV)$(_`zuD-8djcKAs? zAe6qA&oT%fP&5p2+Me<}w14xh;pDhdmIT%-!B!yfw#Oaowl9fqOq>@G{v_kbirJaZq!6ubq zK8M{_X-z$|)t^LWjCgU0E9)jhR5{U=riE@agHeT*>H8A$6O4SVOjzZ-&4yATJ}uq> zkOfxRIJ17)8)KaI2ltdK&L=1Vr0yQVe~_%pofG+GP3T&H^vyREQx-ZBZhANtVt+f1 zD4mpfWp_c_X|oP`=+xO|D`EX=cjwRk;m+qeSXPpu4Z<~mKhm6wf?w7 zqq-^Ce{rKD5jFK<5K+l4OyZ$dqpx7C8kf{!-BcX4@}1Y?278MV#(Dx0F-F~LYD}(0 zRM>c_>n<{O@nKg}{5LTu{8pAbGl^DHj4u-d%eE#f6b%y8yPR*S-Xv|ZX>e9-!J|v6 z`|+he84o)I^jieq_t2J%*}`$umzE_&_6TC0b=Xr8d?(^(O3je=sNOu8QORIzoUv+q zq9@3`e-8e%BKpz`obAe--{X6)GeYYR#)@Of8eBhBuaqdCzjagFTfP)LJhc+;iuXmU zQ_}jdvXA)CUwM1e3JckN@$&e;gWg3_*_<9ZtEYqfqMN7(*?67js)TW5ghuUY$)?EZ zf$lYL`DxW{DXilW`_`PEBDw=jn`VyK+fw101=J%x&KI0EL9_cxDM=BOTQ%e`4Fjlq z;)Kj!GYhMj3EaMjRorxdn3+3CrYRgHhAKf83(zp!{vr@v_-^_3pgEPNw_O`V;FJCMvEpRSS>n0`2-kkoU z*=dY=6c*K(A~_`7%dL6&zLcyqS6f}D;AkOW9?#;2(^YWGm>lJGWQL~>nHhwkY)m69Pv^>;HUp9)L_ZneY z?RvC4ruJQjS8_&&YRF>YZeg6Uyi;eRCL#0QQsBJ~%e%bm-IfKJM(y5|wXLDJ;9Tu_mdCB@7bc>_aKB{3&!qBNRHilP0A2! zgG!4Uo9|#utUGxvr)Km)XCd(EBAPyH)HRiIK=HT}ce>eeGC~2m=`7^r0MgZb=tuFO zeJB4&#dg2943}L8)nU>67mzwJ4gZKE+IN#E89rlYKFbeYEjaM^6?X&oh#$^OxwlCP zIzmp4{(R2e`C$c>!%SlxPY$*@t++7{FUI_MV)eS|#~F0`ryum+KzQl{g+TF;pftG*l+kD?JKUpZd^2-jekf zx^3kXf9$kmKRaA|M^JQe0Et+D|F;>w%i+JIgZ{<;=Lr`Fi0Hp>(Dz>bPR0M$KZI5e AqW}N^ literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.8-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..ddcc81093f4290ace4ce64e9b76a3b376e538c85 GIT binary patch literal 1660 zcma)-eK^wz0LOnbTk|&OUF6-Yk`2Sk>rHuC#9ZesY8k_1jFH#nWqCdFUMhEPl$Ugc ztUAt|GR(_r%*&-BM_qZD?D8&G_y0Z5eZPNvp6~N~|Nju&z>*Gt1ONw42ikaVQ3_~$ z2mnOx2LK}g0I1O+lu!ye*2ENrMVX@L(UC-QA}u;Lju;dh98S4NMn%x0qogDuz*zuD z2LQX=+%U`zCWbY_e`q6D#f_pMy0o(jztgbSnV@&7nu$OBJOjLgjDHfsB~CCbVUHa@ zFQJ$QXzsw)O3H3Va=`hmzFECKhF!CbVnX>~<>d!40?mFW8~ML)sPbjB_TH%k zg|o$lT^LGSkn#49{!hca zo2_CFvzHV|%r%aSfRHXonc=ts7mLO8z?AG#itG+%f`1ii{2hmw7_Zx;M`@)|Jx{1ndrFLHTEXPa0`hxn#BW#k628*XN zM^Ha}j&J(|EZ*|Y+>JTrTzx=b{0Gn_M$v*{yK35Rby|wXo-cM>-gKlON|@?GgM8t( z0JdOnEm@ISdaAPq&QuT6M?U5>49vLJc-Hx+MohjtLxbUWEb5Pg2|K9dI&&c$Pv$Az z%ce865YPh;tr4IAkl}UL_q4_SJXe18qRp*Io$7i-nvTUGF6{Q_WKY}XPUz|bq9ZM?n_vqeP z)g^d&m~>iwoU;w-^|nlM&)@BsX>v4;x(tHoOf)64F+XCe?88s-d05hReogB8aiM=PnwVVE|hd_m*6CY=o8FPG(QmNW`-I9Z1W-T|KW6^(^ z7x@IEDm?FFV%_on1725KL|M)l~4MPHQ%a#I4bO)A#E$}Jla{UT2^+o z!bd|*M(u5aNRPr^{?#E;d;ZNlqOIp{+Fh@s#ZvvGsf$LbE*0pFTfy8t3D>M5QP4K3`^%Io{2 z)HdlOCM9u?CJt$eRLLMGLhS~ZC>fO(kv`l1_E&`bET>rMLoweYJfUN8R@#6T`Gj3? u*XZLbgWbS=V+1#lgai1$o$y5q|0W&u75~o=1UCru>l^f?-+!Uvzv~~zkoEfj literal 0 HcmV?d00001 diff --git a/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.9-compact.zip b/tests/ast-parsing/compile/modifier-0.7.0.sol-0.8.9-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..ebd1e7f232b2f2e644f42cf318e08cb7fa390be1 GIT binary patch literal 1671 zcma)-dpOgJ1IE7_bItg6Zy zS@pns90CBP`T$@70KjSLDRLZ{M7Og?xFGBiDbyq)DJ_{wKSMl8k4+%|NJ1p0P$|mt z5Fio&E&zZ#ixuy+Uo#3wgEi2Ndj` z^^H=C=k6lnk||Q~T()v<=VHe3XxXz^Pr0)e`Cm!g>)kZZmh_kAKBkQr^!d1{i+|q# zLKVI@t8+4;alL@=ut)F*^UjTEK#lF|r2=1$smh0L@QU4}!_wQxb6(lkB7ANsL@1+z zm(}!|00GRp!-M75gWl+bek<`F^ubnzTFhWk@4a8UCpRIL`7=)Bg`@7~io^T(KaI_Q zAiXaeMCX{2vz$kV>bje}Z2lX*BDS@2vbCqs2C`(clYzX6itCSubW}tk4~yYljwOle zD1XCL$_=d5It(;jaldPC_TuVbHU()l;BB5;mk7{1@azr{m5YW*1OI~?JF`eP&a)xj zsT5%-macw%W0hAMrk$SPa+D94ri2(4d6BGD25JQxwXdA=Sr&yfQMP*hg7-C3)Lz@#l&{#~-4Zluo!?mT9lmEjbRW23B9@{g z>AQto80{WCq#YNq&;rX)nNAsMv<;BnUlHRCBh4Awf;gk=vu~@>uMgo3gaH85n}>7Z{^M~(pZ`dO}kfUWd0P(5a}tTf?T3J z*jsfglh3Wff-2w5sRoH38ym|1o&{r*OO0wC{Vv?KwM?lT+JskR`=+->J{^(~v%||3 za@MeMhK^V4qxb1D=U*Xp7<+$K<|gQK;vLq#W+MM2a5KYDOkUiMu!Lsdt;jTaBiR{N zzooi5JKV9kHBMpv(Hfw+-fp0d_C?s$E=ZL+)_gQyZ$6t#3izcf5}HT1p^Ts|_2?_S z!`~9zo^3AOALMelCb-Ie$0dwa~Sp>mAsq%A6Vf6=IG0`Hyc485$>o$kZc5i^~uZWx7ku{rR#0XmA>BJd^A|LPE&CD&#>)rZ57K zOb_JL*iRCEOVa@H9fPSjr%L*uxR_V0CN1(`+G!e@VF{|!=jX4m@4Q{4kZ&}wGVd45 zHk0k0Hi_ z+8A&o15m!})QQzT)Yph^ulbbs^1G5Z9|sDkTTvf)hdQu{fggc`Ac<;io0g*4qSmB* zs_{b8Dg0zz_@%5UZ`EG{tfZW*?{$Nt6-9EP(PTZ3qT80#=7PZH&o@KL7#%4gd;VJ5_b7cz~b-005?u7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Df3Lu*272BQg)r^|#@7lwJExX1Ps4UYXg&F0<(ict_;ONcm zSSgcS_!szdte}5-Y8sFg`@qGVDOY@B``xL z)e-*e{+co(O-hQ=I!d>YdR`hB+0x zV}U*jvn{Y0(g%!|xnXKfz<_xK-bJL2XI`Elj20!h84`LFF&r9Kqgu3$CFYEoxl3Y#KQS4$`^f5+jWQK08M zsef-j2a1IziK)~AZQ*&IcaWs8IU}H|Ib}auuyH)l`I8oHH(7&VIfOR*tQZE-#=wL^kAQ`FUZ@P z+5aJ736X6ZlA6RMwR&L#-be+P)(!L~JxCrZysMm?E_=2TDt`0`MAh?pQkFBX8obYx z0&Il)p~%c;k*H6c_DW+_tjkrmGvKebAxpXkHGzLNdYtsEn0%*BUvJ2!lZ(GNF|Jdd z*C8{e;2pX2ck&;5N$2mcir^2JbGo)}bM$6sk*r?7zd$4(is2b&kI^S(NhbkK*l+`U z3hfs1Q^2i%K`CpAbtF13C$00NA% zJYIScy}Z-s&iQEFtH?O+*g5^Kb-4h?FSiU1IfL%3AX0lQ52nSuKvps3Eu>E7 zpby5nA&cRRYV#e^9c0{Iu}NYGH!=v-)^vXX7L~7rtvBf_F(wYO$Q&%tgy;sXEx0077@$$tO< delta 957 zcmV;u148`D2)GCvP)h>@KL7#%4ge{0a8!h58V!yE000CI001PD4Fo5VLL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B> zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKb=I6Ez@H7&Vg4C**{s)}1_T$1V6RGu^VtQ8h z>Dpk3-k(ZGRpe_^eumLCr|y3Yuc&hqk^Y?-^6p~Drhhy@JaYU2BS`r0)PKO1-mq>$ z5MZ=jvk=$qXN}p9xsoAJJW9LUKa6X*(*60nb?HSHU0`KfUkvv^Wi)km{ZGh1sS@LFW$ZnUY5+dldMlXttrsozZlEpGK7}k!*27wbB{l@S>JrCPJi_HwAvX5~IUL zaw&f;9GQ^eMHM*umA)#rcl~M3oB!yLuGAi19MbxnXNPu(_r-I1;?1KzZt%!Q79V$y z!OZl3IN?2_Q7O_Kc#(fq?C(_;W7$~EY8K$qC7G%Zw_#~$9%@7bBZ7vF;8NgwW|U$U z8D)CXf0VsJ#(@S)^Z)+jh)jJSmP==;%l|F-o~%QfdnkPj6a50tg0=_nKCK?4qUx8I zCVU6K8>|6G5^O#9a6ke>x575^`yw>%%A_061#Y-@3#v@pt&xAhSEPac-9%AB0}07N zj@%Ud@Nl?Ivf%1G5i_aQSTbCye2J(Oca25qk9DrkSDp*FpH%)#8Ed)Uap5uz@@!@$ z=XN@3ZSkjR4v5C&kw4!MAXu}@6Zx>77ybJzMACcKD_*x-K${Uuy8*n#f1ikRzIm04 z57ob^PmyD>Ed75G;aRI-L`=HtU3CT_o=dLCAI-%3cd<*2V-6wC2SGUZyIq#^g}x_k z^2VA6wLr2_!|7l)Amulm7j5xRa$+_9n1w07jQR?AEBW*T=`n#GcRGD6kYP!WV~e*! zu?mWuqH;759G>>vS*UEnB<)86h)g>0XEc>PtOOvLCBlE1gdmN4H<;X#0tp)s&`{SE znO^opH~}3Yf?u%`Ij-MglZSADyW;$ca1pi?`iGoVm)pQNgc%k};!A&g_cb3XOgL~d z!-ye3oIOVT@KL7#%4gd;VJ5^5Xa(A2q005>A001PD`~xSELL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3Lu*272BQg)r^|#@7lwJExX1Ps4UYXg&F0< z(ict_;ONcmSSgcS_!szdte}5-Y8sFg`@qG zVDOY@B``xL)e-*e{+co)126to&fA*uNKRTf75EXio1sdEhTS9ezu!vsQEdI~+q>0G z4yf_w)v*AA^$NWh&5|Qv7%kHI_rL&eXB$Gd`Q!mWI@+nnJE!zN29|&M$p6ur75Wut zZcMncCJ69#6SBf|_fhUIrDF~XIF*mky;MnXtY2-A?I<9vTrj(b%W;6P6^A;nvm4ub zi53~4crub)@*el770C4088yf8vLes+f;rMli#_uU&TE1;x$V{0V`9A*4wW|8_C?{O z{^nWWHqq`st%xLh6*zxk!+M$Vp|Uo2zN*d)e=qf%{Bh$MJb@N-d*}pXK3s+GkN32+ zH^oPDK<>n@(F`Y9tgZHH2IoG+Ui|P1i~f^|sBu)UJ1o6zaU0g69F9%@q|17uT(Z*@ z@!XVG)yGH0IW#;m^#6_wV`jRW%M37NC(YErW_X>sSr%TlSPXw@a(Ou8>*V02zz_{H z^;#JqFPU5iWvUsJ5PW}CH|O`lc$8kuQRZ0zbpb_XkT-hq|H$9!Nh61#nzUR1W+u2X zHhU^eynW@g9WdvDJyXuC8-AuW9gqU?+)u(+fai^kuZ!^I9~?0bCH~I&9A&`#q8cp- z2?v)>Q)K;wz?gsLvG(k4ND3HC%yJ^=CZFupmTRmef(?F} zZ`#9QeCmHn=;g$7#qRAX?cH|pz-U9#t005>c-Io9W delta 950 zcmV;n14;bG2)PIsP)h>@KL7#%4ge{0a8yN!UzU#p000D$7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=I6Ez@H7&Vg4C**{s)}1_T$1V6RGu^VtQ8h>Dpk3-k(ZG zRpe_^eumLCr|y3Yuc&hqk^Y?-^6p~Drhhy@JaYU2BS`r0)PKO1-mq>$5MZ=jvk=$q zXN}p9xn-Iv$w{mC`~fP?4i4+h3^zmW0NWx$MFGBlpqZT*EvUY@WVE$FheZL$fC~NU z&EPI4tR%?@R`KrYefF8FY5_FT>CB<6Jc-ePzZmMk<$QnJxj)`l;DE&{q>zc__5j5j zp;=HVGznYH>WiEoK;Knnf?hBV7}e8D#RL5S6jYU_EMrOG2WnV=bq-uU@!*_F4!@hI zx}$}#8CeXLB+RuGdO_kk(+B!T>#8}Y$;mWF*k~nNO)Ylp^9?*5_tUxwBy_Zt3Nx>zC1!qT`5z=t99 z%xz!O?Xt0OWn}_T7@V~z*CH1dNGDeLCK#aptsH;bKj(2VCQ!Z=k`TctTt~$JvPvjc z)-OzLkV;&JF^t_gn40cdS1Hd$wM*N&;4W_pcdl?7Adry&CBpGc>qV$s7uaV0!s?nNgbeu6G0&Sq%x^z| z*je`;OnE}o5ORy>6>xI!e2UtSO!9zJ_KmY)_=Pp`q9|%TAuD5tl^jw>XY6l@-7TA5 z*)QxH_h!NI{yI}?=KiOsl}^a$p$X>>nVx@P7uZ9-^$4+NiSbwWe;V9KM(Jn5joe$d zbho-blm~-#plA1V3@LA^Ee6SDeB%QI?yz0`xs)bvxS7a%r_MuVS*|hW_my*h6w~I| z=QuzREz_x-so)%tMVfJe3FO YR7HtjmX8Af00fiw14#za0{{R30Dkw)SO5S3 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.1-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.1-compact.zip index 69a7a8fe4455ba4b6f5b6219ea72e05dd427d7f3..38729e07678f7cf3842bf81f29343939f5cb3e5a 100644 GIT binary patch delta 970 zcmV;*12z1-2*n5+P)h>@KL7#%4gd>WJ5|fMsw0~N005>A001PD{{ttHLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3Lyn{1n8tZ&G0fqmqSNxCuM+fK+L^ay!!m2 z&89U<(PQ1V2|D*d&Wb~+EscNrtVZ8N3*`mu54t%q?|7e=HMC8^5_z90*N)}V=?Q$n zjnp~d;c6%u98)&)Vw#uOhBfEIj27_NkdcW2Ts8R#(4r5$kwBO${*Xg-#_Ank@hHLY zovnXX5zS3;rdKjW)zJ`UUoA8NpQXLtK55I=<#Y^vI9q}7@Q^oeoKb&vD>qtpP|`vt z7oKF!*LHx3+#se2SjzVUb4BTkbrV<+#S5EUv{9ebeKeR5>3@(IH$0Z0i@Um7XPm%j z86|m8-Dq*v_jaPR;)MA&)6i9z%+~yfJ|@2nUgE{5l7n_%o z+LbHk#BU9}#fajyMeeKxwMB#(wHhV{vq{^C z=?|TzcreVZ`xR7sLywykuj}ZnX+EHgiWHn?d5DDaHvmLx#PIk^%Jd*Rfd7Dg_zY(8 zx_rE%#cWeZj|FzVuLl+QlE;dIj4 zeEN~)s@*|;EFh7I=|?r;1q8)5bS?KN04@(d-gy#Tkx_eO-qx264bjV%hRa{}X)M4U z2hKNLES<{COV`$|CRPj|D5PICam&NC z62x95tzOf>9Q(>EA~FFEazk3U^I^#xFJ1VVUs$z`H{$1sRW98p9$C`(_#o2HGUP-5 s=1P1eP)ip90zU&k00ICG01I3@Rm-`mBbx&N0H%}e14#zm0{{R302lwx$^ZZW delta 953 zcmV;q14jJC2)qavP)h>@KL7#%4ge{0a8&EQByN%e000D$7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=Ih2N(jG!aE_R(^oyF3+vAm}yxxtJPx%XIK8cVvo=dHYk zw5qi%#sgrkO{{;Y_uf38kO?*|c6D|a$W@*K zg8?g1i;Y=wGtoQI``u{yPjK#T{7CfLUs4Pa6aq*U4jTs>(rUSm@|eJ-Cy=RqGEwuN z8&+X9cpC?F=)cjg$@IO-5tM!pC&_>P96tDdJ1y08)_#BXN2}Pc@ZX^=-@?%+W*0V| zf}}c|$RFr6OQCbSi^rg^ldQjrOS)#%cXO+w#f0Qt({K^Qlf{TYnW`RMiWXT0aDt*^ zfWv-|#BgeTeW1ynxlTgV!ygAqhedsBL=Wk6R*j8w6!Xy;E)y@rF zf|k4r1(<(UKRgr;QYTxIMx3{%^uh_CO?N?-<0GM}%6_&Kqv?paQ!+WiG}|)-Vhj=> zXgQ@!kx*b<9ueXb4L{Mbqk@r}&}ctgyHNCeP^`iISY2T~@g3-V1`lAa2!Y@(Ou}QS zR|}{&9iemdzcYe}(8~6j?-h`EoU$STN-4HlKh}T789|;eiFzI9tS}JEhQMmKWP#)G zeu$q9Pe4^K2OlSUIlTT*QHfEE8gZTy)6jg2h59%}y;>}&nWs3PFUj(dyG8}FLP~H} z37S?b_K*Btya5+t{`N4vU22c8@NP02xFjaRiX?@06eahVH?=?d01SbMLvQ^BnosyT z)DeI3;P}nWS=b!SaymcZgBV1dc-zb(%(AlMsr}v?K3WDZlPR-0SOyGd#fkv3O*2t0=+TmjyO00s#e^GBO928u13v%)01gfS bDRXdC>%Jszk^=w$1e5jyNe0vd00000pHan8 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.1-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.1-legacy.zip index 26988bdc62bf7537702adc1529546dfac39a3855..46a1a7d69db5f804960cea642fcd84ba44024dff 100644 GIT binary patch delta 969 zcmV;)12+7-2*d~*P)h>@KL7#%4gd>WJ5>Tk1NE8%005>A001PD{sSkGLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3Lyn{1n8tZ&G0fqmqSNxCuM+fK+L^ay!!m2 z&89U<(PQ1V2|D*d&Wb~+EscNrtVZ8N3*`mu54t%q?|7e=HMC8^5_z90*N)}V=?Q$n zjnp~d;c6%u98)&)Vw#uN;}G_Uim8KOM4qAB0T3C!kt9&nl>>ol1ygE4I0}ChjubnZ zV7V1+G4YJbG~9B~gUX8H2HgxQ)~$3q*!Q~_ML$_-<)t?Rz*E!hVRe6t8^vM6-)fuR zQ2%*kXDEJ%%z}=s7t$HP#+ShRQigxmTk+Bk zHd)h=oTp?$LbO*x>NbD$x00pn{xc<25Akc34K;%o@|ipJnom+SG5vMrN95 z0#7SHKv~v%QQ^Wu`*-^i;-f%EcR|A(z~6{RrsFu4sx^4Of3CDZ1oow?@+wOSP@U z4)Py_mO!0=fn+N7&V&D6Qw={ii>b_@B8b@3*)x(nXiK}e79P(ldE&7U&2E;@3vYX! z&ASeNlKlc7EOiVlWKmZ3k~xrH7RbyU?E7k5eXzr8!{9m#gOjq|5jC>V!Vn3hj?1ZW zCj_<&Yv(}{iok#6@fA1Q-76Pr^gcPsKC=6dl(Qa~0-s7p2azE*s9%_Ft>VBeE!{h< zYiB{-B3(w2$uCvT6}X{&B~_E^vi+UVzC8wVS3j=0+%I<1LXM39x#t304bb5m6pV_O z>67O=10#DhIG_dcFfuyyk9cTB|F%s~JlHQd=fB*ex^REAWl%fL-64%)XgomB4STm! zHzTLJ{KH0P_M})AHTvtLTU}Lf{cc$usiaR3IW7YFNI)4kE8tcK==2b8j*1~9+zHon zZi57YP=z5^QxTDmihigGI=E=H78d9xf}O@KL7#%4ge{0a8&L(N_vq4000D$7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=Ih2N(jG!aE_R(^oyF3+vAm}yxxtJPx%XIK8cVvo=dHYk zw5qi%#sgrkO{{;Y_uf38kO?*|c6D|a$W@*K zg8?g1i@3Frm?Vgy$bE`M6=`#9V(&*m16W$`D=*CHcY9C+6sd~c%L>fIq_J9s*LM|4 z_KGf{0jS=;Z{#a$u>LCjLkD35R68RN3Q@Wt9!yi=(S3hAILnc*5ww#9Jx(o15+k1x z!5ZFF;Hzlc_29_?qlOVG+quj70IB6J2c0Cg#jniUhc2);?HDB5B`T;k#o)n5{Ku5* zeh4RjdiCY;@KLk>eQ-WLE;u+{quJ04Jh@RnkE*?=7br%}m3O_K6C?MTXMM9i?7>m< z7-;C_d8mILEriBol>mnpqJFeEKC5ZeD5X9YWchY+5D=QfoeOwUk$B8%+HFTw`LF4h zuYJ|bDzZR*T`52_04xY(AbB^!)lE)cjC~Dus3e6avBwkPb&pUk&W&T1zUn?<)SEd**?lXF|Gw1*|W5DI^nb>=Y%Oqk+eI?WX?7jNLNVo*a;;2vK>2VtYrs@9Ar^1<=E_;CRt z;8RgQ{r@EjOqhuX+!9O?H^3hzJG;q7d56AtxtKz%Y5&_R-V{(v0Rle*KL7#%4gd`) ab8uAdI!bzx0{{R7ll22h2Gauo00011$iV6V diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.10-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.10-compact.zip index c816e1db572b0cd11d4a5e090ac4116e294ef1e4..16f0e36945917e4770934097773e5ebbcf8f081d 100644 GIT binary patch delta 985 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 E0OS+s4gdfE delta 1047 zcmV+y1nB#X36cpLP)h>@KL7#%4ge~1a8zrndjseL002P`001PDPy{EDLL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B> zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKb=IO&`62kS*-R?7bOp)aZ@3)+Y@hP-i%_xny zenm_f0(0l3@mJ_KP=Y#-BYS@oOip`c*aK>SL8@2b?C^DG7zdzDv~qR&%rwr(!T&LY z4t$b9DyvTxvOEh- z`6@z8x@J0{PF$zJGmQtoi{R;i*fssU-+_diQE=M&yy>sc6*whsW+W^HlGzl6N;|`n zcllVyQU1hNp@{Sqmn&u$?0Sc|E(lEcG_FdF=i8L5nw<{sD1SHYoOS9bWaO6=bG?RP z_^kU13SBO+3ejhlG--e0Egilzy^I)6xt(g&dyLZ-WkfT^A&thj@%ha|SI~WdGXu!pyt07S7|?%GBC6ni*W8BAeGez+ z8Nybb1^Vx3Q@G45;A?Y^E9xm>Xt{s3RetYm#KM>d$Lmv3^VC5cFUb%FSFxN4p*Lab zQ!IlNLx-#ooS{M{wc#8*z+ zf(Up?ZGszC3O9p}S8yv6FyXY}m)%eBjBz*V0~LpZiJC>xKN-rkqEK6xc0olSdXUaG z@VIF$YpP4eP`6*LrP|a_9u+rePh5X7R2QD+N18J`eF0STyw%?& zkYkNZ0zO~ZC5-+AanwFAo@eI6_k$5jyoQX_4yA?a+xegDOn-Og*J-PV#wY(r{VJwJjV{)s;1w)=dR4eaQ5e_UKc& z=>fm@kL~E@h=?FhUIEA6kSzvi!xfV%ZT}xQ2mnw^0Rle*KL7#%4ge~1a8zrndjseL R002RgJ_JbyDg*!k0094Z^UMGM diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.11-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.11-legacy.zip index eb7c8fe70872273de8141f46a6ff0fdf9062970f..9eb504d5352bda077a812a42c82f9477eecf95b5 100644 GIT binary patch delta 1034 zcmV+l1oiup35^LCP)h>@KL7#%4geEeJ5~7|VmRXi002pm7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Df3LwwZBkl@}`>u|rRIE|*vS*ttSwX%?hY)>X!%zu5N+gJW-0OtckAYE57_#mJ%Km{^8j`Q~r?!)r?-1 zD#(*%ZC`&9u1iCFa3E86-^a6)zb(P0o55qoCFRFQ2#hCL`KDj<9%0d#?h^la{Ajz>Wc=3NLGU14+qZEiVTmLH%3QX1C9H?$F zdcv#~Dxq!AIRT-vrH9p<8wq6CQ_aJc8U~u;jpjzNNA3We!-?=xDg)@u9L`L!b^!5> zG{HNNZh57|VD+p{8t-ll&f6w@#3}#rsSoM%Wdm#g2sH^CBR~59K8o+PXK5GF)q@9S zK=FUd_5{@iN417upv8DZ82SnZlu>1`3rcg!aIVfI}sSZMvp`vZcuX(bznH zDugrargJ}RWMin*xqk+qd?*E~aQ@fr66k-R6ypCtxaxrA&dWOowux)R%F5b>w`eil3u9uCd zT(UYOmesxrd26UPIJF%G?8ZV{JGZ==9*|K4MzA8`^Wd>I-L_mdn8!SnjKvSzLoQ#J z3|^-3p!O@4l9Z!ZN$4p|M3vl)`qP5(c@?_4(^FaRCg`fBRM+-OL!S5)pk`GJ6w4mn zPFdQN&czx2?xq%h|D>ryvrtO`0zU&k00ICG025q0RrwuaIO78V07;WW1W5)Z1ONa4 E0OS+s4gdfE delta 1047 zcmV+y1nB#X36cpLP)h>@KL7#%4ge~1a8zrndjseL002P`001PDPy{EDLL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B> zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKb=IO&`62kS*-R?7bOp)aZ@3)+Y@hP-i%_xny zenm_f0(0l3@mJ_KP=Y#-BYS@oOip`c*aK>SL8@2b?C^DG7zdzDv~qR&%rwr(!T&LY z4t$b9DyvTxvOEh- z`6@z8x@J0{PF$zJGmQtoi{R;i*fssU-+_diQE=M&yy>sc6*whsW+W^HlGzl6N;|`n zcllVyQU1hNp@{Sqmn&u$?0Sc|E(lEcG_FdF=i8L5nw<{sD1SHYoOS9bWaO6=bG?RP z_^kU13SBO+3ejhlG--e0Egilzy^I)6xt(g&dyLZ-WkfT^A&thj@%ha|SI~WdGXu!pyt07S7|?%GBC6ni*W8BAeGez+ z8Nybb1^Vx3Q@G45;A?Y^E9xm>Xt{s3RetYm#KM>d$Lmv3^VC5cFUb%FSFxN4p*Lab zQ!IlNLx-#ooS{M{wc#8*z+ zf(Up?ZGszC3O9p}S8yv6FyXY}m)%eBjBz*V0~LpZiJC>xKN-rkqEK6xc0olSdXUaG z@VIF$YpP4eP`6*LrP|a_9u+rePh5X7R2QD+N18J`eF0STyw%?& zkYkNZ0zO~ZC5-+AanwFAo@eI6_k$5jyoQX_4yA?a+xegDOn-Og*J-PV#wY(r{VJwJjV{)s;1w)=dR4eaQ5e_UKc& z=>fm@kL~E@h=?FhUIEA6kSzvi!xfV%ZT}xQ2mnw^0Rle*KL7#%4ge~1a8zrndjseL R002RgJ_JbyDg*!k0094Z^UMGM diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.12-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.12-compact.zip index 18b5c0023ed087193598bbd0d7b77d0977a61d74..bda6fe0e3af835c344649cd7b7774a091db58442 100644 GIT binary patch delta 1128 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 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.12-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.12-legacy.zip index 18b5c0023ed087193598bbd0d7b77d0977a61d74..bda6fe0e3af835c344649cd7b7774a091db58442 100644 GIT binary patch delta 1128 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 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.13-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.13-compact.zip index 05e511d7919704eaeee8cea5046e0bbc8b75aee9..d0d183716886dc75964045088455ca95e5ec08b4 100644 GIT binary patch delta 1194 zcmV;b1XcTy3XlpHP)h>@KL7#%4geKgJ5?p{9LQz_003K&7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Df3LwzQQE-T5JUwVWR5E7$ge;Qxf{m2|reqOdz57|0cMU6v zOh9pXNlnt4k_CTOJ9&bf>LowL{SS0Rh}tM!=h=WR6V^?ifgDA((a|+6Z$N!S&q>M* zu9Bi!uyd3Xyk19MfH~m{G8vN*8f()5*)0NES;YNYhp=u2jW~bq?dp&P&44l7c}ri1=2W3A(ZC5E(J_SjB ztLx<18Tu4UrI8VRhXq%^`vgg(h1a8XY~1TA|4-`f)qJQTssC0<#YIVr`YPAq6q8O) ziuQ?PqS${*-;yVjRTV~&rYJ*fDn)@^cbGv`LTPLxQx!QKgmA_0lv#5hYI0RLDVhnb z+%|QDdK!Np!&kNx zd>xHuc6#*)NPJQV@z_@j>~zgm`O>aq;xny273Pxcqz7WJfCxx3i~wrtzxO*|G)ryj z&IX+fm~aTq09plIWH0t9NThAOYq>#qOIUJ}snUouhU?IWD(O7*X3E?t@w0xkceH;f zh(UjKG(Q{2=V>WGIRUhK6zU9hNa~g9E?M&jQGJq^r)P X6_7rn-bs?SR}i7?`A&bY?WnJ*v-{$6iIc%_i#kqIL1d^^6b;C9VIO)DXZQOLbkB>^KxvV1Ia%&t9{Z;O3U zioBc+*6++)8Dv~L0(}<^%Ks!8sz`tAVLGKU1fs|y%GPmRl!CKjw7g9{mZLCfY%BX1%pbP|hKDuf|IJR`pE(|IU)cBv4BM0zU&k z00ICG02N$2RVDBo$Yulp09z3N03-ka00000000000Du7i0001OZ)9m^X=Rh%1T6-r I1ONa40QhAtj{pDw delta 1167 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 A;{X5v diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.14-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.14-compact.zip index db0a0f3fd72bc2533622907311716bc05c162cfa..ff506a00777298b6faaf8f6e03fd4ce8abbae81e 100644 GIT binary patch delta 1170 zcmV;D1a13{3XBRHP)h>@KL7#%4geKgJ5@F^rAJ}}003hV001PD(F7-vLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3Lw!(5yXFr|J=^3B3)c{zjk9zS)PDYRtn^L+ShqajK~?=iUld3MGQ7VB4O@be zwa-?BRNc^G0eKTph&T|2*!c3xNp9_y%GI<&ArZ`_eyVB)>s;#f+8f}&H`($DsXSz_ zgz)g(IrGsc>Sq4fApU<$$y@`b#Rq8+D~7Z0C4#ewG?xPX`Pg5H;zHZ!#GXFe>jG9E zS}34lQ`XH!giQB(jK7Kj187o3|HAs*jMo88>Vq$w^R5#;}voLDWrMyKY@u@=1IHw{ByJ-q43P;lL}TrK13?{T>5Yc-kz zuNk8;G1hHrG=5Lm0)r9D@mStV0u-!8;NE@P3Ss3fo+k2b_K}M&9)pk=ecq-cyPl<% z(Kxt^l{H5>5jyfx`1LR1FDJ-3^0TcYII1h{g<-$I?yrA`J@hCjOvh9)rFi?*AE7EL zKJRswgYj?g5sSRVX-1=oyw8eun0B}OHV-G{b{If?e4d+_zazJ@9YHKP2s47ul1|(c zbW$NC>?MQT8@)kw6soqODPE(>nb!5foPs z$m&&me|@z^&zf$vdNJ%U6xcGfoQ*&lz1KWQq%&NK{cy6d zi3lTg>KS@a0-2px@n$6$be;ueMHCYaKdG+gu`FLPLa$|@4BoHwofwNKJbAd4`6#^L zYO)e7WABC13<rEM`8p30ArKC1W5*@1ONa40PBAzx&QzG delta 1172 zcmV;F1Z(?@3XTdJP)h>@KL7#%4ge~1a8x^C3Or;4003JN001PD&jcrtLL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B> zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKb=IPNgP^cHe zQod5isPvGl_Fu7b9TOUw0L_2W4+ZzK3j}lYyyoPDRDP#K#9qtss15;mDzzpH)^>#m zTt}XpQDy8B$+yac2L~KQVU&VTSF~227FiqF6i}lPP1>jz^4K}I60>t3d?PU6nKZn* z!43O2L@R&#wgG?`=vs%fv=^rJ?D=dk9GA3uWFou8kpLhy&^o{xNPvHr(3ydc=42M( zg5NB&ZEVkp%Z5tL^`amm)14?#l)$(jgkx&$g3t;evu9AWd^I@!Vp2U~VkvB0V_POF zDCzEfuUb1A_wZehR)t`E9ewg1@=MNw&_m(masB5k!2YJrQ6-QxTaDunN-y4rkqDq& zrA2{}B-=Q8?W5A74ugMYXo_kTg@5ry7eTfULKZmCsKL+dD6sdHr#3fstrU$k7?Dt)=L z2{OSRk*RTSFzFEEr@Y%WmIs*hdo)i4j2VOW6akcO8LQ+r7_WaSu^OdZqYk};V%>nw zZ^D6)ZqIn7tR zwcvpb_iA($z7i*2j*okE{42l|ZsoD_>?CE+1X9FTn7g@P3xj7z)r+vtE{YZ@u9I0@ zTI$kiUY>dSvsESK@j-?}&8&SFo{8%;qEfIT7`ASNLd<`RV*d$d5PPS zwd!N4q{1c_e6k(`d2@LW)|*S^>%v~gK{#W8F^NCkc(ijwNi%6zKhPocq+iAUj9Jb< zb575;;GZB+lcCmuZOf9|%xJ2M0!mt}76SXRl=|@Ax%XhUHbOx_MUR)QU_m)QPpYaV zfG@NNm042M230-3j;k5*Gq)NuchEzQ&CrcZ4L>4*wB7d`A+jwqdgJAYu zP}MNk3`5ED>Kehw!z+`8cn5 z#!=f8x|nYtL?}@v@`go=D%MO;GmS&z)VT*m=pJDm0tP_=xyTlG3K4fz z1_>k1f-?Jd{023As=OmjGtrW4p!~pjEjShH)14cGee5)B`^dgz*CDKKD-Hj;?ceZF mO928u13v%)01f~ub8u8UVG2BC1ONbAlf48<2Bri6000226)C0w diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.14-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.14-legacy.zip index d42f602b7dc537bff43b2fa5b0298331e829afd5..61a37cac32dd47f2c13fabc045c031ea4d462897 100644 GIT binary patch delta 1139 zcmV-(1dRLc3GE3RP)h>@KL7#%4geNhJ5})>K#4;H003tZ001PDu>>cPLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3Lw!(5yYO8-(cA(V)L}eqY`|jX*M!_jxODI)I3R>5)LK$I0^BXfy z*?*OJ(p_=BI@N0be)q4ei`p@Lw;=ohOB~$v6GLS&!54BBU^d|DDfF$lXX$L7d~-j# z>DEHFbQgH=zu}{3DM2-SV?F*J3TXLK;PQpODd=m}mF{W)KE=Clmj{bb9E5Uf+;H(ZLJ>{w(HGq-@5(Dn6{us*L^PM-f zv6!c{lL!L<_LF}=o~2)l!xv9)#wwOl&cEB{AauS?w>>)%QZYEtiH$S_q>mkL=qcTq z3lAw-$&!z@JMF{qcHneg1iDS)DN3!y0_05DjE1d%EY>gtCoRZ#*6#7b2NuQNn1Nu; zI((tXFqjEcRCkP|?+?6w$Wa>|p7UDc_7FY;f|;qzKK_5g6Uy$TEYZ;O_1bikLPYBs z12@tRCw^eRJDxvqSXZDDst%mOCd)9 z<^epz@?Io;t1sae)tM=1Q4hW53Za)p9P9r1vg4|DBd$f~HdN?ZR)o}SPK@Z6|Iy&# z7A)BCHz|MVWiomRNB4z|&|0cEqsbNymRt0FN#G*x6gO%#Pb~-Ez}@>y5(WeHm{eQ~ zZUD^?;2y;3zQvq0YdI5(1c0UD9^PmkzDeVC2ZUhMel}=O!wDu-hFVY-6n=KWfpC6h z*D%LqCH4z=8R_cWYc~9!9#yz~^&>ZrgYR0e4;?^{2XS6Yvj9uxv-8`G0>q}Knd*!8 zz+kk2K|fnl1G$9BjsMUoNwiQ)0Rle*KL7#%4geNhJ5})>K#4;H003u`p9Dz;g#-Wq F0075x6iNU9 delta 1140 zcmV-)1dIFa3GN9SP)h>@KL7#%4gf22a8&q;aEC+$003VR001PDummTOLL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B> zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKb=IPNgP^p9S zX@9WSI^C73Q=WeWw!f{^KjnoxPdF0;zDIv^;MdTYVId%Qe_2k*LB>iT^_ycEjqN{S4s5WE z1|vAs`bR*C;kmUd2Z4WGe&&x@g9+6Tx2sQ;cz#KBCJg3C_>Gvo1|r5Ors3iYn4 zi0*ARe7t>i1It@!g5RvtdKg>y#N&kqoz=|M083Nz5CWoNpH~!Pp|cVR_9>}0>tosO z-NnUD%j;y_111xghjJJ!XmkY<10ZvN zpQnM5B@OT^5C4BrCGC@iavf%At|qtU-oP!`n)hz=-(Y~DJ9q;%+X{D=Z5FiV1;vLU z{^Qd|wjKDJlkb(r!K4mG=+a?xOg?M2(p^xXVmY^hTS6pLnh)65M4&gWS?y^YcOQMy z(6EvQzD>h(QuTBlsK#%JmYoG^+OG9V13~bWIk>I={_1~q&i_PPZ+AQfNyZ5L)Fbw- zUpiO_B2nx3L|%OB?=Vu|KWDpE8B<$F?^3Pp;W)_HZ~(9~0N!0uT)A3D;FnL7X|9lc zh5|Mo8Y94bVwLc>zZTlAIc%#ca^&fn*7xaO5mhiXGb9Wp19nvEDt(^fu6OE7O)jB)t=e|0`qV94`>(tGa(F-S|T5*1RH1LU%gLit8)iuF9 zui;f{Srww}wQOoyBZ(tH&9Fs5>f0pNWIvgnqPRg@kCKXjzYQ?3=_6u8M0^1SXc6|Y z7lCkaWCS#8?8jdlx7z=KxnO`$O928u13v%)01f~vb8uAnig1TS1ONbElb!@g28ILx G00027RxBL= diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.15-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.15-compact.zip index 0483a7aab88d630298ccfdfc17dd38964d6c4f22..062329dc3d1b323d96f0477a745bd0f19702c758 100644 GIT binary patch delta 1170 zcmV;D1a13{3XBRHP)h>@KL7#%4geNhJ5>Y-@qS_i003hV001PD(F7-vLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3Lw$KRh&S*^;SitZ0wqe(O7sL8;uxk8V3mf zFRpu0f~!R1Z*Cir9&9NZ6C!_TBfSIg2-L?iaRTQXPt}L~!*A;6oIa!&RYfjr6AntY zZhRk$#?2NFi>Kpl{L{qeeu18L1A$LQ@IKo)4Wcs>fddg&vo6VLUok5Wz3oij^=E+` zMh6x)5U{v2`GXT>A5ojo-Y#N4a#{M}@G^W3bqajO`D4{%Jc~SQOTE z4#Ra{Fp(WKsrp~R>TqP_v4xGyw+l4fsc}!&V6rUvDi5$=J-JKg92qWDYflH4oq{6@ z0QoV)SioK=@v^l0~sa0LGZsJzo#dY>u;YISM#=W~R)tECb2r5jr!M%2K>3viKVROI%+)gnGVlg#d=Kk? z(?JT>tg1QE7iEKBpL_CEBw#jmkRT1^(xTWFS$YZz#o56lKyyuh5cS!Gnzi{K7O`9` zi2>oc-wf-@guq*VoRIn5mfeMkNl@hpNBu^9(|LE$XST3D`(%G^7M^vb>)ij@-f?_2 z0SWapV$nQ?ZW08rCUvuOUS+p70+y!XG6@6_#QyrENA8F1T+^9gCnJ)hJ!gjZvh5eQ zl)i-OQlVP-OE1p)gFacUf@zav(V&;EJi0sbtVMAn7SagEvL&4paamHpEamin;lxx? zR3VM`kM!!b80CL4IBVyFss!3T3)^D+B9EIb>$=qQ@3dnUh{4n*ojz30oE6xYRidig zMaa-Sx(rLh@5?=*p+R?#q1PApW|lTW%H8Lfwdusy+%$=E%L9O z@_sP0Ihqesn=_C*0jDsyHINVObWT;6`&GPk&HQZ#E_Q$OnKiuTL(rjX2eXbf%Wl#| zahrpFx^xd|L{(;D&@qSnB@EhA^KFX;b8Vj;h^?cIO7j@P22e1YJD(Ng!lM8o%zLxc zwGexpjVDzr3_!J>SmF3w^mQWl_@e(cdr(0Qj|-Q)wNj((8Z|pI)Y7mQXyy}aKF!FE zo5`bZ`T>6sZHjJAmc19j#S}NsW6%9Kw<5H{2Z9PQ5Qy^nduAG1tQ*SvR7DQfj?iGw zn+n-iOd)gL5-pLv>IdBFCVZ4YrA2*d3WPQR<;&$+~5}|!SS-$b2Mo;)- z5zHe|S*bfk<5q!Klzx0m`72E9^gs=7+g)a6JCr1r0pN)%mTc$9UIH;=NCk&+@0!EM|AX!TAW%yI k0zU&k00ICG02W+3RRjp}eqsaw0ArKC1W5*@1ONa40Bu$%KmY&$ delta 1172 zcmV;F1Z(?@3XTdJP)h>@KL7#%4gf22a8wxJ1>R%?003JN001PD&jcrtLL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B> zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKb=IPbP0}>~Fbo}oco>V(s3yEMxbB+qGWMl=a zx&y&W0CDW{1rahWN+CR=s9Jx(J%|-HNWRns4g!5-DThtbn1Matbd49ac(C(_$(wKk7&RZ%a{-W23 zX6GU~SajxJ1tmlMJNlvr3vk$RHUF3^rjhOzE(59K6IY>5;X|O_kP*YSip7WRe6h<| z6NlA*9lc`|+1cFL#48I|#&RLwc9ahDx>KGPOyn#$i_+nwD4~+ax5iTx5l+yi#*dr_ z#}-?>SU$=MqO&OyNt}NmoK#iH^kfryQHFld6ZJLSSi*n|x-*Zj>a_S0Y_^>Q=-@=d>o|l;=#fVmUYOZLkE9$PL~*Y1rRiLaLI^A z*rEU`*4lb0L2~)W4f|RBG-wH3Th$bB!JyFX&>Ecak9P~%$pXmF`xIV|--u^V;=yR` zIsxf&c0ShWIH?4BVvM<1HYY@T~kW4 z4HXW4*%ES4wD*7en?{`$1LD`Wk?rs$a8D2OXS3X!*iUOb+`K(IV^KnBum~Wf1*1)A z6XIhlHFv;T;ugOEUfG~u73X|xBH{V6M`p(-)Qrf=x~H|i;DJg5teuh7u@kN>7E6Z? z^D1DYO#5S=F+umF3U*g~=_4)4OT6>#zA+bDoc=rLC?!&l~C{GUkDD zv&n0G8>xTW(0S4b-hp*3;(O%S&b8SOB1t>y`rU(i!#iPnAJGiZxnQItvuxUusK9uE zRY(#}Ggt0hH>R&W{i5@KL7#%4geNhJ5>P>{qaNu003tZ001PDu>>cPLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3Lw$KRh&S*^;SitZ0wqe(O7sL8;uxk8V5&- zg1Cft`p}|vSB6Qfm!Jt_Wl(>l5g`D*WvP%#mdD9;nAa-y&04SrV$2hjvz5yT`C4z0 zzuX!^F;R{xtV(A>Cu(OXg*0A$f=%t1ZL*R?Hi9xKEAPrf$WbH2)Hb#ST1pQ!n-sLl z7Uy$wzPl@SYn~0Jmr1R|jpNRGhLe97%BvAQ)_JBS zIAul03$ZZ=XY;;si~C8Diy?^b@5hhXu{wFa2Q!)kKm;j}7(4aUoccFACmaE>cm17F zM=>g>FuUpjJ$#yq`>mDI())m%_)5OLA}nPeUN}*E&($QlJ}^H0{7K=+N0OUOf^om0 zJ-v7)ly7yaCE3j)fA2 zzWQxNVj8POdc=RFa?7R|@;| zs3d6f%!ZZM8_R#>uk|=j7zmi}QX%Gv{MJBv za6Cc)5vt7OrX2M-XT{!VaA4vyTzBQ%kw*YFv_cl@?YbRLIml3aTOTcEMR&+7I^moD zT_Qv)+4`u_Q$PjVpaGi9)8>pS3XMX}ORw)`f7Fa0iSoor%F}q*=#T!59#KCAO-0zT zA`_A@ZDfDx+!G=88U>XOe%{Gg&nvl2rW0}dU#D$)m5d><;!;v`2RTnYnM`Q}7{0D0 z_{1E-YX8Z7VQ+}+vcQ%Yj4q>#)KIouz>)sh_hy$Ong?4JK_pB!JV)szN_N>`oQERr znC=Po){$+X9GU>MSLQ3flZzH6lWf0tk{GEjjgUdo2uKBj%G*9`zIs1tjZEg2R2%?MO928u13v%)01f~aTsu_(5B>2(1ONbMlb-}n*o6~% delta 1133 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 delta 1174 zcmV;H1Zn$?3XlpLP)h>@KL7#%4gf22a8zmENyBCY003JN001PD&;%!uLL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B> zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKb=IPohMc>C7L|5~5lndBx0K!3&M)TNAF>|ER znR+OITYH6IQk&SyNN~MB41<5uk%QW5)u~7saRlBg3gaAX{*nvUYDDKNm;j{dVQS99 zwLM^16Z|6$Gcs)Vi!}HatW;dP^@4UFTMhXCbhdxPwxb@EOf7ZbQ^9>|}? z$+||=v>qt;A+^j#X}f=^rU5T!*BGQj;@1ci`q{v~Z-d=@3r(_?{_dj1J;YS%EgY-* zQ`Dp)l?4E1!;C|u=d|yM2`4VtBmK{p@|O6F ztz>Qxr31HutgCtGU?A1_yK7a6Ke{LD9+8n9=C&#BcC~R3mVl1A zIFktS#@v*;*&Bbd6t8PBuq`rAijNuQw^#inY`;1S-FsTAq~*561qgyLZkL3tqee0L z1o1zQc9U;b>tnbKH(pyM)1yKZeFuO)9ae(PdUkrWjGvB&z#qv;-i+6koXWj`PD?JM>kd z(53I?8OeWIiTdA|(zi0q!z0hKWM(pFch*|KtdC#Db_B(qeap@oe~>vi3PKa;o9|si z$V)90C$SSSK8eGPrRg7nfoADqIX{A%Nd-Jw=0eGpbH{9htD4U!mnr^Ea6i@YHW2}7 zKk!1OwQE&ttN&=-o+z#|K%NFuTq1~71rdmf+|OfM8BGX8a~-sWETxbC@wWw8QXCV} z`|;pbX~)_ozBKq1OV diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.16-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.16-legacy.zip index 07ae0f8beea4d40be536851ab67ca2812b0bcbd9..97c4f577c58e6c273846ecb2c96e300fd5bdccd4 100644 GIT binary patch delta 1133 zcmV-z1d{vk3GWFPP)h>@KL7#%4geTjJ5{3-w1q_k003u^7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Df3Lw%rkLhQBRc&luxH$Yx8-D}ueDj530D}%!B#SCuS=^yb z-%yc>tsz+N!c>3vcw9fgs?3jrjuBzin%vn-6wMZ~ zmOEYrQh$FNIHKul>RfG1E3Ovb-cK80ogo%9Zu$uDNr8%N;=YUtG;3Y@2TAQh5oKY=~*r)_s`x zVC%T;?0iiqKuLdsTj@VZU=}1pTo4)gF(~FkY}|h?6InAM1A{9m^6?|h|8lKW2jsn{ zkO3|4^0ojl{2X7}=?4|sYigUvoOc?=bX#dk<&dZrgE+ zEx@{fF{4OXWq9IH(!=!Er5h?G_}d7nQ)bg^QKa4bTKtQP@DUT|sh^Grx(OM!_$eI~ zS>J!HfAm|)z9y9Y={Uhal>@4LV*DW5p_S_qAV|n7d@ofyqqajZiPjCCVuP=Xqbn|> zWLc8cj08VDdf+MHdW6BqwPHu=`$(Hi(+QATUa#gQ2KsPRWx=zx;@NtypMbEk;_ayw zkOII~;w|b%f_#lL0hv)z$CHmGbU$qqr-6TX_Jh6&Ccgl

Ph<4B;l?e-w266(sD zgf=wWQ*;g^5aVT60pA(-L@lyL8=-ApI;X_h=PcQFH0RWdAqcFkV;E3d0J~tn6HJQD zY4Kp%EOS=U71RoLPEyxFK&tI5^HC?-=c0&OfO|uQTbUmCzV||5+?0UsHpN?;QS*Om zvZO+gBPvnnTL3m94}yQEX4NtY$Klc>M8tU+`P;)Hum4)VI?nN>Xc@C1M~cjdMQo;k zH(DLXp(y7matsFid6v#S zfOlJ-AT}|<{sS}nP)h*Nd|`m00000Y9to+ delta 1134 zcmV-!1d;pi3GfLQP)h>@KL7#%4gf22a8&wdp(I8G003W+7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=IPohMc>C7L|5~5lndBx0K!3&M)TNAF?8^dlq|Kk&P{eB zb#0&SUAlBWoMC@)m%=PAJ7Pb;vay`$tKc|Yp2w~j?SSmo04aA(YFT0ao%hQkg9X^< zv42Nisbe+LLLe&D%Y8m&F(L;FMf*F)@P(A8p_M<~Tn&>ZD36oEQoNKN1!}n@p_0Lc zh%#?tq|!3jtXKazk^@;F6?_Pb>l#h4={#WyRO)p7eO-T5h^GP7i&jSwMyFS@#~qP& z0&e*0UUVqf0!)VaaIk=fD@Fl!3k~Acv><2T5qqBKrVha^vDjD5F%wmRy^q$(`F|e< zr{*U37G{00prqWliEsrou_g)hap_%r_O@I7Zd9`)1C`km71#6|6HL`zGe3`G3Z(p6 z^bZOPt+0R0QwXGxg$ww(+q1w0bHZEja}jyA_`Mx-G5hYSI*sg|C2CdbDcGZ8Sanc! zXC8YleDJd0#7aC7-CS+;X^gP-nsSfZ*=NCg0d{298t{-~IZ<~Ljfcrq;cE4@4B1LqWVV?Jt&LOh) zB=J1RXe@iwuRJM+fr&sn)dL739NaeUmLD`?QMZ!JdFxchA>ArePqOrmje@R;AxAED z1m_&oDc*g$tkwRAP26${n(y|@47a2ItiZD*obFy3D98R`X;VT1MO(U&+l=%Q_-#~g zWr2S`a4A(&Ghknq1n99Zju7;WuX8&TSNT%hUX%-%We_+G&nmZ33@6r28-DipaE8X* z=8Q8JN|e7Zj?@K>N?8gP+q3&Ag(5_$^ThnYg`?R@eB-S2DaPBcyx(w95BuKCxHPMA z?}DWe6=WNq-q9O)48q!tN}}Y=!Ur)_K?Z-|AW8U4!`Q$jUimqQo5(ZE3SxleNfWKB zQ+>x&q_=1Gs4(F93vcPJf-&?P-h2^Ljse<`-{u+K-w?NTz?i z-^gmbDG^K%dQxsLCZ~`tl4EFxGUX6Wc>%Wcq$)qXu+(Xvb*kC2C@-VGo5c-c2H#Va zP`zCL)^;Ahn(*MzJf7;s_mWXtQYPbn7|Z)o_R^;44!1HEzol&UtaK$}Q$*LbXr=O$ zPPbDrB2T{c)EORYLI8ZcvX>?s|8qkb5CT+7{XLx^-aCT;YflO3X@!#M(^2NZKb2>X zk(_Z%XL?Wo|L#l;4Nyw~0zU&k00ICG04sBFRQhM3Bt`@P0AG`!1W5*n1ONa4071wh A`2YX_ diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.17-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.17-compact.zip index 66e5c9957309b0e8e3c41903e82998f844ae5ded..2106dc2cbf6ee9a7b4f7d0398202cea871b15b42 100644 GIT binary patch delta 1166 zcmV;91abR{3Wy3DP)h>@KL7#%4geWkJ5_~f2|Hc{003JN001PD%>*ZrLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3Lw(0kjZC%Rc&luxH$Yx8-D}ueDj530D{r6 zg;Q*Q*-U&|J$=X55PDe@9uj{fy!cSS!?5y6L&b~cVhq~zgLNS>X|SjDs0FVa{VG}f z`Af>6-rLlD>&a`xkVp7bDa_hC`t}$RuWU)-@9R1Y;hn%LIxoyPs>mK2;zT*E+tm9H z;DIUGyraxRt74G@Rea68G0a`iAH0VHhVS$R)~!4P_{N+0mIBG7BkX@vptBxWaO8)( zVldpouuVDxIpTalAqIETkt9i>3k5cd-5E&6>==mDH7@+#s@f08dpDv}Uk)cuYa+6tDl||Qi^NO-{NK6(lpl5Lm@)Mi~m28 z7a}NRYyV6PE-oEXFO}$dYt6XE3^w*FAdMQ*)S?`t!xy$yqT9Vr%>P1k9A~Omh87Pv zx;!{?Q6?TVFzU(M1#pc=Huq>x&S;Igxpm{&9c zMp7sTJ`I1CAUrT?=3|sEYVw>6Mme+kD`v|a&+D6qcXmzlJ@zDh;L~jk&>2{mA>P{@ zsBx|JlR;0yP{mTc>iEH&-(%?!6m9{K>@BrX9WbRP|J0Q|DoFVnv(lZ?s$jXnudj?& z2jt1>AI=vc+j*6kU)5A)tR{VP2@RGmx2{7iZUI|buA_+pc~}lT^`u%@MK;>N4Rvz1 z-6_R`WpDf?oX1h;w1Ehb*mxISCg8*T$H3SKL_Qji6(_$u0Kx965B~A-Tu@5^0zU&k g00ICG02y36RfT8?J6;3;09%v01W5*<1ONa40GTr~OaK4? delta 1160 zcmV;31b6$03W^FBP)h>@KL7#%4gf22a8#a{Z<$~O002{w7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=IP#m{|ERnR+OITYH6I zQk&SyNN~MB41<5uk%QW5)u~7saRlBg3gaAX{*nvUYDDKNm;j{dVQS99wLM^16 zZ|6$Gcs)Vi!}HatW;AE~pwis6H?ZKEIv zaj*;{#H)IfB>#89f`IECbns6@^ndj=z7%<8dGCLCA7&XVj~H}ZyR4U|*PrhItK}8? z2;3LCPX)wCmqB0USp5k9}t5jz$6Y-8s(Id`zu}9j>6Zl$a zob`Vf64V4vbI^aGcN`VeIplqD^?sl)IEqRY)b{aHk~zpJes=77EJjC@?`f~+5!Jli zvzYS_8`}=2{?Q1-Zc?#^#uNQ+%FsUO#?;SXWY^PT2|yz_c>zn~i5yrO&ke(rFK)$n z^fCz-Sm>Y*+?2dUKP1UN8q$lMJ~sxMp>lsDERg{{NWK*gwdG`E@9My-frlivX*Mkx ztC;4&{(Z|XX(n*tAv@%L)G8tXq;MM>(uko+`qg45r<$CWO-|K#g4Tf5q(5s=b3jdt zGlzYvW*a3lF%TnbTetuC9K#~(imyZ}`MJ zogQGtLbS4wkM~F#=Pcg$sAA1Y2&YGeR+b-HK0KxZ6(U+vZ({86Js+zQy5g-<&59dn&mqy)v=BfJrYr@vKCARIZ)|-{+p?+IFHT-(kA# za&7Cdo3sb4p?|o^VG(MQZ*mG`|9w06N2iPCIJ0NRK`!KI@TCSBjYeva zeG>8^lW}~f;JQ38Q#$2~7b~u0{R2>!Yn#zVb+iSGL~;pO928u13v%)01f~v ab8u9im~WY21ONb2leq**2BHK200009B`YWZ diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.17-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.17-legacy.zip index 44bda80fa3ea346b1281c8d17462324e2f45e35d..c7c6c92cbb60c954826eef71167cbca4b5f87faa 100644 GIT binary patch delta 1135 zcmV-#1d#jc3F!$NP)h>@KL7#%4geWkJ5?{JYe+u?003VR001PDtpq2LLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3Lw(0kjZC%Rc&luxH$Yx8-D}ueDj530D}%! zB#SCuS=^yb-%yc>tsz+N!c>3vcw9fgs?3jrjuBzi zn%vn-6wB@Q+W>ybCxL(FSnOtkchzMV*c=w$-cK80og%z$Q)pVhp*mR%?Z1{dI)m{r2Gy+EUJJml_n#Z8$SDozQh5oK zY=~*r)_s`xVC%T;?0iiqKuLdsTj@VZU=}1pTo4)gF(~FkY}|h?6InAM1A{9m^6+=- z_6e4)`L}Nhz=QRsRif;*=t{>fO0I~r9DpTvyd`2h(BlauDLV35p?Czh8Z!1|^NxTN zMV{@&LV5>qip&L5=KMkHWg-I>C~KIco)`#ohRPq!F;p#2_8Vw?**n##z_6zY*Ew5> z1ptHARm1sswg!LM2hi-}X~z~Uk~MG4A^hbtPH~b+!~fck0ve7A@=$+MAK8R zDYT94G(if4yz_Tp;{zBS8V$$1a!i?CBi}m6;WMR&eSPe?v zj=5Z@Rmw791@GBu5v8T~wO>Or!HC15T|}+*Hhsvfw3`J>vRf%L8blxpk+ME6_WHym zwcnQ&j6)y!&*7yeL}i!}vInHRwq0^WV~@>y9NWiKSU^J-gQEFGn&&U_wr>O@g@8v0 z8~^J!&8mMe!YCh%`=uChqq4{@(dFKT9fHMEPeXM4G*+5S_v2pQOQpzO0Rle*KL7#%4geWkJ5?{JYe+u?003W;n*>P)fdl{m007@KL7#%4gf22a8#P65W+wN0037J001PDtOO^KLL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B> zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKb=IP#m{ZD36oEQoNKN z1!}n@p_0Lch%#?tq|!3jtXKazk^@;F6?_Pb>l#h4={#WyRO)p7eO-T5h^GP7i&jSw zMyFS@#~qP&0&e*0UUVqf0!)VaaIk=fD@Fl!3k~Acv><2T5qqBKrVha^vDjD5F%wmR zy^q$(`F|e0N+jwdcgijpn$N&l}Tb8>n2W9Lm=_P;F(WAVRx&Pn~Ma!!u zYy7Z!yX%KS&U|v>wWH!UBM6JjRXx?O7!_1+WwHIO6}?p+SV8pqAV(Kqk0xTM$dH4i zMFk;i1<{@>xi>fJxjAP7c0Sa@?8||hmp?;Do#(-?mPe6Oo*5n7v1bM^s4By64h{)u zqvIkemRT7t3T}VlZ@Ec<>pi&k$Y=_$KQn$YR0$;TB1xA`$vQCo!=1{yND%Iv7rM$^ zzEN5#S#o8dh4cVxviC^m_e~bpanepb$Z&UqrEsX}s({-wP_Whuq=*i8$>_w=JUV@7 z>0ngOxRzkU7fezcRIi%^zsBw^9C^ds(pw909~<55pqF_$K1YK zU-J-EUr>K(J@PxBSnQXxnI)EZw9xH3&GDs)uy2GAli?d&3pg(!qb9@4cRqfP;moE8 z&Vto#*`kLGHDQ|3ilf*La=O@gf#CDI(yCF5vSNUm4|HpfE6Aa42|^S4VYZ2Hp|Ujj zw8$ukbFDkU06M*KAe#sE2!2ZR%AB-f;nEWw2VhQ ziht@}-EJ|4D@ViqK2F6@O928u13v%)01f~vb8u9erVzqF1ONb6lbQrc27&|t0002~ CHWMBI diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.18-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.18-compact.zip index 025fafec49b896457e82682584b641bdd359133f..8dcf47e250399619c0cba35929abfed0f490ab06 100644 GIT binary patch delta 1164 zcmV;71atd|3Wf?BP)h>@KL7#%4geWkJ5_gB8OU4&003JN001PD%mgQqLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3Lw)R=tPxeuQwWq4aGcmkpSa9U_&@~5Dm5O zDzBk}E>k{9sIT%y2iAV#cQt>=bYo)`<*M=AHP(boI|7F~iVhK+#s~ri_?ry(^S${W zo&wABbK%DKm&~Pm)%HlJ%h+chd{(`aYRBLQ_hCm&N?Z1zSZTxrxr3@2Oh4{RcQb*d z!8dldW!yL;wvkl{YNBvFHT-(Te>QUvqt`nXp`jRw#O@BmlIk-ds!4yKGP8sr{yW7O zA(y6B?%2yPe`AUo)$88Z!m%ynRQA|kR3ILC;IsdOgS$00$^;9OJIIn# z+!tW>`G6sm&^zkNkot=H`|vn^F{z{|XXyeZ#x*U$Z#>DuHyjKB4-%Rtfvh#Fe=38J zR@i!!jRp35(FXj-6o`Ko4h>{H6C(QK)NedbyaAG<+zBqY`y1MCgV9R@+}*){oM2EN z0MXL&#*O5;)Sbr~Z;~?Hp%9izf7~~=Xc|F&8m9!v5#~rHicM3aviSNh#ab9YY3XS{ zBdY{PnPikM)e1(eKgr(qKhQPe!e7FAT*QBDBSCM|?E)$Yp=f`wS&c-I@6N%hS-RiB zOW!#WLd4x)Pv)J@7AXnc$>|hQsebESwZRQI96BEbo)H7(0F8hVzDtJnyOGp>wyYR2 zp?fx;X8WCk6=3?PK^Jf1!X$>VCu)`^fsIXker8Yz1&vanJL3qD`=_kJsnf92o7SLA z%N&hNK-6yLU44I{#`pt5z8Y-(=+FPOS@hbcc_4N$G_a&DcX9QTYk;+{1x)!bw7vrs ztn*|FP;RSsW(^ts#jfmQLa8!ju13t?L#=!{|%7t ze8Y;*5UOaWP|!d5W3ZPaV;XWn=avQC29J3 zdC+-mMhupWyJe@W^w|48qz2GT91yge(`Y`t4>4##iJ z|DJ^?9i3Y{FsooP>?}GADRd;DDCU;BaQhuV#a&rI)m2+ril~<(9}7)2j1O+%?x93L zgmyLQt*22nDpIf7#ph65G}gOmnx6i+z>)pl;3gqEH_KLbf7t)>`-?eHO928u13v%) e01f~dTsu{FSQ*G%1ONbAlez>+2A%`}0001OL^1FH delta 1159 zcmV;21bF*~3W*9AP)h>@KL7#%4gf22a8ywRNPb@g002{w7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=IP?CLWV6GI(N#cj+Igua7*#o(~mU2Rl?DhO}H;e<7hdr z3lwF~cN1Z8A#8ig0z z^a!w;@H7gdyNrO~C+UX`7wHz3sXxCkb*}iMiJ#fkSp0ut_u^U)1pP)s0}CL-xcxg%ZxukW#SI5=4E*l)d=9Y5?%j&sr>TgRIce5R6|2K$gfJiKEn}WG;>HP zqviQ=SUZ1Hl6zsqtoXJHUL+9s;sDe?b6GNi&}BDbQJ^aHJbt@dyUO`s%ZoNqPQCGc zRKGRAf9|iB<&=B*cVv_g50@l zXa z*Vei86l=?k)=i7(+!u#yuUIG5UJ~gRVQAD9*Mz{J{=W>wBSj@;$l^$+NY7<*%Eo$# z?O=aEHgZsWt+ejQ5cK-K3_@u! zOUO6m#8hQzw7faBeg78A@@F3lNv!ezp1EF81oLolbA4k%up`ZK9h*-weV%mbNl+)c8f~SXQGsM{sIi4 zFdzb(nG@U*s8JBSgOSB9SbA+5(KzQGCc<{ls1?Z%xcfApSKMkFFG;X+`?gv4VeRCJ zaEa7&5st3M>Dojw)ti{VXVqbKpACCrdU^^nvnCxT+=#;uO~<;fm?>iIdWhq&DH(qN zZ}?>D%;5)ivQlGx-+`u3Cg6mI97@$7=zh!v_-?>IUqdV1AcJ zk87I8?(FC~9GL0$tmv>-LYyt`mTp|E79Hv66*G4274xR%b*eP9?>EJByFP3Vf}h@UD$~KFqX(uye*crd)E7`o0Rle*KL7#%4gf22 Za8ywRNPb@g002{yw**NBp#%T`003weHCzAy diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.18-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.18-legacy.zip index 2900f1013ca4792a1b233dc056c836a098ff1963..8c756b719aa39c0e09e7584f13bcb2625d3b4f61 100644 GIT binary patch delta 1124 zcmV-q1e^Ql3FZkGP)h>@KL7#%4geWkJ5_-m@u55f003W+7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Df3Lw)R=tPxeuQwWq4aGcmkpSa9U_&@~5Do6}^|!l^;U%(m zE&v3iuy#Wp(Pn>&WXtEeu7^6C5`LrReVPXb;wB*{7H$aqwde}#*xb)UAkSx)K}^Zq zIkSLnff|}Mu4M&kJdg9cD)ZCW5fR#s@^6gaj#>q7CeKiuF-`4ToEMvt^DU(b>om3q zC|3yf@dRq@YF7EpdDb`Z)b48^Npl}HiU)qltwL!(+y4k>ENg#`KWHiA8 zDT~!Xo&L{~`f%CjI#{2CJshD?NaHTuYHj?I)u+GywH=@NW%nzm2#B&ab+#m24!Gev zz_@^4voa=P$_=W!5rFzc$%n&YHfY?G8$&!>2U|ZQdBf12?nJe0wXRKDE(ARP0t=I6 z8*U)>wbjNzNs3G_t%T`IUp$!OlwM zn6CvYXUxG52rkGK2I{VU;Vm6|2tkO@k*k6J5z)WGRai>pXaNwkHm zmUK8!EBZ~Q(5V=yg$6tWYcMF&p#~OXRoe$!-XIPg&)QYb_J+AHnlxp{6Y^p^j!@%a zw>E#DIaMO^QrA89BYiv&yqHBFXfnLol_B^lK81ThV9)Vab#fHNhsU5!$u=N7$t)AQ zS&EUxSJN%O=itL5Q0A)*T6TNH7S#73MpBrmP8;~{Oij$63M=Yo5|+2teF0PUCZ(y@ zO)*p;>^zG&e!EjrbKb#x*sY$0ZeOt;vZsH)ewOYsk>gUw`^J@Wh%MGD_YNh#sCAFk zr#<~@BmVI^|4-nc-A5L5vabWfTQ8B4g$GEw<*H@@=2K-QFyzfp(a6n+83+3fy7Ey9 z{EDJ9ych3PA0GvH2w>>_@p{1c(Zkw`Tm9qiz?J95N{Z|Qzm@*rhbP^>TN`RUl_!7L zQ)TMoOQrr(VK3aEEy)~29_8C@y5 zbgd93mm!CZqY~KjnU8$-gII_(Qa|A%{|oINy8)rH1bn9i6mm>ch@~>JxQ=2)52%mX zQM*O3h&^hzWR47ZtVG@h3DDF%*`hf}8biJng)~n((~%dojLI*d3}s!`M>}9 q*ZPf6O928u13v%)01f~dTsu{P9`T_(1ONbElbHlb27Uwp0002wRv=RV delta 1126 zcmV-s1eyEh3FrwIP)h>@KL7#%4gf22a8xals2V;50038!7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=IP?CLWV6GI(N#cj+Igua7*#o(~mU2Rm2H@+{nq#lI}T4 zUu_m&G$;c2T2X)MgLIX6{f<_&I9S$51d4Axho#~RQdADJBJCMaRc*!?|I^~2@X3H zTriHI!La<4CQFD^9R7H3-G>|<;AY$R{^*Ydk8={0MNxml42OjKqcddGfNEF%39_xK zEU`rtEcZwHPwiz|zMVy>hqiCX08$-@XV@QYWq&0AFdL9@_AS==7GTXiguYmn_)&eC ztQnC%dSw7VasRY4adN7`;7LzfKpHw zs?^{}`tANl_q^N{10SL1U-A!c{eTT>9XYKyk>vzOcrh-3Hm$&Es`lyijL`$H}T9s+nkj^ zv-QKiW0aQgNqUWtJw;YHZ4+Xmbi?BAriT)rG-IH}t@-H@<1W=V-q)I^miUpXSU>eu zW;lCv-?ZPyUiNjiy;B|JvPHN*_4rWOydOZuJs8j8LYV#JDF&&c=i+tv>JEf9Kazhj zY@7rVpJAlYD8R)2Sq+F&=>;K5J!*}1(YT)yT8~rg1lFo!#jkNhNaSD6^E+7|H(ZV_ z!sD#D+}J*c?z&}fQy88nLH@XfJU;`sL`33Vci=81_;I;7oxr5Ec#xzAH#7nc=hls( zT*qHVzpLQAA67LR`5jnYaj{a-tadvID{6^O0vTs|?tq)IXx-z4WNUB=^*}@_SdE&h s|K7VBv`|X{0zU&k00ICG04sBFR4tOI8a@O709TWj1W5*f1ONa40O1NC%>V!Z diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.19-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.19-compact.zip index b141c15d681df01641b7ee4e953f8a6f4e6f19e4..b90f8c07e6759cd13c7d27f1a34ff4b4c5582f40 100644 GIT binary patch delta 1167 zcmV;A1aSL}3W*9EP)h>@KL7#%4geZlJ5{MtG@f4s003JN001PD&;%!uLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3Lw*q<@A+huQwWq4aGcmkpSa9U_&@~5Dm5O zDzBk}E>k{9sIT%y2iAV#cQt>=bYo)`<*M=AHP(boI|7F~iVhK+#s~ri_?ry(^S${W zo&wABbK%DKm&~Pm)%HlJ%h+chd{(`aYRBLQ_hCm&N?Z1zSZTxrxr3@2Oh4{RcQb*d z!8dldW!yL;wvkl{YNBvFHT-(Te>QUvqt`nXp`jRw#O@BmlIk-ds!4yKGP8sr{yW7O zA(y6B?%2yPe`AUo)$88Z!m%ynRQA|kR3ILC;IsdOgS$00$^;9O6U1~y?Wy>vrdLU^ ziEz-&)Lot}v9f#XdwzQ8x)m8~*r0dDwjWs)?$2x#6}Ek+dNnbQ4@ti5{vJ>MkI{V_ zU{d9#)O8sWx2w{>`=oz>cXH4zY7$U1e955_1MuH4}$e9`At^$Sk+@ zQcpf;;-1~QeG7*{PMuDWkgbAW_I2#yt^rvTPN;}T-3vRnUOg)3Tm ztULB6zDsdgVQOYxb#+yOS*BL4lqSf4xLVA_VA0YprZ++Rt&4vTa6Cw8k`EFX3YAz9 z(rN_ojAcF~Zq)xb>Iv)WoEjA6o$iz|cj)o4!2f)l#}D;XBr-aid3CQ-mvq9Bk+iL& z-|stM*z3Von0hL}brAsXU8F0`r#ZZ#plQ#Lpx&eZI|@Yqdu&+@#y6N|7rU?WP zi~9IEtXdQu_;G)Gf}NU#U7Sw+!8={vKvY>pT#b_(>D9PTv0R)c&%e+>51#@7^%ScY zmSR{K))Dh!8}DTM!(ZoQ4cn>xNZ3!K-8XXApM<)p@gZm4UU*uofe(w;zVoZNyAx0) zJ9nBWv`a7ow+##$f~P!9bmkib>bN(aLVZ&nOUFkV-S~gFvcGx6QMpAls;<;UKS^s4 zxy?b)WkE;Im5or2#^;uAy*`@CJj%X8mBfG844i2I)QpcOBQa{QLdD5K_Hl+HyT#zk zA64*+kgfdlJ#5m-6n3Wjhd5@svVN7 z+h@p>BZ7Z(k5I^S0c4G2KOcRhHSu&Xf*)9s?5Pj)w!?c$W>u1s@zmjHU9cop zp*QiUq6iEETF(kOxq7U)NRnZZM!lCKfIW=$Y+YQ4@A0;BWqr0<3|=u_#V@Y#P_XC@ zEaF%ZG{9yi{nsTR0V=D4-bE`2&v&fY{Jdu&L^9PDEjO?9n$=1PP&fWMX=YGM0Rle* hKL7#%4geZlJ5{MtG@f4s003K)z641Ip#%T`004PvEU*9o delta 1171 zcmV;E1Z?|>3XKXIP)h>@KL7#%4gf22a8wc=>FHwx002`F001PD%mgQqLL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B> zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKb=IQ3ahK4N~I(N#cj+Igua7*#o(~mU2Rl?Dh zO}H;e<7hdr3lwF~cN z1Z8A#8ig0z^a!w;@H7gdyNrO~C+UX`7wHz3sXxCkb*}iMiJ#fkSp0ut_u^U)1pP)s z0}CL-xcxVp8p8hJ7uxDo5U15iIS33uhxM7WI6f+Mm56Q{p-OkhW8fkYlg& zjWm#w5`cwgow^?@s_XST$b0m950)`2d*7^MJ{ z{vd&_WID_$G;JKClw89g;+=}oI&6?qX z`fX~|LyGQNOzRo&>3DC}G$JC4-YN9B`$&I?8YtnY*2e7rNE|eIx!Y>2 z-Xvbk(zM#&tYAPSu($8pJog+*ZW0_ydq-hSXtyUNKMMhk8|-LzGd#VgXD^tg#B<6n zr|Xc`-9v`lpg2{dnF;{;(y&~JmEMrc4w0uD2;&ro{$_G?hH6J+P|_$Z($Dw+qr4hs zP5><>Kc;_xCUm2!FW;VIS<~rP0P$(a07*31^t3&H+2eRkrspNGfsoCD^VpU43nTYY zTxSf7;tPUca6m#f{i?js?w;6$A+^o0YA;s57z=}J33CsLT`m}rC2=zf@j9M0 zNbFnm%imDPGPfKZpJHg7>OFr3mhk=f+Xh|^<^CXwGAD_NVbeZ6J}A*c+y9~%Sh7${ l0Rle*KL7#%4gf22a8wc=>FHwx002{yx&%oEr33%~004=}GT;CJ diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.19-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.19-legacy.zip index 7f575de73ac83b3cf6c6ce437e7f904d872f9267..8c8fbab7d54267ac7675639bdd9078083d4a765a 100644 GIT binary patch delta 1136 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 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.2-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.2-compact.zip index 8bc67d8777d977587c9e7efe3608f3697261dde8..61e61685770e360097a07b9a05f9af0266aaf96e 100644 GIT binary patch delta 964 zcmV;#13Ub*2*(H)P)h>@KL7#%4gd^XJ5^oP3w50X005?u7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Df3L$H}>INDhdOS^YJDt5O74f~W7w@W>GTV^)Q6Y+>266y@ zX1N(`+TWhLfq#D)u?=X+jzL;>pMFo?JlMFJs>8(CQukF4RT1DOA1fl*|Eswgo8)Eb zOEAk(oGi}+$woGwBEz=dvVl`q*lHm0DuV+zC)9Jji<%VkMes#h=0p>Mfu@WYD>Aox ztlWUO>dVU=Q9d`awdgK7cuRkp9KxkIRtU67y+~MxI;c5F zh}Z_Am3+}W7j?r#VhHtc_5mFSM;?bWA$+^sNbc@FIq;ro?KyiJa3RX{tw;%Pj}kxK znoX=r&USkyxrA|ZbbF~>QQDuG7OsD*%ES`ECrM==R91yFD}iTqUYH>=miBx(9ADbO ziQ3Gy@CtwZJpvwzZ|-yMr zGL6Ed#k6KFwU$q1)zNyyG^$A5!{rk!Bux3|S~yIvZHbT}egpLcU#&-X;SJZ7r7~S~Hg-$Z@H6CVTLl7^GZ1LmXEzc`BIm3XsQMvLa%fp-8Qs6u}Su-9GFGP?MhPoDA-DAN#$(FE@Ob-33B z<7zJzoraw7iI6l*FM^EI!Dk$bs*X}7x%kLT$%i>&HXjEFMmKcD8@|tj)4|sp1FP^J zZ(@$15GwPxa{31{;9eQS6668io4!AW^F;j;2A$`7$UTwAOTkndx!zgOr~lF?Tq7A! mO928u13v%)01f~QTsu`=)eCi<0{{S~ljQ?R2Hyh!0000DAI_@) delta 945 zcmV;i15W(M2($@KL7#%4ge{0a8zxga1V+D000D$7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=I^WscPD*N*)$BybAI#w4NY}J#3vBA{i)3t1)uw$E9ND; zd+S11HsXs+>O_CInxhO$z+6O!>!J0veZ#eJR`rDcilxl<;Vo*=IU941EY}ho5)L}+ z<<-hR!nPGm_|ugyvw)9iVRlL;^jGJHBBPE9-fnAH2;ju3p11l*8>@M7(kz|A6C(Ae z)>+8zHNW{MX)_w&N_oXSLi2x;4OgYEt|j%y>AauHEUSMV;+3gSP7pM<#Dn8NJjVoe zm!L#$70enZbqltaVOt41O}A&Ja2rew=cZLd%T;T}Wtsy0r3so>phr0bH!R;cm@9Js z^xx9PX1BcA$k!y}UrsX>;G+wST_OfV3mvCEx;v;p^Z|d@`1V<;lp!m6t795`(RYx` zg8L&a>uZ0Io8mJ}21qLozi{s6EUEkg#a6xQ}X@JH^83M;;6SVMn#F8&~%f~1O zi5Slip2A_huR^B>$u$z-<&3^m$1m05Z`uO@-SVnd6*t0xImyOc7OQgUnm?e1yn$`- zr0m*rk21>c$f;T?z^gHFmc^&)qi!NBh@CGrGje~|e+Ab)Dxa+*T2V3XxL9Y^kV2=( zR0EL2)?!;tuq|B#)N-6nUh4Rkt{9vUDF-_b7uB2qREXa?JJomf?0#pQH_hG<8U1NjrE!phE^JH0C40UW4~<5 z?NWb+%R@wn-l4I2zy)OZXKusaaS}q;3%J4tUU54elEofv#yJ>69MXzJ!OKPDu^zlu z&Ey<@eZXm96ym(b)BLPxvC<#agv6hadH@NgJ{p|5q)hL?#$|Sq%u^<@RUZO$3bsHB zG(f$d0po!8J+a-M>r5x?!8A#6xZ;Khi0yy;XLBH_zrz_aqbGF{kf24};qF>ZEmI(^ zv{MR4=y>lsgbIkYrmM2$uW#q<^EQ5v_m=@8-M6QVO928u13v%)01f~tb8u8`qHqQe TiUR-u1e5p!Ne0XV00000qxs0k diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.2-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.2-legacy.zip index 7c3aed134479197c576a4702a0690976525a30ae..d5d0691db0b93285c952f074bdc2a69068c5cffc 100644 GIT binary patch delta 970 zcmV;*12z1)2*n5+P)h>@KL7#%4gd^XJ5>~BpE;WY005>A001PD`~xSELL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3L$H}>INDhdOS^YJDt5O74f~W7w@W>GTV^) zQ6Y+>266y@X1N(`+TWhLfq#D)u?=X+jzL;>pMFo?JlMFJs>8(CQukF4RT1DOA1fl* z|Eswgo8)EbOEAk(oGi}+qWnlWv(TN&3*99y58_$Io+yg z$mS|(D#8A>HRZCv*_;RDPr1Q|pkf*o%YPtilgaBLW^(kk_C#C$iqd~?{!^0KExoSB zii1K3Odn{W0t|38&QHOW!=SeHC73+)XOnohP=f=^hKa9?Dia= zbn8gOBnA!ots12ezrUI` zhCoyGOn91K5z@b(pm2ZVYjM8x5mRyg<268PR=q&jO) zP-qdjcA$E)4WR+NchLbXsMNAj|2~9SHDFEn>?nVjUkQZOdYdxwnE93D zQDhox`V$%qA@cxo-S2m%#l>2$^|h?sm$AA>zgFHUA$L*a$3t0k9@1u26vdT!C%;%5zXV zUymo^T8Sm!7nOg5t>B4aHHYLf8J=uYU!7(<)4qEi*c#`k+upHa%Z?Effm%rwzE2*E z)O*2#6uX{LNyDA^=sgO%$=aK6#ddvw>=PCB%idK`LEwf-zR>9_6yiPgms3|Nsi&l4 zPAmZG^Ik`M4?=YaNb@dLZU%q1WgoWJF+MJNX0N1}ugJtL zG(`mb9g%fdX{r+K=XOj6bp^V=I>6f5!0E8@KL7#%4ge{0a8#hF0&tH5000D$7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=I^WscPD*N*)$BybAI#w4NY}J#3vBA{i)3t1)uw$E9ND; zd+S11HsXs+>O_CInxhO$z+6O!>!J0veZ#eJR`rDcilxl<;Vo*=IU941EY}ho5)L}+ z<<-hR!r=lKcBT=Ysx%@D_c6g%SbFWZl4Ax)*L^_rpol*R` zrq3yc2oABX<^h1)^pK%$S{N{)LCO;&m8x$PY;N0Xj0d zIe)~~X@0zz5j|^dY?*Z9n79U$Vl%cMG(7&Thk)C;>#u59T$Z@ZUx2D zbYS^x(FD_aw+?{HlS4H|v*A#3_}7FajEs7vXS3^`hijL^OB$K5oxD!4RRMvsy@Mv> z!DtNQ?pH-Zg_4m@GHOR-+~VVeO~{3Wc(2&PPSSsqOw@@M02ZLF`X5?Mk3jJ4k!3}d z8az{Q*N1{x9az|Bg35G#b-5k%FC*vnwM;xrYLNF>SYeH!qcZBpVSSNeACI2viW{|* zq}I_z%^g1L8Jp7Mzr+*zCSe2;Cs-ph54S%n!00^MCa{291r`7cB9bJdvaE?;tKFn=L)v9a~@Gurv2A!+uv^m;QV5I z^~hnNxow%efED4f~ztkp6x9J7cTPwVhskiV*)69g zfdDowTEF68qz`lK$4$a1yf0iVXL+O YRG_H>aE}8300fiv14#za0{{R30LXF2djJ3c diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.20-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.20-compact.zip index 9ad17df8c37eb60f7b985cd85e63a84b05d5d1ee..7dbfd796bb6822b278ab84ce459b3864b3021dd9 100644 GIT binary patch delta 1167 zcmV;A1aSL|3W*9EP)h>@KL7#%4gefnJ5?<(D8*j{003JN001PD&jcrtLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3L!T#s_-*3cfE2Q(XCMhHnI}vF-aM+Xou+$ zkK^P8;)Y%O=!emSw+9zv9DslOHJx*6VSIP@(Uy_#ZsUgfekLGjqKG25`3+o4377VC zBazDUlO-_DO+UBVj3F1IgLgIyA=|<(GL}O7_xN!%vVI($`H43YB*Z;%2yt7JZqOpb ztCMxH3iH5XND-+WL&W96nZfXRlcTuG&GgAppIM%po>apkmDOmnH=uv>U8EFEoUt+S zDN}W981W7g?kJRMX{Kx>E;_g0hKN?|NiIX;h!irTW~zqr@l|gd>?y%7dSk45QLxJG z$Hv6C`a+!@!%c$~E2Y%TvEf>NLQd-rQ^U&?LLOzdxdolLH+I%`vouR;yH}F0yOYV$Kz`K^pQ%wCAUw}33 zm5Z(ZF_q)2{%Bn8m1oD)O(_XwfF~JAx@;q2W=I{ZIoc1#S9E{WAtBL~zPf85u^1sZ zulUgOIcKjezDD2T$qjr1?58T0J;Ya1WXj{#9(Mx%mAntWfIYz#Oa@F&flO9Bp@q?>^h!*I(KA&5@Ot)Z;UNdau~Lp=1t6gLqoZdBeSsiz+y z>u6=QJ%IA5`hI_LwOrrqzo{wf>b_21;y=~9=+OV3VrSnZldKe|XL!u)Gh-Xi5&Y>V zuh{Xmxpot{$A3_Zf~@{ln$(+ukVHFW-w*@kqvuAXE9l$Ks5D*jSfSlSBErJI6-IOo znt?`MpjgFA>P30rXF}bIL0@K&8$D8CohaKvv@n|p4j+GPvCE=saqg+2hCB}_d>s{2 zR**iuN`Ey1MX3M7W%L(^$0n05;9ne)j*OKRHN@aW!d%~kH2-(9dh*AnK2R>uxyyI{M zPZ@MM#*=@c9Ti724FBh}H5+WLB88@4DxZAN$l8A-dllnck1tOSdQS`J_HL}>TA`+t z={M8Yx7>nH!?}sE?Ay``-GE*EBWs;XsV4-g>EH)E?)jA16+kgAeU3oS>j~}E3BRl1 z%~%4O{n}CPY-9$AN4Qw`vdqGEUlOQGeC(=+0h3%oQ)wOUeWx@p71QD1gpsm_vb4r@ zzw_!*0PW7C8vpsp1jkTI0Rle* hKL7#%4gefnJ5?<(D8*j{003K)y#z@Hp#%T`005R7Go=6k delta 1170 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 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.21-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.21-legacy.zip index 739750ff4526ab92f3831565d15876f0dc86a2fb..bbe5db5a427f089c9941064de5081e2cffa5beb5 100644 GIT binary patch delta 1138 zcmV-&1daRd3G4|QP)h>@KL7#%4gefnJ5{gtk(@#V006rY001PDu>>cPLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3L!VGup0y8hE;GqR5E7$ge;Qxf{m2|resgc z4pZn=@%pybtdK%{$^cVS$uobuIn0n5pK+KoD}5OSLfWI!juNnIzNULxCVWmcZL@{D z{gH+ItnkMcD=FY2%%qonOpg^k{9@I~Kl3Me$lnsWjk1nu=DV!S@ohP*rp@J^_1&p8 zHU6+Ms-UrGaiGEDMrOa&?=~4je~LN!X!Nt?Ar>z_scVDVV&_&eA3aSS12!NTH-9Vbj^v03yJ_y=zr?_@gr+NX8oEI%97_B|%px5RUfv zsmW{S(aftqgj@zWxJPV-k3-qNGT=MNg4VS3qE?g4pI^KHZP(a2!i=+K#&TJ%%k42A zWua~Hz9fmktUQ0MF)luh3)6@ln0%Im&;97=_7>70l_a=4s3E((Khe3IlxU^5QoLaj zU5pw6kut$r%y|J_XYC!z74cG+dGiU-t3!EaL~GO0O%Xu|cJi6!86?FP^A5-yqL$2M zR1L5>ItZ7sP7jZ6Iy^W;GrD)i$*Ht3G4?f&$d;IYE?9rv5U~;db)O8Y>#QKs0yZz# zX7!$dc`rO>M;9ddWs74dT6?{xJBr&29(bZ5ZP`>^J8*PBl|vkkPJ-M?GR$^Q^%!cn${ zB!B>2`qY1X=L2w*^S&Fg;NKcBX(3M69t1g>T$iGlV6AOVO4-5`f(g*Ym0*KP3A=YagGN7omTA^VHp|*5?$FS;M zYOS=1W$Gd|>bG-+|DbRuUrAuoI(Tu0K1c)1W5*j1ONa4 E08?2U`~Uy| delta 1140 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 I1ONa40IUT%ApigX diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.22-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.22-legacy.zip index c2be37ba954d6e767823f2d0ee14eabb5f24ead1..ecf80602fea5afb638abd70c933fe2d305d0d4e3 100644 GIT binary patch delta 1153 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 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.23-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.23-legacy.zip index fe5195a0842e13df1e4bbc51d973aacae19c386f..ba205032096518978be74dd3b17654533b41e067 100644 GIT binary patch delta 1152 zcmV-`1b_R53W5q3P)h>@KL7#%4gerrJ5_*G3w~Gx007^S7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Df3L!YAxXwvGqyuY@TrFVMLD=d1IOs0VfG=&)QpS$60e)}y z!<@PncGiHoX*7Sq9_@aWJWYkOkOwS-8{$M%Z}soIU^V^#?VlrtC> ztGaz*^PLn0h+z+{%(?2|+kR!(h;nHsM$2ico>^`h3><&o%}$eR@}2Lx`nI)+?5%#{ z!x>E~;|+VS2T)QTeaSM|7Sr%-FlVZJlH`f#py)oHj&f3Dx)$qu_WTv}e?)CMny}07 ztbTp9gGjy2Z~UFOri8-SX{5x=;)jdoT-YhB0fz8$_L!B$Sh8Po;=(F@_b1F^ZOit+ z2(Ei^olJi?wV!$qzSCW_%F{`dUNk~~`1pNl8Kv$m;Dza{d|J)rlOk1>i5c`(mXMbTR%1h><;gHYeuDAyz|wz7RD(;63aGF!$?*-Vm2-sCRechk z@*mb~7a|ke)vi1&=SxdVJe8Z|{K|kZrWxBSTx=7nEq9#N#Vq?!~hC)42Et%N3oN6$|cRWpR_ z--!T{7QY}4b`X6o%LbF|0C|=1(>zc?E6}tGr0xK*LQ)CGmfO z>zza@vc#Wm?G-Q3N$i<=-yT@U-nR*LFx5&Tg{rZo-8oUN1jbQ|31J30Yc7q!c09 zn=Y*fT^xxh2D&BB-w~2NPr&9iq8wGsHMa}xQQe3g%6x_$sBOWrpq3*mB#=0o>y^DO928u13v%)01f~kTsu{OR11Ds S1ONcvlePp&2ATu_0002&=P_{r delta 1155 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 I1ONa407}wHHUIzs diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.24-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.24-legacy.zip index 25d4442ea4477bf062dd3624e4e1a2e9d58bd207..873ee11fe678e0a52d1809d2276665504ece9bd4 100644 GIT binary patch delta 1152 zcmV-`1b_R53W5q3P)h>@KL7#%4gextJ5^|_wUSr_007^S7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Df3L!Zm_>~OB+(eV(=hY(FP^4Grh8CSR(+eCOph#K1l&vI2 zd}s(xv_UL8#vOkQFucZOS$fqvFfHR+xE?C@bzro~MNR%7-ga-jGy zs@FsF_pFl*xe0@uyoIp?p!7;XKQPa)w)o7pN^Tr3ui1b2ZgWP|DVULjR2R_fzi%4B zMxmKVd&(0AV|09~SYq1we-YU3>{dkp`%VUgJmSCO1{=Hg#Mlxo@ry^Bi}C%bmIW-%l)xTAzZh>MNkq{E+>G8VOU=7cfS#G?q7-G zRgy6d3ZuQ1@nX4<2(F)O7Fwqa6J&|3Z#Z}&&#`AMP+eg%<9AC%_Rn{5-q!@U&W^*q zeYtC~&K!bK($DCs1&jj`SpYP04D6t`O1;uNtq6Z2p@&ECT-h4&RJ~pj)ahY()nL9C zNrdYC3}YYYbb`yr5~M8*;CWE(Uf$`Z4xj^a12Fb-3C^+WdmQiJjXdw-C97`ydE1&d z^zdMmuNu%Z9?I~g=*xLPGOVm^%)y{DkM<0)1+Z)G`%#~LmkRM*)>Z6FZo9*tjO24& zYkz;+&r-nr($OcX4|#X(Fue^v``V%W7*Y6l(Jb43%mE=Tj`=l-ah_44<6D(P7NPNf znoHOF?~0`8R&7_b%@9a|=AQ}M%A3WpX|O|8 zf^NXeeOOB?rxn>V`@C)q6C%#u`j)Ruqe_1fZM;NAS0>y}EmvKBe(%~zyOY@p1ikMY zWU$LLxp`r&^JqpV%vOka;}|VAfCLiO*6zQ)@Z#+SRPg;<$-MeR9g)hG;TGv(vOWQP zvZ{I&olS)9!0#+Oi)f(Ske#&pPgTMN`9;>W^=9inv=rgu!IQZ2Mv<)L{!)02PP zM5j)T!4Spuy-uq-Fwh$dFS)Me#1++VmKn0j9&j)lIG}r7UFgerQ|g3IJkT3+B3h9^ zc$^)FMrNpx{!UfVT(wPQ1fPXV#{zp|=UCAx{#_v^-$6Atj@KL7#%4gf53a8yGJVgy?R007sK7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=IzEovPy^`hgNxSlNeQw{>5dveMfh!lS;rOOenX_1tIvO(Ji~8ATbV;SzNXOIil+bdQ`Bnm-I%aXId&q7Q`V~}rJSqEUy|DQb-Z z+F1L+#G_TDkN?#K^C0UBtU;5*@D-hDrjbS zeD&a>II-_a%KxnbnWO?fS0}Cu>FjLv2rMcvx4$tRRFP z=t+S*Sh;4AujXN>s$nFp%_vyNhfui$Zi`- zK&Pjlod_5q=`-bu*eaq|p+c}3 z`VW6^j(hcpbPr~4DumxA#ZAZNnBFpZ+JHLRE65X1DM zj{=3>FWkpo%&ilMSGxId+>h|}wiLT=9O{1(kPC__tUXTLYq6+=5rI4m7*jFWNfb=D zsEVX@I$brN^fD0hxF1_c?V(x#jAD{M6gD2dH0=A7lR4&iJm4rUe4#%iPn*Hz%s3;Ihq6bg#zQk^Nb*BF~=Ym};AE`$nxsi@S!97A}V)ua?@!t)Na^*xipE%SK0 zbtW@UEZhuj!w?e~J?c&f|1Z(~i6>Z1DRLhmj2)yE6C{X8>;id!2zLuQa=hP$$`Xt? z^y&Wn4N)~w4UC|zDL3{EvFvdXg#_HGh@*W~`U(5AltEBS0Rle*KL7#%4gf53a8yGJ VVgy?R007sMvjj;7odf^?0018aFirpf diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.25-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.25-compact.zip index f66a17d9a64c697466cd03601e34a45e24211c2e..c1b054e2eef8bd44b05853d03efb9514675895b0 100644 GIT binary patch delta 1194 zcmV;b1XcT|3Z)7cP)h>@KL7#%4gextJ5~5>3ygaN007&O7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Df3L!a}ff;=b$FF z&gJMry>s(f2ZtT>b-{vfJMJ{Da1FDy@~O8-W`2pmDPVubKegG@DOnB{xzHUkKK2%a z-H{2uBw@NQr)cd>)NY37>^IV+_mH4XHIr$z-7MG{1#UDWFHtsEQ1$nI`@-STH=?np|;I4aW`y!vq zU2oo$4m5uN!ALu^l~m*tD{;OLt@ejXlqI5iWOt7^mEj2(+0fGU0>Nl>o6(U$39?o$-lTn>$b=Wat$w>uLIl6gmpS#033; zf?R!%Qz8q|kqfB-%hE_Gl~om?{DB-iC>jWHyMlj>Xa;0)Y+g{x&wk#1mIKDa{uQ4` zxdyIO_;@UwG>Wfa>vssaws{t>EFK`W3NUWDkIsFSvJuuQ1|E zNuz%ykCZd_i&fTG-mFu7NSr?%gVA`aDXe8gW3<*6xnaD${0G7CVdnz0kVHoe2rufe zg!D7NU#9!S5J9*hIRpLu6mnw2pJAX9R5o;!g%Es4?$zQCbj$!v42&b~rHG+?TekXZ zzrA9Jq0VqVa7Cya9fDpd(z5-VgT5$IHno4OM!Z44&lxLsuV-*@hQD&(%j?*Tx_?!X zL}oPhgT4!Gt?f{nm+o$~AQF7rd7@2FOe_P-MM1RXatMw-TJn~s_v{fH77>%w z`oBW6e(IXpKli;P&O-6ZD0_2{)WKsDk+OfG&l96m_p2ONC&^&ykuC*~S@qzoUcY}% z#Md;U`2;!0vwpeh#dR;5I32>Bc>G5j|LI!5B3$*io00c;1aU^orm;Pke;#TljHkDj$(jooe-=$I2cLzz#Ou>CA(&sO<_l{i0RH>L@l;7bZFN5~&4o z$>mvILB`s89bk5nNp4d%_H{E^t-61nBJEj~8sM*A6xKAPfp}z6?g==R)WJV8xJ?>2 zwN**dmpy2rh#xCWozyF9s}U9jgTwemF=)a{KNE^YQ#YUn3<}yP%)ZfYXCXp71TGG^ z1gSeIE_qBmD*s>r0sv4;0Rle*KL7#%4gextJ5~5>3ygaN007$&001Na005KU1VRSA I1ONa407b1dr2qf` delta 1194 zcmV;b1XcT`3a1JeP)h>@KL7#%4gf53a8!YJAtikT007gG7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=IzR|V(oVhDH`@8ZVi_y0K!3&M)TNAF>|ERnR+OITYH6I zQk&SyNN~MB41<5uk%QW5)u~7saRlBg3erexo2`bfHv99;oUPe^e;W-Em#DJr(k?1q zY2KKE3U=Q$UdLKW@)&;FrdPfCRUJDet=5?^wdl7#c_NMjq7V&w;D?6sQx6FtUYEEPLMz z3ggQ?@7#ZB-z3rk;+bGD(u(Aa0y}i*%J1Ym%HoaS3QSHFgi}ad z_CPab<5TVon8bFDPb^Y=reqhl=Z=)umbNQ5%%vQY+)r*H&l9>Z%-m$2^7#1%-U6(+ z@D8C;jctzg)a9ti(m>iNCt-{TCnnJAgHtHzFF$|snNjJH6ZrebTa0B5MdO_jLw=#8 zMB?L9adOeC4_Lzko30j1s<|IPzher_Wm$T+D*WKG%R?7J45EbfYW@2ya+FcE-33IA zLh9i{^2>wphQVzOe)u$bz#@(JpGDN+l?_C1+NV{10NC{bdGR^)eMIw-egKGiHAWM* z0P=s1O8Q;I_D$O%x6>p0Nzp0&b)1VZxVNvOuwIuR4Lz^;J;~-diXa*=<^n`vg$TZP+~#FV!c5VZ}3#mAEKIh?21r}bp-jh`Kvp-jxU)Gn5$dwNB zDD{3LA6JQ-O~P}XC$LZk`0JOZa)&K|zgQlp^X(KV0Nk1o?49z;yup5?sH*Vl=U zBhnT0M6J%HD&X=?{}KJi2Q*#YJm-Jnt+!J*?j1$A%?zw@Vc&W3<0}pk0|LU`-CgAd2>wv+|wq^EwTfm@#R8lZb z6(`2eGKDK>m6yQ(@IRj;P)h*@KL7#%4gextJ5>Nz?!H$9007^S7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Df3L!a}fftsz+N!c>3vcw9fgs?3jrjuBX~IHl?da?6;ZR1ep+-Nd|v4Vbr78jKf!~{hmw6%CEf~ z=qfZMb)4i(x87dJD&WkTB&7Q5fKfqg`tD`mQyvH`SP%ASm{QVGMt=7h(xptZId2E- zyOrPuO3Vp5QpF6?g)}&tCe59-n3f0-osUCCeE3ias!xr|TQ~-USehE;*XfDZl0!T% z``^i$@3w!fai_XE-#w{*hc^Gn(F`RdGEt)oTDA{{cM7J7y|A-q+G6OZw+@A$FWxdEEKYmdu4w`ornNBUG2DzMweWZ5lkhYoIp~G zBYMhqX~PaAZ7kMqKHyFCtP%~2l|pM^iCt~A-FA&EXah%X$^JrVdu=yE4*t8Dy%KK< zx6M99qi7Liu*w8cZ%gDQT9M$$xCfAv>d{9O)`lI%n=J^Lo|PK)H^b0^mEYWk6b#;E z?7x4AN@9EE{z)LF2}8PhZs8qI#D-_nQiuz*Gc=^5@RUP5T;HFaA@>iyVi??$+e}ap zx20ynR;GJ#06J&vPD%E6zF51U%oYHSVys&ik(ZT5!)&|o>xow!fSsL*#SKX_b%6<& z`q!7JJOamQI>Iq6KGC1;OBb3SgN99A^D2Kr z&iT-1aJENtKTjc_)hh#P(v+{i-u)hmF_D86iB(abn`9e#A|%gsqBWxMt2lFVAjF#x z#hL)%cQB`2?7d(Wu+quSGt0?U7izBIYjD--MEFl*Dv~&IDBmNn^#PzM6m~%6?Y^|c zzDEt(l})1lVRQwj0qxT;U8@rH3UXBG0U?at4uAp)4RKW!;=gX9k^@=&Tml2?8 zB_$oW*|;V&_M9*qHxBgR7~N#uj8Ddn{r~l!Xl_tT0Rle*KL7#%4gextJ5>Nz?!H$9 R007^UwFF59nFIg;0042NB-#J~ delta 1154 zcmV-|1bzE~3WN$5P)h>@KL7#%4gf53a8!_e5yDyo007sK7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=IzR|V(oVhDH`@8ZVi_y0K!3&M)TNAF?8^dlq|Kk&P{eB zb#0&SUAlBWoMC@)m%=PAJ7Pb;vay`$tKc|Yp2w~j?SL@0cy^4_6}r;2&|zDmJDqPo z>4mVziANP&3j0&wpl(;F`nZ6F0h@K}>a8w9XX4J)Cde~K; zXzVSz%RGMq6c_4WnX)zpMvb?Z2N0@Qoe=@}K{(t|h+kEbFxUyy3DGAW6g_Xa8MMjw zpxz;MrlY&=E|&k%oNjS!;xRx?a+oc|oI_mArcY_ajt zA7Ar#rYY{*LHJ(HAiySI=fY)96L4ICRTR!UkMbl;O71%+8}~ zAb@|m&CtRz3`VA_2OLFj-&!nO29J`%hM@MPh}=zynWsL;vXyES`Ud5d zMy^N+3!LNOZS0;`^7jQ)w@c6;(vLlDKq!BuTkQT0?WVNDK#nOXYm{Q=B{ z2jUu_FoReH#^@->d~aeE@23@%yroZY4^vd?qrL=OCWL$gX(BLIfs_Iw(?XR1OOnN6 z_0IkvT!(v(yT0tE!?0>$^p8cGZts&&=<0|GGo-!P3>P3d)i);0Pwe186+}73bQFK? z)g71higsdC%(H??u}6h1f5bn|Mz}6Jy1&l0zU&k00ICG04#HGRFHiU U!de6X0N0bU1W5**1ONa40C$%!e*gdg diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.26-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.26-compact.zip index d46b4535b6afbd6abc0bebb6826e049cefb3a1bd..33c4637d4425005978638c7f9bfeba42cccf4a30 100644 GIT binary patch delta 1202 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 I1ONa40E$;e#{d8T diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.26-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.26-legacy.zip index 167c10fb1489ee31c15d95a3d660af75b9fa826f..426d2c8c41984a9c90d3951f736c88fdab188e91 100644 GIT binary patch delta 1154 zcmV-|1bzF43WN$5P)h>@KL7#%4ge!uJ5_@Acnw+v007^S7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Df3L!cSC#fA#E;IRDA}%32$YJ=oNx*bv3?22@&>}SZVBQnM z2VcV3TpX3bWmA85x_V{6d;uo<*)yNW*lWar9C_=|H2@~M)y{hGL;q1Im+)`|@01YZ zBv7O6_j{VN0Ys4fZMlHj9nm4f-bNPte^e(=TsP~Se+OmR$x#Lcq{Ph8k0qGt{vzRr z{i?j6pR&&Alvph-n=WmiRY~QX05DCLvmF9j((GX!DMNo(%hO$3!9Cb01(E5QmWHgz zf$!y%HHG?v5Eit1F`zz*$f$?dOm2|JZgYvk)FSN$4mW_?0w=@SDbbTaF(ph^re zMqDUb$2x!5ep~ejSjVXY&JS==W1vbrVREdEOt@#HFUyBu{TI53Be&6)(9DT3_1@J+ zfQKkleQtqH{s(!&*Y}+=M||7}WWCSzt&u~+Zeb`fh3CTDi!^M4H|Bm|1?^E`iZjiD7<`pI%j4zAQn_*t3=Oc`NX z6%*9yJ7l}*E~2NB&icjjQo&*)+D6f}NnaX)gI;b#0)%YYp7<({KL&>^<%aB1=^S7< zNLQ1px0Nv1f=lAs;J&7iBhjc!2@fqi}INq z`3ry4)!1;oJz0EVk7L^F-X0#YKz~l)2`$h85> z{G7CT1F@mqcfNfdX!iJbQ9W9&N)-ezA=w|~&WE#tXz>U0?+h!YyT|A8jy)P;Q7?ZZ z5x;Ob{aGYKhMpq2ZY8tZZd+CVs@VvQWdCCs4)sQ=Y+pV}v+lo?hx~_7DlY&e%LZs3 zwV^A{o~R#rkhPU&G5-rBqJD%dCt)1em6L>L*(pMdpn3ql32pv8J$;=k&ikU;)8nzv z1Zl20f|LUC&hf0{A`jB1^ysb+$Dvo}*KL3A=_HjHza7JvQmOR5m+k}xm6+hwJz3Y@ zVx=Ttzerlh@j=BB$KTui()8NSFj}XCGhZEy|C+|@nNUjs0zU&k00ICG03%#GRf6_- U4O#>M0N<0h1W5**1ONa409}qMq5uE@ delta 1156 zcmV-~1bh303Wf?7P)h>@KL7#%4gf53a8x2cLXTVo007sK7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=Ize&vms8Eu~P41(-{7dLRDT4M}izCxyL9ySjtMYCtZXe zTC3ZWpO=BHMs0tuO`kzU`t;4GMjw@m?X2s@tg^Z>n^nf>Y-m^~RhBMkFv9I+Zmw~Q z+DBOanl{(v`zj^*as6`BMV-kk(%#z7b{%Z5^b=5CAeS7clqOZ*%2o!knl_712?kxR z75bqd7z@@W>sQ8pO%|ITzyUnAX=DpAV-&n8@sCOvcOTxJnf&EkJbBW0w_A9GhcBc@*c6J*#UH)sD+ zPRAwKoe+K-8PDR$MOO0qm2dyl8zZkY5P{lDN{i(}ecg&mC$XZE+D2&(C>)_aisKVP zY&iGM$ViT#fG<$_^h+`uH&{i=va#NrZD(T9cHh!btYb$N(u)2dtXX@;S{fv9@KfSN zH;R8aX+TNqYAOC7pHuyCv8XM&ffsTSs#l&M*yKI7Uyo~SxbFK7);C$YmyvyV8VMeC ze~rH|ebeJc`Z_6TTw5+*4X}7y*lF)=WJI5p?R0qgR$D{x7-%Ue6cWL#RwyMnYhR{Y zqUU~89Wza&yN(ykP%GWB>?NlyCan4)Ye#?4KDeeC8)%=(AHT#4iq`)#0u2x{>T_$F zxka=+=9>adxq2t)PZ8z7BC)E#)wZlla_F;Ar`-m*0TK~dGD!B?6jlYlZ+VdbsJb(C zQ}}{FG7OfVR8 z;ug<{t!G6qiOgXWR!I>qm|qSj8)jLcXQsbwtPy7%=YW0X1^WNER!#9xO928u13v%)01f~wb8u85 WKSGaO1ONcnleGj%2A%`}0000~w<0J2 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.3-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.3-compact.zip index b19bf3a396c17bb8dee576628a12417fcbd7243d..a1086e50829b35d5ffbe54666be8b171e9c23462 100644 GIT binary patch delta 961 zcmV;y13vt=2*d~%P)h>@KL7#%4gd{YJ5@4wtxB2$005?u7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Df3L()3HU=6XdOS^YJDt5O74f~W7w@W>GTV^)Q6Y+>266y@ zX1N(`+TWhLfq#D)u?=X+jzL;>pMFo?JlMFJs>8(CQukF4RT1DOA1fl*|Eswgo8)Eb zOEAk(oGi}+%At@t-w3b4A^)?rXlEKHiXdS{ZgbhdHe?7W?5|+3fxje%aV2WW_P{cV zV8(i?xO^jv-rtlFKKV(y1rq6cg{GB0t>YG6YH<(jx}JZIZhb|CC~q)JE$t3duETbC z^;}QuOiDV!7S8$i+fFT4!e0%a7Ev8;1{+jL`)T27SUmJcUpmu5VNWDD6weZZniZQZ z?0&8cmLA%=@0^P+6PxjFXGw(uirm}iQ^QKP=Kkf@Nf@pJv>L3~@^I%#u!h698P7;Z zOih`2@PU8)n=)Z112E$ZVVbev%DQ$K!9`U$SvWVJV3dAbPbHNY&$LM5Bc9tNM;)Ej zkfgIX|uA?^Gi|$)nry-MbqrVacazerADLG5@BLD~z>eed2Sm=#o0KO=$T* zFb%UDL!=?9RWd>8=X30x${k{PiDwmpwSf|}E{`@a(NkaK6?=E%wsNS|rnKCEW-_Z$no~ z@?f#|goXvdAaeJ^7yh60`D!OtEV@KL7#%4ge{0a8z*7hCYk~000D$7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=JSWqLoGpYVD(zebAI#w4NY}J#3vBA{i)3t1)uw$E9ND; zd+S11HsXs+>O_CInxhO$z+6O!>!J0veZ#eJR`rDcilxl<;Vo*=IU941EY}ho5)L}+ z<<-hR!!yLV6?uZH50kQS*r}NxzlF+YM3?}qbx0)GJ_V5FisTfEX>*qd66AQ!5>9!E z&hu!~Z#hd3DF_**rnZe6K6(P_BDhtdw>c=-7fVj(LQsE$P*%@QOrG~_4TdwRN1)s% z4tzcHJJo1nUypXe2P32qX~?qh$`ql_>??^WGr-?*h?B`$B^G!ML+noiE>k(oc>nUW z?==>F2<$a9x@wZ}zmXYlB4-&cG8itSYgP+)8SmygTDI=L1G^k5P=o=A-eXpbYa_a& z@L8C0c8hNQ97-ZiUe5IT0!KyO7UKcbSRp z&{GsD=Y##t;>z)yU3M(oj?)4hsTf!>+f7N5Qr7^l>8VzIF-R94o4)`#y7ZPWfWZqX zZSKLhsPrP(uBflgT#{xPV!XM>O$dGD&SC83rch?)Z zerbQi`Jx4pIxy8U^4X;*Jeg(Z%~%&vTv^>VqK|4>8V}Vf+>J>Ibv=_rD!SQBiIsz} z+Y+wFvE?D__~8_*Y~64We#J(#$Z_EoNq3J!y&!d*aK1Br?kfZPuTRvLh`Ou^%g^*p zQ*Ty)d;S~*deRlBgg9HL!!~DpHdrfW!e)Qs$2-K7f|kP1SWw^~8m1@pg-V%a!j{u? zm^<-jFU1oN`Lj|hxU>FdfEHskBPe7gfsJ|$;Xe@0VS;WmFK-!Hsz~WOla@yZ#-WUj zcJrQPm{3ar0zU&k00ICG04Z~DRB#B< VhCYk~000D&^#e%;&I14d008gU#F792 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.3-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.3-legacy.zip index 14e02b8c256c329b739f5941b45ac195c5309eb0..66a2c1e6608f69a3a99bacf89d8100121d99afe0 100644 GIT binary patch delta 962 zcmV;z13mn>2*n5&P)h>@KL7#%4gd{YJ5?k#HVK;p005?u7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Df3L()3HU=6XdOS^YJDt5O74f~W7w@W>GTV^)Q6Y+>266y@ zX1N(`+TWhLfq#D)u?=X+jzL;>pMFo?JlMFJs>8(CQukF4RT1DOA1fl*|Eswgo8)Eb zOEAk(oGi}+S3{cWZAwAFg9>bvM?@7kcKZP*0{dnumR`u%Q`yt-S-s+~6IW@&7PHu8 z1`)ApoV93)pxdcPg@jRG`^V%cihWo@)N~{+x8ibWsB?c_?r}7;q^HJasw1RAdxl~h z)`gkb?>oNdL|nPQzGXC`kEjF@XHpkL{ZE$qICWyMctAE6c5_!*9*Q z)JuI_V_ttTBIuSc@X1WyG%KEO$QA*gCko)s|GQ_QzZN8oqp+?F_)GGq*oPBAz1PSS4Wv-&)cBCWgp6lIiTC2TTRM zzar^`XlDRp6k-3!O)HmRa6mK-C}LGQyPmZp{;A zJq)+|&6BGPv#xrL9GS>Q%%DC{h&Y3em;=8EWtrqE`!nP^;zzir3Jgz-KUG9)qx|E) zg${q{%y^%ofKrGy*J-f%JD%HI*FRbXdX`uB>BX;m$8hMY`Biny%sb8B-?6Sh;$#@j z@gTZyMSF+eCS?iFGs>Ft7MKaM9?JIX6fL8(QsuD&(H(E0g*5xhJ9YpZj8r|wTC^1S zV|Pl?Qg(WyE#CwDiA#arocS#>w6?=ywE}-xf@mP-RU^a;4BeM75)p*AqJ^KvDgf|a zKFD$aFNxwwK9+gjMZMK;B$3Z{;^!3xyLP&&lrbjB{!wnH5*~XBy?A4*mM_J1F&yO?J>Upl>?>n#vRZN4gXMP)ip9 k0zU&k00ICG01aF_RU|bw37Z1|0H%}a14#zm0{{R30Gm+7ga7~l delta 949 zcmV;m14{hG2)GCrP)h>@KL7#%4ge{0a8%xp36qWk000D$7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=JSWqLoGpYVD(zebAI#w4NY}J#3vBA{i)3t1)uw$E9ND; zd+S11HsXs+>O_CInxhO$z+6O!>!J0veZ#eJR`rDcilxl<;Vo*=IU941EY}ho5)L}+ z<<-hR!!yFXzzx&)%;3b_1I_(QsK7*93}EXkTq3t>q7M#!FD1n(ZH80tv>!1}ws{s> zTY0iE5$JA&5nNYFtJXBak|xQD#ehuudsDj51~GYc@(zEB4Fm3d3#eUmo?KZOuoBE`j6f?JqDy~AJl-cye(GKT%BkfklETiZM$c?# zufZm4Uko%p}bqYZCpC>vJRJ`%n`po*_hm*g5MQJ(vlb3 zQHFntz1+lx$v~Tws(ubntN7COgKaY*_K*j;9bxS>n_2AoPYj(->r-V=cgzL=Z)|zB*-QiG=0F2w7em4F28>W?jVoXb}YI@Yz$;yDsvLDuL}osHV5!t z&Yq;S6&E|u%F0EaK^KZhT|_|G6;1NdR-ngcLBX#zOLA$4A{qkT)%1DpjL(hH0pfk9 zITP|@Zxja$Y^N1{Tx}R(x{49hLJb~a#-*Ol#Z2%1wp~Y1O928u13v%)01f~tb8re& X-j4~BjspMy1e5jyNe0jZ00000YRl4s diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.4-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.4-compact.zip index 842c67c65e6831e75b2df822a4e5ba41a804068d..ca622d7f745e9b720384562031ce9c123f5e1fc9 100644 GIT binary patch delta 961 zcmV;y13vt?2*d~%P)h>@KL7#%4gd{YJ5}guKAh1NiqHkm>0fv2zNig;>En?~;ywJ4!u@OVJ9 z>^8dsa|R9)*sgybl4ZbgUlIS!g9Ay9ohAP`Te2Hj3meUT_VMb+KK^J_0$OatfcnAEcGS}6Ir{~U>h_Z&@6xN^`B9C#v7~|c)reP>tQEI ztV;KFFhl7B{{%6`0NiS?ci_-!P@S7mv&C#l(*Svk|4{EAhem6cqKhP?@{*4^-Ch!M zZ6^f8dUwmXd0xa&&#oJF$JCk}j2My4BK&FXOh1sDi^l55Gu@7cR-6iSw4)14q5)fI z1xv^A-DwwMUvVwa829oFpgiEWroV=-<&q{pB9cmjFG zSX@eigS|R?JQuP^_8mw+CmCTKW|V?ED2mJ6n^rH8qzJOIQliS@4MW~7m?MUItsCcg z)k}kz<(?@O^_p`U*mAY$hW!~%M!2aYH5>-0W-otC08J+OM`b7+F2mV$bYPkWZ$*&5 z6(|{3p;mPT5leS5=gMTXcMJAVg`Egq;LJApc29t8e*uW^A*my?>=6?WNg=z?k0HSE zwBk{9D`Lzm8lzikhj!z~TaSRCNlE%8vOPR#$V9(1&pD&dbIa@N3h#fLY#c%6HKQ2* zXfS_6(!(w(u5(7%+U7+*ll?o&1J2DU{Ix5A3z~1^qL(8v+S2w$$e^rIs)DigJ;_Ow>xbKNK%J2gUYb=%K$NKftJ3lqprLAhRc)?n;rZ~`eGSjsp0SILUi09@tV z@nN!l{S0+b_SNA&3S_H2pFfv}o%-BG=Bj^t<2kR%O{sz#$-o5^7Io5~z^zcvcQrud zT6snuSB8EJGuEX7n2IE{RQfCGfy;dxvZ?IZ19F*bMi+L>|B!NY)!FjV7J_q;|L z5lNLla=!yE8!5Uk%xTVsbx!fKcFQnd^ge(@KL7#%4ge{0a8#7CAcBqq000D$7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKdZ}WUORuv5}M=kHswDAS?JD8e4{8VZMqm$RN1$UUXt3cU- zEXtO-hN&*T#hHJ@qR3stejvlTaH9(`NXl>M>`OWIZvQ>@lrQ2Qyb7iYzP|MLc%60yGz}`z73&6{oB4N@K%cqjFaG>79FDgM}oS@s}$e#H9u78 zk9Rk_z&F{V5q#&SgVX+Q&MR4ZFlzN_d4#~}&j?_wm0ExBh+1`7nN(5IwDaLqMOgs@ zsh8n93AQ$c#>LLsf`06Zn6!v;p#xrd8%}!93~fliSDnONB^aFB&qYBQDQ_KlO|W~! zQq-zr=}9MSqGIi(F0!*EPvW#JWj;NTm#0c2ResImS$RcEM0r zcY(C%+q_ThxiVvc9baR$H~Fhz`9*~S6CnHV!M4P(Ifidt?POh#Mh~1JvMm>y%JIUY zNDk?j5%fK~JhyQyZt8>OK6Xb{>nAyyEuOicTHSvUX2Hin8^p^%G}pxr{o*%p1e)-E zbB$VtFzdFRg|RA;t`>Hu28vvuzvXrq#!io?JbMfL4c5S^2aZZAZO)@V2mUK`*zgpp zK|dfC#CF^s=NUn!JI3R1($gxGGwmNj1Y7@NZTK7}BI#IbwCX=B!~qlV%PBlUTZ_!ng)mE18omhj^oT2tp?n z(xD@>L}H&5oU0BisGr3ms+O928u13v%)01f~tb8re& Xl(Ha#jspMy1e5gxNe0jZ000001ggSB diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.4-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.4-legacy.zip index 560ee388bf5839288f6853079e38597cef5e8eee..380b08cfcaa5282926e2a47555fd52714c34a8fd 100644 GIT binary patch delta 969 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 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.5-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.5-legacy.zip index 6c909e4f2deaa5ae75b9ed0408f39bff53d7eff5..0c3808e7fbf16032c5b3c4efbd96a55bbd0e3cb7 100644 GIT binary patch delta 966 zcmV;%13CP+2+0T+P)h>@KL7#%4gd~ZJ5|5}f90P8005?u7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Df3L>Zn%x|vL6vEYx2q0$!hi@82Yfk0pZwEpW*LBOodG>n( zLN0_u7IonSg7$w8)nu+JOWe8DO|^4QXmyrC1?um%oQ|Lg?qm1-h{1{N5Ut;FHv zHvi{x6syrvm`(P>T9Xb&Mz#DMhVHJcoHGJ~(g|Vd!t%OpE_IRlc}`RPDoxEU+wF@c zw!A}xbi9AXIHW`fjK|ZyUtu;dI(eB01Ns@U=qij03wy+?%MLK`Zh;sD*@p;Lgtq5Y zpu8u48Rk=ZRbJMq0(?t)vFtdo%kG;s==y~6h8t_{-RY+=3j$FQPU+ipPK_-RggVx^ zNt^W44_V-l&zvuOUl@NF2v&-A%^(u}Cw9r#70A%nzUIgA zIN=?E8iHeoOH_y49=5Po5Z_SPCL{lHJ`O-?B_>*B)cS~^bWy!s#i*5hZ3*8D+=dc$ zL^bd5_8%2EOdz;sI3YOqKa_&MBQ%8h1LywBg3jStc$OwTSx?HCTX~Mh!KK;ic2{!D zron%_!~(lEA6E?_pzo{mi>BNTqLBq5bN%9gCb!kZ?$p$S_U^}oNZDIDy{c`@;;(@V z0^kf(PFpL<30*oxU)%g4V3y{NA=4>od^{cqBbTK!tf9MR0VVX8v!@@D@Xtp;9ogK6 z>L#bx4!BEV%z=*mM-;e;UtpOSWSA3qlShA8#(KbGdp2OZ$?)m`*!mu`&H2MOuiKO1 z?OgHGNj-dm927lc8MX_fv5o5aNG7J8f=G|#z0JUj9;9S|AY@f+@@FYYn#POBVA035 z&kv*IN$V)bHppfHbrfkHYmTr>T&MyJ>cxeC^E@2oTN2S{2eHu7N36mqBD`h)F_s%c o08mQ-0zU&k00ICG01jL`Rlov&<(~rp0H%}Z14#zq0{{R307+!hmH+?% delta 956 zcmV;t14I1D2)76uP)h>@KL7#%4ge~1a8%qh=UI&d000CI001PD3 zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKb=KHugOFG|sTq`3SW21fZ8YhswCef5GM z-y0`v+awmki>TI4Y)y>`1uTE^%oDMW_0d)=ruS@2QS%>#VGnF#TKS)~g$}q4g*$;n zW3OR@o;VpX+r@6{erENtjccU@xqvdo`>W-HQ4-$8T@4u2hd2%KN^5%g?ySVOnf!VT zYq)N(S2R|UmDS;CC#t}!qQZK3B>Tz`oQ=lRh~h7_gTQsx^=IB6yOMtsPd)ZJsa}_( z-0dPqhmAl*Cl-9u4c&+ev{828hypmN-mqq4;5@_uO4>l_Z+C~tg%~RWe2G$%W$wC) z8Kv)eyfgW#tB~23|GB?^CGE;fj-*v6IKs2H&Y#`OKjV2--Z~?+n|_4M40;#tib-;e zOCA?<^48Rl)+`07rxAZFSGU;%JD`eAV6%9mZ7_tm+dQ)M#?gb+2%-}ZxsC(8{6!EV zp-r)DI~B*vQcPCv$TRy_-BpfWPhS7+#T=9-4qZUw1L5tNvQGOqK|R2<7N8hba{q!} z|9~;}dG6`b3~IlPn5rK8ZO0)iK>je>bwWfI6c;CgyJ?I@11^7i63g=n)3L;!`J!l> zn+FLvOXSP}pY32%7!$0k+HsiW<;m9zAs614X!v)-UJeU=97t2Z<=K>-ywK6O+8Jtd zs|>O}Y*?2R4drf0lnmAC#$as26oH58yq&ixk0TxUnvR!r4#w-=2 zl7HTDjssRS^BlUUXp>87J@x&RIpy-7z-kxBS(GsfO6jH7b6RZ>sV37=IunU=yJh8# zC_*0P$&6JgrZK~z-}r5M(AKZxcg+2gtw@_iW=uNaa+!Za>xlP$5+~I!D;GwwX4R%x z8dg}Y96ngVn&$CW_8{=&nr}e&E1`)mb(BVdp_l5a_ld=HF%b#K#Z>a0)e$g=Qxg|e zJR6`MmB?p1m5CdvdY07Yo4=AB5|$_CA`x9E*0O1~q-iHrnf~{YekM>$0Rle*KL7#% e4ge~1a8wE0H0N230{{R7lllWm2G0Wk0001s>C1}% diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.6-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.6-compact.zip index f4407df8510f52b19edd7dd547b0c4b2c803476c..ca3a1023fb390463b200409e055504e37a004c2a 100644 GIT binary patch delta 972 zcmV;-12g=)2*(H;P)h>@KL7#%4ge2aJ5@`^ZgZUj005>A001PD{sSkGLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3L_4KrvoI39+**+ZI!T|7qGSKdzFdNZ;$*`Y;1W>`@wt+WFpSK!Sl62-(~N7dI-(L0NC=z)NmD^{)yQ4@&(o~E zj4^g`un{WIsnMBMLJy5CUmhmT?7I=J#+r^`(s)5 zpLn#C@R{L+<01LKyTmpmPJbriMyQHby zRAvOZn7MH(HiblPqQg~o{#P787Yk;0P5SHp;3Ic{XebeaD@|S+RkrEg68Wa1gfgVF z-=m~T|ELQur84wQ)Uwv7>t8}IF#Lo{d+gx@YM!Z{koyw?BhO!x|JT+A?Xs#FDU2h} z|5Uz!q->-+DYk#5AS`Qt1wyv5gPgYE&$O|iq2;xi4WhXg(M&|xW-QY`7hs@=(Ba>oduFwghOAlc9!K9!S>J$@Vi uL;ovYqyQOEO928u13v%)01f~TTsu`u$8K|-0{{S~lk5XY2Hyh!0002*%h#U( delta 952 zcmV;p14sPF2)hUuP)h>@KL7#%4ge~1a8y-_{+^Ko000D$7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=Kr7$JN%txK}KTGEEOW>>ToZ3VUU0jFIaWBziFS#<&$DQ z)Dwc@YS+Uhp~`<9>|Twa&BU11#!@RsTPMCf**m)X)USfCdw;maYI{~g!H5{3>)0fp zPZdvjs3Jx`RnlGaZ|KoM%!)VYI7dfkRmD`+RHq!$c8a;L*4%NZ_$U8oZ0Xwq0p-y( z5xGZ54HhcBKUxPJfMLK!z z0j+I2;+Dt30gsH7$%}L+NYJB@&$+4~LPB19=-c;Tgg z7UWs1Z+czx`M<-0uv0CXtNxBu9X36~CW(IJV8|^8uEve)iKN^?SWzDgKU2`go3(t8 z{%GnuWK^Z92zWW<3B||T8BRN6zLkB*U9B~9qeg%0*Ot3k390}?wl`VzAES$>bbH}S zMsyhdheC%d94ogjnrqy_K_-1kT{UKc^rmS7alr5S?-m7kvrX9pGQ%3zFau8{2QEgt zqk6Fz!)NAN^1P~oe4v_9;R?HC^<@j=sF1g3qScz%<0x>nrgb9nyhGOrKQ64353cr6 z7jl1??*V+mqtP+7nh-l{&WzOoV<94`K_R&;Tj-~!#bCgQvy*xwU&1bGM!i7`uNK<8 z|3xnvVv*-?gn$q&@rAR=uvc1q=icsDS3tz#OMEZh1T_bZKA)$$bjQrlYo`& zUjC=%@>kaWp1buqF`*ul(?@i+X?at*CS@Tk7;&T6;7|Lgl2TAh0Rle*KL7#%4gd`* ab8u8uivFIF0{{R7llTKk2Gauo0001XsMX>C diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.6-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.6-legacy.zip index 8164be9690fa0ee2d8a1c7d55bfe22df7077ffcc..886617fd8571197ec651d3dccdb98f02bc158529 100644 GIT binary patch delta 968 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 JAp`&b007fK@6iAN delta 1028 zcmV+f1pE7m3H}HhP)h>@KL7#%4ge~1a8yjBDAm*h006cQ001PDOav#9LL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B> zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKb=L3DlJN%txK}KTGEEOW>>ToZ3VUU0jFIaWB zziFS#<&$DQ)Dwc@YS+Uhp~`<9>|Twa&BU11#!@RsTPMCf**m)X)USfCdw;maYI{~g z!H5{3>)0fpPZdvjr_OBOaW2JEP+HuqUfw@;oe+Vp2~VcFlU&x!`=RtX0&i17l(+t7dfA#%IH4%E^# zg?(ark7MFomQ&c==5PEt;m&CWI?=J@H|LVw8k3ehR*W@W;^@xkzJC?f&pwL;i91w& z%R!G`rEKjxYq}f!iKoJ10bs&gJ8OQ2EXO2B%v125Jagto~@t-q!{&q$WcT z>N1r>hrjg0z|7O?h(r^TxXPF4q%u5@Y_fGp$!%qKydAE1G9B_o6@2VNMNt2rgtyqQ zDV-Z>vY%9!GgJZlIwIKmiQOGwkY4?C-+B&%B;B`!RG6UqJzam(cEN#>fFr25`JX89 zbiN-PjKq~VZY_{<`z6@3^=^GnS&VQwogDHWwXgf9CAF=ljzcr#!#!$xAj}kKVPbo0 z-i8Ah+bh+KL}%`e><+Ii%<=^N@$IhT?-XZCv`Ck0(Y%w@DRMuqF*>hk!`whP}|-WA+L}h-yr6TW!1~^zv5gF z4QWDRqIWW+QYh}lc_ns!8bgSBi=DWX*j7vlH871}_P~EFMG2HUz^WhVsc){`NYRhJ zfACdT1XfaP5V5>NkcwLdHphnW69z96xWdWI)wd6?(x?~8!-?`fNH!7rD23_PR$5oMie0jekWH*2=rfoetks{ciTE#9u6^#lji zZ$j?=UYb$5hdr{ncJMVgH=AH`>%gmc@Qr6BK5VhEJ?^P^xOBB_YBD&j82agBMfi6q yRxEj&!r%Ucf+SE&0Rle*KL7#%4ge~1a8yjBDAm*h006cQlRE@R1{MSW0002l3-yrz diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.7-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.7-legacy.zip index ed1708f04202c72c429d3b0e4d0bf37382736e42..f5374b523cbfb7017d80cd06232ca630d692b8d5 100644 GIT binary patch delta 1030 zcmV+h1o``d35N+7P)h>@KL7#%4ge5bJ5?tOnWo(X003AIkr+;YAJ=oe7BTbcpx^-K z1=jV{4gy4dH3+yu{_QSp{rx!wdRzcnNN4<<{AYIeL_nHT&h-GPFlNx} zo2)mH&!3cZn~Y8l&m2Jvg&Lq$a{8>mdmF&j$0FBU+5i>K<744`+~9GT`ww(P7j zGwxY8h!!rE^gM`3hyMR!7v6R?Z23PtD_Cl*uGS7fNRn^Al*{O7au`k8c8>^9?whrK z8~hq4YGY~t#m{j!j_8~q{9&TZlOR-BdEK4HUYUeUcG@NFry#3^s>=@myHfb}%$K*b zsV7zh-cyu+&j1+j-ezwQNJnEV%_oVEbEq`oV_p`qI&OU-{H}jLe#N|{o<}DKaRO*U zwjCcfQkWW)QK(Ixsb4CiHV1U%LvBbDlrKYNr42-{LXMi0f@DaFIW|S;oMXhhm+w!K z8EX#uPfOU04JlREVHsw8Tj}Hk$%6qF`r~L@99ma@-)QMH#-mrbb4T0fJ@d{-Avo8# zC;;Sx6=(X#^xbN=l)|maV>6j4vQhIYrqP%MkQhWP3AxJJp$7eLaFH1)=X|>Rqimmg zzP8sSE?#quF9dr^RitPd1L~jsrh<%9nOk!qfcKHGP9Vnrlpth0RzGbWc~B!C%5}ML zh%;$_lCopm?*u4IdfgZRL)6g>D>fLPSh`r+y5?`+*H?SzWp-n=$NY^{{qNamXza*V z7aB*YZ;$*)2bkp4d!$fi51eJ+32>NjKwsr-8xF-D)Bgcj#LP~9*h^(*M8aEE2sN4| zKX%RMIH|s@+q{WAW*R5*_<%Ye&u8P~CYnk&=>Nu@^(!jd(K`~f+~7(<@MPjz$^JVKSx zR-V%uiOrB79&4(>upDwqkm;!l1S`$@KL7#%4ge~1a8y9K-0s)|006cQkr+;YC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6pv}aX)y7gQM_VVpJ=r_D`_!+3uX}&E#cF$2L&1m`pzGKq zpHCG}d8hfNd4*Z`!Q%mF6`z%=^ypfhesZI?yN*Ruv@0)PTKd7~PsHGWu{zoXe7~Od zf?+=ma>*OpI3jJI*eEPP2jzYFuh5)&KPQy??o9aBCKPyoSbMaN*mK*N6@0GbaJ`bm zjs5dVq;v*yW0Wz0Gb1gtD(9zZ^Al!rtpa>dCaEO9@|c7M##AOaRmm+T2Xqj%4+LB- z8;%bNtMW!f+8k6;w2&ZRg}c{R6J56P{G>`R34p>yRh->s{tH$N0iyNZT_qZPJ(<2x z)0JKX_B7Cc-XPYy;AT<;hUlym{{S`UGpeiZ$fiC=dt zN6Z8gCJ4umeW3-AcWb)x&DR62gQfOGjl>=fWIl3#Mz1FtV{2GYvzdSkncbm=3H#ij zYZhlaU^0c&+)lEPLZC8*Bh76~LTxY403|O2E0HpgAp4NW#0`-5w%vhF94P2}W~0Om zK4KssP4+-mpo!Knc+%8+^Uc8Bu1y}A#8Ch<0Uc?9*1^W6fa_vrwPyY(VI$HI8*XnS zuK;F$^5Im#W{Nt}_HzAVK}m3x@ShV78GO(yq-EV|zm2vrwL#i|H_Qto#bIt?JybW0X!&D0P%4 zih;;q@9h`dj-6RZwP}NmG(w`wjwN@4Gq`hqh2~a{Kc0By84>{|@7fMt1AS)T$G!T< zokXMxkkumS2$ezT+M$zpnU^k{IXS)+Itzk(ad#4%*ljEV6XXoVwkD#c8`5-*WUIk- z7E_^_d!Gwm8Td>GG)Tv^1s$2vT#FZx`d(M(3j!nF012*?4!AdwB)pyXL6ButwK(Wi z?467{U~bomZX2!ZX*M-2(tBeTOwF;STd|Q3dM_@#A<}?D!`TzG1E>j*{|n?YEPWT4 v*6;t-^~YdPO928u13v%)01f~ub8u8Zx!ms90{{TF4wE?qNCp}N00000t3l)) diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.8-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.8-compact.zip index 46807909d51a541f850566c0364c5f1a6d34fed9..ad369947e94fb9a0b2991e953f931161f14c0e59 100644 GIT binary patch delta 1044 zcmV+v1nc|#2#yIGP)h>@KL7#%4ge5bJ5^L!XanQ}003AI001PDKm;d|LL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3M1D)bh|9P25tl*ZP$hYFA*t_Shw2N^!!_h zv#2FkNemLowG)p_ewLXeAII36ho65OT1vwh0`Cbf zhvg!V@>VZx7#YTer9yN00@w#KJQI|NBU*hL|4Q@WPgeq6@bI{5^ZJ^rizo@C9Pjlc z1G}+_jYZDY2)Qa1-0CqB$E5i5_ambC2<9Sz*0?8@>5*LaDv`BrF|hVMxNeS%MxoroX_Y>E3YzQG}ErB$C!ysaa;f z8p#53<(lM_hna%+WEry$iZf+zkw#U4#=EE2XNN@+zhJ*{nFX3@J0r7^9SI?`Bvo)5 zjG30w4f9YR@j+AJ!t)=Q$PK(qQ>}^Q_k&Bo11vkktNJsdkSl-RiRD!#J=gg!=N}ns zd4W3_VoKhr;8Vu~jsJF)J4d3_#`vubOA_^yT&M&1?G@@!k6_olugEjri$>@%X@?(F znxeVe{o6&NC1iHJ*E$Ep>1yjb$%%oMW$aKAc5`y9H;xN>oBe9m;yn2aMdrLtL7&mf9#5fF)= z1xGAP3-rLrc{&l=`!56~su14U9bA)5t`yfibHvLh_&|U3`@DJ0cMegrRee=a;lA|( zSvhv09254K$UJedf7`&X=r$^(5AnkSskR7!c62`06$tv}2UY~O9S`^fdg4<2u>$+- ztY}52BOvRf1tFef6<@4qQXHIRNvrF?`A;Q4I7O@_84!$3_Y+R=^i0<|Kc+xTOK@*3c$mnK#C zkIY~m5<%=?yTepZ_5xSNakZK}_y4OMh)_^V0Rle*KL7#%4ge5bJ5^L!XanQ}003AI OlP?5F1||dm0001?Dec1m delta 1027 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 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.9-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.9-compact.zip index b735fe419068b56385f9745bfc403810a03374b4..2646618afcad95ada97e2f5a7a56fa341887cb19 100644 GIT binary patch delta 996 zcmV@KL7#%4ge8cJ5`#1RUx$l001!#001PDAp|FpLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3M4spWVkwemiIGTY&1RWai+-g2xrk|?UmzOT9U9o7|a2Z83S2pH3#;rq`6VPE`{Ilx7udZ=DkWh8h?AQc2AoH%abd5RkTt zE>c1nSOszq@R!09OB^RN$aDN4ofm zW73VgZs&4s6xf%4S$luT{?*VGkh_f>7E7$9H_Yeo*`KTIPu{+r#d&5ZZgT~97b?lT zhff7-*#h&xU`n7@*3PSNN&$hm6}Nw7rJSe+tyGe~Ur?cp zg7%h`j~Lf5EvL)*zm^*QygN6Z2#z_;EF7@b;3`JbAg&>7DVu$U>1ZQjQGLRZAtQ}b z;0eQ5MH}_cQj@FUX@y00pRzjzE~5vWnT=q=3uKJWz8zEh0Yi>(_n@?dp5e zsVW1Asr=vkyrh3nBb4mcy-wy;h9v^HiGVqh&=adK>@HsEIesCF^E{l{<~1~)k?+^V2psGa4b3Q7ym(a5OkabcDB5HE^gf<@9&VM~nA z)odWJ(9$sjteemQ*2ryQAP)DjBwl8==GMRb#IQn8O928u13v%)01f~VTsu{ofK?&2 S0{{RqlMe(*2KNI10002!#oE09 delta 987 zcmV<110?+42;K-6P)h>@KL7#%4ge~1a8%>68hx|_001eG7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=L-Yg=GUC>MC7Mm+gdPFf%ySaOXsY;ma)re^LP$Vyp?1;(fqy~Z=`i>uV>;CqAgDHne z2~!Pm#(r(b=G_JWO*c=8CQ!j7l~p(|T_en=c=$Db2gZNtE7E8Wo<46&10JB-h^m}r zXXSDA%ew;h)wOl}m!D8mRnSus_0Vi{5U-T7=UoOxf2xF=cCSfh11psOL9sz-+%btY zop)08fz4V(YC7tO7C7#1$RM6P`w3R)mdJ1nb5r#UGdLgQktEL|J##N7t+i6X&-)bZ zNrXlhc)Ndj$5r0S3U#4>w=u)#{L|9I`hzR|JCNaIc!Ws^Gw1G+kEJM+iTAQ z`Z-1QLC$*kxu26Ovk^-rA`>)y&uPvrrY^ef$qE&sx}q#d9&0$cwR<1iU$*G(16Y6m zv6QGal=_`h?v+L@<1@vyqa`?6Zj#UR3^Ffp7rTE*x--FGc^&c>%Cp^ARY=liei?Xo z#K(VKunRhm0ihiPW=5L8g$ERW`XWEA)|g}c2`ZFA`8HmzjrDl&K`Jac7g=AyLIq)tc4x`8|eXyGU^GTMrL6@cB+r&p(wC&OvyS^u8ydgnC>ti zYH4s6OzkJYx(u{y69tuf|Nmm~Hvmve0Rle*KL7#%4ge~1a8%>68hx|_001eI5ClmE J_5%O_008s&(VqYS diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.4.9-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.4.9-legacy.zip index b735fe419068b56385f9745bfc403810a03374b4..2646618afcad95ada97e2f5a7a56fa341887cb19 100644 GIT binary patch delta 996 zcmV@KL7#%4ge8cJ5`#1RUx$l001!#001PDAp|FpLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df3M4spWVkwemiIGTY&1RWai+-g2xrk|?UmzOT9U9o7|a2Z83S2pH3#;rq`6VPE`{Ilx7udZ=DkWh8h?AQc2AoH%abd5RkTt zE>c1nSOszq@R!09OB^RN$aDN4ofm zW73VgZs&4s6xf%4S$luT{?*VGkh_f>7E7$9H_Yeo*`KTIPu{+r#d&5ZZgT~97b?lT zhff7-*#h&xU`n7@*3PSNN&$hm6}Nw7rJSe+tyGe~Ur?cp zg7%h`j~Lf5EvL)*zm^*QygN6Z2#z_;EF7@b;3`JbAg&>7DVu$U>1ZQjQGLRZAtQ}b z;0eQ5MH}_cQj@FUX@y00pRzjzE~5vWnT=q=3uKJWz8zEh0Yi>(_n@?dp5e zsVW1Asr=vkyrh3nBb4mcy-wy;h9v^HiGVqh&=adK>@HsEIesCF^E{l{<~1~)k?+^V2psGa4b3Q7ym(a5OkabcDB5HE^gf<@9&VM~nA z)odWJ(9$sjteemQ*2ryQAP)DjBwl8==GMRb#IQn8O928u13v%)01f~VTsu{ofK?&2 S0{{RqlMe(*2KNI10002!#oE09 delta 987 zcmV<110?+42;K-6P)h>@KL7#%4ge~1a8%>68hx|_001eG7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKb=L-Yg=GUC>MC7Mm+gdPFf%ySaOXsY;ma)re^LP$Vyp?1;(fqy~Z=`i>uV>;CqAgDHne z2~!Pm#(r(b=G_JWO*c=8CQ!j7l~p(|T_en=c=$Db2gZNtE7E8Wo<46&10JB-h^m}r zXXSDA%ew;h)wOl}m!D8mRnSus_0Vi{5U-T7=UoOxf2xF=cCSfh11psOL9sz-+%btY zop)08fz4V(YC7tO7C7#1$RM6P`w3R)mdJ1nb5r#UGdLgQktEL|J##N7t+i6X&-)bZ zNrXlhc)Ndj$5r0S3U#4>w=u)#{L|9I`hzR|JCNaIc!Ws^Gw1G+kEJM+iTAQ z`Z-1QLC$*kxu26Ovk^-rA`>)y&uPvrrY^ef$qE&sx}q#d9&0$cwR<1iU$*G(16Y6m zv6QGal=_`h?v+L@<1@vyqa`?6Zj#UR3^Ffp7rTE*x--FGc^&c>%Cp^ARY=liei?Xo z#K(VKunRhm0ihiPW=5L8g$ERW`XWEA)|g}c2`ZFA`8HmzjrDl&K`Jac7g=AyLIq)tc4x`8|eXyGU^GTMrL6@cB+r&p(wC&OvyS^u8ydgnC>ti zYH4s6OzkJYx(u{y69tuf|Nmm~Hvmve0Rle*KL7#%4ge~1a8%>68hx|_001eI5ClmE J_5%O_008s&(VqYS diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.0-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.0-compact.zip index 75023f81ac53180c5291f8fdcb82fd00d4c412f3..e4ba62b565924b1070d28599190f69149bf07f1c 100644 GIT binary patch delta 1202 zcmV;j1Wo&@3a1JiP)h>@KL7#%4ge%vJ5}#-+yad;E{{AGW)Y!Y)f13=mwA}X7(#t+|H$K=;Il6!5b0O@r-aWW&R zo))ce?FH?G#zYF$Pi-!#XLUncVBV{59(dAU68B;H&ecx75!n!(&Svvebv|!v$L?*e z7pq2`h@hoOHxZi{5wr;zcG$1kwk|}WSm)2!YW9EY5Wl;Rk#hs<;m?0r4xYpE0e$6L z$^o19hpTa!9_PhPfU+Py^Qi_NMRS}WPa4V^E{YDCMmkXrluqTf9jpR0KkaO$q_)t zY0NYC&OKV4kLwYyABlh5frfyKBv>GQTe2}DS@j3DP{u1X3))nB>&LthM-Yd1$sIAd zUke_xybd?5Bb`ave$bI`Fah;a)TE7SW9%=fEs)xEA@)dlpKD75U0eS^GCBenx_5Zq z{w{;&FOVBEIxEJD9>|-P;AhWAfS;u{1`I4zEW@vod=_-3iG4hd1fA-M{ggIYM*_Lh zT#8$3g5*{ax&MEEFVjdQA^U2(@0rN5zj%OFZ@4>fBC7)~WUX?^jFIBfsooTXd62*o z8PEG7MaMV;;+Z(je|HdM=Wm4!Ky!x(7RxU<$jiUJ)^_Z`T)_P5b&>p|uX8pg>vD+d zhR-)uA#ZIFv#U&sOA@u-v3B1KUlTd!(&7;^7_^Qie+7RT21R4_dJAqHBf93-`(HFn zXdsvDC)PCi^J|EO6Vfv2<`Er$`z>y^^gwbPM3#SsiDqR<=CkkOA_(&x0mB$t--NFH z6YZkG;+!`nHu!~Gx)N|H?PxP~fwDg0z7vDG#x5sgSc1)hG(OXHRoY2af3BQd7z-@= z!Uk1YRO^33SGz#lze6Tq&e72)d0?r0Gg?TTqwSyU>U=~HG5L5^f3p&`riG;-@_NVG zb0D!{0ZX6f`a5de7iA!18tr z5I@VEfK3%`Um#3s3VnKQYx{oxxDny@~ delta 1194 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 I1ONa40H7*AhyVZp delta 1194 zcmV;b1XcT@3Z)7cP)h>@KL7#%4gf53a8%qC3q*Sa007dF7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKe`|rjm(jG!aE_R(^oyF3+vAm}yxxtBGh@xey_J-yEIoa-{ z?z#Rk?VEp69}IsYbU585L!WY|w@4gN@v~&L?Q|fWK*Bu%DwL(c%?<8!D=Oop)+2J` z`EE6y7(&a2@^r#Xzi4>l0Uu+&#(!{CB1ORZsA}c!%u#Ips_>5-6ieo{@3Rb?i`$Qc z>?FHTL#q|qh+d1XzJiEc@~3@YpA?4!ommu)Drn^+w=>C8w zJ&Gq&!E(9>RU;6jXu$Pur^GTP^qh^9zzV5OmIwH*ky|AWt989MEZ45ZtOrw-pK!#0 z-=iB+%f^6f2-+kXeWuMDOeEeh%ECCJx)gy`@~(!ae3CkY17D?tK_hIT9a*c1(ul$V zOb1p};yHhks_UK+_Ik4xedP8G=}Ghya|$*`sS!Vu-X!~2z7w+J%*+~+{P#Z7?`zHwA#}tA@#*t}O4R-EJtrgp9n5qZzdXd5 znQ?O_`hV7%-IkrlRJ+-{j%Hn7fxL67-!}I)LRx>8>YWy9sNV=b=j-I32~d`|Aw^58 z*W8mdC2RJ6{I~N<^+Qq5irILDxB&1!A^adL)X(Uv6@$)*5*A%=^ZF$gI@_5xG+cn~ z1q2dJSq(YOfXyVKLB`6YzDPP7ZcTrt&JUNl9@KBR=Ay|4W$;lcr3)&J9=MQQNpH@R zD^P!MpC|yK*W_6$tGBrZ4zJnth>qp(b>e93zg_+H5XMQ^PTr*HlpP|Zhw7;);yos5 zc854MnzSw}kMqMBn)WgA)>bi7Q2xN!w$e=@MfrF837r71zdc*B5xO+JuZT)tva4xF zJE*8!iZBIbmcEERQ4^|aEVO6JtKLxGgu#CV>O4}n`>TIOm)&i?WwfT~SLa<|FBuBF z?Et==`zeNev2xxJER<)}q^5)s{TpUzq*`Fn0Q@ciY#nMlvs@Z&VZ?Jjr8JpBj^mqzt%Dk;XvFo_869&PhPTB)*wV<^jN#bZ~!T zcahl0#fZngkkMLm_f>>Z+eI6#bx z?rI&aIboHK5_WFNP~Qb%6B{iW2Qt?SoR%7g=xs?!K z%v%ZMoj0e+od5K6m@QCC0Rle*KL7#%4gf53a8%qC3q*Sa007bv001Na005KP1VRSA I1ONa40FVqr^#A|> diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.1-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.1-legacy.zip index 5b2633e0e06694d5bf2c6975de0bed089d987068..af5d001c3fce565fad428f88b724b280c5022aa3 100644 GIT binary patch delta 1149 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 OljH<3m;e delta 1202 zcmV;j1Wo&~3bP6qP)h>@KL7#%4gf84a8wp3Pi%<<008%q7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKe`|ZA1qnQ)K?wn=J2Z^JHe0AVgmapV;9@}m6f#zMxD+s^@ zTdw}Y^Q3S?aN~cvF49WsNxZCj#zL6Q5jQgp?XZ>L2J_i@6xu$IryP2hV;;yHJ#gWqvnSMg+T~Bl0tt4Yz^0BLIJ%S!eP?WhMCEn zn6^(y*L`rG4!8cVXU>X*+>a}+Q2mt<9~ZcWy*$ZZnBrqZVjuB2FdKt2ppKrNwcAuV z&9jR9@f*USg=cpn6%YqS0H%|gyBR3wu;XlW48yKcrKodJT)c~zA{O`|-z~YJT!Jnr z`jVm*055+*F^NFg{JH6t--^8~@vDB2c*tw?EY~0@M;&Udy9PkQ;C;iQwywbb7P(#9 z6=lhBQnzx**g5Zpf)A!Lnn@J&f$WLFQ@i0N zRx{z@TRIdIbPd4X7vp|~2HUtWTY)O?GQz;rA!C1OQ_TzPum~vPQdC05cBHBsB}aPx z5=E^LjI_S8X^s)&V#&>@;N3gElIr?9nH~+D6MQ+D#?(KW2R&pQC)ntNQJ%UzHIV^N zVH8T+VI>U)4B1bt?ZU1_)iwSDC?PXtjPN}fwIok--EvuYj@(8v>IkK=2sF_$SxAGv z21tJ>D7V;XCWLV+#6*L50`}^2qK!c5nf|GOb+lxK)G?r^Q^I|UxGX}B%67RVjDHF* zo8<|aR`6I`mA+&#{S)enNbK`V@M1KAZ01by%r;-Hf+))3IkpyY}wLVC(4aXtAHJYDW9*lXS1I@#TSh(~|6 zprF8am|LqG!s0`gMFg&401)E|Dd>OFDs^|&YLY)4P7DzJZT@WMOnp^09SCh$TOVI* z7u}8ZK^M~C13}-xEroJGo_}-5+eU<^wQR2qtK}H26u$6clX;sHhiCK1j#C~@&Rq;S z0yLeEsCSq=w|6U<2&tEH6VMPR;Mae%K9h^&zlo#Tw24$2Ucxo)KWUwAVOM5{wJrTh z`H&G}2#^e?v47FpmZ1d1dPqC2)=P{VKasov2c9x?k3!u6M1|0M9Qj+6QLTtTsxNtt z?K)x*jvAD;6#7El04g`}O6nl=G0@`w`tGZ!P)h*G7AOZ#Y>5N_ Q0QZyP1W5+V1ONa40KbApsQ>@~ diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.10-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.10-legacy.zip index ee2390a8631ed59e6d46a5202a80ee6c340ee46a..0841d565834f264c3014768164592d1e31a46168 100644 GIT binary patch delta 1195 zcmV;c1XTNw3XTdGP)h>@KL7#%4gfD)J5?b?6B1+u0009Lkr+;YAJ=oe7BTbcpx^-K z1=jV{4gy4dH3+yu{_QSdE7NbHu(usYsfSpzC* zFdYTU`iO7e>o9bCW4iN#UTLdoK!+I|=s7f3Sp z$=0cH0O+-FD3JKoG+|Wua~o!%?V9hW_!ouz6=M%I#R@rp+{oXej2W;4dv}d+xs^m1 zJNQp!I5%2fHr*2*6><6{O-lS3EV7H(nMYNfknN+|($J@onX(eNE2=fxPAT#j+O!s9 z)H~TQo?Sn7fgx5y&lY|>dt*{N<~5Ksah`zhE0y0-)X3~ZNbnlFqhE+u%TvR$Xq;6k z6V&jZVaPduw$cN0fuGhBE}E;}P5Y5NZu9!DfYJK^WCEBwSy9?`BS|Pvo$F+&DmMH$ zfyf)bG_f3}+hN)f%yDlXc1$?o0{2e-gEl=x2QoLMpDq;D%* z{MfXAJcYybG`~M@Lj+T?#riWn!98=!GF_yH8qmyK!OZDVBFN3i#3;$)_IoP}5usPC z{GdQQ&pi2rhr(sv9dl&?1Kt2l~VIQC8q0CEqGf&20U_877RKh zc=4feN-U0XDLZFk*XP_VOys}Dr=7UtpD@dQ^DCBs*-fuopinowiE%G#oA+$We>@-Qq zL8AnZ^j4GkrFoarg=mOB+0^+y8$^SDK04u(till83bL>YdS+O`BN*~n6!wlSD^y9O99Tcp?gHSd(_MyC31xF#$i_f1KF_vP)h*J0}=oLBme*a0000000000fB^si003=oWNBt;WpXW(-vlcL JrUU>0004}FGQt1= delta 1175 zcmV;I1Zew?3XlpLP)h>@KL7#%4gf84a8&5lytifq008?D001PD(F7-vLL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B> zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKe`|ZA1qnQ)K?wn=J2Z^JHe0AVgmapV;9^CJq z7?(S|Wq5$|q!BBYUn06gZ>@h%alh7Q(&hy`HV61}#BmVxI|wsq%?(A!gbz$pJQF}M zp$!Ri4)%)$-(;F%-OFy%k)Ec6W--5^?q2pbv$P{Ah@Fd-O4*gd>Cb$lFLN1-ML=y& z*nedT5AR;hn1Yp_x&yWeI@1OeN;tBQ1wwRdL`KweEu_1ni@)uL%2I!~x%}bj!-o~a z=;x%07mhOpDUE#)(;`XGWb(YpnkV!f`O}NAS6N85{*Q^CnIA(a%(_|=t~Zxkg?qDH z?uV5?c~SYjcQjfHo&;(uiF(*w!0AVfoe1qf2zxgk&tSG~vex_R^z1SgQ4N}0e@0Td zXz0q*;M2fLw1&jxvS5EWiq>is5hitdSx^l*9XP#`cEB_n7jF>7`oZ&I|4z>mIe4!4 zkQp`o(!l^=@k{r57fv}(*htsT5!~QFUY5X2TeB#eiF831{tr{U)_A?8ECDRr}A~f8z9J;gC)g0R3Sx;J+&8uWRu$R)P+u+&~d~=k-^{M=-$B_fz*%5x7N~34}b7KzZgu+1oAv z(ucuNpj7KM=g@mU~paPZqktiAC>eAw;FqhYcjw_&y`E$5gtb=7w_%&GG8%CMW=Pmf1kb|_gINt%&SPO2_& z!moI85x$d6poVF3QXTq5ieKe-jRRIL7LGrqge&2JY6`vAg8n> zz{(6LsI@@+%(Tqvq4rL3J*S>k+?a`LsUp2g6ghPh2;=NDg18`-2!Ixn9kruJEyHc6 z4Cn5o(*X7t_|HmXmneZaZlubK6BcUTO7qJBNPz>Q28E!$!uodNNSw>%>zLWL` z3uBlLJzam0OZT#)LpG}&mX-1PkhZZsE%E68lt>D((*FB#zlGN|4|F4}b^Us39Ev7i zHXur?*DJ>iKP0*;0yA}>+3Vgvu@V#}In?r~LQneB8h?c^ybn=et8Z3f?|N}z9~sD< z5Z9UR4c;Wi-$#q9i#my-Bf11BnVNCdO@uipCbVQ0X2_iZ{~dZ?#B8Z)N$DJ&B~iHU zp0#k&-I;(uJ*)zI>ZbTT9}brL?MJE;;`~a3l>m7SD@gjqi)#_C2|M`Ey ps!&S-0zU&k00ICG04;NHROr^cw`K$Y0Q(V>zywGJs0082003f%He~<+ diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.11-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.11-compact.zip index 97cb59479384802d67e3ede9de823379f2315c1a..d032f2b7a41fb70690aad8da29fb355d2a16c7c0 100644 GIT binary patch delta 1201 zcmV;i1Wx<43bG0pP)h>@KL7#%4gfG*J5@woyW5Ba0094y7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$DfU`Ef=Bkl@}`>u|rRIE|*vS*ttSwX%!3&FsAGhDj8Mk}G8 zg(ghnIC_R)XXbyQ;jX5^tc|#A+))48)|aO0{R4i^qXz~|4&mswZAn$#tiey;DPltl zN!Io;(+ab0ROO%L_yvo2)EP5Xvr2w^2pT+}jd5`)uBd$;@^xZY#qndKu0IxHA#{+Z zSo=cFC;~d~L(7^gB^qG4iY_VeHXPeAw7%d`5TJFyzf6BMG)#j?MA_8>FXNFtahz3r z+8U8?=R>$XwyU=#7IbDBfFC?@HCSX%se1p?IMNd|;!CkQYrT!r$!j&z{WU0b|o^6_ikHcpwyMeP$2o;mDPVz0Y;=dP3v!Tzr2yk@|@!HzGqeW}el;Yeu20~z5BqVxpbnx1`I_6Nk-X$+QX z9-kbc5GDLdZwJSZ`L8A#gMi4s2N+{qC4)MDXhActn?nV6fqdsye?Kl5jpAE7-hF?j z5_sVwo~E6DHl!1s4;KQ;Nwap7P4x=gs`HNU)GJV`coq1X_JxmlK_wG327@c4WB6i7 z6Ty)}BVi5kzTJ=UOcfsUw z2b)@6pn}Ea3E2;Rys6}?=wIvL3#EU3DKdy*0*ZsCvP|M<+TOW`Rr2$I5mY2&u3{`~ z)y~#Ox%8oVD~3w$@3b`GvZrqBzR6B9De~Ww%N!-7*~&|P#IO|S+GLzBH>1MdVOeGR z=%MJv5eYt2)GGl50e?n~U$B+vuJ8B!>)n-5O928u13v%)01f~!Tsu`nUAqR`hy(xt P|C8nfNe0RU00000wr5BF delta 1204 zcmV;l1WWs}3bhIsP)h>@KL7#%4gf84a8&7W5?qS}008%q7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKe`|ZPK62kS*-R?7bOp)aZ@3)+Y@hP+bF7O}bprc2s@v$Rz z{>R`K{>T(TP56J_NP8!VdT-JpLm!{Mx~LXbjx1z-Pu7C*R`Iu8Yt7~=YLx(sNeS(_ zgcE?6E`5a)VA3V^8zOPF;l$OT-8iWPTpYO-u1-H(e7i|Mil_s`4eS!N$}= zGd?nLYDwOsI)@G_sBizLg|vUo_`}{m(9GW!Zov>))Wi0} z@2)qRi_#;rN=)aMp_t;2DrjtQ2Eu`YNur$gIk5`|2$~mFTE9qkN0?Ts#cbDP4TnIRX<~PUF-JcRw?MMqV)3t zh{yPn#SKTiTlCBha-VLgWSiCltM|WTQoPnb?&p7%;lUEIyCv=-iZA;+`cJeq=@mo; z`7P$1Umw_;m7F(I+?sh{pI^u}NY&ogyDPA`0RH`3j@#4UR4cJ`NU?RnR`f`)JUH4X za~QQqlov zHvKs-RLArIjJ!*r%8zeiP(0@r6+6L)TRDGTy%>b|tcxBtKAvplUto*o;>xfuxwIHK zCFEeiwM1b;1*t`P_}3wlknZgkeYIC<7H!9?NP9Z#MH-N+K3y%Xl_!p^fL4A?d-&|l z9mFp&6yn(_S}3Tf#T?vb9H=04gsJ6yKB33U#M!Yb$_?a=kVi|aRiV&dV|G<67MOqY zHE)z)Rl~R>M}01Yae?W4$rKfh2)nb$22&Qd*OL=tba@bsgdgYn&2N!jCurd)4Uyu! z2PXcBz9F7_Tvr5;=;EPqxeDh&>W`CW*%Zc9%YN}cLVc-yGc(z^iTKD&+Q>bokf6!o z_WCa=sUA^nYCjn$1blj_tIvYpaRq<4nZ$&bhz0;Ks|VSw4K58Q?*~ zL+HZr+y_`{kFEV@KL7#%4gfG*J5_YKRF7o@0009Lkr+;YAJ=oe7BTbcpx^-K z1=jV{4gy4dH3+yu{_QS!&Mt9F~l zdDUIoOHuaHOOIH8%_I8ERIxm${}i^p z6gT!;oay&*Llwy`C-3r1Z_RZG63e+W;Um7nZwPIi{xkz_8KB7y0heC_sK@*|ed06D zW6`8|p8=<5P)?eU$r9!68W(3(lq{kx>Hkl^Z(KzGzRqiCdeqkN$u zU$to?pw~pXa_E5TEal^f)1yRJLO;92DRwwmx-Z9noACXHy7P+V2HnQQzW3bczaEgT zt69k9ktl^k*XIJ)dc*N-q!xIhEd)jUzq?$U(xelnc`-P?&Aa#js4jReLFgAS zqvL72+#%ab%neYTJMUh710YUEK2~*^&zeop-e2!i6bq@BjUq;G*R^tZ@{pL`&MT$R zbcaLmwIg{}paYC%zkn2K?q6%=k+g<$3K=SYd+rrhT7Tu9HFK+^;oVc<>}C9OWF{N-PSOnC)pPKi6=-B)-$p&rp^8vmnmZqu zrazB8ZSiaTKrkoppJnDx;;t?{l=$W(q-!A2j97M&LxG2kdiZza|BlD~gx=TKx9J4>u>7#bfvW`?-sPNWr|E9*p(`*E z&Kh%en*(=qFZS1;eg%IS_1xKc+AU+=eb}9Lh{HvI5ZQntNMRQ+$A{T98nA#{jE5Ak z9M0#cDld911-ZR;SK-0BEO6Vd9rEOVvaEQwzaVw+dMERw1Vlec=#W4$IqSPq$hc24 z)`kxfMs2f>ilK5Uo0MZp*hx1va)th6t(MPNxebL2i)%QvPT!l<|MdUr6;Mk70zU&k z00ICG05DuTRdl&jk7Wb^00R;L03-ka00000000000Du7i0001OZ)9m^X=QSg-~=oN Jrvv~10031^JxBlm delta 1170 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 R0094!=LAUx%me@c006BTNpk=I delta 1205 zcmV;m1WNm~3bqOtP)h>@KL7#%4gf84a8!fc`5=r0008%q7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKe`|Zq&3ZHHExXEj?Xnp3_+7vr=JIOgDjrI~Wke~Ey>x~Ss ze%xW?ze=pK0uFx@+-g%6IFn%?cft`r!MW3<&y?%N{3<9Jy1DM`6AO$z={sEB05zk( zOPZIG#y(d*6Q*UB$@!Zg((I8lugf$A%Bt&_VCf!Ob$Ov^AQ!(@v!C|LXe(;agZ`Gy zRj^owJZ0{;GI!bnf3V=~g17;UQDW-e8}mrF_LTYwxQu@_Ka7Pss>!HVA<#T|UO}=) z8k9jQEV6!CV4)KEE?e!2v%ZHxGW9R^d#%U;vFKtxuhyzr*`8J#@cg>Fdhszkz7I-C z$>yvKw^#;Bk^)btRAp==w_=&9?A-RIc751J5UWQ!?!_)i@^EaK`_0)bY5~M=DzXyH zK14POAK`ycRb%idd0d{E2SpC6qERJczwMRHmiKsZ>+<($c+&G2>?}gF&*RpVeDHV$ z50Rg3$p6vP&V-)5m+&@Y+duS)aE_^B;-gifT{$1UKLdYQ zO`hrV)|vc+)|n-^eVf3;9+`+vpof)UD(^NiwApsVXK2c^WGZmi_EuRu^>M`A2>dv{ zij0*7^iWXo3YiL|armakEUgcuLHI$AkJrzv5K>E)_XdUW^W(Y7JI~Bxb{G_$_HQw+v;?9?@QnU;v4`j{|?4Hf*Sd9%}QZ}dq!@b#Ig3RUd$=}7RmNvEP!6# zYISkxK@z$E;7j-U<&r3niAPS<% zXxmOpg{NBn9pY>JawC2EbX3_+l4#1Xuc#SBv(2;srDf)!v%8CWA|BJ|E_#d0SqRl* z7_Vj#HQLCL-BdsVWMLh!TTIt7Vh7a`NJd&^R^^0Sn<4f&@5?_hJ;S4Sm;E$i diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.13-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.13-legacy.zip index e3bbd21f125f61f2a9862869ba591aad901ef421..9d238eedd8573d7406914b8dab1e476ba1f9cea3 100644 GIT binary patch delta 1195 zcmV;c1XTNz3XlpIP)h>@KL7#%4gfM-J5@>{U~Fat0009Lkr+;YAJ=oe7BTbcpx^-K z1=jV{4gy4dH3+yu{_QSkFp{NTS4CRPa%d zP;e@81l>@Gsw7C7xmxLQ;PDEUQg6em*Dmz7VyDVR6hQxf^U{Ua24PdRAYc{A8R*mC zS@@xAV4 zp|$fpu=c)wbc=Ohj(`rb@)vc^ah^DXCqgznF#V5F3tYo#C3drkeXIF4^<+QrwiH4_ zC^0b%8u7h<5e8|xI^R91ew6E@vYW<*UU>aq;6A>e*V=8fB~c%9Dp8rcH7+ZyhUi4F z#VvQ9MWpo%lt%w|dNzXD&9xo3Bl_h+M!Er^EL`tv177wf$g3BDzte2evZ0b_GB|KpzqTJz$t>&A5o}EmCh1zKIS#AKD=;*Lv_cc>-1ZBJ73Gc_)y@J9{{CNJA&%Gk9-q3qFD}Ps& zax6A~X^4wzpE7NC%~7_rr5@I~ssIgLwpaSw_l(NcqF0TGcqccFsbE);E!Pjm`jK-= z;s(37dCC1V8T2Eh$_l)K#Wwd!_0rLK445G!H~Pkd{`h&x&Ueh(XiZ+pRn)-%f!qe% zRPYiql&h@H4IZtjBX`6b%ELUp_XU!`7pCYKaRU3yx zd6y_@K$)-OyW@ysuPk{l8<^W>b-r<$_GxjR3IZazK~>^oS_{U^H!0cvIf@5cW%i{j z^mm07uzt$BdACDfZorgPE65O<`dEm64TYGnT@WfkfJ`0j_Q(Xcn_{U~Fat0009L001Na0000000000004ji00000ZEs|0W@%-U-~=rO Js0082000PwIa~k$ delta 1195 zcmV;c1XTNw3X=*LP)h>@KL7#%4gf84a8yJEyV_|4008?Dkr+;YC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6Qs)rE1H3 z`6&9W^bfFR`H8oGj#d5OByiu3&`B?fP zU2mWb0RNGfb=Pa5dSz+(mg@L3w#?F(IXwg`a*5Gjw`+WVrBk9G(l`9;qi^9aCE1Bu zDgi=u2eeY1=W80G@+Ftg_q(#O2pvN5&5LgZF^lKgJ{qZKT3FjFrR@JlCZEjnAkj4J zanJFe+9=Xmi86{a|AoH#9WPew(Ov{0@#Mf5ysrh%Cko#jhcp}N-%TP{wNUUG9O0Ll z@(bpu$qjFRus&k%YY#+Eybb<_NAV%`2N}Bylo!L|gbj7&@Hkkh^#LO_&p6@D1%_xW zs&F_iABu!$GgOnFsO6G*fRNPkQ0HanfvZobD8{Et?<3(6aD~KM5AopGmwrZqdr4eD zIzdIDqe(obS;x~qgtk`dfB6!!IH>&!fo=0_DJ@KYh)gqn@ZQ8kUjSgFO z{QNbKLZw~F;NpO8=Ys{CJDy^kD<Q!NbI;mGX(F;CWYsbuN~>lu)) zta83q!&?qrxk&(TJ^d9kftvExqUai-$~&w@&7%yM#f$o9Vo5 zs_6Z~r#kSNd7@W$+GeR#`^w#hiv4|g*-+MhNL21IYN$>S?vj`ZsvbwN<{^Pvj=fW2S^7mm2h4qctNfo)YF;|M@c3>rhJp z0zU&k00ICG04;NHR73^4+Gzv;0Q(UD03-ka00000000000Du7i0001OZ)9nc+5|8L Js{{Z5007FdJ|_SG diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.14-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.14-compact.zip index 10bbc7d75e991aa9d789f61bc0c23c409412bf39..ce2f2fee06cc106a1c533226952e4ece032631b7 100644 GIT binary patch delta 1202 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 JsssQ4008MKJe&Xk diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.15-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.15-compact.zip index 263785eb56a60b6c5dc7d2e0b9a8385dff79dd98..1cdc76aa58a927be8131601cbd8ba256bb730f5b 100644 GIT binary patch delta 1203 zcmV;k1Wfz23bYCrP)h>@KL7#%4gfSE0094y7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$DfU`EluxtDH?C^f$v-=+M7Pzpo3U1m3#`juGfbQb~Ff`Wu} zv*$wqH#9WbE1rK14*NfPMI!cwgqkG8PV*6ZAjVbuL)xH{z&GB7Co)@!rl$Yz?*_Z^ zP-p}3Q3fC*Z(Xavb&K=x-qc_A3E+yfcPJhc=SO;#Q>LeZo1sQrkyde3*VP29G1fCt zNMo%UYU=uJ9AWu7V=t#G8xp!FzxQBOI8vPX#O>@{ac6(g(iSzAp;-;=b6;M~_O}W} z;<()E$9Zb)O@FNnP$)Vi?-eK|LjkkUxWugU=GOjw@6vRj-G0C0n5`vvW*~DGfWUnl zI3x?Aj7gESI4xTM0+%7FH@fmu&~e$;q`2iMOfF~P`-1_##V$i#J8&8zXMz6;3)v+< zOc2}+R6c*~RG&r@T%V`=bki>}F+^574-9@gntj4S6-|Y2(vcfK23rx`W>%if=}R#Q zaUvPze37F3un!pLDZNCiZ9Vn?|B*{MY`NA8xC9!&HJykI3{wc1@6IcS(*M$c8?BX^ zOQuxX)JufN*zE;i(*pz=h!^pJD3!}bHA?31>WqKu3ko{}LBLDPz${0t+~?J#BfefU z@r4DEcGYANgYb?p@2?(qvuNWkhde~JCkmX(9|>Ro$8jE;km zVWo_9qMwz1<4{rc4Q2o6sOx96a<6qNpgG+8O*H9Aqo&Dj5(A^_A>Ey)M%-3BVOxQE zmr#Ex47WxB=IA^YFnpcmo6Ns16)-)Ui~>=@0{0UncWSY!_2gKC{+?+s7#_z*GU2Mz zwYJ)jY7$=lwrzL^0cSTz6=cz?l_^>P!{eO^-;zRZBZ#j!zqts87jfAFCYvvT?SY zz>cthih5xLzmSxo-{Lu71DqFg;-2G<*Nc&O+*+>tUNv{kb7h0&^*Prlg7J)IMc-`?9y zv(nh1GRj9d^O^`^nezGM>gY+UH`G&5BO|M%CjNg5`;BD`b`yNDLkIWnK;0wx{~d{RwBtnX@6L)g zBGrx8&=k{jLMnHJ$O#;7bldp~xB?omSiG3Sh30BE#)P|=gtE6XKFAqS(XR&|lv^e} zRdAqVspaf+^omd}q_vAL0mcMIsLbm3|22Zo08mQ-0zU&k00ICG05n`XRpbbQRey>E R0094!<^)Lw%me@c008ZbM3evk delta 1204 zcmV;l1WWt03bhIsP)h>@KL7#%4gfB5a8zaqMzV_p008%q7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKe`|Z`NP>0SVKX7)$JW}4g-K(^eg^Sx>P^cHeQod5isPvGl z_Fu7b9TOUw0L_2W4+ZzK3j}lYyyoPDRDP#K#9qtsrkKp4l+7a`i?z!?pdQEWqO7w~ z$TJz#%ruVRa*xXNu}js7Lrph%t0!H93U^)K15rO{%{WX+@f*2uJ<35MHDA};@v!YV z*7)?aA^2~FmD$b*h;#G|%4jI^Ay5vn+Bx^+;OiABb8mkSV1@jQIq23N7fl+LU1lU-Z3N2_9kq~@ai zIceYdLxk|y{6Dt8?36U7o~i`$_R7H3dj|Z$UBOi75(P|J$a;QBL-ZO zL&7l52%~>MNaelsX}YV z4!DV$nwfnhhKJe??UY9G(cAl1I08Q`Z$+NP7tw#)`ilK16dt#Y=al0C42c|%YswT$ z^v%&|tTDFpTy}pQ$XlXSc+X-AN&mhRpegeX(9R}`v*d8vb zlb(Of1Hjg%%h#3fsTR(qfz||ma~%FoZsn_;kVnq^$L^FQnV-Qf zNg7-Oq6#m3KRvmMj{{)XcWnVqU>aw-=+RH2avPa`O;l#E)IhzxULC}zh|2))sGF`b z%hl;I-Ln5fiBxCj$|`xG4NW2JIr==sf^UD9?m;&0V|DlnPCczkCixW#;deSiMy*G~ z%%+)#mf}BpYcgIIZaDVvdX4tpA^L`92)rsNHVYuJBx~k9Puov{22NoWg~x}DOa5H_ zLxGG`OW6=oXhI@wrV31K&Wq+Z^xmv6#I`onJQOnfJg`>H$dh`aVZl{{2dn+{j@f_C zinsqmhudO&zN@%1!l`=KXu=e=K4i~?@r2mrfC1SCLYPJCr@*Zl;c?k5M7WYS=80hm z!V#E{tIlTf6(G%i>ErAB0Nvm z?vYuK-T#`Ln9*aBwkrEjZvh}TV!3mLimU-A&(77?r>l%Ab{5^?FS6wLexlB#X$0}H zG8oTBgHz_V{_{vd>0&t$M|&qPdFd4lP5=62oi$KP0Rle*KL7#%4gfB5a8wCq2}ZJu S1ONc{ljQ_S2F(Nj00016=1yb) diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.15-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.15-legacy.zip index 27f726f89cac89cb3cbb043169a46511c94772de..1bb72e452d40a45e550537f1d06a83e3b52301f8 100644 GIT binary patch delta 1195 zcmV;c1XTNz3XuvJP)h>@KL7#%4gfSM8WCxM%5Xo_upZy6M(JwsaSG z@W0`sXemK8eB{90gQQw10)#%umj1335G`V{y#!^7+jZ7|0beeEz&T&}xF$}4I|3|c zSWxzJR(bc0tO%c=b|vKxnSr*3mC`S!o!;bgN8x=ya(| z|1q?!HO)0_ejAy9ZQ8;rdxiV8dH_UZrn^vt5|xi?7Qz@kO5A58e3>EK{tm-cCwExL z@f(r;BgmY8i|ixIlt=tLPVfozg3+zFye3QR>C&$7a>mjniUT%M1+MddVulnCujDrf z{~D`+)*8aU&*wrpn{WfIU8Hkg-5bISGQC8NGoaWT$FbIAClCL$?X>4i;{fJ>~ z=Ex4p*%I8XWsa71w44rxLnNsoJuu|Z@XDv6ADwi6mn#BJ$~yQ!l{#igxxcP}Po~;r zZ5t2_Jjw7|{a2UOe%r*t3sKe#B@{|AjxKEQfK~4~;+ANBBoe2Ke>(0ds7gy%l$1SR zb28UHhVB`ZkvP-W^o;JwL6wC!O3k_DU1<$h=hn6TGJ4@kUGKCpPgo#Ty01S$ewvx~ zp|CiAsO1*Tpo>v z7DN33sLO)Z2t&8X{SY6d$eUntS69Z`og$Bam`-8~- z31!1Y@6hZF{Td)&&QZ$UY9n4hHrp8L>K>{2{fNgLO^-O{!I)LFGR#K%K}x(ERx zQoO&#-@9aL(7Pe{i* zV6Ugc=gNNX^&uVB-#7t(8-#3*W>ofcYGJq_A7DN{GjQ&N?OkFBE!qF#+XtvnO928u z13v%)01f~&Tsu`+^g+{S1ONa75&!@s00000000000001h0RR910Bvt%X=Z7Y-vllO JsRRH3003gXInMw9 delta 1195 zcmV;c1XTNx3X=*LP)h>@KL7#%4gfB5a8%QsW(#Qq008?Dkr+;YC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj6-y zwRroAays3Ws#BhS1h&7e)Ia5gJ5M+h1HMOpbKuv|m|-CxcYj$<$U(*yG8NWKBf{TI zB)`nU+D6Mwks4O@9+{$Y$$C3MuOl7J5jzD3gK7n?W;X3+D)jcmyzmq#xw!8KDiip> z4=E^I?c@c(;;@|76SjNK8?2s}%}T7RDu%Rob({MfRJF-}u6b1RQqTPRT?n*m{_zrY zy4)j3qpu+7P{TzP`3@wWLWiUKD^^iiT_>%=eq$-N&qIGLU?DXGeWcZ+q=3Dy>Qbj=Wu2%;iUX&*RsAtc>iGE}lRb ziW}JCZ&K^1oMIu?t~`L?h+Q!x5dZ|176xbH~x*E<{GShM4qqq zzrWqeE4f&Rf0hp&u$dv$?Do#snm4Ys5;=+K#$8RhSl5T)X*axdyL9la{&OlRZ+s`Q z6Sy#cXH!nJTD4n7D2zVea6oZDLRhx4OgdrC!lBKgYwvt7bH^?EehOZ$3cCXo1OlDUuc@Lv& z$(&9JT3hMooXn*bhPwJ}bBs4bF&u9`S&&zM#QduE!+D>G+N^j;ih0NT;nDfXX`q!h z+`Rm2kRKbJj*@i}olP*^r_NBOmG2B|LV{qj!qmDGstvtj#^@XwH#)56D(=)0AF*EW zG6QsuX+q#AP2eC5Q*&vEP&80lM+`DeBl=YWh@*S5MEhvjNQ&a;Nw22I*(tlD?6Et4 zR2!7$bw-3S3dfXerkI5Xx``x_ReNNm*XJlO!Y_*Y;fo6w2d98Td$$aOr`G5s$ATry z^Q#A&X$r$C28V z0zU&k00ICG04{TIRMVYi3uy!Z0Q(UD03-ka00000000000Du7i0001OZ)9nc+XOHM Js{{Z500438M+E=? diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.16-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.16-compact.zip index 9dba82dfea5d7569adfcfc0b46d8f3d873516538..d1b0b62b739395592d3e7dbff746dfcc3d5156d3 100644 GIT binary patch delta 1199 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 JrUU>0004X^9LoRz delta 1175 zcmV;I1Zew?3XlpLP)h>@KL7#%4gfB5a8%eOw%=w1008?D001PD(F7-vLL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B> zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKe`|a8)Mc>C7L|5~5lndBx0K!3&M)TNAF?8^d zlq|Kk&P{eBb#0&SUAlBWoMC@)m%=PAJ7Pb;vay`$tKc|Yp2w~j?SSmo04aA(YFT0a zo%hQkg9X^ZD36oEQoNKN z1!}n@p_0Lch%#?tq|!3jtXKazk^@;F6?_Pb>l#h4={#WyRO)p7eO-T5h^GP7i%Wa4 z-*%_CX%%W3nTjiYeR~)xBTiw5%B1rB_q!%6hea-(kdOtntKzm88b@C*Gc{$fW#1v; z4_lb^PS5DwOWQwx6jvJzvv-K-;@ z!t610_UovHWcjBa7Bzps+Y!B_B*8OWy9L46EvN-~>|5EMOa%%>=h}a(=_wKgR&A(!1;4wV z(1V%EElJlUyilCC5LpBVwhO!Ban)nbIo_@J2{xU4y{zSAos%a=FjIkhiEg>l2Z5d^ zcyX!w71k_8XP(@Z_OeIRu5?`21|X}@Vhl7 z$UzjL*OwjR>uiq79VUW+BDkIX+XX?rHN89djT#W!j#L?QL0FPm#3NdTBQfDR0PW~L zaC81i#H@eHWE#O9tH~W1Y;FfH$$1GGKToh)yRemJV!=FT3oulo^sb)S`l$7^cB@$2 zWk>)R#)56&{?A-jxGS@C>VS=JgTeNH?cM_6c){SFy4D#Y1tJ9j?%7!d2L6_d#SXDH zY$5pqPtm0HdLvb2gI|zkV5M?3gDBE=8Si9Yh?HdK`s<{GDzZ6BE$L|~h)$9p?`eVT zcXkYa2rEXK&03c+uZuxaZbxrL90Y)Dq$Z>?@`?62&6a&A_*DMoUi%T5;gU8B|J1He pbWlqH0zU&k00ICG04{TIRM;i9-(~~=0Q(V>zywGJs0082007eYCkg-n diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.17-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.17-compact.zip index ef73090bc22fd08d00eebbe2f74a89674ca16a38..ff7a96a213831dd1282ade4972854d3ec04d958d 100644 GIT binary patch delta 1202 zcmV;j1Wo(43bP6qP)h>@KL7#%4gfV=J5?g-#jc420094y7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$DfU`EodkjZC%Rc&luxH$Yx8-D}ueDj530D{r6g;Q*Q*-U&| zJ$=X55PDe@9uj{fy!cSS!?5y6L&b~cVhq~zgLNS>X^H!b808;tKa+qP=_3g55r#kE zX7WYkTN@qT@<^Lw)tMAt$%b5-+@3UzFE6OuC9e!njp11v?So3crQ_ccXY%AF4wQSg z-wQJ3S9y0ZX~D3;zgKmPW8#v`6#RQ*|FBjLpfYyiCb@rkJRjpyv6Jv+a~BS~+)GQ= z!?^4!fnosh_-E9A5Roo(@Qx5!N-Bzwok`&WC@n4F-oEhuoR*7y5*ojXGB~pa zHJ0Ud%nyG8-1+dTl%;9oq%t5``JEE7vv{+_0G)ge)Zb(H43avaGE1wBeEsIe(<-R2 z(HdP%dHJi=40t4*uv__Y1IGmjPXp0dz<3MgCu{{ZMrtdh|ej|!aIe7d5FFfBnbtF z2r{Ot8lq#7Q++3A)^bd@;%6782R4>M^qT1I+i(F>>~42r+MJKx6|>5~)>@&$y7*>g<#74qTS-@6eH-a#v{M^W$e%dkd z1yO%uhKF)`%Y*6)R!AI<12ALw)!ADe`oI<6==1_(6ki<7;VaQ&Wwm z=v#T{aX{I=beEbw;Qi2uBsMW0aX=S>fJjhtaRVg>P+nRtn=(_6_#Snni(=HwPWBeH zL~^trm&ECYJrirW)=|_OcXFRsx^?VcJNzYxH)+h$EY$DOdidn3WjImY@1B4B z5HKLNF{Y(`RuyaquzQYU@v5YO`h(5p{))#Yq;3yr@^Kv3eT=ZGkly z2@78Flem4q2P#mFsj%dbh&xF*WR$#`td$_icY^WImp@J-;JnwM_!Ix#rLM(_vC?e$nIJC`)BF~SzUgbmpuN4dvT$}%vJ`+^}I z8uecDtqhj}OL(}~UwL|l35lMNw2W3dne0W_cFC;OJyisbk(&NNC$tmyATKL!xe5m3 z8s6Re+gz{Q5m%d|KFG^EfHz~E@BeD2{+`iPP)h*@KL7#%4gfB5a8%K^GFOZQ008%q7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKe`|aL<{|ERnR+OITYH6I zQk&SyNN~MB41<5uk%QW5)u~7saRlBg3gaAX{*nvUX`;N5j1AO1V|&lBaCV0@tFvDUXwKkBK(sG{7_D))4`ry z{j()J+%7Ygk#2Q^;1goO8M1bA5EuD-a@ivFxP*T!G*GmH!*=Ch!?Y_}^7$tl!?j!Q zsmG-`Y^1a8N_5Moq)6Wm0?QZ-dOV&jqwoY4#0i--8J3 z60m<}{Nzj7eLG;`k!?WmNywOxWCs^%I&LmZwt|f8OkuNwX()vQd${|?a8!4aCSn?} zwuCBPLTZ_jiZ|cVe>BmnWcOE#yrv;w027*3B}1DK!%3HJt8P{ag;G+VUKbD07p32J zlP8(crj+)^lQ*v<=NE?X6*Vf@uV$SUxk-N@ho|?`)oH~-UWZi|`Y~PRKPQpxE`van zEd1Kty9{r<*dkp-PpR1{Y=Ot3lnYwr`NB2nt7Ux<9K|bTLtM)oy~lCh4c>av-2t-k zf36CTtYi-56^tCR2jkaA!aD_CbNzGr4es^c;d#1vF1plPKo&Acl)bE#{-XvE9)^D* z28=nc5}R>g)M>>M8Kg;h4cyplR7E{$!rf-xe>w)ZokX zsUl^xp5Ri&z>eu6+kZb^mhDGzPw0OXK2UFZ=o_MZ<$e^aPVD)>#2-j6HLtw)qaF}f zS7ty_pJ Tj06Ax_mkuVNe0dY00000KXyY` diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.17-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.17-legacy.zip index 1c741923ac7ae1520c6b671a1d903897866712d3..5ac31105d8e4df4d742187e428dcadbc30ccb3e5 100644 GIT binary patch delta 1195 zcmV;c1XTN!3XuvJP)h>@KL7#%4gfY>J5~AB6q9EJ0009Lkr+;YAJ=oe7BTbcpx^-K z1=jV{4gy4dH3+yu{_QSiWQqD&$J78 zkCRRvFOB3$6}{FLb`m<(AMr3{5NX8ZP?9opa1vx`hha2-=VD73{m;lGZ!__roGT%# zXO8Utu+_cycIsjl1fRJ-K`!Qz#SJtG5d$cmGNm#9{?}zbLV}=_?d{zLr+v?%2w@RB zMxyO_nio1xq<(-3zfPhHLKsY^9uho=5=|k$Y08fRD>Hrk$)qVAqQWZMW>jr%1!9vZZGArhPu(`P`1_*D(TCvG4` zfw@LxobfubOzi`-CY>1AUn!LG7evVwfWTf}RjvVlkI+a)pTnsV)5U2>&+1QuJMw)% zf885!&p2Bj5singx5@6^h@-R~ME}$OJ+;Mv9(X*f{ib=pk7`Vss=Im|AsoL%sIBsX zOgdI~;OeDL&Ae$chavH6aM&1URAXAmp`&xCFGdY`iG6#a;v4=^gDXxdjluU>!dTj#B=_0vx|43fAr3@D6(p81+WX>tpO%wPp*QxEjurL-C!IDj>utI(T*;khWC*klx%FuiPf(^{gw_Gx`Zo3OGovFEW_;ag0 z;j%D$2cF7YB)_JjoFRjRGws$corTevy)IaPH&c%xW5Sb|Aq#XGpAFvLZVAobyzTx> zxsZ@BsMZ@_0VwxJ`R}Z^ear#@>TSbE4D>@=T_c=lNA9rzecTXr*krrXUn=avO{Cm%4Pn)};o zNF=*Y#hyZ0%EwvUD4ghd`6j_wI`{SDy|M25%^d7Xm^xH=zDO928u z13v%)01f~)Tsu|y)fAIw1ONa75&!@s00000000000001h0RR910Bvt%X=Z7Y-~=uP JsRRH3004(hB@qAs delta 1195 zcmV;c1XTNx3X}>MP)h>@KL7#%4gfB5a8z~W9A;_+008?Dkr+;YC$9^;HL>Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj68s#4U7p9T80~=U)&MDYO=?+T{+;*BB7+6k z=dpiBUa4a>(n26A)ysW8WicWL3Pt-n$MA)er=gWU-CPZmCMb`S!cx4H9tCQ-B%zYQ zg@`h5Vx-bC*sNFoIg$feAQgNFi|ZOqu<1Nu3RLQJ{e4}3Rfwkn)r(7evEO#5xM>w? z8kveKeSLcvDkDx|hsvb#{r9^jEQdudosf_PwX5Q`7#c@kFEce|uw~yN;SXDw^-j;| z-Amg)e-u|67$?{TbxX5xu1#US<+ff-&(AEelHPM9($A>SR$1g9hTW_qpTg`hboT40 zg<&oW^LaUcf{?Gr$>LMzTO$kL>~*TNGfA}-rYbj}km^)On+8?1dC1~d?8qR_A5_5- zH-G*s!gomDth?~Kn@+_K_C=Oy&w$y0+OMo>5?R(U># z$nv#23u7ekML!B1Y%CF;2aTh+5b`fHMvvr=N9WpqtLZ5c1y*gSd|cM}JCZUaFiAUSk8t=??dw_b{HPOm0gwklxE|9l0@izoutG3D z6cPe|k2eN{epD0tONwz?JQ#D( z*69gPdL^wUX;8lMben#TfZv{mO1lU#NL?u}a#qnhWtfej@T|adse!=E z#pVNRu7S?GeP+a%ghlxawo>9q`qP1aw}bS5D})Zm$PQO|#twwe0zQG_BxXjY@D2xU zHcudm=RJJ*@;7K-$9(NFh!_Ro5|#RQRe4weSR4)bd)Ii>6nba=*^GZfeIEMpL^UaL zSc-o-xMs7=UWrkZ<(W-{6&E(Cd9BD~7xQ~%VX>{hxGcxf83$)h)>1Xo*^7DP|KPKK z9s|~A${?e2C?dGY8-ja*?SpI1j4H>$(&HEc(t9&tlJv z{haooKtHPcK5?epff=+^d2ml8Oo@FKrarJ=!lwDvSZ;8Tmc;TiBKE-EmBQ_X5Q(q# z*51xxqk5&}GRs4IYi+P~$$M#rPME%bD4EB2Bgwet2J(u*=mS}fEKY4n# zjWk>!gszj5H(+it`Q>6IIxQtnfwi#vyHg6vE*>_w`ii~OG(b(awxB5Z$NyfRl>ksn z0Rle*KL7#%4gfB5a8z~W9A;_+008?D001Na0000000000004ji00000ZEs|g+5|BM JtONi6006JjG`9c% diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.2-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.2-compact.zip index 74816482ed3da0056105d871f453067c878e0548..f7ab71d36d942ba8381b7f2639bb63c94d7906c3 100644 GIT binary patch delta 1202 zcmV;j1Wo&@3a1JiP)h>@KL7#%4ge=yJ5^*bGCq9-007z%001PD?F1*0LL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$DfU`K1b>INDhdOS^YJDt5O74f~W7w@WEcZ!4R z-cK3-FAfOKd9+ho27(h9W$u5bU(@_a#WWU;mjA6tB=XkGC>#2x=cv-(W`$8970t&w z$w8X7R_B6&_CWk;LByY&YK677L<;SWa@vZkR;pU8AtWhr+TkrYV}E>5AM_EDW}`(# z(@!zk9zIbRRA0w5LJ5B|-wp4Y? zxe02vGfNFBnXr0z#vfg>tJ!j8!m^WYU!9(meG|?(TU?7re4}$YRL}lE>E0A19(_jD zenNZBL42^V)?o(KIWH*cDyf7U z3Et%V7IKlmZlRtpSYtD_^K0CDH>gen4j4w@Tbn%(&KO7BmJHX2Te>)a@DlWK>*Dl& z@p~9|!V1arz@5g7m(&6nVtjng#HQq~qqFv`w|UN3l+563rr&>C$9)RTxOgC={Ba9; z`l>N%5=u0O(A{+KULY)@N{p_zJcU=?+p`k5^qCyA>*ZfR%j^oS?;`|VyRo11YBSq< zZxc)Yu1PcwtVASvuizP`R%ry@014Anq95mZEn@BJ0_GOeZ&eb7PkHsW@dK!y-Ut2N zpt6ht;gpd3tURn0d<`>AJE^%)w;kJ<6 z(%gjMfj6UN0WdE@y}0KmyO%_ofBzDUeTY9U{z#|u<3~Q3!?I0bsif>a7^fNHnV%cB z++|X{;lzJg6rogm-22O@c0q7sD9xIBw|4<@Z17krz@`4+XpKajw3)DVL2Ohyu;CQ| ztYO!dS-{#mVU8CqR#6Z+*uQ%3VZIJ02Dy1KM&u4PEO?(EKQ*XnJ?VdlWU}j-AU~RFv57ABEO%>z7I>OvDTV4TweH+?OK#nFpN}ezR4|o zmlvCVVV&vM{v@#MVUqF(coj1L`wu#7P)h*i_@% delta 1194 zcmV;b1XcT|3aSbhP)h>@KL7#%4gf53a8zTgiS~d5007dF7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKe`}3>_cPD*N*)$BybAI#w4NY}J#3v3M++R&yO>XPUl}ZU0 zX(9wBGN*FCb4-6aR=qA)<5La(#ASF~A-TSeX=MZE2ZT)ehB(Hnf@}&4GGhxnLgA6O zvQm)-K9s*Kz*$_SryDHPDDq>CUrOW<>RiDnQ5x=t8oJP^u6glvO^s~jAbd5a&4Th) zD82U%-_!YZ4Hsv(zt%R6-|u7E#k}JKE||=zGm!cMBb|SA?dbZWAUjr!KnNw&O4x;^ zAjq7s0=O5g%+;zGr$Qt+5|qb-=0R++oYG;{&~fxP2%{@&mUl&K#J_!5o8Ih?3g_D) zf#DtB>F*eaT9dZ1Z-e>;9xH z$!r^02uy!n7ki6AGLoZG-P zG`=neYpLL+tLcsXPR}&k(P8J(-6=6h=pT)A0N_aY5Hxm*ZQ%8H1~ehJLspn9bL7l0*J2Mr5(YTzU5oYDj2*r8)F#SP1|-|EG|fGsB4pUudT_)WooxS9f`P?mplRNw$l_OCWBWd@fF;UuJ*WqN{iEpH;0 zDI*Lyb;phmvZJArjP5}e0*FIOXZtvv6n#7wCKV+vFX*00@(;MifI7&dbIK4r!5b(v z{t+GtC?cV$=ZYJPQcEcw$yrEA3|kYd<}&5R$;jTnN{J56lvTBi2oEZ7%=> znNy!##y9qZ+C41Gd@TcLKuZT%a}~Uj*mYWj8v+DDANBx%GOOw3rMw)D z0MB)gvNSKlhfnSKjJIk2!|l^hO928u13v%)01f~wb8u8+tcmu31ONci5df3g1V;wK I1ONa40Ki#4RsaA1 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.2-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.2-legacy.zip index 05bd06b7c277f12a6f05361eb6052d244f5b850e..edd73a4f2be3c424e8b2fbbb18054a9be5cdcdf6 100644 GIT binary patch delta 1154 zcmV-|1bzF53WN$5P)h>@KL7#%4ge=yJ5~STjJ8??007>R7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$DfU`K1b>INDhdOS^YJDt5O74f~W7w@WEcZ;M2O_i}p+e;XC z(RB)Ke08GXtI2;78aPBHKb+`UI3|*}RCRql%Kblm3XxJo$l3VhBGe0ze3?o7-SlNf z!qL*KshWt6kJ-jbhD=R+1z51_Mi)FVeGq$x;lsL!Ie0e@jbYB)Ciqn5-&}*Q446>X z%#{9{X6~CB9_VNE1W3e6gf%nK_)YgbFbUzOBat@{tGIu1?(>6Eg?2jHWy~nq^5;n2 zdG=Si;S|x$DNMDx=ML6FmsD(Pne3-N1_?@)TuM0%|2c0w|I3#5{FHu0ZpJgK!%&~XZPNO@whNaLggL4GJ<+> z%<1GEWk-LJ*h8zRpM0C(T{WY^ol%c{lhOZ-YlwZn zi6RE2%o;;ygP$YJV#mu6csDB$-jMlbh9i0k-+ zF7f@ozq{annN*rBMO3j{eV-Y~eadJ`kyFB6>LFfpHFa}N!sV62;Y$c}lD-@NQ&e*B z`&oZ(r+!MF4xa#0Q@CYkKY!qo03qO@F<9cCfVUL7mpyCg^kfAEMhsSd@Y8GCbH<5T z_;(d~p#4RB%8};M`0^AP`azTxi{`@I<=W`uZf7j7S*t>;Xv&MI^g>e2x0)4WizHjO zhz8%HZoHdZuq%xQ*Rn|b8&G|Up3_p#ul|3En1{^oe)q1}zk77_D~-R@BGvdCk-ah^ zQST>r0J)TDKuuG|>IJ4&L#TyVPrYVi4U4>&w~YidtrDXlKPn7BXNQ2MmpDMn8qw_a zgIv{2=DVneJFKkFl4|Ly)(qG%&s-ljXT|q?TEmyqcWv+lC}Qc9U}Os>!>kqG&+UIc z7tm(L$k=~<&+4;~Ax`w?p6o9<`(fx4I64V#H0q-$pM4#&%LffvVB!$-MyqU<3QHCg z@GR+o=x{$P#V-t7*>(E|afY3;rFX<1U@=py0BkZ(iBS>hHJnZkAZWFkGDqAB%Aj

&CRZB`|NQPE0#Hi<0zU&k00ICG04H2KRsZ3P Uwps)L0N#_h1W5**1ONa405f|z8~^|S delta 1157 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 R007>Tv;;{8nFIg;000_QHa`FW delta 1153 zcmV-{1b+L03WEw4P)h>@KL7#%4gf53a8!YES4LR`007pJ7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKe`}c>@LoGpYVD(zebAI#w4NY}J#3v3M+-aHkdSrW;7b#}K zIwjt?1!11K6-9qptw_xcNY*Ihryu;RpA)Gc!5lmxhvE6?TRK{q0N(@EoXpc*E_iXO z?qt*6P{{H-5fPgir&2+6IT6;Nwwn-)Efmj*r8!C%-(ENLeJCcyAE^=9nf^7POz)%k&Pa( z>e2bpyoTQqFwx#wVbZiStwM74%R0q7*IT(T?-FQ#^?xJm1<>cl3J%7J$_RI1A5v`ixAfu`6 zCi%dBrM%A+e!?s}D4RrxP=MNviy!0OmT%5Pm8$L-QO7EGl(!EFsFmB5T1DLu#S%4|4ccAaE$nbp9?wuA2iH&fM)`jNL}Ekwa`tUYe>YELBqx4L8S6xW*T-f( z*9B>`!+s8gw0mpPqalET82)D85EgtWDsx?=LU#IErX$do2(J>k%})UtO=z@@HjPT1e}W)F?`eSa5d3~vSQ{LAm!>u!oA-lPjEOTR)etdn^`xd!4zQg($c0$lv9kD@c#-`i`;9( zDr`lW5X*K}sDv(+ejp;|hID86tE6uWms8&V__CU@KL7#%4ge`!J5}%0raXWI007z%001PD@B}B3LL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$DfU`RNhd+)B)6vEYx2q0$!hi@82Yfj~O{)2_r-MCwbnt{2EL$BxVLXYq5&(k^FUZb znD{oTc48-Gv7k)Ep#=q2`wrXb5yg!^?BYOog`u-1UMD)d+uG^4e^nGg4xRuFH$sRf zIXST<_0C9{%7ZAp<$*7NpY<}UO&y}gQ?VWPIy7BTD&t}cqv*ecOs0Q8yDN*%>y+yM z?QM`e160Bqa9qr3NeOyrAM$D0I1yoz!0hQRAUXGsclDb2Q%`e3tmQ!b{}kn;EYcS7 znx5LjEjyLlW3eUNbM^D|F3=;@0rX1Y*`N?oZ16yPuBEHI2frnf)Rhdvqth7~w?5Y7 zf>%vEoc!zI$!FIYTEKsajYo02Wpp77T9u-yf>@j6^d7&r8l3x)8Nmuui?K2EQqM3h zrIxY{1ZP##SC?220KVPHTrh{~5b&)n{|y`09>_Q!)pV6`f(@Z5{aOlZnW^ zFM^lRJ-U0wpPVy@KWGZ&BCu*MF|`tbalj1-iF;xU8weaY_g-$UzsBNUemxQ55#JS3 zK(pU@riqMkRFf7?2`aY&_d@!@rniirN8iaDa4cUS`ux3dD!Xlh?EO_m|Ip`%bSac7MoB7g2Q zwJ*L3Vn4PLKAzE?xE_9!g;yP&N&0Wr_qBC(l!Ha=plT5ai1P`34(&c1TxJg(E{*tZ z)5OSU7^Z&!t41wuHRMRtZNR=1x2LX*ZvuRRYN0jD*08K(=DG(HTuy3zr0TMU>v`X*YQM0i7v$Sz4>y zPM%v_LchN>vfE972|9mdb{y1XX~0C{-OG2dK$CwQ8Cs{N24%o6?(y`G%)2YN!e?HW zsW;X=-W^rG^xAG45vaPk)6GSGw?Q?ZYX`5kL>l~c2}xJ96Sw+q;FadEVL7DY;cK}d zgV_fbI)ncyJ`+dR6q__?nW=f(%cmFpW~^0EO928u13v%)01f~tTsu|o)TTUu1ONcq Q5df3m1V;wK1ONa40IXs_1ONa4 delta 1204 zcmV;l1WWs>3attoP)h>@KL7#%4gf53a8!xAQl*0g007bv001PD?F1*0LL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B> zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKe`}=vk%R1kCTq`3SW21fZ8Yhso2ET9X8 zw;s8|!ls?bw0DQlEhl8`V}^e{aGyn}u}vJd?@l+AAPrnY(vegOjfbMjB+k zbx~=9gfn|Hfp5znEF}pS|2u6Tu2G1ebgXw3qY_SaFB10``?ybiZ54LG~DQ8>(b51xEqep0?yByX!Mnr%a+`B&jd2J%L9`OYl`wPe{u; z^VPFwgFokMH|m_6@{0Z(k)cPTlM+C?I*kqg z>b;m+0DyiaP?&SMkNbc8WgP911mI`xcEOdPuP1TewjIgvg%TR8#+u!%*AW~Z5$@tbPT!{bdv;KBZ2&#@y$}nXfa92*5cOKkF z*r~zi5ZL8;GHD)rImyx@f=TP)8=d9zW`u}j!6C|Q1@t}Kyf+;)n~^nr@wa*asH0$5 z#$P>nQEYUD2d94;q($v95FFOZs)TcQ<5z&^3@d2F3|<~~ND04gcbk=%9L}^j$5@kF zSs56$kV(z#4QQ_%o(Ek5tk910g#WZ{IpF)htLsA-+x=&J*9G-JPh9N(163~d!AQR5 z(1AjA_@MqS1-xR^kqjE@(gL4b=_!*X1^;pK_g&Jz0$_iwVJk<%ikAL7=5diYKy?B8 z!sJ$gEV7RZt*0QfN1FJovp|6v`t;uSc#n6Yq2Ar%7=QS+X4&ohBluxhr|)QBT!D2( zy{=>bAC^LDSUjgB0e+Z7VY&#oj!Xu^XgNjX|DXYwTe7vg>`J1!1Q(d;2WP8YR(D0J^~KmGXcG*e@X9uM```V=@3Df>m;k zFeC_Q10|vWO$!R=OXu~Uv83dGVa*JW&^n@#H4%UMlR-El=8V=^Dz@`=vWL21eHSF3 z51vJ0aue&T6#AEz;S#pNpNZ&dYT+WQX=CiU3 zuzQfY1Jb%q@IQ@;{{1R6Coo>}w{NBcLjU$u`1nvu0Rle*KL7#%4gf53a8!xAQl*0g S0005fliLJI2E_yb0000g%1-70 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.4-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.4-legacy.zip index 999da3b1189d2ca81e89ac6d601d19e1f301af02..b3155aa1e7b35a90742e8196e555f75bd7619ee2 100644 GIT binary patch delta 1165 zcmV;81akX{3Wo|CP)h>@KL7#%4ge`!J5^4O&Wv3I007<*001PD%mgQqLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$DfU`RNhd+)B)6vEYx2q0$!hi@82Yfj~5Dx>=-_Y5}nQS+?Mr4-^K6dZ>jfnmdN}&QyW7NBw1ft z94SWoOa2%Kp#SZ$HX66SVr(ITM6K$_L<{CG+PaifVfK?AMG!fBvb}${P(u#|+zFFZ zY@3;U8@B*-hp$Pb%DZ74BG!CHAW%noPCV)TzZjieR0=?K(*j$8u{wbb1LfPnrJEGF zow~L3h*jiyqjI4tvbP!-8Y`T#9}oj5t?oGFQXZPZ4*IOc8}}20<|a2dhiuKJMwnH8 zB#-1^9787Ms`FeHCXs)$MVX2y^eny1^~>gmGD^U4R_y)7X!P>0tI(rNd%!0)I_OLF zgZ@H4K(jsMAu(;u%d>M~8btQTK#_-K*)a?*gux2eoKT3%O7;s zwchACMMH$h76&zEVnC^}KjdXrs;3-(6jQ2($eH>u>jBhQ_8*jNuqWHs2dQOMAOSuz zfba~|OXP|mE*l15yd(ttI2DnmmV1giIp_0LLIXw=IIEc;LF@ACGs-wba_G%6b9A6^n*yGDd`@W;U1Bh5u0u}b6fUM|(TEHJ zh!7fHcgmQja9r~{2uN=~HzPuL`8Q8+=yRtLRRD?)l(v69uD1oxPdVdI9rOl6@bw7& zskJ1=ia6e^@!=>v$s7wcSz>hke$mS3bss&mB?=_bYXWGJ#(BxJ-HLNJ6rd)Or-U7ZG zx+)OH$+@i7f6@-Di?To{>xYnS5?ors)krlmx6N7+CfcQC4mqBwcOE4WZjkhM91Ff9 z%l*VHl7K<1&t!VSM%2z{+a@W@KL7#%4gf53a8&1n!k=FR007pJ7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKe`}=vk%R1kCTq`3SW21fZ8Yhso2EUK@XLhDshW$pP7 zEL(D3+JoEE%zl6WhNf9!@{GE2X7e!F%*3!PT;}!ty4wxMMY7Cb^_p+hqn6I1z~Ehr zcMeMD*y`!xv^27`ymrKul1z`Xmv${8ZU>7n{nd7)>x??~Qi3;Uesm&JG}p4loPEov z(tE%9-<&Mu1SL&=b6T0^CrR^Oz6ikk0e#%q*At*z4MBfR)FT}Sl~kE>-h@d4XM8B< z8A46Gm4PlVj(>+~4ydBg?6iVYebe~c&+}NGzMZy7cRi{odDunq4lvJYZjK>s+WK~r zelGVD*!3qVA|Z--#{F)+EQ|xWuD!BLP==FU{t_?8L3t|$RxUmbjVvp^bsC7iVO9m* z7{r<@#N2*)p3h*9nB`%ii8Of9}qJ&?55uHD;x z1_;mX#lsiU!%gG`jh!@)R-}}YrMQRzOv`qf zdT;_?t7}o1O^*leqy0a>cSA{3j=ace&c(8<;{cEJ^47h^uE2j(DXIF!UF8Xdssts{ zkF41*-)!|AlLefB|ugLvKWja{NwI zSipNj3Wa0vAh6g|VFC<+zM)4@#d-k{YG$HkL6gG3w8zjFqu$7>)Q{Tdjd)P#Bp>w< z3?k6XIMP^^53QZqPCs=GgM#{c1?iB%et>@|iWrW|mUS)D!O&x(0AAqc$~aYj-#UG2 z5U9;IP3kxgyO{ZD`=Xo*jNn<4e(49f8YvNhmjB?axxP?K0Rle*KL7#%4gf53 Za8&1n!k=FR007pLxCBWCp#%T`002D|KSTfk diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.5-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.5-compact.zip index 8ed211536131abcb7ed2dba9d7237c995f2fbf10..161c2c949a933bd0c0d32445ed857ea7921b902e 100644 GIT binary patch delta 1194 zcmV;b1XcT`3Ze=ZP)h>@KL7#%4ge}#J5^{fD%W@f007#N7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$DfiyBDHr>uKAh1NiqHkm>0fv2zNig;wBm~#F(12f6WMyC@e z>Q>40#)h>jxjKI+^T+_^qVPuh_}pk*yPyJ@xfMTwI?jJdSRAvNHI@aaB5ZM8f~6$1 zJYeGaMTrzst@bPYcdrzbJKDEroJZLB$N!Tks?Ny=*SL?WcG40jZt%Q(4!)LmSu4}{ z1NpBue(}@JRV2un_45x;Cw-5j`ZGRyTqf~cBgT?TXtwWa%(B@7J-RVvHIj#nG ze`#w|S@3$W(0D6izT`KzyE_|)e3x-|El)ZCRef0EAhcoXq*X!zZi!PUTl%(qN~C(>%PgLmokY2p13`!KM=gfxCrSy|VP9yicBF|5%Jjqw$dDa6@ zMqh$u+0w7dAeyzxjUa}+n+EHKd!+dtz2+G)3ZXDsy|_!u1{lWcg_(;7%?m(rKQ$Ws z*r$IG;4OfY$s}E&0E!^``kz@AB#>l4WhgcDXO3B+k0x%Px&hq9zpv92D^jeMCUF${|4!QrW75bdm_!UW zBpZBENryM(j|c7EMG9k3XTYbTX8Wr;ZB2jpOvK9Li$pt8WjY_4KS7vEXB{n?NS7;V za7+bqdHe=o%=}Vl9kEjpvX{O=)sDhl$2AAn(qw)oqrIoW1wlMG=L5I-e+%29)q>}w zXpXFwo&Bk`M}0G4PldzUP4TS_QGd^^VY$X~hHO)>3|E0{od$ZTRtgI~*^gOu7*&7B zY;Ln?s?>kiB&Wh+Bg$T3ArUop5JxxQYNEj%Ci{4H2@QyaD{Mx)H6k%ramQrva38->6zq_Y~EFO__0AFX@2{l zlDF@~PC%dj{gJ^?O928u13v%)01f~uTsu{0Fe=x01ONcq5dZ)r00000005KV1V0A4 I1ONa40591!B>(^b delta 1194 zcmV;b1XcT@3Z)7cP)h>@KL7#%4gf84a8#^l0EK%5007dF7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKgg#48_Ruv5}M=kHswDAS?JD8e4{8TcCmIVsYa+k$-fGz@M z^?AD)HcZ&{Sf!0D>-Q97VTT?butKeBY|xZl+?I~*%0 zYwGhQq{#=kb|c+}mdG=qy5k@eE^vr36F>~t^C$Pa;e6$O#NYTe8#^;?A);il+EzL| zirEs;WfW2?c;{#jNpFw}k1b=#?{|M5jtR4hZlm~UU^{;(hy~5Jp8qQe=p0!PmU+B& zs$!!{p$cb@wHE0NnBVVsw{*f7%jY=%D<4?sc@!YzTlYpGcoP79PzViJtR)(x_cTT^ z>n4oTJ-5Y1r;dYrg>b=d1DV;ClULWXUX7G{RLro-2}yN~s#Lk@FAvlzUGNKab4Yq} z9W7=)sQP~!Y~c>=)-nb(#Z`>ch_;SukRtD=M$lJ#6Yg-1I@_tauqD~7gMq_P=+$n! z_3Kax3<6~VhZMk2B4u(Ha$JaNJ%m(FTFG?WflEja!+w{S^7~b_d0)g^0nHuBNAeVq{gCNsstSA$q(4e z@@3xSejP5DS0T92Hv4<3^h^kHDRsme><1JyVe&Dazc7~u6%bGyKpAG^ET_GKks+b~ z7}I`~DB-X0s^Ab0G!6hAwbwhBh+72w7TahG+uczwl``)_9H?0mp5fdZp7umkOGdczB9Gf;Hk|QG6KmokU^h5J^v1YPia}BXZ zZWZ237~JCci8VRK#A(O&0=-419*`if4=p|IgmgH4*X)v@v*DM0KN|HS2_+7DA0B^* zK*mkh$@%ko=R;Q&LJ?j=V2gj==^mb?9M9XLz2P0>Nu1Jg!VkhQ*)RwRps;*UdPi{* zwsK%r76_loP|QWMxyhsd@a4O8z_Gw!h4OMf$X&=B5~6R=+%2L&txh)`D+eC~*j@~( zPI#oCUoL|G>!xenGHIQ&&!SJh>urB?ILO4z53&yaGt^8v@gI_`Zqz~!p>lgLp0_*x zD(U^YzbNhqv!JJDS~s9}`3ajPNj`lXkSM9I+H;(S@zQu*GL3d;HzarlW&olm2PK#Y zYJLS=k%35w=nMYeg5Xd~0Rle*KL7#%4gf84a8#^l0EK%5007bv001Na005KP1VRSA I1ONa40H*UVO#lD@ diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.5-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.5-legacy.zip index e59d05a611e0eee4d1439f78d75c4150786081a6..a48e14e83110f228ae9459d78968141684e851ec 100644 GIT binary patch delta 1149 zcmV-@1cLj53jYZgP)h>@KL7#%4ge}#J5@qfn`~7C007>R7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$DfiyBDHr>uKAh1NiqHkm>0fv2zNig;wBn2ciaSWd}p)qPIx z#!735yl9#X8R~x%bmf>$imvTUD=`pz(%*_y1flFLB$0kv@3=>if`BbLhC*HK8?_yv za_^L!p|Z^9{bQx%r%L&AHukImhH9}D=C25DCAJj1T0O2L#S|P_5=>V;ZD{e?%EK?> zgweSD{_t`Se5vJ_7a3`~%r+EO%(pHiL(7a6a8dcTy@!95K`8GEb#$Y#{r_K<;lj=j zTd4ok7D9kiKPy|~c;}1h(O3jrkXw|G;kY+@+M26 zyF&8E`bXDYrcDEe=`NR6EE zFTGBfzK(w*9_Z=tNjF6}7K`%7-MF#MIgqyYdm$|geP_28B`t@g$rNh+G4a+wGGbJY z)LCjCC|k=e88=^vopHvl2&m zde;3(ixX}gAReiUq@Yk^pYw?n9j z@_#&otC<#;I#sXM7ly|;SgEtHbGztY9qFDN^{TVPLZ81{F%iSp1vaIFqZB4ds#0`f zlGJ~=Cdto_F@|Qwi7iAT`OZ(?$5C2s0CEG>J#eFxV}Alj93M1gnQ*3JJP*3}ufpph z=&k<|mwr4X2KWr}67HVkwg1lJ zp99PwAY7vz6e?FY+tm4+LhWCJf$HeU7KndoHP#ZI{3&$dq4N^EbY8T!w;nrx&Vx(p z+4aKQ_h4~*?EJib!#bCD-MwO5PJ;vEzjyIOCfF+$kjorLDZx~`L-+0L(+{(v2)rAi z0BR?Q_h1yQikX6^(J-fE?8G3SVYT>0*JF{kuCQwg&LBDJZ*eo3Dnb)R0Fn-+lN5i6 z^batJhtWSN)|T!RoEX58=#^albPekrmkg`jfg2P)h*RRjP4 P-jlNgNd}h$00000uXHOl delta 1152 zcmV-`1b_Sg34#h2P)h>@KL7#%4gf84a8##21C3Y&007pJ7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKgg#48_Ruv5}M=kHswDAS?JD8e4{8TcCmf!%`%KGaN-H)

lFdkjxg- zx$cL;k>4(7>8lwPSwb%;TSEOyXM`JPSFbUe#3iHpB^!Ueg2N6+m7JnSX)?RdCJ`pC z`>U!&9`I3~$Jm4{>4qEy3!x}ANEOgFq~rooB#k35rqARYBIB?WHeB@~-u7_6#D!kv z-#i!63yTx>fGF$B&v|PPl<+$_1=S7r(W(lF=yCg(1fFMj7EzxzUx`sVsXI%I;lWiB zdf7ci#zTL3D(<1-KOh^l$DDPx#e-wBqvV5}lO?X7=m~T*!-V0M=>>k3XmA=i(Mez7 zg?My$o+J_DdgJLK`L*qaP-oA|~57I(WjqKIj!b zAfSOIEi!rEg$|g-Wv~OJtM*-dA?t^C=AaFGL{ZtJ&IrVriu+3GZ0&N0o*}&S9}vuk zKl9@x{#TrR(AOX=fy>8miu(d*f!aXk-@wKrOAsuytbF@j8?f8f+ri-CaLEny($vk2 zsday6q2ro!SVkJ<{sfiA2Go#}{k7@K#p2z4=5EWGVuZJ2ZIL6SpnIoMlWw5(3T_&$ z_kAIq;uD_1_ zHcIup%xG{Ul*?)!pG^`#fpiFe=B1V>M`VBKeZXiOj(AjsGy~_kr*NCQ3Tmca`^>s) zM~J|^6|ob0dcoDk*=+MRE*E$=dAQ=0{vn<&Z2VFf0E@2BMCXF1R@OyRH$7Thtc>YP z0rEdBagPBj|13KOZwF-<7n1iwNWo;=+K6`s#N17P_H7#hLcs)^(REkxggf{fZ>xXf zF=Ii!kXJ+(O&_xpkPVNG+c2l?aC| z=tlk1bN%DRqi2%>d_3N(%6E_L1cTZq$x}MD=pvhCRb(8bt=gkTvqM~Cv!zzLtujC{ zY-66u)`AXj$?1ldjc?mq)g>UxE6!C5aT&DAd&CbJ+${vfz^!?$i7apESo@Hgt|6uH zZO`6#QP-&;T?U|9yy|5OeD2VYE+Y4>t{ngIZ6Xy=O928u13v%)01f~xb8u9rKm(0f S1ONcmlduFy2ATu_0002zhBjIN diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.6-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.6-compact.zip index 5a58463bfdea8c48da5f8bc37242f02cb8f0dacd..ab38ddb1bee7a90024fa97611c89c534899f3914 100644 GIT binary patch delta 1194 zcmV;b1XcT|3Zx1bP)h>@KL7#%4gf4%J5}%yrTcmW007#N7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$DfU`Y;xrvoI39+**+ZI!T|R%?&_ z6!+dP$>4rF?VJ%^6_=M>ODs*Z>G-Ue@<@~79@B&dOuCefD(?zg@e*@j*hXKF(Qt}0 zh@qpImi{Jlb{{UH3qq+;w4})z`;k>g)I5d^nC3B~=j&mq8ta#3m{{~hk4AEA4aB>S zu}Uo{mhOKjDaBjcJ2`*3u-+<3ydzx5au4QH)zDZIBJP;{`15=CR!;fXncWTsPzNwP&jYxG_#K#nuhYqCWn?s6J@kx=^#X(yxc?(i`G_*r>=1QmjvQ{qu!{2X* zPMp9F8E($Sh}rR;v`Kz+-=8*1-PWnfL~@@`!!CaxB_ojrwv~kTErmx{xzvO30euKo zi|S{8t76q%kSwpJZh+Orm|NHW|H^y(J1|O1o^gRwz>FcgD0LZ5)p(lOyCyrH)ae^O*g&*LTi4UY zkCQCLYo&7=Ha7ijYIUoZfg+p_)T}chPHumc3x0DOAT?~NbKwfgpC&<{+$^DjFf4>) zch*h*?tS1^N4bgqFCJ5Qzru=m92Hmii3T#4k_tA^i6iDQn512rM<&S2{0mD6OMt@& zpKq4;AUwEIlT?U5lU}eJok|8R9LTPK6fiQdD=32aBSSJzZjckbxBf0^@ zLRHj;9vs#$ijFw4rD(^-_RP?X@pbMbn=Yn1T_qu&xUjy?b>l{20UiX-#@ykaJv0&3 z|4e`e^k9YeN!_8FR{&XtSee~nxaG&!bguq1*o^=#H-G@=THfcREhr|EitjdQeLN0zU&k00ICG04!WPRqzm{`+5Wb0NN1%03-ka005KV1VIM8 I1ONa40CI6X`2YX_ delta 1194 zcmV;b1XcT_3a1JeP)h>@KL7#%4gf84a8#0~Mtyw*007dF7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKe`~#p4JN%txK}KTGEEOW>>ToZ3VUT@t&J9?V1;KiRKMe^> zW!pMvfQ}{T(S?6CCV&X7PW^sv3(s`Xq#->4aRGBB z6KK$uMeo0GpgPjCi=~DPo8DuX(oZ@~7OTEZ%INV}6^4JJ%S4&{vDLbl+oUZw|1!Xh z=?YhQsTN3?vb&T9oxEY>`d!c3ZeCY@MNOO6E^|U98XAOP*#w29{j;lNl-~mZ%NU4x z8sk^xCQ&GS|IraDHCqUcx*djrc`9cODoQ4#Y zArlLIaLEg;z&P-R!w(BimaxZ4zu{YwHd$XDa3pabjizZQ=hSmDTnViBombNjA6W~^ z2rw?4RG}>-TC5rux-+E6Ry>C<-U{G)_}8XK;BRBTYHQ^}hs&x@PMI&(fw-9%-2dk2 zs#Je+Y;DX2vi`k^pMuNDn5#q>B|+@5UgrP)eWmvr>0}{F&5|q(tcqeGpBZ?J-aZ$2_QmOT*IjRp7L(;q5%GBTY`fD&3SDyN`Mr*P(dB9V#q zpwJ`2H^B1wV3hKqPg9~oOULPfZ_0bJvRTL+FD-_|1BKLf+W15ZMOKE=v z4WNO6qQAE=o63J$x;tbYPdp2Hu(LHL_K;~htW;bpZL1ToHiRDfx7zS11R5KgrdxW& zau7*1EQn6tup&m&$%P&N^r<)&Q*qpo?OrdGlBY&}eFOji(h&dvBmk4z1VjeE I1ONa40K`}`8UO$Q diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.6-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.6-legacy.zip index 83de17a296369c3e8dd16359a4336ffc5a372181..859da901f201e40d6a0062451588189c861b5f26 100644 GIT binary patch delta 1151 zcmV-_1c3X43V{k2P)h>@KL7#%4gf4%J5@(Be_U4t007>R7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$DfU`Y;xrvoI39+**+ZI!T|X?5^t}J8jl|L1Xr(jOsevC$0C#;kAq6H77|IEhUQ4F~|Va5!T^HEnO zRD9Z`&F6itQk>kCeg}HdhKX#Dq=!lBoLUdtMrxm=5q>0{N3siF84FNo$oydv$AuZa06J=!7FffJr+q`*IUq*cr*d z(q6Z|0p`=0Cb$0V+rVS@kAx){Y-^}Na9B&E2AgqSXA;^KtvCc6qW%#=I-}P$PSrA& z0G9ldE)s~ws5{WEidX#Qc(HUB`pw7{*3Hf%jia{Ut<6nP_?blGVeVu=>7Jwy0iA5<^uu`ry8GJK2c4iy~c^ITQ@Qm zb|N3T_eh*!cfN)ptqioseERr%U4&Y7TP&_8qh!U{v{diYZNK>;Kw^g076M|dBY@QA zoxy}4aZU~aoo{NWDj-ah#O(;0LLOnASDpvA0hWKNtK z>{ovbCw!nRXssv0dZH54_zfdc4e1aM;D?9|{tPM}L^_afk~QQhMY@x2UmocY>XnwY zX!f25HLPcE7rAg4I@=a14y~=1(-qAA-@=p3vZSW1YelUbi4vwASulkDZnawfXF%u* zEFkihWKv&x=g2}DW%{;9s^n6__Qz*2?0tU?MCao_!i#ZizU&U6+`hk|BbRNO|I6CZ zj6f;Zj4a{PA^JrkzSOzZ=bIwV(`uW25L3iT?5!PEv2-OK0CqdImo-!A`$9YW^C_VSg6(-S?XQH@UEbCy518KpTvFZ@rc{O{WkaF2<+fL`qzIS zb7`g{LAHK2k)-3Kk7+y(a{WBiqT2juWrW~EzqbFagwse)FtK>gV8N1I2k5i{>79kM zxy&r%p|Ue$F_qnAn_yh5#3Sa4xbjW)6vBAIA)W!7A#Q)2DygD|wzvm4U2vGlw-JwAvAylTv;;{8nFIg;004WRDXahh delta 1153 zcmV-{1b+L03WEw4P)h>@KL7#%4gf84a8x$7@FH0R007pJ7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKe`~#p4JN%txK}KTGEEOW>>ToZ3VUT@t&KIg9$sQx&easf? z#l~xV8$XHu=4gLhn>hm{?>P(ypKJaz^eAnm&f6E(1ZX`Zm5z$! ziWeeCQdF9-DoT90sOUWhBleYKvetcz4?ba%Q-|vE)MKn415$*mZBF|ji-2^zcuzej z=g7CZtqohOmV`w|m6v^tpGZumW515_pUpF0#0!KJ0-k>$ISOotpBS?oveC9^jzF|6 z#f^6!vB?!V*pcmGyqD7FB>@*K1JzZeX@Y7yDk&MbbUQ~%9V_~AkUafz?!CL7PtIdx(MH-A^#Nz-O5eNJ4I#sFS2&4@@ zRPqe&N?;o*C_j@XKZi|;p-y>*w3%aR{ZBbxWcPp0?vaoDa}4F?bJ9~#-jRdU?jI`S!Z`)JK7}yzYz` zKM;S`&c{pdp$)q4B$6XMUbn~HSuV6qfQ3J_uB303Stwu=6W;mIhG*w8Y&HufY}4u* zhR!y9+NDG6fCq!uSM)LW=gf9yoyd)R#sTs+=<~-0U)%^-z2(%rH>6;}{eH>*;7^3; zzbx81pVf|-seXH_P?(}%>8)nwJ*>@Er>cLSFGc=pO|UHLgLEESDEoSW(3Z4F4JM&B zHa}fNO!JZCY@3u2Bu+z;Q?oB0HL?GQNfvmFh+my z7a+rB^Xd|X`+n(gw+C(#9jB|8R%%f=oOH6H972_XE*1|0{6v@fB}8yBTdS)QppK}8 zQ^4bQ6)bG{G{%}{4&Iujj)0#N(zkoYPi~Z+!~&z+QliRest=FvpWIdFuLqHgRr@cT zakFT3IXgDL0#Ei|87`F#bpY%kJIz+E+f~&8Kz&)qod$UY3Yr!R_4apCyX12#%-}|i zBisttIC2R;F{7+4gZi08#cH|!n_n&7{($@c0V>r1P)h*GHn#90 TSp)z8)|0XXNd}t)00000P5~eW diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.7-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.7-compact.zip index 7614bb79ebb22e2e9b114779c5bcdf4f96681c20..6c6c20763d0e73472887d8d13ff466fd8f46373c 100644 GIT binary patch delta 1202 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 delta 1156 zcmV-~1bh313Wf?7P)h>@KL7#%4gf84a8w|0K#yDm007pJ7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKe{0Du;JN%txK}KTGEEOW>>ToZ3VUT@t&KIg9$sQx&easf? z#l~xV8$XHu=4gLhn>hm{?>P(ypKJaz^eAnm&f6E(1ZX`Zm5z$! ziWeeCQdF9-DoT90sOUWhBleYKvetcz4?ba%Q-|vE)MKn415$*mZBF|ji-2^zcuzej z=g7CZtqohOmV`w|m6v^tpGZumW515_pUpF0#0!KJ0-k>$ISOotpBS?oveC9^jzF|6 z#f^6!vB?!V*pcmGyqD7FB>@*K1JzZeX@Y7yDk&MbbUQ~%9V_~AkemC-;9FpcbaG@%&>iif4X1#Nz-O5eNJ40NFAq`6nAA3Qs(s#ezRl-D_AF|0uU>S2&4@@ zRPqe&N?;o*C_j@XKZi|;p-y>*w3%aR{ZBbxWcPp0?vaoDa}4F?bJ9~vq7KWK^!|#o zPGkwy>M9+wtfayYY*W8=#t-~$0}?!Sb(2za(TxhX3LTmhw;ZRK2GlR4x9?P4QMf&y z6)df;Q<|W!Eu2)DiquLx;cskPyFkwJS{hMG&K~+he$kp_T5Q+ zKr_Nk-&EKbffZ9ZUG@G~B`QDJsbzagptq^`*J7J!jFitm*6K{SEA^s!+gKU_af!#K zcWj((Ps(9dhKvcPbKVrmc$EGlOw_1QPi`{ zi611(jom%^0#xr=q2F3pyGK4}gbRI^F}tB|S{UK7%=n5XLy0RYz$3m59GXCnvh#m7 z3Lgy#XjdN5VLjD^Hi@e^LQ#>@y|w@Zc?Lsd%u>gZt3d|ww^4-;fxH=AF`c|%I8Qy3 zi$cAmy2A4|eNKU0z|JlgqK}170~%mf|F|sm9UwcGSJdu(B|7{8(_#(!n3|@9a6q}Mj51~f(`=227Ue*o+hA$3bPs9K034Ie#O928u13v%)01f~xb8u83 Wa6pe-1ONcmlePp&2A%`}0000RgBtY! diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.8-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.8-compact.zip index 7cf133ae4a9df4a6beddecd8b9cc7ff46e029ebe..71684668df62d4e4169fc91f48650ef609569713 100644 GIT binary patch delta 1202 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 I1ONa40HrfUGXMYp diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.8-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.8-legacy.zip index 241d8b4454c85a7b2acfd9121fe4fff78b64acf2..81f0cf7bcdc000c4346214abfc49fa474bdfa135 100644 GIT binary patch delta 1153 zcmV-{1b+L43WEw4P)h>@KL7#%4gf7&J5{HL^}$&L007>R7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$DfU`f|Mbh|9P25tl*ZP$hYFA*t_Shw1o53M7Zn9tUYH*N1# z{hqFZ7qKYFxMCU@yQy`4}pQ^gBEV|JQYp zI9R!-`BqSK(Rz6-rl~r_aF7ic7hUehqZUR^NvLQ{v*Ql+mSx9h)P@ulaDW(eF*8}( z`8zJPiy)!+>S`KKNG|@Imti*?)job!{bXr2m&AXK% z^m24@8ERrHLFdxw-;D>1`$kc$7yiZs#CTE@B;0z_#Gs))(drRwpnQ-CN-OLwmeAVQ zCq9Y9EvQm$#e$vL9ooRE4?}~G>Sb*7y8`;rUuY65SMdRT8l#evB)ncKgW4P~!cWyw z@+5z1QS6IKcT&~)dZH54_yLaT)`PVz@@6}Vt!24n>1UK?YGAViuVL^|B<~SwQDdnx zjkEZy4w1RJsMYR$nBe_~{0TFzkpjW3*2ORPHQ&xcY~H$m*Q9m2o@6wNZl|aToFQK6 z?#SZGFTfV^t+~UYzESucVh|&2d`-xZIQM^_mpV!xVp@o4nJFBHUMyjkK_{AyP!a?<}eY;l3V{cp0eoONQkRx=RoxxAZ zynTFsgSr>+7R`$*pCkU{W!VxMCQD4Esh5|=anqQ+GQd7jc?=0xHw4N;OHlr^#zcRk z=K4aDl|;`+;FqB-vJr|wXCdJjcfUL+k4w5=X#U&uFtCw_0 z)NZE9gzF5|sH*mPsQJtY_X42zxc0@y7vZTn=@KL7#%4gf84a8#V=n?+j$007pJ7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKe{0l|~=GUC>MC7MLl>XKvdFCTL>JlAv;>-G0~QeXl2!R_(z=Dys>@%esP_i<9kf*u9OkjIvDOgaBL{(1s@%43vDeD#ETVb?*s=S4WvH z|G1toBR`VU^@qF>)3#a=e0UyOFhqnHN$LHM%f?8En=pSx#~fGVAQSI9>!2_hofo2q zPw2>1oS7Y*cObQzXv zo5gwFX^xfsI?5O8!Q+3#9bAbMN8wU(HKx74F=~WUyl9A>?E*f2rz*~&|*V`Hx}pLPLI37ubG$L{dAS`RnMwIG?FovnAaF} zUQU%`-)Um{N?qdq_}qHsRIEX}I?O0U$!LGwRrBH`lt;0l^Hm}o5Muog9RCw-lnf}` z>!S{B?ZM&dG-qmS5n*cL+hg_i&3=mX0{YS6OPNOS*wagN;j?Om>tN9KF}X_%KV@X( z0gs$s!)Fx|svjk)^qA^yKrEyF*(3GCpKpE`SD7#6LWth+una*+&Q*y+A${4Zn~#54 z*XCC#{1ElPhEB@+#XyzJnJle?$4YUkD?1j+3MtYqIEh2&ZSG(u?wsy~pXNharg3ul z0vE`9e^#LUC@vlgy_nx;lXa9{YEOUVOp?p}q6fZ}TGX$HLD@!2%N zQz^RawBZc~m)v98*cy>=^3E}IEv{H_PQ~Y7W@AtKPzsAyValOseG@y}P(iCU)#f^S z7~X2EDdy$Y!mpNg3oYZEV&w!^c5ekD02WMQmjC(^nP^Z;0Rle*KL7#%4gf84a8#V= Vn?+j$007pLv;;{8odf^?002%yLIVH* diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.9-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.9-compact.zip index c57077d1d4068621623713d2b1d47e01f522e4c5..1bf4d20c763cb0a6807e777ce9fea1d6da210d0f 100644 GIT binary patch delta 1201 zcmV;i1Wx<43bG0pP)h>@KL7#%4gfA(J5@(07Mq9!0091x7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$DfU`jc5WV}WrSCs4Q`Xncj!oMsC})#qy?%WF27(C3elkU7ZQ|EC>I<~CWawSb;iz-?3=!P zaR0iI?F#7pMLLYsrXXPXJmcjULgFcvGd(*PkJghiv$B7%U2|BJq@-`8bF7w3=>sOG znnczY6S=9mw_AIw&oKPbbhGQ98E}zqO_nDx6Xi&e@!`z4A)x1lkXbB!1}F4D zpix=1n%wqtQBtg?qjv(iWub_v?8bBhAbQ#Pg{X?OzRpu5d`4Tw1{WlvbuHUZDjnR^ zb{NGIw=p(FAjC$Yu6cw>6*4MqV$*9T-HY-d)`NfMM#0c42iTo|@6HkHr;Hy|XzX0T zRPU`@58*?~SZ2o?%nxSvE`q~eb|eDlc~KV)SA;C^4|p@@%!3zi{a-sYN3wJ`;v4Y zuX*De5AB5i(n@#da&$L2&*{!$UTv_NZZ_j_oj65cR zE+R3~^M*KNHeG;K!ao7F9s~$G2bFa0NY{TSWGaaHIzTE-pJZ~=4;hd%S$dqb8?g?B zn_oR8$47eZ2*<~~&hXvY4T=O)a@<4}V-J~FnsZRM)zkE80(fZ2Ogfcc@^cry0Y!Vp zcl!Ol7j#o3Xhaq63FI@1MTKZOZo|`!hlX@eb!rHu|3cfWVOn6MkY=84XUtSLy#D(Xs+!+tLU zBD3fQrtn1~k~=YTOnJIsmB`f|eN=ztWl{2UDW*A~wBAw=0oLd_viX&MOC;edo_ik6 z-n!ZiN_Sm%CE(;Tk7Sq-R}-1I0>k+awfI~nW}i^it*@Ox79)DhKId{3^tsu<*GXT8M$yy0UFCq?y3#?}TVPz9gO928u13v%)01f~yTsu`qC>92rhy(xt P{*&eeNe0RU00000>OVXR delta 1204 zcmV;l1WWs}3bhIsP)h>@KL7#%4gf84a8y;x5(|q2008!p7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKe{0{@(=GUC>MC7M|Tl~2FFqh*Tj29FS+fX$lDa;Bh>$J&Msu6bp@nCr`04V#Qr zzjO-3nUwHr!clu6-3G;Uj?0qK^pdD@)b;v)XN@@2BiZ8 zL@#1TN-lf&ZDOL9{`HP0o(n;g16#gP#C+DVBHYv54`qKf;OwHq6j??8Er3csC6!(? zcV6vp)&Y|KqOZArb*`MASX9mqEU4n^Fz80eC{_Iq2QeeQa6*$RiFf!H>i$On=@#-q zCjmW9f$pz&0P8D|%?`i`V`quIL;(OGf>h$)ZaQxLg3DYsREfMPjie%3IXBJZ$pmMs%v+A_xU49okoS-E)}sx_P$T9`UAkDda3hblS%mX8I9B&f z6WYURggZ$P*#5^NvUT7{&UJhWJA${oT%Bs48b{#_j&Dlz15(~|_;ME`$au4rbT03? zghTU zBi=bH7Bg#OtPWdef#y?~FI4dMQW|h}598X4IbK*F^4@UpZAIXG5R>)qzvxt&<>A<$-0YP<}s_{w#+#>$V5B*)NtB64PRa%heIJsgaaS;HGg*PfY>8OT*~N?X zj@Uo$R~m~iUK?+by0Rle*KL7#%4gf84a8wCZ%MuHV S1ONc`lj8(Q2F(Nj00014Ha$fE diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.5.9-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.5.9-legacy.zip index ea69f7fbf4ae0e212664e17f7a9c95707afd0a8c..a0b755b690c9642650a657776e6f38d495f1faf2 100644 GIT binary patch delta 1195 zcmV;c1XTNx3XcjHP)h>@KL7#%4gfA(J5`||xg=!-0006Kkr+;YAJ=oe7BTbcpx^-K z1=jV{4gy4dH3+yu{_QSRfSqH~CpuejzysJgLn}60Qf)1N2r$y-V3vC5Iv!mY(U~?Rldk!;;cDO7r5`e0;PNF zCI=~olIH5Ar$;_AW1z|eKDKXI+1#L?_92*B%959f28HxulOnOsAuSh5(3wCHlXD)@ zu)>z{*XG%ONmGW&orpsrG7e&#@hx#!D-@hrA>tK1at=_JvN0vUTL0@w*>j?L8sc;U z1sZpn?}U5<8T@Xw6kRM)u=XW;C6?o-^#msgWlu%TZQY}Kv2B^(Ae9|}53M*ZO&93h z0O~t~xI+ZD#Y(w_!%o6gBhgw0kA6J5G}9=a`wmTi{xi?}Jk`&=rJDc-#CWR5S-?Dv zP4V;&DYh()ZNtF;=Tqw76t%#4ilzUiUx$Jf2RDyP;koy!i+N?Wb<yra@flO0~T+`zq;_$$<6?Ths9O_&(e7vwUY`QACp3 zibiWOH%##-;GR!iBuaJoZ8^WjW*rT`!{d^FxERv?&=u#y>tOyDjNU=##5`==sW_&w zOmqtlFJp^7fx%uiM~3_oG&{ZG`<~uJW8v9~O(sIm!~%Ti7%u~(AKQEd;Q^~7U`>u0 z_HMfw&4mMzh%%41gH9V^BR>F(()lTz8QH9&TKbejT=@74FML-9C#!5vv=Xg;4&woT zL$?k|Sf6sFuNUy1mjQK5|4yA>EumM}G$apg&Q$c)5G2Bb@+TT2_YC&nik{@hh zbTMc|q{kxg*bIe<^llPrxZ;{@KL7#%4gf84a8z-^M9pUe008Z#d!@Hn z1K;rtgMiGxRVHiXUg(I;wV+Sz_)C~)s0vj65PWzZS};U}7)j~XtA9k&Mu5flM8ZDhq6yQ`5Y|Gtr+eLR zhm9e7fN2-%Zx{6iOWwD9-;fSfn-HcU%Q<+Wb_PFx40T{eff|o?cfIvDJP-K{m-POM zvrc3Q)#@r8vaF=S4s27ub;b|;Z37ZKb#;?cRd)sF!`+(LU?jWTXQ@1OQa*1o+fKKJ z^N}h_yovze;mH3>I)L#-)SBCet_pu4FBeLq^73uu%&6lVX71>G18LO7OCB<4f~eVu zYB7?3C$76c$8d%h#Ic)i?9Bl4$T~&dj{5eOT}kT-G5rtHD@rE(5H!PKk(XW4nMifZiJYmm!6$MWa0tl;XU87V8 zM29?I)fr(<$2l~HP;MzJb$x=G0Z>j}4@ydZ*-xtjbI_c*+@M*x8m*|nyxs1OepE(n*{sZ3eZpBUZGPrGJ+ zJ_u(dq?|y6opM&l5yun-f9AB%z#kLiVo?UVeofjbE^-gKxd7+v0Z{nrTRJ)b0ubr@ z+)~FI!U~18`Hk`I~RB&K$VwX)NsUtwF|u{ZJJ-qC4(p8gfdNTtaI~25{~Ddwuj!O928u j13v%)01f~xb8u8~!bHty1ONc~5tG3LNCv3{00000-U2e5 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.6.0-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.6.0-compact.zip index 2decd51e2f1dcbe1755bba8e79b32b98713e467a..ef09219463df3fbfbbd91b5b6cfd76ef19c0ca49 100644 GIT binary patch delta 1234 zcmV;@1TFi`3d;%`P)h>@KL7#%4gfb?J5@d?V)dZ}006)e001PD5CtcZLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Dfwrt^KA`|FRgW&Czzk&Vd5wzq}xa@#T-6%#g zz;m|J0Pe=6>#-+yad;E{{AGW)Y!Y)f13=mwA}X7(#t+|H$K=;Il6vBTf8l=o9sDt9 zfGrCve5rhNAlfC9(Wh0-MibWG5#=~OU5&bR<2teH54IRMDA!?SMTIM~>0lDE-@4bl z^raR(a-X{#yvoUz`I4}iy1Rpk-I1wag=2}>vhZa#pa9*af^1&X{sezkQbbu8Qn0G< z3i5OuI${(7NU^3s4ZglCGS$_naPuJgrxgclKAyWbEcFp|=7ZY>!1ii^hxcS{t637~ zo-$2JXjIrJ!<&?Hd*%THlUCnMB}BSsyoMN#+VbtARhizyiLpo#s$b{p8v>8!DR2CK z)0H(&sqp&j#fxFIs-%BNoiLh9o}E2mNnyL~KNpLSPXl>pg^13FRbXs2v}GMl{ZeaLOZvG$|0>*naYWQlZ3YSNpr zHQi)pT&}Obc2u7|+=P(&m#46hi3a#4P(9%b#Iygv@GvxHf;@i>*MHczVOrfhb8{>5FGPfV*jL5 zx`Hw}5i$H|@CIe)OFlGpt&T=F+0uBW$u6BNchlLEfa?G{GLs;tJ#{#2ELs3bqf*5! zKNU?k`h}DGsz1mkJTW~ z;hTVqw3PdZqX6KHlQy~8R`tfIo zFU8=sMvq&A^JwY4q6cH37wI6=A;EnZ2G#2gv#By$@wmcQJ80lV)IrBln&yOP=T7`7VQp5`ls zLOaxE#Q2{t><+P*|54*%#_rcTuYb+5nWIPN*{;P>S#iyXqS=F7sFS+-HY9bk*z+-d zojIb5sYnLWUR+%XUh8%)u{6dkBlJ3|i`}Ldnn-^16SL; z-jo2Zu~5r1)>+UJ-sFFR(Ch})-LE+cNjr^&ytgS>N{d<3aZXtU+X`{GZN};^MyAhl z=hx-!=zz}Id_!edTM5ZhJO@(hGd**=qbP{_o6(uUSAeXg2|sk55xDAP=5?y?5!L+8 wng<^{|L`XMv`|X{0zU&k00ICG05@DaRX!+U^`Qg+0Kk*}1W5+t1ONa40BkRAod5s; delta 1236 zcmV;_1S|W?3e5@|P)h>@KL7#%4gfB5a8$-UxR|2^006iW001PD4h1KXLL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B> zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKi5c9ST@H7&Vg4C**{s)}1_T$1V6RGmPArGK0 zPH}-o?5+%X>L6N!hN1j5p_G4K@s+B4$yJxfZ!tUYXAkvecSS%`P_P1vEW&ITBY-kg zeoO*H+v7bS@!Xr8d}l5eJH>SfVG|tokI{1J=mL6h?zRa5%ZLVa$GWqH5%Twv=o15) z78k>*ycOG;du7V#ac?U>t$J^&8BbNDF|2`c8C;gnxbg4!-m;a2E2Mwmn`%Wx?Vz}C z)Fk#lq(H3au+{*MxhT^1%&D&vn08+O)j0-k+d)!tS=peW*yPo{n)Ku&$r^nQ?K~(f z|7zH-gUp_w%7^yKBDvDct_*B@39vHjML>d;Mv06sG|y+D7CT}#JMd;5l>+J@+@-bh-&GHQO_qXi1|ISzoE)7iw@duOO63)!5{rZj|eXl);C1YN7Cavbdg|x z#DpP0Q6m%*S~8*oQt{0Gv|>y8aJZ>YwDb)r@JVJFOeYgbs~TkqbzgNsoB^{T3=Gm9Y-R}m;p$6TV*`rr*5wIVvfMt_iIK{B@9Cw8w46Tk5e&uT1I4Qo1ONcIll%lp2IT|*0001Tr&S~X diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.6.0-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.6.0-legacy.zip index d4ed5b8d1581772acf4b9231438ed6f905add597..8cc3597bbdacd582a13135e4296a0e920535537e 100644 GIT binary patch delta 1202 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 I1ONa40OgWVB>(^b diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.6.1-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.6.1-compact.zip index a0b337bc66f457b5d41d12d673393473e8729d9f..0eb1ab76c07d1776a8561024151cb1c548124f56 100644 GIT binary patch delta 1233 zcmV;?1TOo`3d#x_P)h>@KL7#%4gfe@J5{COufd=M006)e001PD4+STYLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$DfwrxxG6jlHo4t~qj8FpQqCL6vDW^8fQpGz$^ z^SLAhI#mGBWW7}dFI3hJg86@C-y63*HYUcW&EUSwJwI;>#k+*Uv@mGIIk5>cKq#fS zbvUWb*(s|`L#y`KPz(B|`OU2@KPr)9SwY(n%(8TvEGB#5Of-P*0Fp$2NAgU{M7YG8kz_|wQY#6Cuz z+~}YP_bF!1lJ9RU#U{m!?V8_ngnO2&dzxtOP+d>755|OuuT?VQ-$3{QKEi-Et3~NJ zf4>QUT5AL@ezep{0yZrc%!L_bCpkP|*txUY!WZh4kxluJYU6YCMZ-YBM({ z8Ou#pu|oq!KpwqlK!ctwwbeJ$0_>)4>e5BQTIEvcBor^jSCA%1Z|3%+)9XT3PduHn z@rhoy)gCVX*)y-Z`^K)-iayGNfMNmuH1JEOF%zaM`Br>YCfa{vgge&#N7zp;4=Gs2 z*?bolEntP?GJJ)oO>OfJg-2S!^t5PwpAwc>F0G~2r4+rEl9d<`R^7`c2%&;`475h; z@9p4ymef*%?;~B~&N|AZ{Qwwm;)n+OSJu2Ls4VcGY}8Usu*HfqNFXLn%@PSNA+^iB2HqJ=Ve*B5*zqST9AuC6fXNRx@Hk=Xuh?fR-PQiY(l}a zV2Tr%s6Ax*>|JKB7~|uDZIQ9EFRS$%erLqq7e(B9M6Ld~4ug_G5rU~$l_Zz4m1}bw zlaEj?g@4}r3@i*;Pst#qYsGuh$1C@=FJ%(ZuvDs30swzH77#VklW#UzMZk8>Ju>4P zVy?d40&WC2qR;lf9!u#ckI&b!>DWiEZ#^~)_m3(&p9EbavN`C$+Z2nar}9Wo>u2>{ zPa^;6!+5aK^=Q?RQ)I#C^bgSorsNNWZ(ZRB8C!pTTD$7aDI`&I`R^=8MOiTf*}h_U z5!f2bS_FT}IRQ@YvPx1T-kNQ8E&Tc%eZm()(=@r~AstLybSyI3G`5_4S}OO(W@xVu zsimFuWR`|l;wPz)99ws~-8esuYpj+%FKK;u3-}%$Jcl5R!4n;ZnV*aa-fCTOl@n!x-bEpg?=QWoBI|@ zm)7Uid=jx(OTPNhcR%6BOWCTfGr?Q*D_!syv#Sy-l{MZCdVIq~LPcxM2-18O7m#;? v+8-YOSr0P+P)h*@KL7#%4gfB5a8z?Mo$jIp006iW001PD4FxBWLL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B> zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKi5ckF?(jG!aE_R(^oyF3+vAm}yxxtBGh@xey z_J-yEIoa-{?z#Rk?VEp69}IsYbU585L!WY|w@4gN@v~&L?Q|fWK)f6#x!;NH73%Kp zPhoHtO0l>fKYjM-HC$f{D9^nD^!8>F zus&6>bo|bSJKUnNzEH0@mv^Oq%f8vzpPQ45`Ux!r&37dGqFS369nfI5whN0d*FYPM zDHV1PT>jf$T#dKK1ZWx)3(9NUvyaVvla>O}3pG9;l#oTgEsENRQfFi6XRAl^rtV~@ zh)irf;eY?1H3|^QxSoHU9`lWiCpW$bX`D--2!FE4rEL>iAN2-OfOiGp$bSU6&B0ZD zX4VPQ#J>mrNG;1Y%f9=AvMplVd?x-oDf2U1*1qJo&y%I_(&t z>zZdNCuN|Ani79HJT-}A1XZw{_5}y>FP*S{9QRW(DqqZ{1Hl_~lOAQ?6T{sL z$bCM3&(vzBO6C5^%4%mFI>jJ-vrPe!TMuTjc)GDbEf-h z%i7nBVAg;0=TgkPiX?faqW~R8V+EYIdatf2M%OO}F8NL|pMGt!v%W>z;p|G~~$%>?(*o%&5K4fUZ(uze+Qp z>4D-~(SVI0VY>4g!$(J{gX91CHEUx))}m%*64{^}s93jpF$1oedx}~usQ`YRZcun_ zCl=s5SrNNwh8TXDHp1)UNzl}7;&NZYF9ZxpG##}ksynzCm^p3s-TTZqZ_HiAc& diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.6.1-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.6.1-legacy.zip index 50513f8a19e2885d5c99d558c807f8bacb119df3..fe374bfc80a79c1627862cf6e0cd095a18a4f191 100644 GIT binary patch delta 1202 zcmV;j1Wo&@3aAPjP)h>@KL7#%4gfe@J5^f(U_pKa006`i001PD?F1*0LL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$DfwrxxG6jlHo4t~qj8FpQqCL6vDW^8fQpG;O^ zEP5r3&O#1Jx{oVo)FT+7w~2p~g=i^>qaonhf|{lIs^1NxXO9)y`Oh8zQ!plNxgn9F z5M~G1TA451K`VnsC2lq)k$Lgq{(LC37p%guaZ*2=yP>A?MO3@Sq|OU3QGxafjCXCw zv}jVW%f8(c&>M}!GCqw~q5vwveZO+84=3%KV)1J0Jn0>M|D))l&Psoc%rO9*r-*(a z|EmDL&Xus^xKVRwUTG-+M2z&_r?|cwo+j$w2_upyDmx??oX&BkV#)S(2GLiR1NwFD z^{$E);tmind{s>!JH3QFr^X#<3EZ8V=61bAKi0eDpf3(wzkz@$wcp`Wbm9{?2nf!7 zW~%>T%wKcYPUF2*g<^k6o>1*O4jTi8+DL4a%Kx%uE_MYIX)AWb1WUdocg(}TVq69{ z3e*d*jABrK1crROp6q^5QrpW;g%Ry(@Av9>?dc;{hoq0Xm5WJ!JCUD-mvr;wM48;0 zU7GQ+jF4L7$E4ia=fvy$#j-e$TVYW6Z8pWL4d~T4+89bFxO;!^__JBW*w@~PzLY4( z;2_8Z#P7)_yQAfljaA5(mXzkEdCVVCvLM~#jMfe1f({F!sF3F;(+dq0q9@|gjI>3B zXgmI)@M7ot##f?K0pcjvSqI`h6vydu0uSD9hDW?XD-uJ4{8sdG^^NM(-C9s(;AU;u zz7XEMj5Y0V6hnXH)`bTr=nKMboS-`w6{CcV-wYvT;oH)~wTZs!L3kfyrFB`3)YDf# zRzGKq2PW*B`=}#JX&fOeityoZKsOcnsVXQ_DS2ZvT8*q@a?zAgm*P!~W?6(kR7<6H z;dfGbTZWPp%!AH&CysfT{PfkkHEw^e{mZY;ZX7SqfO(4uXwTE0SIR`VN5ci98zN(KB)5Lqs7PhwLa81tSyW9Nglox-?wNs<&$)zq& z1gk>Kr#W>-+SzCgj}iSEJyHqc{p3PcoKN1wHN1b~ta5W=@#H-%ebY;I!5)TXG$}ql zMlE*)?q@!04P5j|8Y0uXi!T50zU&k00ICG061JbRa*jJL4E`P0K^gi Q03?&&1VskG1ONa40Kbz(?*IS* delta 1194 zcmV;b1XcT}3aSbhP)h>@KL7#%4gfB5a8!a006v^7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKi5ckF?(jG!aE_R(^oyF3+vAm}yxxtBGh^+;wz4RC3L<5*N zocjw?x!;!TOe}x>n0e5AqEZ-&ke-LNH6gD~cs&H(O6;LgNIu$byiBAX>5dc1&}+YY zVhdNNGUg7w|w#CVof~Ha_ z)AvN2{{5f9QRGSJCB!z${Y8Rc&85pO!3fHWbA2`Lr|O}IOV+>5zcqdA%FKm7wr<1P ze-5~H$nF$tivQin-mNkSM(^0V^ln91iK%>5=z)I(0cqrVTvhBnaE)w#l>E=CSw1*s z?2ZVl$V4%W!&bjA<9E&E4IE8{gQx|7yHnF}E#!hmRtI`R5F9bm6$mST2;brIcZ+nQ z)T`2q0LZOH!X+!tvXWZnei8d5kw%ag-e6ykuoSy(RG9=bGb#Aqod+&t})dh=5jSe}y|NzTZ}K z$vp8`ZQ(6>;b~Am=j+i~o5_XrhCr#NIi!yw*n$I_Sx!ZVZjW}jx5(zwwo=U^QeJ<7 zv9>;8^?Td{nqlT;W7Y@H8Wdr2KAmDI0uEt;4jPO@-uP1SP38xpI35)l48htz>bF9Y z+A2pdUuzOWXmF-E2YNKzEN>MsDEKQ<##sGS@!e7a z=+!;Cqm!IVby^OqsSU!dqrB{YHYnzIiv`#4C7 zC@TtJQr4_;bewoW_1e3yJwQLYc^(nG*m9~l#oEYT@5*^BZ&S2)Yp#;-Rdaawib8fN zBn-Yo!~oRKnQEcihe(0`%c2fYO928u13v%)01f~yb8u9GS4Jy<1ONcM5&)Ci1V;wK I1ONa40NxNx!vFvP diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.6.10-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.6.10-compact.zip index 12fcd3893476a4905144491fde1f1684640e1536..a3242275a9766ac6c216fea21f1a3c61303c6320 100644 GIT binary patch delta 1232 zcmV;>1TXu{3dsr^P)h>@KL7#%4gf`5J5|el%fz1q007Mr001PD4+STYLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Dfwrv&2@sD3MUkkg|@006pcx1*v{eGWF?3RWx zGc8FO?R3X>Rn>R*iftu8WjlXCcCKka6q^s&lw+T1MY}-29eNR{#_i-ZD4kZOKevOv&iQBBaeX^B>8`ifRzc2N4(o>c(H*EF3#Fo@om;skldh^ptZsCO!&_hL4IxsKnW~=p7JYcnQKbt3M>eDU2fZj%2H+Lek4gF}KfQzLLkA;!n<)OUV>y zQUrePhqCO<(Y#Xl$s?}4f#U_yO|ZuLx!=QSS&%ga*B>Q?*?20HVOir=@w}}lbI?$F zQMqMx9&m1#FD`#0SENjfyuQEM^SY)Z8DS+7{{LIE%lgoTbB}rjPrge|O)qh9VpC^<7DBLGPV{*5S>>qF_e%=n+33 zlkpwTuv~v{5JOm?31cay0vTQswX+Hktigu`!A1|FZ+hwpfDFC{L@|Qvbe$*Hu?c42^|I1HtPgU)oc!{(5y#KP&% zt+*F2&`~QgqJJ|7Fr%%HzjcIy9%+TIEeD@n?bCnz>k#&c1A+e6IDwBY=IHwe4Eg4^cdCi}r|#i+`&Ky_|>^m1^mM!2Uu$ u$NnAocQ(9GO928u13v%)01f~}Tsu|Eeapn31ONcdll=rq2H^w%0002fx>^?i delta 1235 zcmV;^1T6c>3d{-{P)h>@KL7#%4gfE6a8wg3KT@Iu006}j001PD3 zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKi5cR%TqnQ)K?wn=J2Z^JHe0AVgmapV;9@}m6 zf#zMxD+s^@Tdw}Y^Q3S?aN~cvF49WsNxZCj#zL6Q5jQgp?XZ>L2AenkGK8NA);n}9 zMwe_>!4=M)`YMragxA69L~%Rsx;^FXLKQx&KlSra+# z8${Uh79z?){II3)i<1)J9`ip|Nl zd`-V{h6Yp<)wcE%!~D0?i0hTH%TjtG&Q9O*jYIN*m=*}mTP>A`=x#6XKBYhFh#}z4 z;d1B1ZHzg)%m03Q8D4(?_fsX0rIAY~cLWFPJx3cudr4+-J#5jW32#v5qQS6R)D3}L zydl#a$Q*!2H(T*4U~a6hOQT+NOGOCjR|>GV;!;9PSG62fTw;K89|$cA&L2wTOn)vj zRyuTc>xIM=SL&QG5Qx93j#l=t9~7^aOq-Quz7E--HD&C*$#sA7d6@f2!}qgH$%HQ= zjvymesfK}}N;{u=N+%nNB6cKv0BGO}@nVF_ba|K?wkP*<)i!DdSyz-dLx_(^iXbPP zox#*CN<+1Fn?sgh_FO|ce8HZ0;yP7%9cW z`4~`x)J=}$yQOQ6DlXLa7(S?JQv^AUxO}RxvLj9<-lBD|U5F@_RZv2v_H1HT@Bf2- zqn2rWTVR8uK*^T1-f5a8r&H|b>`Y3e_>+VdyD)+46hD98to70r2SLUxw`NRu1B)-w z%8rW%re)9UrFnJ5bch<3km`*TH*g-jEDf9|KEE@|{wcgu#o4jICOIBYpgcHRH%Map zUW>Na0U&OTrEvjk__-rfVie!6;GuGh?n})SfQ=;$e&)aLB*Zb?ROFXtqic**eZq8}jH?=Zm=E@XB@%FYGXPXFGP&hI z=j<^`usi#YuK^utAzTj`ttX1ZYimPmNz57_0a{GwM!>=%Y&H1t= zfDa`WRL{~I(GgRSiF*5bY_s^Y?&Y`tqEORUV={jhk}is&(Y^6rey%Or{CL^BV))vy z9b7g74Oa{iwi8&As!0Lv_1(0Sa1VysB4lmR?>7>RC;=tHcXN;fm~^T`v3YhTHY=bl zIQ@KL7#%4gf`5J5?`0G_`sJ007aE7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Dfwrv&2@sD3MUkkg|@006pcx1*v{eGWF?3T>1I^JJd11f1S z9RJ4&`dUW5L`n!+5E*xvrX^ zW%=*Bw15t}7fYoSOxjxTfT?EBMf6%Ro{{knMrI5-AuNBwT8Kklw&k@m2mb7u7KW+4 zdf1dpF=YW?DQKCVXWZ(nS`F?jn=1iV!^nZ({wc~69PE0J*nJ;jzbgFo!wxM2x>U{< zu0L*V%`4T47v`BM zRRq1J9yxz6kf%V7TUfI!=z#SF(RcyAFJ%u8=1)d^bTEppcR=w8O(tb0Of zep|&#C~wg^VjW!r_<0u)R@CjMvv6 z5Bli;1`67^Q*#0?PF-45c2{K!H9|Qi=-VEY_e5qIJnV`K!oo{?F2w0mBw+6da-B8K z?bv_tJI`p=0wp3i`x!%Js%GjL6*0vjTg4wzZIiSC9&68b^Hz0j%K9L{fuYB^+X#>6 z!p4{!68`cFa-*9$zE#$MV~OG7LINio$s?M6v+mwCqhL`h4bw)zhJsy~30S{wX`S$p z<~3EW^=x@`^LkI?|H2kISo06oUmpa9xI=%}9H?X5aZd6Ikl5`V^gdHJ68AWg3}5xv z*9Q~u=%>pV0+dQUMvAq<0^Y-@?6fn&=tqGwMFjV3>>|=`h*I&54hwJU76Nc40DAsj z>um_hK5?OxH|LF6(;}iGXnuKoJAG(Vei8m5fZX%>fP>%PTAL=wbi$?aGkY{lqDX)L z$-IFgF+FtEp!&BVc=5sG5CASV^wAeNtr)!G+X=i=#f&M98MT%pZVZ!iB6Z?&96^tz z;vRjHcV&?qxGmWhYz1q;iWT91MyoQ{;)ba!Gi6oE98dxsc4W6wp%j~l!Eka`2;mYr z3Ofpc|9}~vKIXXKmgR3$fNFvh5>J2L`y0<;bS|#e7ORqjyAIuf1|nbl_;V8|=mM*k z&>aVSVHczI0VOl=lLg-^&*E19)6hWHD(8VRC;(NS3wUekNTG0|Q6_cAbiIN6`WKJV zLmQ>&jrbEd|H5t9rBF)&0zU&k00ICG07YCoRWCp^wR!{q0MQZv03-ka005KT1VIM8 I1ONa409*hunE(I) delta 1194 zcmV;b1XcT_3Z)7cP)h>@KL7#%4gfE6a8#K(yE%IV007C67f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKi5cR%TqnQ)K?wn=J2Z^JHe0AVgmapV;9^CJq7?(S|Wq5$| zq!BBYUn06gZ>@h%alh7Q(&hy`HV61}#BmVxI|wsq%?(c(%O(;?qvIE}UEO8`64fXp z)ll3Hs_y48wt?I@?lz{&`1r6F?exa@-$q3GzV00so7#EL=~{{#2IR0?s&~;`VvP}@ z@X}yWmVBeD+l6uyt%{RD^~^XOdjlArDBe+z z84`!czcT^HHc{$BqbL<=QM(7_>7zHHsnmv;RB(Xt0e9)8QezjaEoW~W$gy_XXJkq1 z5CpVYys=4w1I>JC29a)oY3g&~cj~zo7sMML&31p^REd{*O|ueT4c94ovWm5=_m}yJ z79_$mMQ?4^u2z1RXt)N-B5aDyPOp+RoS%S`QI3K3nc(AkK`6rcDlv8;Me-YMIW)#F zmc`3=5c1EDWRoLHTaWM!h?ndzi@pi~M13R${-;aXiXyk??8DGNRoHoqnr9}21k2{H z*!X|(Lg)5x1VVxcmKzlIdSGWuV|gS7*7bp1 z)>}{Up+I(naJru0IZ3EBbv4GfZnFm|PHBHoNF%RhM^Ap#^#orvgHxgD#$|7Z3MvH? z8iJTnsbi(oupv`?MWzSsH_&9`368-86YsG#=He>mmR{r|El{{j_P1pO4XaTLL|h!Y0u|afp9i zfuJVc*QQp;Vfu#e#2#nv4=^Z!v<#G!r7Xh9pga0sNAW`l z=rM{n66{&I`gSUNyO+DDIYqrR5@N`Imz1zfb+;AJYIA zBC|HcwBVLbFo*K>;f$d^+K_MbAxQ z@oQ2%t4h%vtp8{C-v>}j0Rle*KL7#%4gfE6a8#K(yE%IV007An001Na005KR1VRSA I1ONa40NX@3A^-pY diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.6.11-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.6.11-compact.zip index daf0b8f25626caab2e76b09b27040804662e701d..f451b3b4cfc7e23a192665c88afd4339127d41f9 100644 GIT binary patch delta 1231 zcmV;=1Tg!`3djl@P)h>@KL7#%4gf`5J5_=;j{=?q007Mr001PD4FxBWLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Dfwrv(sG}ZA48Et3)am|>o=T4g}SwX%!3&FsA zGhDj8Mk}G8g(ghnIC_R)XXbyQ;jX5^tc|#A+))48)|aO0{R4i^qVd$VG6flivwL68 z&EECH#z*3wDkRA#uU9lY!(|;xpryz6Z`UgOsZMC)fSs0|zt<(NMTh(5%Q$y_VD9mU znsfgV$1vQ({bwE2@~0PlEZ?;K?>KB&;*t732C_2zX=0YLn<$Jq=mD@V_2zXpJ&H8h48+wqJ%J0=vh+%ndB=K0oiVrZT*@PIM5<4pu529&W8KOX#40nI*@##mBk#S!WL_|1b6V$92KtKjufb1Hwe3kpL(=0w{~dTf&C-Zg}Kp3dx$toT_Z1h0}ECUpVs9TxaS^=9>8>-o>32SRvN zH*SF&)IoCR_LzSannhBNWA{g#Z;ZAn?p}T7ARF6SKmIdi$FiHl{dak0>jKbxpkY{+ zzdm*}4JnKb7PGL6_c~w$uI2{1CHHB~<;ayFeyM2Xs0)Pm?2}a=gP-OW?sHW*n?Wm@ z$3q_$@zGh!Y4l@MuhsC0T$zT<$0Ny0lazZGS_R6b?`D4#a@as9y;D7XiB>OvOOc)? zTBbTOCSp_F*p^yK(GQs$DT0zI#jT}9s3zdqG%e7n2y?@{G6bBOB<+8pgU-EGWN9X-n?b$kgk6lErmzUBZ_ZLWB*Xk5+a7YOkY#g z(=(M=_anW&#b~b!sg_WgB&8xHdgf z^yzqxMP*;iuQC@AsZaJ{;Ba=*DQn;lHWo_P)3b!e-D76nGQupLV?zn`<3I`XJ;<9a t|Kc2~0)0?R0Rle*KL7#%4gf`5J5_=;j{=?q007OC`vge_-~<2w007@VRha+) delta 1225 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 I1ONa40L@xMs{jB1 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.6.12-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.6.12-compact.zip index 5b146bee61ac2406fcd5c3a7399fe0cb2df7931c..6c3f55506306bacfcf6357419a07430b9a308ec1 100644 GIT binary patch delta 1220 zcmV;#1Uvi33dIT+P)h>@KL7#%4gf}6J5@WxMzos*007OA7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Dfwrv*9`Hcc)JUwVWR5E7$ge;Qxf{m2|reqOdz57|0cMU6v zOh9pXNlnt4k_CTOJ9&bf>LowL{SS0Rh~RSB7`L-4Jh&bu$umS$_R|WMyc9k3DY4;X zL{Y)yl066e@2*e*nq>VmIWw3zv7(}{`da7AP~~h9#9S+EfxaSCyGP9jAgRIy1b!?x z8TU@)isfs&2vzzaaRaL$BXHmhiBE-l8^`Sa;G*rTK|p_P5jhc4LB`W`xda%&1+|!0 z6bTs@7K2PDJh4C4`dNK5R7bKADh4e{De@zDpt$JJoL+ zpN01wQmO$z>Ewg=6=ScxNK4xgFIrFU5TlUEHk5jmQ7*pZ{P294`TjYyb6>iA`zCtz z_2UJqcJC`u!6_Mn0gQmEzK!hb^X-s$DdvwWWY>QS8-O-doQVYzE11vtqQg)nA}}^? z_U&^KBF_RoR1Eb}$|X_r)iueNDDhnhZZ><7C^V=-3Rsj&7Npw?vSC ztU#Ull&5_!Zus&RD&gS2p_!~n9X~q@poJ2(mltf*ifdpQrUZik)+}UgE``EMks*Ec z*A{=(qQ0v8jR&*tYh{?KOq_qE z=1p};T@gYE_F^6u-6)iH44z^_`Z(Tl;IHAGaz=(=8^j9;rlGc0)$$hpCnP1c=FQ#y zn}YrJs4xAamYKm79p!wDtzK5*`QpJ2&RHe|JxE8wO{m-_EU1a2N=2>se^MJI#DbyB ztvR*kN#mGK==zL!t~Yeg238 zV;g?H0zpO928u i13v%)01f~~Tsu`e#74B61ONcdllTNl2HgYz0001!LPC82 delta 1222 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 I1ONa40B|TJxBvhE delta 1194 zcmV;b1XcT?3Ze=ZP)h>@KL7#%4gfE6a8%!F@FaKy007C67f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKi5cS9t+MjLqxXEj?Xnp3_+7vr=JIOgDjrV7yjI&>*YRi22 zDEh7R53pwWiMM}_RsG;3aNmy5Pxn?NjCu-d1C5&Cn{{`N_;|xIHVyX9hyCV!nDtzT zrW~o>8kC6xrPjDSyeSuqd^+6j9*;*BJ?N-U7G`uey|-5DomFrr&G@LSK33fQ{mz$A z%y3P?wOWQq?zh!@{fXI<%iVEz%KF?2%4lR0n)z_p%dCHS53Iogdr&GVL>sIGJOZ%Y zJ(v3i#AFg}kI+D(4zW{$)*s+=ZyXzyUjb3FFJ15kWP|1ajyp zLr$4b_tZhIzhjin{gV9Y=)hU#l^&uxTd?uAI{SYLbiuyXyHBag`m8nvM)Z7I@RVR7 zNBllR@yniJhTGGD+UBO2GaSl*#me1#&|0Xq@H1SwbD!Z{VmA5&_R4pahH zrM6R~%BpIvOfPDCIo`uF5iFtq^gPOs_GS5k>?IEewl(y_FTYnP2|_d!64y5zdb2-R z#aDl{2WYdAElZm1%2{qmG_%Y*D4{eJ3Q-uP`+lHx&KcThgQbq9aNZ}9mzg3_{Tnb6 zm$A_;kg;zNkS+Cz7whdGq@J&*xV`p&#EYp)!GJxzh;vAZFYW@R`_iZimi9D?gxnIZ zb<>1quzaA{F_3F% z9tHNjiFUCzzap`7Rcf&f?>nN_K}0DhYf9K&N#7{7%=@o)h>zh}SKzEb(2mn18f?GA zAmY+peX8)_$jVc)&`yHM_PYU$$jZWCTzi^|fQbf9kp@|=31j4o<*+|09p!MBMcJGH z+)Jk4#&YTlBX0u+Q*oE1VLFvEhL0by{u*Z-=h?-caH56@_7k4Cj+_ht__~h|tfOr4y;0Y13qC zZ&z(LHogDsF#sn}O928u13v%)01f~zb8uAOYVag@1ONcZ5&!@s00000005KR1V0A4 I1ONa40LLy!KmY&$ diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.6.2-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.6.2-compact.zip index 25b265f547be6a9f2f6242d4fca0754842f0019e..c8505fd5eb91ace11bc0cf0b21a6ffbdc798997f 100644 GIT binary patch delta 1232 zcmV;>1TXu{3dsr^P)h>@KL7#%4gfh^J5_0O4Z)uT006)e001PD4+STYLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Dfwr#RK@tPVSdOS^YJDt5O74f~W7w@WEcZ!4R z-cK3-FAfOKd9+ho27(h9W$u5bU(@_a#WWU;mjA6tB=XkGC>#2x=crHYIvAz%U#z@w zDQJJVqRyucaLs}~5eoww}2r&H3K8LU6!2_cmUnE1D5d`CaHKUodD^Z%e$xqM< z+!&YSIm5U~q6bE11!1Od7!1?_@lY%zU06-uc_HG_fBT(-cY)@}SUi7PN>@~O6j-Q5 zAX(KtHbEd4JNcbz7r#?mg3?w+D&gA$pA{5E_ng~&ugI1r4R5KQm3oIP7bi*pnbO}> zAl2GLOs1)8`DEXKeR!)kS5#LX7}zAh%`)}KwE8f|-s;D*{vUz40F2^%(oPXJYdvwV zsf}Gn>Vo~nC99{U&`f`U1XTS%e4e@jFsSXeh^Fk@VFYT8cEhIl1>7H1{Nd(PyKC{% zqY${{$w?QbCn=%t&&tk{VD!h650d3AD{i=c0H=*P0yiw(rC>3DKJciYelS{Cy!`Pi zz3-Ed(G{dswSnLa*32@eoAy|OcB#?-v#pz4QoLeK`%4QN1GcMTfzz8P=XH%-H2axRs z;`KUhTp{{vt>YTpOu2;j?_uIZUEZ_Pw@^ zK^ya3f%Rn+LPvjm)%0I0LGK?(1iH8+IB-;`kfMOM3;wW^(7Gcw2PGHwq?|AvIJ-53 zg^H~abxR?rRIkF)B@Lag)#Cbu2KCM>p;Sa`rHH=nfG_W3JInK`T2o96aGg!Y-`8p>@ z;HNqv|Ho+1O|YZVC6z^&T&bD2>?Jt%9BrK+{y(bnbvomzD}x!cf{q%G3sD_e4wn1J z!v>|E05N}}Ds2*8t5}_e$~R+%Dw~Gx#W%bxm%|zCLlZdJpRPbW?oskVQF#VW2;n4; zgfyH#VG{=?&#QXIJi-D;#6LwZPgFnHZ!fSA zU?0W+CJ*2@5=u{%M#n)}GJ2Ol0A^Vfv6tMm9X@}Qa_(g0>k}y}N*kLdQK;b%X|e3s u61N@xHK_woO928u13v%)01f~-Tsu{1a}B|t1ONcQll=rq2H^w%0002P0z**% delta 1235 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 I1ONa40ElulqW}N^ diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.6.3-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.6.3-compact.zip index 29f4032aaeaa6400be116f11cf94ada8370e7e45..d69bb15d132a831b5e565279a5a2e83faa5144a4 100644 GIT binary patch delta 1235 zcmV;^1T6d43e*Z0P)h>@KL7#%4gfn`J5{2v#9*of007L97f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Dfwr&@RDViD}dOS^YJDt5O74f~W7w@WEcZ!4R-cK3-FAfOK zd9+ho27(h9W$u5bU(@_a#WWU;mjA6tB=WU*gxUx2c9kvDQe5N5FUH$`-^nAeYAa}y*SMQ*=**dnm?`)W!YHp?{!?1soU=7l z?I2VrNebNw@k2Nx$|a5+Z!g1*yLFF~eVkz1bA<`kR`GxT1eZm{8FP*luwL{Be+$wl zPzA9C##M*h^s{Ji$6WwZRy{Qev8(lT6 zaftP9Dry?E1o=OuZGh+#G9p%duhxqpT7;jO_|0ho*nkm~y+InOEYf-u@>--whU``$ zsQidz+holS(imW0>p&9$2PJ7c0cc;Hep>lw4fTJ|_tNAWs229!Pcb_+TqgL`!X2ny z9Y0+8*WEI}k)p5DlsH1t!O0(AmnWY`vz*2wkznW$aC4B;%u48I;4;-!hOnVptISJv3 z^jc(=`yDXny4hxqz&LLC6zc5EvqZ8ldSvN0x+R?kSIu}eL)F`DOcd{|+X!sJ$b8Yq z5(>vxESfWl0T&c0c$Tu=3GH;tLpaMh2S(C{2=3vKK54YriU%jqPieeztXOwTrD%Ub zhlNhH4ylLb)uoa-v%=bzN~YGB4_U};Fm%_!Iy3u*4{r=x+pbPfNXS5gT;wP+002B_R+#_* delta 1238 zcmV;{1S$K}3fBr3P)h>@KL7#%4gfB5a8!xG1Kq6z006|17f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKi5dVkKLoGpYVD(zebAI#w4NY}J#3v3M++R&yO>XPUl}ZU0 zX(9wBGN*FCb4-6aR=qA)<5La(#ASF~A-EYRT=uf@yZE{|@3#au&@aFM8jCu$?8u+C}6>1-7Sttaq>7SQm z!Qd`Ii~$z}mS=-eY1p7ev*DgSeC0&VQAiDgZa(G453qmo_-^jeOP~aTYXSIa{wC?kOW;a1Br7 z`%Ob!HbnuNi_WEHcA{fj4vr#|`U&8|x9@jW=`fz!$i;m%#wC@En3&sy zL2Ao4^km^=5d4KSf{S!s%*HIbzlH#!ea08%NjQ=&vBNrc=5DO4 z!RV21Q^-}+apE>KjrXB<7BYU73>x7Y>7y1`*lg{i$wT_F8q0Sp6D+ zkb|A`19*GEe146l5Ji-9tTQyFHqMrNg=Y~QKI-f;fJ9td>=W8UAuy5ZgKj+$m7J1b zp4q0P2)qO?2VWr%u`ErBV3Q>OTzCGI=97Qiupz58qV7`U%Q%7|H4HE+kQR0*YtKO4 zWKQZ5?{%Xu;?A*M7stYYzASY@BOe!m&b)6>z_r@rtA%v=JP;>B4`nS*X%D3qnO1_g za1|YXv*r_CovgJoX1Hi{ekauAF;b1sB}H&`IU+9cFY)V`*DsCAyRQMYo#xg#C4GNK zHLU@(ZecUun@E&uD$PeuKGtWU3c{pni%TSskm+!b4-P`B9p9dl0ZC0>H_Ot82n4Bd zE~9k45z?Zqi#X}3qd)5lt{W#6UTYv{{Y~O&1j1dtziX$eg(uw6chU_U?y!rk`IcL$ zw7DZEuu>wqc67Ui&)tBsXg)j8;Mad%+596Jok;$8Mi&R;{x7ZacR}_!3|@KL7#%4gfn`J5_(|`ih4H007XD7f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Dfwr&@RDViD}dOS^YJDt5O74f~W7w@WEcZ;M2O_i}p+e;XC z(RB)Ke08GXtI2;78aPBHKb+`UI3|*}RCRql%Kblm3XbKsCh+mcVjM!Ek`2-k>EHY~ zlS?ooFrPTF8@)k$twBm~p*UNhDBCf^L(!wAx9Zl2{>hlzWg;`lzbaOsf3QK}JN|d6 zTmu|#OZF!Muo8aDz%N1~lSh3aib5Iz9I{q1Z7x=4YP5f)l73s5yEG*fOaoWtCF&3K zGb%*qC}~v^DXt5F=UCm9IMugy-}1Gfuu|xJON5B9{grdc%J^!Q7;M+f)BEl3Q0ie8 zcZFn;4#_AK`u<$t9CFDs}AueYRotO`^zekXmgh z-VZ9}pu&GBE$>}!bIBQYLqA-KX!lw`MVI^rENwP=kWe?>h6{PxNchCt+|prSGl+*A z-`CgQdeg-WSP#n;9XC*9VV?pz(OvXGmjln{QIRXG)c$smaUBFvB=sFNn_u+0J7Yqm zA>VYGD$wz-UYnULZq~6vqJnxC7Ayn#YJ<+PZv}r9a3vPD$|V|JNow4RTF&LP-*k3Gt$33G(O98?v8pht4BRLo@I5U|L$<1G zbQXNxP*suW3EDujJZ@}_h6yK0{13#hDf~%Sg1ThRRa?qA_V8$?OyfPiK#E*;$(^P_ z**Jem9A@}nH{H-=bsz>EQ zTRQ(IyN9jX2OUg5z~OK=sF@W;?9{vkE%bi@i!S+Nz1*~*ePur*e~$ZSpeZNQj`&$6 z|5N+(OkxVsf0#vce6C)Z6EE1F+BhlZG-WV;SiY}z@PCC^f9IsMi@Ca_aM-x*ji1Ga z|L8opp-66qrhHxU7)K(mW<}mApeHJxR=du9oefBrU zF+LG|>e7ZS;i&_nCvve^Bqj|@;t0Rle*KL7#%4gfn`J5_(|`icdI1ONcg OljQ_S2FU~f0001Qhdc`a delta 1203 zcmV;k1Wfy}3bYCrP)h>@KL7#%4gfB5a8z?v+y{yT007957f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKi5dVkKLoGpYVD(zebAI#w4NY}J#3v3M+-aHkdSrW;7b#}K zIwjt?1!11K6-9qptw_xcNY*Ihryu;RpA)Gc!5lmxhvE6?TRK{q0N(@EoYUT9+~qrd zE5+LNt;CPTs{5o^@NHQwKR$@R=$oB}NE3vUt{W)c@plDGQvh>4FhEaIv(~~KZEYB5`p5jrZcaQ(>3I*&t#F#iImdEMlbG` zgP05@xU{7Q6(CBqd@Y#-w{>0}i25LlYv`)CA+R{mAqF)ql1TDahP>u;Ev7^g`F8uD z1WDege${^kpX$H$d(1-5Vm#n?VTtQgIiA}29r~~I@D}JloGTzCPp9M{XAr?v5&v;D1om6{wxr9tp zB0lxE_m^gI%o!;u4hh7#|KTBY#n*`8n7-WDLi3=j*- zB-SnVBOQnmWRr(zIc_r{AG+7->PEm*bM1fgn80z9Q5^?%6FJ$Bbu=Oc4lVasdR#-jEXklkPXbPIq6$;?wj~+hkKE|DyFn0r=}h zNTid-Hj`9$4joR)O))L?t*n3K^}gDmP~(M8izvWZ#yt}9$x&q+cLRXR6! zr?fXv%}$Rqi)Zqa(-8Mz`JT8Qr|^ILN?xJ-&t88S{8fg#~39Li}PDKBaKQ3kr4)lU+>wZsVLh+g^;%yq!nBDKY=f_yPqc zY1mF8fX%A9BJBaaJQ6anjn-1=HXnk*5&D1FvQSF_0zU&k00ICG04{TIRC5Sc+y{yT R00797;si+s%me@c001b7Oospf diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.6.4-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.6.4-compact.zip index d236e34cafd95a9040472b92de21aebd9dc6a33d..9324b26422b02a1ce795690492fa9c68d08218f8 100644 GIT binary patch delta 1232 zcmV;>1TXv43egG|P)h>@KL7#%4gfq{J5?WL8;_?1007L97f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Dfwr+g)Ez=~49+**+ZI!T|<4AOjZ@of;$4uh*T3KCqiv zi{QfEMW@Ni4nwh&KM-+n94iWxYtL4Ag`!@BFewI)hC6>jc1i7>_K-n^)SPCXJNYrS z{vx;LB*Z4wQ5$awEcoCOZzxZPNRp-lL24Va(|$Kv8K(knWQf4k`0$!rA{5HKYY}{% z9SR5^^h!U?4gHGwEGc$I(DjdYt%E`!MnVwJcuvtd3(50Yjo;eK2C6zv*AZg&LJ&p( zKK2;UT$O*|)B*X2fF%0kM6$e_4H`SAWKJxbG?=&<%FPjq8CK*7jf%$V88}@#Md=9{ zXc%GlzkF?PVV=rM^99@J>I#4I<*=Ww9mw1O21*!JYxDMhy>92D zkBCa7;h-F(I3aXGxz(!e?&=w0k z>>A(tQ7672_v`s6pKh9jXHOZJCI_D38pSA2GCcT{T>jp4bEI-)kPx#f98zW`)7c)= zCDDIERm=nKZKP~uQ9te~al8l}!n3R&cFAncbMJ3?FwWrkI8pMF>dR2<|dkbH&1`@Kp=!~LlZ@72afQ)Mb$=O2x1;}@ z1eRR&D@E&gPx*)``B2>S99a9RS4DoxgI%DSeMVvE&H{{~^-l~5`Ykl@Hm56MBKNDs zWwjvzhN$^fxoz5{ayvROc>nkx*YTH->r_F*_T`qSmyx>6d2SmJ8#8)H31Go#$B2Ii z?Fh-o<&fK)EpGY(xe_eDCP5Bjq%q$d3HV>vm!@V^@>$h`f@8#J)TL((EE^Y)`o<~R zQ&1R0$H8aLS=SkfOqPH;MZU8oJk4jG3m&K7kr3`O^9#?={PM>b`0IjvsPqn#{dzYN z#+i=o8vps^!aBL-RVtG9O_0tz1Dk)IpOWGZA~#6`ZveY4S$y*qU@mj6QI}C1&9n$R z{GWfvO8$owkMPevmAQDR{X!zD;gY|z=EgdMS544Yq0w#`NBsl)s8%v>63)?MQnmpe z>SfRL=M!xLD;a3s4gGo+n`AYaM)bMVsdXB*ZLuX*E8}Yp4w;L=5$CqwqJt%E2#lac uj9~w@kjB7JO928u13v%)01f~=Tsu`CWgCyD1ONcclLZAy2I&L<0002nnoa-! delta 1235 zcmV;^1T6c}3e*Z0P)h>@KL7#%4gfB5a8yltS`MlN006|17f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKi5d&oA>ToZ3VUT@t&J9?V1;KiRKMe^> zW!pMvfQ}{T(S?6CCV&X7PW^sv3(s`Xq#->4aRGBB1`$(r=&Fa)0=I|8vuy2{A+xhZs3rl~Bw(*UH&rvgB4JZCr0cfg# z3?VwQ_6fk1O{mmou=GFil}-mMaTPb2vWUVNqOT1XxU*;jk|Q~bxK(fickQYRdELJL zmc|UKs-Y*WHVkhOy*PD-iMWTNkpGn9{s|p2lZ4gJw=Xz>f^m5BI`X+9-MHiLfS0{Ibu|vdL#V(1Wu_pVK_6)6!rdcDuNy>lWjtiH2n zL$}0OFZQpdAlRRJ-%HmssH-R(9gr*ez^Zr~E_{ExctVHJeLC%`f(Z)Hbn7hCdB=(X zp1w1i{RcAK;;UOqa^JC?8G-yp#U+^;wrVny^}-xnkUaKJWB-G{P41nOVQgC&a{Ds5ZovbBBB$eppp$ZN+vSmB1$ z6s~_t_15{V)g@fLwB%KkD95&l$T}+YQ)5vHVH;q&QnnTg0CKWWAS>yplGnSkC4!`x z=NLC6eB7*;oL_^W@seg|?x2kSXVn>f7_*fCknjN-E^c08gQ}*m>n#6la#T>0<3WC4 zUXPQdefAEw{uoM(tWGuCpz7=Oz3%$UKdgVHgy!tQ-zpUDwjJRr&pY8s=K#JX+f|IN z1+9W!UmdI0?jHgPdqpA_RVlFekB)CCH5?U8@u~_yivf*+py3%>TpLkbJ@fYzjadWA z$F1AQ$7I*m$rCLi$Zo$0L;Q=f+cuF)|1@ulmp3apAG{oq0=@U}>Zzow3FocfY7Bqv z5zm59^3pCFGs>dmkMPX()TkZ6=#V_VLI??f)^kjnF@k_aKBcaP<~05&&X(Dfw^=;S zhZ(P@^oI*K6?%8L0Ai9o*mej7Mf6Te!BhX@l^DDW*Ihs#5+<+~bf<82*xQ_XG4C76 z$y~hExA_;)kcxq_6S;efG0{GT!H$3Y56v`6UGY6Dpy~~YD|y4I=(U8mzxc|)xFw;wP+006MVSeXC- diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.6.4-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.6.4-legacy.zip index 28f2a0b1f53cc39726e13fb782bd4c84b07fd842..7e2fab9ca788ce16cd49181b63dfe85c08d8ac77 100644 GIT binary patch delta 1197 zcmV;e1XBC43a$zlP)h>@KL7#%4gfq{J5_yBqE&X?5^t}J8jl|L1Xr(jOsevC$0C#;kAq6H77|IEhUQ4F~|VaC(Y&mo@1 z(@`KOy2oUGgSIIG93Q`8luzOMr<8+5eQ*oi3vLT@*Sb+d%jpbk3Fv!!;osOOPy`_T zO=m|wg085!f&)Tr5(iUxnbC`nfe4IU@)^+;l&kUCj@y50Omc!2yVUKci{tFiU4^oK zve{l*VHN1xkAd+#^tdMoYPoQdwSiHE!Cj&7f%&DGy{`?L^urs4A6BKJY;_%jz6SDZ zuTF+bi5X2Z_4wallsF-6Vr$|Xq+43T)Ah+hjwH@QqlOvMGQNwIw7|Xs89#Usj=Va2 z{5$@agvx*GkAXo&UX5Zt>u-gPDpYM%4nBm=(!X)A!=`2$#OK~eJG#LFj=gARXZA+X58kxc(>9o?k9~K^Mgc9cm|d0SP2)sL0C<12`ast~LGQ|GruhAf1)la$*D-H|{#%#oE1z^7 zZVqb@SPXTK8s!U|Sb;vZ`(x>NH!gd18~cB#hOyrG+G>S?g^~U|?6v81vdW7u>-h3V zQC!Qa7CZr$`cqsPkPnBjf9)%xjvWmwA$J3eIM;pC>7O;3Bqf+)P=q-msTaQrO-h=WVo+ zCLS9r!_1V=eVRu=y(EzAV;N*;! zPD^f*U6+9R34NnU5)nNjZ38YCLePKjGRCmcHV81wL!2u5E=N~o&eEt}W*O(!1Zj|t zX6wdg7O45vT?%>h2|Cyxoqw722Tq?I-dp@>2aNl~Q~5yQi+DXbAlWRy46|RG zE6~Qqj6F_nv2+5~R~J!jr`!MH%p@^TO928u13v%)01f~=Tsu{LQleFa1ONg6(39c> LNe0FQ00000S&u|> delta 1208 zcmV;p1V{U>3b6_sP)h>@KL7#%4gfE6a8xlpHHU`;0077m001PD@dPK4LL`4DuM4|1 zvFXEmrMFlE-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B> zTUxWZHGc;a>KnJMlDq$c9%)`VZPkKi5d&oA>ToZ3VUT@t&KIg9 z$sQx&easf?#l~xV8$XHu=4gLhn>hm{?>P(ypKJaz^eAnm&f6E(1ZX`>!_2|3v<4r&!hhk$Ob2LzTi1Cp9K#doLE0_l{r@}&`>B^X-aHG&E`K&b$DzU@``FavKqM9BH|NG$A3hYtkZ zEbwPpA5{OdxNUb0pFn?NxJ^i+fr$o#zt;&WrcUA$n|R94?V|bZvUAFeHvOwuesQ(O{kvI}hHB z>uC~1E;US!U`3CRh4QY7&x`5XwNb|-iw;ZtSoT(yM9>DpE+K!3>nx`6C4y}=bm-*2 zgaCQmdmd%5S zaEC4UeT$au{dfML!#y|k0c&ycWP~E2(IbF^ z06DKoHYEq05@LV4;jO?=5h|q%{HQ!<5675Ye`BJvUd9mZ-~V>zxzqh`yema?7Cti5Fve%TY3hXK01FE>e}5IS@4KKzCoZC+QV|9v)EIDCU_~!-HmBUm zY7(ghDhmpB-e49TZ=SEh801G=n4}{&Za~D)SfB!`EaQJ?@-3;t@9y5v1gn{%hPdO2 zlw21=+|z!Hk1gpcr*75qo(qdhf(Z3fv98&71+)>P~$r{gg;x}9j8OaAUYW6^P zK{eU3QXXH%F~2MrZ(Yc3TG28|)YVjU4)gG5=`8>nsf#VxdX*DH1l77S$|E)X5+)7Z z@i(sodd+{cf;F+VQf7GNsf5mV!3-u-k*7A_nfT-Rmz?#Sxit_RJyEruK8n&L=+#zT#SJ&C`51X>mgj&RcTtO=y_j|e%*$Rrt^k^ z)Zd)ye{odrQX+Z;p~(O4-UE_%zp7^PO-dWN>G*q`xj1o?`L_#h8gRG4LOK=WDRK4s zUQ{~6s<`NgX&&{jE_GL(jaKo^FV*0xA8Ynxv;WyRPb5%F0Rle*KL7#%4gfE6a8xlp WHHQU<1ONcYlivhM2FU~f0000R$3$cR diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.6.5-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.6.5-compact.zip index ea316dc6b9efcfea809a2bd9707a538b2240c7ca..475877da51e42d4641dd3548159e7b5ab034ccdd 100644 GIT binary patch delta 1232 zcmV;>1TXv43egG|P)h>@KL7#%4gft|J5?smeAlN0007L97f*j5*K@rVG4tx6-~i_Z z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{q9U?!xK}lR zEP1^y2Ex+{gw_d-E?$Dfwr=8e4bvov9+**+ZI!T|0lDE-@4bl^raR(a-X{# zyvoUz`I4}iy1Rpk-I1wag=2}>vhZa#pa9*af@}o|Le78Xu}EuJffKoOq)+4=q^$e2 zHtYR1@@EUm6jcAU1qa?LL>kpV0@0+ZAfO%-eS>t*yEAr*0;e%>(vgR)lB@5tabFGv zh;@YyW>m^CwScpd1k);vcVJI|mGT<>3GfWwLGpk8`i%?k-LIhux~fc%UpGoEsh0(K zD5XFKn38|ij6e{nY@H?G#AG*eNok8i3ifrqA_{+yix1dcVH^{)VE~7M37&Xhq=|Hh z-2DnwlJxKVr5Y#~EG|xPwHLD`%1kD;Fl}?n4xak%4oN>=N0k|Sky3Lek@^oD748eu zp^9G@s;4dYLVOQW?@2M|REPEYs&WR|B+yjs$gqF4MI|P>J3BkX67&x$%r{S+o6>1n z5wtGpnTt>ds#0i}99Ftl1}a2X*GZ(*_8vZFgrec*&#yLh8)+$)J->*U#{z15%!qFZO1FxAUBMF zVXuGe3g&d2T(GQD?VHBd4_zJRm%SPr|6FU*qq_onFW<^y2k^(skzC=^0CQUKab|~gah@xMp{C_656=zO=TnZ%B1JsM?YoXCYt8cBO zGxmGpt5{_TrUNn8be)sre%>4lY^xm(_WOTqJI8A~5=LIGC?c}&ALj`&)bX2cZ4QG% zRroh+b-O208bmW^xNio&ZCbz4qylBX1-GR3rO7LP`GhsQa!Xh8KcNkGwKzV(>?+{2 zNj=ctd#%ln0ab0hquspOg<417r$4xf6{kj9wItfMuSto@*zu>0r_WAJ(K~62-1vX7 zl3IrZ1dG6QwaEj92iXj^u*4frhC&~4lrrxK4EtUM))5@U8* u0*U|c@cFP%O928u13v%)01f~>Tsu`J&V1LW1ONcclLZAy2I&L<0000_15jK5 delta 1235 zcmV;^1T6c}3e*Z0P)h>@KL7#%4gfE6a8y)Pi1w-k006|17f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKi5eGt_`~00{K}KTGEEOW>>ToZ3VUT@t&J9?V1;KiRKMe^> zW!pMvfQ}{T(S?6CCV&X7PW^sv3(s`Xq#->4aRGBBh{d?wQ4TRmBfPS=9j1M3?P zqP!R&Z9y|itY^;Ie;t84`_tZ2sZ_$P*Oe99iec=8K5>8QFc&dY*=t>*NOHrVxoBJM zJ}+mL0g56Y?9)PE##kCI2 zu0+YGjss`31NdaY`{FKZt55UV^Pfk{3giFON#z6TxW~|{XCFGf+Aq@;KN2)J9LnR_a0raePIdQSO zib_0E{raD*XqQME*z<6k)||8&(BG-jKLaY0=0tXx8|Ow!c%Te5+hAO?TUbs9lR?Qr?E)#7na+r}3dbQr7{tJ+Cu zCp$6yeg%kARUN0$NU#E&PbT9o1~M78kP3zor~v}HbsF2v-SjG*H{lVphppj(_DUsz zgs`!`GXakR*OIg1a6_6QoxBvH0-ar2pRp9W8sHZFxs2H6Qf8kYyE0n~QXmF*3$cHr zfU(rYTQ=($6l~*JQ!)rFN7cU+-D~4c^RKaE+XXSI%ayt@o7IOfcA9P? zbUZ~HfbAm%kSmg;dUA&>b#Ttk%rfa@sAIRSmJ>(s-uA&3pA)t`XaO*ivOGag;aSXe zxFZG}!yt7qC4P<`SM~@!3mKCIR7-#K?Oz|4cYn|YyAvA4%(naIft3tDL}G`nWs>as zr-of9He2S(dR->j1P*O3b5=3^|NbuH++lLiIm(KsKy^uXqU~+z=F96N^#haaA8zgG zXp1RV8u}K>th{&$7Gg+%?ru95C=!%imx0R-Jm}(K5;Kj`JuSefZyd xOk9;wP+001ESS$qHh diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.6.5-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.6.5-legacy.zip index cee34d9e5d9bc4ae1f24fbc4ce2f51fe50a873e0..2f7403ebb4e3b04443f20c1ff95657b0e5de2258 100644 GIT binary patch delta 1197 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 Q0Ns-f1xW_?1ONa408n*bP5=M^ diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.6.6-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.6.6-legacy.zip index 7e229b641b64c42027dde83afdfc2e41aa30bc15..1c1675d371793b479f74ca03b72b6d75080a4519 100644 GIT binary patch delta 1215 zcmV;w1VH<{3b+azP)h>@KL7#%4gf)1J5_-MwUUkm008L{001PD{sbqHLL`45*K@rV zG4tx6-~i_Z*7ej50z`c^2)IK2?Jk2OFU89G@O%A%dRt)n$74bRcP5D*{Tt3|M4<8{ zq9U?!xK}lREP1^y2Ex+{gw_d-E?$Df;X#i{H8nbV)iue@$}MuO`8?n585N>F=82Wr zhSJa}!v1#LgPAx{d#8O%7p7fW0}R)_`HK zCmq2v8TsdK!I_Mlu{5y}+XW-^Hb|Zt`oO|heKGoDxsRtZG1Soo2VH+d@jZ479lL}7 z7IOk5{9?3Y;*BQpHJ{l-D@g&;cW5?*hBHBhXd=~RsV}{nqd`KO!r>gbdwN#eVwe8K zHuyvwi@kk%E?&y>IhL)gh1Z7c`0_`z&yXd;1U{L$u7)&7KGZ7_7QyoDZGfl>Y^SUd z&ADB7sFG|;x&}&!14n;U07A$Buvv{2G1p*X0AwTC>S3OysP2$Hk@qI{&l#wnRhiyd z9*S~3JM2;H$zvYLicShh(B|$Cd)`G?d~m9=Rj%7IJ{o4Xca%thvHj$mFPJpP$UN^0 zl|^uj7Du=Tof#cz2MRrrmDdM=lEf`jzTX4CsrSdxBY>xQXTyJ~SZuO2{~mApnk$cz zP%W#s1t)YqX(97Kcpe8h)pnQDF80_C(pbw|?e}+l(9^BY+7O@vP7cZ<(Y5A$AYwDN z>cU`=;N`5WKGh6ZX*8C}eU|+8k^aAy!-$f%Jfg|G?^63bq}#TK>^0Uf*aTQ(kY-^_ z*dM_JPB^SMrf`2pv|)Nc&|h#K?+Zw-=3)L0{d7muPIb;7?r9i`ND4qiX~}Nf@*)Ue zd$^he~y?nYW;_U(9{$Q6#EEohH2W$kC`HHd7a~cBs|ceTYfw?5)I6=47I-lZ^6w z?eGwdNGyN!Lpp>22ab@Z6eRqjII|6??^RrCLFir=Xxx*?7JgI)O53SqPG=0o0<@_{qwjeCE&8hg*2dMBxMo&`v&wS3yu-1ELd zA#F1O+(0U?y<>>Ca3DO88#=tZ1T7!(4egEgj%TK@kC1Y-i9C^@tQ-bV74Y|61iLyg zvyF2T86cw8Zz1I|vGtf4Ph6|lcZ2b0;8NdZE4AAaJYT)HKmLF;)=*0U0zU&k00ICG d06`2~J5_-MwUUkm008Ne>;y>$&;$Sg003@@OpE{k delta 1210 zcmV;r1V#I}3cCsyP)h>@KL7#%4gfE6a8zm_1K*JZ007~U7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKjngo?NRuv5}M=kHswDAS?JD8e4{8TcCmf!%`%KGaN-H)

#-l6nw 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 J_yhm|002lYV)g(4 delta 1250 zcmV<81ReX}3gZeFP)h>@KL7#%4gfE6a8%e=F|D}-008ch7f*jDuM4|1vFXEmrMFlE z-|-EDfXu&DCTrwg=!ng=pik`hOPFV<3RM2&4;=QCRi$0dIUcp8Z);B>TUxWZHGc;a z>KnJMlDq$c9%)`VZPkKi5ferR=GUC>MC7M|Tl~2FFqh*Tj29FS+fX$lDa-n7y@Si174BjRG3W(n9<8oIA zMJV20UG;Ig=jn#2&m!hyV?9|e<$fSU^7xP=XPbJt{MID1mHe!-$H9+fgKDt7+4Hp*sNFKh3N)vwb&Cg?b%Z2Oj+*Z-kO8WW znQV)3^(tyC$mfNk#nIFD-%GLPejf+(UU z-k(#jDgm8=yA9}ROd_==qr-^ZdsIbob!C=w4BmgPz0QIsr{ygHTw!&9btpzhv}~$J z+%SKETsoGruC#X@T~l3eQg?x3zEN-6|6yvMROe9LH@25h?wWlH-14tp!)}~^Z&Qag&6t2%9v6z~~rS;_S-X-ppn?M#&&Nu|KrZgdgBWhC1x zi28qHxyan8bt6uJ;@g*$1GyFcaqe4#O?plBHMDwJ{KxQ)NL7Fn7o3?K7jec`Ip3Kq zs3~5<{vxw6)MNHKjEWvET`dENlGHLzgwcD!Y(wAuScJKnphQsEyo{S})s zYpaAfN}N9VWTFASh19#R;#K=`!hysSinS8>q_jiqYBLO>F$wwYLC&w6RJZU5;~($F z22T*b4|@<8WEU}?5MFG~k$DFt30+M6(Y1Ba_=w}}sRdKs1+NT;JayJLo7S?iT27bI z9C$41k7Lt>JeHQ1|Er7TD6~@c8NYuZK8KP)=_bS+ir6srhzvm|`~bv6js^G`3AT=c zwGpkDnuc}eQ(=dC+@<5%UA0|bCD{XX56gxq*sOgx1#P}qTvP9RkL1gcApqOXxtIDZ z<3SM=l*rUiNkA+~qEYgkvxdjUVT=*DCh{N#W{@3Io_-2z2Q-P zs8l~Xu5tKPH!3d?(zH2Rf9c3A|L|;jUrt<8 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.6.8-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.6.8-legacy.zip index 56013943e999e4b3de4fd6bd05ae11b6b05f6fa1..9366754ec920d0773d5da624c8b1218cce0dd06a 100644 GIT binary patch delta 1217 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

7$le)0#p7Ha`NY9#=})T;VA^Cu zy`VHI{@qzq(UJ?4oAqey{Jvv)2Ij4rzJJVc$qklZ^_QYS$@MEaUtN9_KdkhBQTJUw zWFI8tb~ox92*rdgt9ix+H51D$iTs#q7C$1$30F?7xEE50CQrq*sy*!d{*+g@mtNf1 zUV$RSu+A%`IajZFP8WzN!p|PQJU7>B0~7lw*tir5qti&*oy~8~A8}5a(Q~8wpVfI! z#v;<^WcQnVN|SZ-7l2xHyTj2lX|)d8--=~Dv@-Rz7wp8(Tjr-OeA$1hFp~7xY}9#u zaP4;3MF_ar3n>f>1L@pz9AVF2)-RcXvKUk$x>x73Z6*BPeD{ZurgzED9qX*Ou643J zp|uaRO>-W~K^4Tk{FUyz4eoN}s^q_#HpM_Em}UOvutZvi(H#%`pf~xjzxBEHiLN>`SiW)Zcg&zwtIHvn<*oq3 zTO|&UP^0p+`ydF=8@MaxT#@{)4`WE zXb{Q>y394)mZV63zz&Eq9{z6DgY(HI(e>^y1~4&8!5@1ul!;w8V&_Bv3eJMEaLDj& zAG5={Cga@v1W3pEQbdah#m(rWEKsX&Td|-aO{GoGQjCj3m9HYTt-W)NJvJj2#)4}V z8r5*m(^(|y(xiwQY4YTG{o diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.7.1-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.7.1-legacy.zip deleted file mode 100644 index 377809f67a4a275a07059ac0cfa03618027eb1cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1282 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 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.7.3-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.7.3-compact.zip deleted file mode 100644 index fc3c697b1bd541f927523a51b80de9288dffed20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1310 zcma*neK^wz00;1&ZO#a(4(I))B_+)JOWX2N&$DQ=yoHRs&KQ$rtm~M!vxoK6#bmWG z<)*ZfFebN?(PbOL>Qc!>d8v-m#1g0b|DNZ*-#@O|&00__p;FQcz<+WhQ z83+K3>;M25008OaL}D^ADa$^NL~@{zNwG<}ndGc9v2j@mDMV_LLn?)wp$Sn3@Blyu z03?G!a9MXb%^ewRKd8g$%OLI%nU|aoHb(8eyRFOZ-dyjG4T1>p>m{8cx>OWqlQtbQ z%aFCz1-)MltR^&Sg>Fo5H(jX=YrqeBnYT5N(}Ju{M&0jp%h%X7ZzAAd>e?(cC&qZC z%L|D%8l_MC?R_&(DWjy6yyXoYOt!yxudeCKSPUMMu^?duXc`i&AvVsuED`0HcX+qM zi8moS8{(wgXsZq*+vru+zzszXU%g#}R`Nzg@aayl_kf)8(|P_$ZG}> z3nV{odR9#5HlFhE;@c$@^DGo;yxMR?Kh+{7(iU=Ot^?)@l4||cW$ok*o#?4SMybBG zo=bN7iJq=7_3BZo`xCMLi9);FcBLZ^20zvAt0HMk(C?qx4a zd>ic^M@Fh?qtyeZ3!rz&`08=1-8$=-{+7akyR9Sd^nTv)B>Om_Ofj0gnKQPsSYY;< zqV>$%pQ#EjJtD=$XBEy!9E;Oo2yH!gv1%w$lFYtwUwM^=MxrHg>1JjC{2T^Dh>UOX zAMkxn=k;Z*j7!&)&%3F)a)OaFekR`v@xbY|kfObZBNyvlDW$>q7EMhro8_O9hnA=C zf|uxX^(MojQIr9E!l#A@>&5G3O9kla&lf8y%1fd>ai#%Oe^BH+$<5H>Nn;$CUzS*v zVY!`6TiyLEH*x^cyEV+=4$u{1=_aAAGpPgAS&k0Qm7x(cL z@7wAFTz#3F%;>_aEeUp0KK3;yy>2?dLEJwewe!he$l6hhwM`KK6OP)+z4R;C}{_evMMAv*0dbCE3l^t?6ej1PJ>uOh6vzGT~S6w4l(qnkQ%nM>D~rLKtf?l^{z3&>OVEqx8O=yjH``!Xv{ zvzZEN4bHVG#)17@t;Q5o!p9T_k@fJlWd)6L;MaMGW4C_K*}0SfeSQEM#o!1penNTI z)7|5yKwK(P-fEQ0p07(^n(ynM@SGH5H6K-8^r=^4EXVdv#!RpfgZsic)5HB_;T^12 z{Omqz!ifoE44gAoV^(oFr0V^KZCE0!XY#d{H*&^r&Cs2GZ@*txv5@INtz{`K?96O>4JZk{N{=)#3@*|znTo;UZ~h#_{- zC8XkMlCyP0c{JsNfqm^M_yNHNO;U&pR0ACX|F>IPbp0E;+PC>Xis1s)zx(!8+iLLE Kwr?p20RI55Zd|DV diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.7.3-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.7.3-legacy.zip deleted file mode 100644 index 1936c5cf42cdeccc8f57f2e5f81b9f4248b3241f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1278 zcmWIWW@fQxU}E57FeokvVJg}3C4_~6;hG==g9-x!LvDUbW?E)yk#1s6j$UzoPJC)b zL4Hw5d}2{@MrK*6URH5_9w!ScLo5SB0|SF?M@PExALGJ>m(Fdo=ACmiFH?2DTx)NT zl%4u|?%k#vUmmVrx;=vV{zu;ChBNy^)v}+&z34c*b%FnzAKo+4S8#>=d%`dCZA$3U z*mIV0TbJf%`zuCAZQf~G&o2B*di&Z*yZ<-IWyV?NUTw-$V{gCctm{~i@HOg8aoy*C zyuPK*N7VUb?qtsVQI%3XLtHcMkd^Aa9juA-c8a=2uJt&}>v2uv@pAb;Yvv2Dls_nA zquBoN=Zk2osF@7+nXk^dd@tqBQ|mhIqqn}UJ<@-4)$b({A95pg?d>}DznDF@%|p0l z@;YgadmqbLeS(=c&N1|k4_}(MdZ)!AwrbNTtNbhz`Yy-2KO_88eZz+XXNrFxTI8U(l~q>5+vjWAQ9kFO zEAiaDg8XNS<@8+&l0M(R5M(v6zq3_(=>vtmQu93m6tXsp7Oq^gPP1dSb&p$WPVHNr zpYN^pEt`=JMd0E+n)NHF?MbAELzOQR|{K(Wf z7gbLLPwkx6E+(gVG$x7LadP{WZMPBwBvovS!oydJ_GSF`I5emA!aFav$@+U{{7!li z^=$UUhdG6vQ~s@IS@9-^TaxFI?Br|JN9?~aSt;E1i+Ge?wJJM4`SyDo{hGFa`ve(m zx6f9(_`t5esr;1zx1sJQS^v~K!c#uHNuK&^hkb^Ier|z;!?o6vr;eR3(qghbx9v*& z>I=WCI-AAq)%gx|NQ+CWO%n8<^nL~JETR2w5kBt@p5GYsNbgU>k8e76G$&k`wYI3F zf%o@Cfgtyb%JK)>)#`lp9@h0gy*B5ZgZGW2aRq1JojhP-eQe@_tmIki?>(7b(ABQ8 zn5A1$rz=A(V+qscQs0@3SH9JD-E{i#%KusToravn5>0~Ab8~kU$gVk(A^C49Q^lg4 z+WS^>GYOkb-m6_5S+zdk<&k4+L~aQ$`gv)a=KSS*u3qm`n!+~WNMZ$P0 zyCOpQjxXK&QvA?5j<)Q24+XbhMGMsyY>%CANW{z|v+~%}{i$gyu7sVFx8n5;KF92< zVGuj(-)xS^^y@2%|E(KGZWb4}Rg%lL&HwP-K=oQ(^b@0XaoY_3b$raOaxR(G^8e@djtxya zcu&nsZTRqQf5^rI|8qH%BN$ZbrXRc(yC?9SLBLNd8E3auvqiQaT@>#5ps9P(1jTLo z32Pg71kY_MG1xrs>H&k!&wcL~^gZ%gx{m4LoUDfeic8F6ZTQ)1bo3QY?$OTqwUB4p z^`?0ro?o#pIJk8ZN73QFwwhz!|1-Itd+BgZl)iD}7Pq5&h}Of2`5zrT&1M|>BNV(P zJ}aQHQ&0BfJ~A*`p>L)|J9Cq7vRmvWY3JdTmlwN dV9>w_qKGM_0=!w-Kx!F*FbGIb1D0|O3;=w7PjUbN diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.7.4-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.7.4-compact.zip deleted file mode 100644 index 819497795fe3011797a07b65d57194bb14e696c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1312 zcmWIWW@fQxU}E57Feokv@muw9QyB{b!zDom1{DSdhTQy=%(TqZBHhHC9KGWFocPp= zg8ZVA_{5^*jLfoBy{zK=JWdu?hFAuM1_lP(j*fKWKgNX%FP+jM8bKfGt8uiy&#_k>^O+mz6y zvF9x1wl2-j_E(IK+Pu@Wo?ZBr^!BxrcK>gZ%Z#(kz1ozi#+~x)@t?V=j&4a8bVQY& zzbeqLNSshxbdEP-D(k_j7JFV!@6_8?84Z1^FD|y4sx@$|_4`|w$9=x!;u1w$#zMwo z)yLmkjEdjwv%Sir@Bg^+Vn<|y_lw4l$6PJa%o~2#6)%6ORJyz4o)C|yaZj+%yN<&- zIbr&#Nm)O5Czc%cTkmMExmk`axm8-KL|wu=@ZY|)$4k-$-Wjtf9J9XtWM=I&M!|&C zDgVWfY*DSc)p^S`!@42ht#F&4{0D~#-xlicu(tWrI;BwY@${RCvcA3>*Q~DSbyzH| z^ZJ+gmg6zmS6`-UO_&;YRkPjRu5YjF^uj;Z!Hx~FY-;+eZY^#twe5FbAyBp@#cS#OypSO*R;~oPe;B4 zymx%h?SJ%CtAConuUiH44BNiE(m#CbvyE(o<`y4y-#O1c{;6iJ+jjcQB70HWd9OKG zCbH|+PklFE=;M=jtF+`|f4Q#y%KKXIe`t@|J(XNxp&9Rz7EPOxS``o{zeUx8Y1sv% zx(l(5o(<>L*k9~ecYOBaN~0r2Ngk27*oYbqNz@xD&?`ugD0#ZBkG%doxWU8lsmJ+rp5c*icTI(?o) zMR9yjs{UMlV!K-<^U>V7Gvn3W%zdP%u2{XtWc`$~VCp#h+9^53{a_x7RQH#MaDfnta#mj~2UW>z*r%Z04^xzPWx;aOkrZZX#CmEz` zzjSWzIZ_*}ouF{-m5TS%WW|hnmA8}sZ?r1%3sQcyzI?}@=39T(Zceer zcwX0qn=-?lg7?qoDSx$5^Z$o^!AAqU8JX;vahF`c!V3%<7(o;<D;r2HBM=4w L=^emwkbwaJzKL5o diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.7.4-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.7.4-legacy.zip deleted file mode 100644 index f7c156912a3512346f16bcbd330765812c1d83c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1281 zcmWIWW@fQxU}E57FeokvX;S}pKb(bu;hG==g9-x!LvDUbW?E)yk#1s6j$UzoPJC)b zL4Hw5d}2{@MrK*6URH5_9w!ScLo5SB0|SF?M@PExALGJ>m(Fdo=ACmiFH?2DTx)NT zl%4u|?%k#vUmmVrx;=vV{zu;ChBNy^)v}+&z34c*b%FnzAKo+4S8#>=d%`dCZA$3U z*mIV0TbJf%`zuCAZQf~G&o2B*di&Z*yZ<-IWyV?NUTw-$<4$?@_|M!_N4KO4I-*L? zUlr(ABu=O;Iw!tL`J|lk!`d@qua6$fu93Fy{P!#)X0|1>%6m&5_W9ZWjK65)E_w=t)zZ`=36We6BP1lVSxpv0% zv&}`t{2Ke;6PuNax(-$>zAZO1xPJca=WXZhFIYN#VvoGRD7R?c!ZpVFYTK4%F;9?X zU;pH0i?=biEANH)6i;*S1@6+(IRa*Hluay7-7ow7_20dn+x0g`Ut{97)k%4D^632e zQTK1RyT*J=5AVI95cu!Lbsk~!S7#*uUolx4zx5K!tH4Ve7CCU8h~9faaK_GcXP&qI zHlD^^cH!Ul*`8BdIy$p;JoeqLuKC9p7@9Njnor3;uT9e?{`1+%(sX5`Jp1BBUMEF6 ztxs?1X*uNaNlTXBA@@}r@9xjF4d%z^DOg8s3R`<|?Yq=f@7o+KniE=Wo=&>0^IIW3 z;l?K;kElxzZcXhAZ91vBQH#I)xc~9u^oWL#s~1ytCsyrYlkJVT%FK0jbAak$OP{S< zHn;G&cK#Bn{Qf4e&$sS4`%Y`O53w`W@%|OKv;1XQ$6NVlJLYNKdm^`{$%S(k_qVEP zS%!*F60A07)oxlNtLjzkpI^q**p@phUz>wjU+Ht(mB_ZYzZV=baFj?)c{t_xv+o;H zHGiI2e3j$FvumnBySc+NnJm8S%cu!n{QDaF&d)4==UX+%vwVKt9ok;L{=2Y;9rxMP z#zHx!0{v^plIwI*_3YF(AA9`WI5zvB)3J^juX>e^D*pI?qpfE5+!H%4ugWzPkp>-He_viMKAst`!$DdlfjBC~6{JLCf_^x{k46u;BH6V+^FNJwWk?uuA~@Su}bj?d{h!VQ_d*nsC6`=@X>jLQ&N9U zi!ZA^*fY`1t&p|!-o-N-$`VJ|uQ!~3x-6voQDC)&w$Oi%$mf;*0m>rMOLog_4LVYi zcP;Oaz|6AQzcy;q@%2 zSJLd;x%rc~8_%?3F6_OvI(pY}i+AqnPJ7S3onOkiV4BG1IY0jY+@2#D;LXTn&y2fh g0+vo-(7*_yh$*N7yjj^mY8inr2uRNa7IX{@0Lh0?9smFU diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.7.5-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.7.5-compact.zip deleted file mode 100644 index 45075e0bf622cec0f734873ef4f03be823000670..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1311 zcma*nZ9LNn00;2@JV#pPPFaq~!`%q+v2q^P6KRv-<`}UW!!oAPI4xvco+jmKl2ce_ zony8&-4;VsHw=qfiiAW<32nu3y7%|_-0%0|_vZKd>xWd=fCFm47Qi7f0bM^|W`0fs z0EV^!fCT^maimB>6ai1(dzwhJOC%Ao_>=?^ISG5391%mH;O)*NlHxaMXaZpXkO2Vh zIXTfzt4?Qc4)x!0)xX{yPq1t^$)*QDJgl4agwCAVuJcSmu=@CdJ}slSJ7_pJd84)Jx?OA5cUAp=!c5$uny`kJ#_& zAto5`)~uELRT>UdFW=fTRn5CYRD#a;P_b{BL~AL=c~%@qnA-e_{#!f3uhm*sB=^v!1sQ2%K*c%o-dfK zU^~l(TugK<-l=(P&L&4}EtJ|q8>ifcL1xF>4tvL5Ym-)ruMB=PI#EnPHm4@?2FB1& z4EGH!V<&1ZoRL&i%AjC!jWR4ChI%Pg@xZb*21d0*EwL~=%@F&}=8?6NNQ{&fW}2AC z&^oHaxjkEG!Owq1s^b1)2)@OC?eI-EY!~rKS;({#&R7Xz5S0_gHzeP`?skh5dBMSg zAvbHaa8W0I3QF=KDoj|15O$K@7K_%OuHfa7;wDMzb=i*5AQ%iXSW}?Z-?v<**=vr3Ev7H$UK-3_|m|9;XCL$q(a`E z?*43hGYsT|Q(QEejCO<6U4}p03N?h}K8!aEI$v^1mN(cVN{A+U zHh?JzBGQyM9vK^8EPf&*?2qJ6}*?FfWR{DGj{%nA_8# zp{Vm2H+H<;Jy~(G(8!b$$4}$NZhczme;vOf@bAgotV3Lw?AoH`lU%)m$zSx=asRO6 z;j*v`mwY#N`zzWhX>qvZoDgs%p^|6_AME&}Xx!7~a@~t%anHtr{CStXm*Orl6;=em6@>)nXPZh(7e6FqcVUPIUyTA3&vX87R%&9NT z7b6_zx>R@<*OGXv0Ovo9{B4cwcmF`q{EkP^KRkXlw*%%I=IoCx+1|g+j_HB(A(|*f zednd70;;;brn+gwUKB*4XVJTU)&BPoKO{&EuKwR}ZP@j1GC*JF|1jo<)YSU=1#L87 KV+9)w0>D4Vd2AT~ diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.7.5-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.7.5-legacy.zip deleted file mode 100644 index 971fae4d2dc7de58de42f0b0ed7c87829252c695..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1280 zcmWIWW@fQxU}E57Feokv;VY4<4P#+oxF*QJpu)hwkei>9nUOz`$VJ(UETa$GC9erE}Y?dFLF>%T(Pj*V-E- zWv9NLd$;MvmxrsDZjWHT|B<)3;mrO}wd^NxFFMX{UEu%bhxd&16!ZiAYozTv|2@lynQh6e^4^k%eSY>o<1ZSyOV8aF zzs8bb>tz!ueac35)>Dlob1V&fr~GU;d#L7o^~d%plG9dgv;6XmP3u^(pI3Q&Cew=S zA2DGJhqk`I{m13zxz4rMPbUi~Tfb8m%MPFZ|9+C0SZ|m6#Kup*tzU{P+S7bijM;JS z!95-l!g6Nk&hMNeWN$LH^5S$i#p_q{KKjlvtoi=OCa>1YFHrj`^J3u#?S3BX1cMI6 zo@x!fy|$cjWzYZZ?S{cdqVq%^9?Gfy63Si8__OxKyeC^N*Ja*k_03znaEZ4=-0nNl zUsrtQUBJ-H7**qH6RM@SKwIZxfu++D>+7#4uoj7^%y~Ll)JvmpJ8$`no|)UPI~Cpe zaP5$3@8yjTns0NQ*lf+&r(h?VJ(rzp=WdBAz9nW!n!7x0MDxmQjEm1~6F

_n2eu z{jIlnVxAjTEt$aoBL4o%M2Yy>o8>Jg-V4z5Q!Wj=^50qbcf&Onw;LQ8=lw4J^gbu{ z`TE`i*`7PRJbwR)i2iy1=lxKwMG;p7HC%R?`Y&OZd+_WS*BK$_z5H*!Wyzdc+2UDa zHS6>9438R{BjvNy+{>puJR!LMwwV1go<9p7pY`C$J`}ygBkk7Z?)+7&u6`4K{?gJ) zc3t)RC3@nkg{~Lv(f8piJG<&ikW}@DLF;F9$rHBCEb)}1pdnAP{`M9s#wyi+z25*fe!d;w-!00fL!98fU)R z86~ZHy5j|#t>kAhCx=tV7z0k}Tb|AN+x7m=l=Qy78SzE#k8A6QrJbG8%Y-ktYrvBdlbrtE&Z_4ci-J}h~vw85o(r|{Nq4_#f~?C=+=()##Y za`%s43t8BdDjME>_wdtCPKd~QGv(yHLmj2Er=PAa$l%_lvHED)-Sc%9xlcIHeOLW{ z^Qn*>OM@2&h-WCVv^VK-TvdoL%`E>RanAs%_gBA??Q<95*Pn@iw!~RZfbG@8|B=GhzF_l+*R{N+BLnul{M< z-mHD~GgEBI4ZC+nk8b)M(EGPwiqZ8Kb$40UF-pa7mDXL4|>VAvZrIGc7Zi%6HYIdv z>^V!htxNN>{S~95Ht#g8XBU1Yy?yPZ-T#~9GUF_BuQp|>37cwlTivgY(YA_Zy}ikt z&F!ancGA?(It#d4x6AE3bZFV!6I;sLFX*bLyh(1eEtv1RVxzCjw)cMKQxy0+np3wb zsn0l&eK2*`#YKjUjDIIt-u$Wg|B}OrWT_45o8%oeq`V(q@^|SFl86d?o7j4FvGMmW z&OaQMANc-a<0M8enFG}`9QQ3&eO|HrRq*8GnNt=>RDVjpR6l`Fi^H;F-<0C7F8@A% zzjswGFse1Zzv%wj^ZP%%{Hb*ASEa(-j;L>k<#>J@Hk%5CJ06}I{yF*PtIef+>ub^$ z@7TcU^Wa`q(oTlC_Dt5x8|F=0UHD_hZ}G+rtxHcba<6pvWwe{XX7%FasXJ^6SEpr( z_DhX_<9)eK_??^fD^fQ(6}(Z@lQ2KmU-9S7q1?O2s{PaAYUaLclG6^_bNs%q`1}c1 zKBk|avWfq&#Z3p#?F-$_{z~oJSnLtJc^c1+(j$4ToKZ?ww^-+Xw2@Cgv+w9-=I5L} zKdSeZJytFD<~Yvy!|nN;>Z|pK>%C_LpD|{0&CZCC47jA@tYC9s@w~jC4=3+0Za-$m zKcVJP+_#8Q>58k~@gEj1^^BQdptkOR-toyyItkD93ufJCW9rW}6f&vl%bfX9N#KE? zh~xpTW70W&|JyvKDcqi6zTtoJyiO#``%nyvR0I}bBX7JTp_ORMF%&VJ^b=c%BTKbg4vsAKabeI4E*u=)Fg}B zG6&A6@6AvwzWM%q^wos)Phm4W-(Ppt5J!I^z|Mrk5D~eh8_*=`BeXGTV;w!!PCO=N_Zg^VjlrHzAX9i~* z_ayx+O$F&wY7LvcfAg@^nlW^-P5&;s&-_UOTch>b!i{gLZl72>=OBaGa@W&|ovzQ` z1@BpS^7gjvOw46}gEwEgUr`&qxUaU0r_}%9`Fra^`#6~`({{dI^N=;I*ifxtvHEF2 zh1$njDo;yRnyzNlxuiO4zsG8u+xrWaoV~w0c2oU7Mz&Ymuem5yh;3zFD?H1>i^H>ar^<^j7;{-xXUhJ@dXAAj3A1bk}SZRl?|kp P5eS2T^e$jY$iM&qjP_co diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.7.6-legacy.zip b/tests/ast-parsing/compile/modifier-all.sol-0.7.6-legacy.zip deleted file mode 100644 index 6b4142f3391115dc1795c2110428d25c2811c20a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1282 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 LeS3M^5CXtIb@FG7 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.8.10-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.8.10-compact.zip deleted file mode 100644 index 26ea5c5ada5a621b5335e1c28fabbd021a963864..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1349 zcma*nYdF&j00!{?Hsm_tAh-1>ghE>Gb2(B@q;1SK_xqaJOlF11gwi(E%z2V$v)Vzq zrK8N{k#=-)8^`35q?LP(<8s^zM}0rfbKdvE`{n)oLwQ1^oB=QZ1uT<^nC(HU!4fF| zV5$Is0RRAaLNqoO8$&XSNJubGCM1N#P>2N5rLYK6R6Ld(V}3E2kSHf54TJzd763Tr z=f}an!IR1cgwGt5?sp_&4clPXY2MmSM`{(Ct)9#Y(s<7UAQMYU)U2L1UnAUP=xly( z0|)tK!}Hg;3VF=Vq_XZB)0Y<_w1YM92sotvg`lT=tIU0B^E%I~?=>;w2M?PI%DdlSVIY)U4s&_b_ z&OtYIc0xYy0BpKw*0;wjFtVXdmD^EuZBuqFV9t7h!F4x(a=cTeoDent$H+unCgcLy zYfAvT7Qe;PC>KAXZW^zvLm%S~!u$kChy>SS>f-JogK;}Xg*-q9xdt)|T>8@!*&Cb6Ylr4dh$cvjwMWLUcI zfky=VLKa4n&PtSy^I);E|L49o0<@ENA;ulWlVtTVlJ5TN_>HezEkp za_FnI(X5~w^NestfQ7Z6WX!77F^aD8HT^!4vXA1qA`ZnRwSlT!6qP9 z@O+#OH)hnMG#|9~wKuVmQDEM&jTS-GhV+NelR7(#g3h$>N7meM!~};e=S?h5y;3li z1%I<}<6gC$SZ&1NZQ1Sk?$o8LLSbX>Qrt)r;$D?uC01EJoVYYO7;d<-c$B4PYHOmBO(#_3Y+xKKy^ zR>M?fLmi*ACJ79Y>O&zr99VuCsmOZguT@WdkUP|;xX|HYb`f6X@Zw?AsXrw%@fIo7 zJEj@KmIKO8wQ0G#2~S`4pP(&&L@M6|VsDgd1-C?Xx7r-cL$epDmt1l;OoGRSUdJd# z-Be5sQDd!SmhDpznBirhc^x80Ycbo#;LCNduBwgkhEDRk-lJ;1ep9+bi{4(->(W@~ zR1&ibdcHUn7!%Bof=LQ0nbu3#TVXT36Q3i%oSX#rT8Den*6AsF8OdzT>4EVQ`U6f~ zA0sFT&tpuZ6h#KS->zJOPVqI_n?rz`yvY>WtT=sC3pG1$9WbdJ8UdEVKOk59R8E5F< zhR#BZP3YR3wt*o55F;6V>g=*H`EzU+vw=_tdQz3uwS3{mZZ4T4@+yKJ3dq?&-63i& wmxjBJ&+L*$6#U-I&Gj{pDw diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.8.11-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.8.11-compact.zip deleted file mode 100644 index ff4b57bc4bad9144b8e751a8c914ee206b7fb557..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1350 zcma*nZ9LNn00;2D$2`;umuVQf;XDf?4`tnP9V4?mi#%^KCgdT@7MG_)d1@_Wm`L-G zi>XPU#(7q$m4|R9W=yqq99fp`{e3?7`@Q(R`Mv(4kW$i)fFu9{jwHr=1!&DhR7e9r zsS*Id004-^M?^?u_vA$9iH&3i>rzkP7P3Ts4IGkg;shb=o9jtbFnTYbFM-L?_<4_-8SStEr>6@Yww^P9%6W^Nem*(Zp5T{=6qPc zeSvw(9WvrF@70x~EeUG!k&gh47C7H>Agnm0F2#m+1SmmLeN!|f4DB11&J0YBsp%3D z1Kiel%tEP03>bf#-aI12nL^cJ^T>$ApXWx)41-D1(E&z z$_QiU?a7(6LCq-DF{kocMIZhU7tBk^b7i|)8vvjg_p&lDh{JSh{+tgjOYqhv^6+308|wX(2v1eZ+q$y5tYU{SWY25 z?B(*yj|M)*(M4!8Ka1CD6Km|zkY=mN@ULhPyN9dh^Lqk<#AuXkOM2()|AM;ecH{k) z-fRE-RXaqajrU?04pE;}Aag#i3|6?O-zmm=ai+S!N^5aiU{8=&5e;w6-m|)^&Dv@9 z%Pecw7*5&}+I+SZ6o+~=^iLP6z13W;K{Vt=a;6&^!(CU{%D z?SF3cv?<`soj*HT)>Rhl85h5##}1G9O~_KRiWzzBwl=rsadV-b2a4op{t$_x<|{qo ziZ?N$j8T_&lXlv0T?i z8*=FSkL_3OT&HBvuKt_P$iXe*15O`(1z+9S>z{@$bEahLnC7v<-i$3>Dy4;~?Dm2| zwc>bFC<<^h-rq|fsf(IGcb1R^C2;-Vpbj@zU5lia4D)VrPm}^KKEFJ@V zehA9nknASUX6K7e!ZiC2J^UPKQneAQb*&!spfaF(d;V}IIjbt;@>QqEdrDUXl!5rm}U{jV}E$j3> xCn0+USz>W14jzI+N=Q0N{kLzs#QhtR#P|6>+M$p#vfsZFyG8Hr?5>so@C`8EfC&Hq diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.8.12-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.8.12-compact.zip deleted file mode 100644 index 2d9ff748832da1de43fa57a812782c4a6db6dbd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1350 zcma*nYdF&j00!{?Mu>1MPOUP@wM-+ItQw0&NSM3CT!tAoCMk(X)Z(~I9AzfYa!HL` zmbP*v$t1UWmJzvyTpE^34M%-H&vV}Q!~5m^{ByFGkhB26fC6AhA-fU;6Oen706u`lR2m3x>Q}uEpu%0%@9j^%3hkOx*DY?+h_x5 zaBRaPv^5OML(#B$zPVqUV_y@e@h}ykJ1@BKFjD zWyy`~%ksgYULc5U<7@(>>XMtq!QkWS-;tI$Hd$%v54#?Q@BT*1s=v_1o83 zp%t+12FBQ6PKrYzzqnutKR8skUK#`*wF!Zb-=3Fz`py!zC)zVp)nRV> zn!#c~yjQ)jaH?H_P%Drn+v0Rx$@Qh4d1FO%xX_ZFf>zQcdylAg}6~6!7qxdrd0+=Z^#$%DnsTkgkOh zoLVDy(ddc_lMdTKMz;$}MQD=TS_v-(bLQt8Mck?ZlC>JM&zW8oNcF}{Ta~C(1hbVV z&(&uzK$D3cXBum#h()Zoel7t+eRykYC24r|8={2|_bFj~!R>)4ZLB3pU8q%T_cs)y z>AW}h7WvQ;exp;puq$5ib-%ZuS~_DqU_soM@*1G%?>FIqq!RvYqk^kNV}q3Unxa|* zc0m^VlkB3)ye$X=k#;imdSle4hL|J`$<%;LUVVB({n&q_tWi>35|dx?UI#i5knxW? zcd0AuXmhv)A<@!#8$G+r8;lloOUa@Ud{M$g`FzJ%=M=Y7b{d54QNTRb#+iMgmx>Yt z^&ax>Ftm#fZH8tr7(iCD4eG9J|G zd!%zBFE#HJxOs-b{6jUCH{we{sV5tms4xzEDs#E*b33x2#kp4))NiA4V<(fW2M5PF{ZZlw&3q|VIB@sNY_+Fd1TofqzGB3KkBqWM&NY~- zu8aC*U~)aLvd;Eo?X^p#4_gJN9{E-!qnV`q!XFa>dhl@gYLV_t3j`iffHc3!f%gs^ zge*!JcrvN25B&J_?!4GryJrf7u?MrA4b+}{?b?`v?3xoa&r{0l+gkd`V7Ig)F7k0< z!HS+8St^Zr!E$Fjxnd5Na_N@F@IZQHc{ReyTP?IhfjfD;=*6}1QeIf!RC&{}(d@La yXGhoW+U(j)`Ac8uWDf#cNc^{NTg3fN66n|bAMKp%w@Ll_g0_m?+Mz8i0pMT!8hc9s 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 deleted file mode 100644 index 7845c49f6cbe7a36b1ed17e8cd88b0ba4404107f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index cdc342f1230e5434b61101d36844d56a5fa5f18d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index d4d53a419e0abbee46099180e35742bfc3f6ad82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1349 zcma*nX*|;n00;2@X48QlmJzC%TbbN7bByFHS8|4AQ)_Iwa?G)u@jT&q&>BKWv5zZ8 z2qi*~#UfW)T0PTZDo3MdwMWnU=ks}fzZbtZzt>-P7YT?p00#B|g*cv9>SvyPDFgsY z^DWx~H-gVmi7=kpWxUq8+Hx0|)i7ymgNj!?Oiravx=#o^=PZGHaOOIqHhQy(|GUhp2ou;?X zHbPkS-cQSNcbD}O9~4Oqt$g7o&;`Bfb9FEcn~!G)z4xAVXEprEPiW!*c7oxN8+8D| zP~Qb+m%Z$0_U3XGQD|hd8!KXnKcCZ>TntKz_6uH-hxeX{#sgIrB?A( zQ|>#|?+@V`B96xeK`Q1+6d9&!BR z>OI{F*%JdwpX`*i^Ru+>A{Vp7<~M&1!ae8L;K}_sSZdAK;I8AtHtM0>OgR}o?dutR~tfOosbnv)GTm1H<4 zhif6Z-~7ek-(&-CsUU&u>qu8v{Vke>+aSa3B<1lq-_UbE9ae2ck)+Ux!A4FHEQZk} z>9}dI6j)GENt2mtz}rt34RdP86pzDwjj*+E)41u3c-*7+vddh*k+H1)HEFfR#L+A- z%;E7o0t-FTI3_Me7t)q<*>L`$McJmneQgC!TkA0fDV0{+qXL;rE7SxbHCq<-<#j-FWO5=+7SQ)-vTDd2?6aq>yAok z07!-bfDQlvBuXS9nh=$A6i*}?CsT;HsMG{X(s>*{DI%7T5@j5hOd;=)mI1H;Km!0I zogQPpWu90w#=mE$Sk*@+=yq%76k!fJ=(82>TXGh9GwQf!q+Wki%%%->2kOPogwNB5 z+nK%}#9oy#4e|jyGfL`T$^z@Kd>hU7I!e4RA~dA6!;&hiya?wumE4zPX%fP1NH4O8 z4$kSp^Y)C^CUVCp?PyEeW=IsI?9_q&>^l6&$lxPVr~uTW(rWRC&V_k~#&|>Vt ztL3Mij?X<(%`L@rzbn^jHKDhRxL{FoZJv=xaM*zNXv?$QV+9{Kx5FRTvh)fFX@&>oIr%+5~hTk&WN#YMZmh3q1 zEj-&4o6vxO`uTGW)7eHV%SA=$iQL?jCC89jjUJzj+9CUBSOy{Gb3R?Y+vC|5I2o}d zd2&`fdbwWfEy@0UA38qWDJ<&rTuk7Pg9&W zV7xanay?R&dIwi6B7}`px9WF@8M2T{h&h4JcN!PZWQRvrwal`MBfjF9{2L@LRHz?@owZPTT(XpY<2ogGqZ;kodob*g8+i_ z1?^96*p2B_6iC!8W``&jymlSP>y7}(w5=8L7kVjdcBgnkZ8_0FUdw#6V{wp>0q-5O z{V~?mnx&&1V?uojb?3Ss);*GqeMZs2u`!7JYA#1%#aZAeyIP`QJ@t+9C8aXs9gflw zc)b;;C1T3<&s+!JEVq|D9p5UugVDJ24(l-ZA$>o<@R*_3lAEVyu---=dM|Tj;awo4 z@*MR!2yx}_pFEH>Q~S0~Ig6SO(ai8iBZU{)_8_tyhi5g6n7#=Mexu#BZ2-~tX%pAv zkn@+!5^HSg-Zs1FPjVSKB99fQ&!(nydtJ(o3XHn2LEQiuPg;K|-h?bEtTz+|`p}W= zVTUO+`q zoLf3X?hX+_Y~K8JPN8D);oJDzMD19ulT)ZNkqM6>g`T;NSenB}l2+qiIojYxeR!F+ zcJO5j<)BME6Wx7{ETO~IZN}th!2_LNXyb)(<6BnuTzZMtoBmG7E2#(WvLO3~GS!i! zPK`sK5r_GAq=tf0GlP5FSB<};S^8ilGVeo!S&D9R&a>GEwSs=n21 tD_`I7YOVq_20Jb^7e0Nps(|Pq(ghjK)!xKyT$D8)UK2O@DDS=W*-0m diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.8.3-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.8.3-compact.zip deleted file mode 100644 index a1a5cb9987c92c53c71a3e38e75541e1e13877c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1344 zcma*nX*|;n00;2@=6YPAC2~EFT&o=Oj2I#2Y?hHp*ic(*S{qxF4mGPehU)RS9!E=Z zXIZY|36a~T7&#u-gG%N46uHWy=l%2fJip(I-<#j-F9szc=>UL%T>y*`?&}nEASqoE z02sRgKpy~r3p4`xESX3*38hd>88k{TF)Ex!zZe`!KXZ;8Ni+>((5SMKQUDGBSO8!b zA5VgB!6WkeL^ZaGIjvN(L8A^Q*+;|P=&^jgrC_e*YC)~P#Kf}VO;%4M*6{oc{(Zc# z`o7nvHB=_4SkCwRjFQ%BDz*S8Lg-W%(9V151_o3ITf)*<5&7Y5iA zdspniDyK80kB=cuqCBJB$9bg>IOu&HHw!|0d%Is=2pj}es8(8x=`-JFYxfu5eh?TY zc{k0^(fZxXy|*@ydWU!O!vklwM0a=1H5avvq1BtItN~PTIX!%1Zx8*@le=XK!!HsJ z;wj0~*p{F6FImF>vU#hNJt9C$(xTbiseorXNQ8$#UU3*^JKmh)w#IKW%N)TiIXx$E zJ*b#P{z8GBwn(o>OV!V{Ex>rs4WYjhG{G%;!|#zEbGY;CI`wUzk0Wi2A=}br>Ls>- zmnJSY%~$xNj|WXPad}~s(=|XH3T@jA6pR$7QTZcW=&Y=a%XNLEH!Od_+dAJg_(-NPEt&?QoR8cg>b+hnAC2uXDBigICiRp(AJUSqTjoO_w1OTk!o zdXjelR*P~~7Cn7<#e11O$mSsxQ~lMJ;VTtSmlXrGZp6jO&Bal!#IRN6g9M65_wq>voEZ{3 zR)VV_%*30|BD`cWbk;LGum?JydIu*nC-qwg_OSSGtg{0kj@^ZNi7!0ZZca&hKclkJ z?wtBPe+pscyylCXP5foBZcO@R$Ccl<+r@?rmx79tGKI_9&c-O3Q&x$Y8vgqXIp*QD zupFeUPWb=Cc4o9W`uO|zucIzIzKrGUVJetaxV zfs19bml5qcDD%=&rVv7sWe^D%y#>l2S7E{smbQNR;z{-LZ^oA-I%1_{`tO6YJJjW? zyS*XN`Yc?nxo5M5a3fH4cuKdbRrBbvCm#|aco#ThQCCg=mOUN|$4zkLqX}Kl-`wdD z-ak~dWgU%%#;zf5hNV3%7lzmbN;IkKr&^wNcB%4o+q4#amIG}Ua=<*J&GLrpdNlv3 zFfr5gUR7gRO>WWkwuEA(J>p~}nWLa=wCrHNmdqMZ`f9V;x!L?>s4%+DN#xq^I8Ox6 sQ75*D1`G@e1a^@4Z`pQm`!_7mkNH2&VNg=iKfa)y`t0n`j*|fJ4-{W!H~;_u diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.8.4-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.8.4-compact.zip deleted file mode 100644 index 33e6f9631ab67153ffebb3a13bed836ea4669552..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1353 zcma*nYdF&j00!{?E@(7toz#OIbMH(pp;|SUQ*NQ{7#YL5u#quFiMfqr31QY%BCUzT z4x%KNtW=LCcTsNTxRlE#b1CNNd_T`~-uJ`%<^BA_yFj2e02ojP%p=1+yq?~gy9)(? zR3rfC0RRw64+y3N2Qv1YqR~tu=`?cSg>X6}ihPQ3CMfuPpvl=tdKe5U2lxR%5&&S? zY^ueYMMP0od+i~3{>!jn{U)u{Om}r_LxEDgRpqph$$LzMj7Z=qNpG7x4MN8Kr`V#J zLfp)X%MEIYqK9l;MRO_7ljqlt(W>FmLvSdPPj#JDqQbT>8js6!>o=0Mg8ea}y~#A| zV;V!Gr4p8}VWWag*@4Md4h7%!cg5C?#kqzMu#4=E_UI~pD~i$ON*H`)Mkq$@znwcg z*gg*akv!@TtCrv!U9TcdmmYqO<$cW&&fR5IWNtX{RbRYD6?a?pz0LC`hYlZ^>Y9m; zVJYyZJYbaNc*1>fn}xGXZmmWb+NZWudM*6YGp+#QJu&UBxluU({jxOh*OHlC^ZG_< z*URC)!zWtC?1Xqkr@7K@!@r$k(sUx~Rmxx3IBVKvM49QVP|vnuEOq}_FPLS%?lKR8 z45Y+wL@|l)P4h0Ir+Vg?eap&zP*!D%FJ|PJPRB4Rks_1f#K*rOM$m;5;vvqVi_`q9 zK_mP>qC8@sdxmv<$|LOI0rN|?S} zI%W2eomcpv>@d`aYD&?2h{FwLXq5_NvwQ)%zXm>H`k+FQDZSA7H02aKDvclMOk zibW)Oo=;} z<*EBV65Dcx=;sL}KNS*FeF3CC4Ww>{S7<6 z4pO)0mcEXzrC7HeyR-;jKB`SOqB_dk!|oguQONlIDT%?iixu!V=9X6CUIKvF|OigULN@^8EP@j&Zg&vB^!k+v~& zhl2>!i00#~2rW?BZOc(@^l;bmL}#Odpd!!MqRd$Acpv66wC8it}saehBsCB5{FTWbA~uEVGh zl^_pz>VXd^U*DL|SOMc*Kwulle-pQ<+`mZz{ha>;9^OSx{^u98S@+Ey+XNE;{s9d( Bd+Y!J diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.8.5-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.8.5-compact.zip deleted file mode 100644 index 6751bb8dabadde5c063f65e157139e810591afc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1354 zcma*nYdF&j00!{?nENmxV%f;0L)Id~wgiL#8Q?^8gget;E2;tv0BHvR zKobCfaB@I!U@##{A0HNmj3$Tq5GWDksB1p>DF2|~7y>dRnoN=aivU*vAPE4>Gc$>X z0>jA4@fRIv>5`|UU@ewfT8^8Fh0X)1Zle}{e>|hpOL%TwIwfg@<)IzQ!!2b#Z?C{C ze|0P()=9eW@?>FO3OpEBUzn-2GsvMB^~>IET}Fvw@_(y#HqpBGsA|DDv+zl3n1%E7 z)5~A#lCS76#Vi|4KXA^Keb+i1*Y!5RDHLnInfcmQueEkiJ!;$uJHtU?tJO{J(ca9w z;0f(e=W!Bk>n=>EJkdR_JkMHxe9BFlp22ZsfKe2?A!n3VCEo}=(tmJnR3KSwO();g z?UV7tbyf~U-nvfYv2R0W1)jOYdgeUMT9tgu>eM_A=HqUR-GPg@EG0#6R;k;dr3zB3 zPD~fmdOO(-y=Ot_gzK|fa>;6Ti^jb9w@Nj5TKEMdVOQ1Murn#5llY(vzOwCJST@5M zd)0Q8%VVJ+g}L_@v;8&{>@(URYPkCngyJia1d{`|1oBU;I5jgk#b?1aEawTj(xAy= zUKyV`Evp=gS4{9ruN?Mzyc#Q0fp#UA40ytRrxs&TUwtz!sI!{$Qzwx_!$1CJO`ReNSvJjuSLEEt~f_`f# z&5KlAbNHBYBb4jRAY_WJ_b&0-f%QGr$>QiyXndAL+JccOnnR&5wLKHNiqit@I46JD z9_NV;1P+s6S|6Tc{W=;qDSx?5zei5%3$kD(WLE0Ip=>jod$W4^k{z%E4ym#vh!}T0 zFJv|6*V2u(&xeGcZ61Wd;*MmZq&3tPDW7BzwkG*8@ICZW1RJs@+9$4{5r&A@jMnG8 zD#;Q0&=ew`pp6Nyc13hHrojtW2_Bv+H^V6!DaEr+u|H1dBdWRu_#y^4sOJ&a^oq?= zhP~{o$@aUXit=wnV0g;1w|3%Nthp4Y2_UIfJGn4?eD?2Pq(g zbfBqb^J9!B8klWt+V>$l!_O9T9m~ze!)zV?oMzt$#_;&K9^Bq5%;K&A-nG`ZSr=&y z?b~@|`fJbmKYfo7z0{se6{a|@^3Uf&G^{)Vy6f*KJ0km6%=SuuGn(m(JKjV%9g&ISFF>WPH=WOS-Q}g0x748_-yCwd5_vx*WYNdu5=r%_FblD zeQH`U5G(t|JH(@oX=`7`dC7&wHq#AgOu3anRDYqmj8761UPC``*K_(#MWyShk6Ld^ zYihD_;Vw=Ka+4i`VZvVy@m+HCkM=Uj&4$jh1j?PSLm7idzcfG#h;A7tCFI$j5K7>gp z9l_X$pPRULarX9Y`Jjy{B~j?WH1$pOqSgHhXWCl3k;+kEjU=SlA1Z7Xsz`qF?`>UE9ddC530VsNw{iQ-{hK7v&-p*%xj2f5{``XW>$bn|_QeE%e*h@V BX{Z1I diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.8.6-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.8.6-compact.zip deleted file mode 100644 index e6393db5c17f00748bdec7684e02b3a9e74c0639..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1353 zcmWIWW@fQxU}E57Ff1+zS>S!OZ9WSFL#q%2g9-x!LvDUbW?E)yk#1s6j$UzoPJC)b zL4Hw5d}2{@MrK*6URH5_9w!ScLo5SB0|SF?M@PExALGJ>m(Fdo=ACmiFH?2DTx)NT zl%4u|?%k#vUmmVrx;=vV{zu;ChBNy^)v}+&z34c*b%FnzAKo+4S8#>=d%`dCZA$3U z*mIV0TbJf%`zuCAZQf~G&o2B*di&Z*yZ<-IWyV?NUTw;;3!J(!`rC@e81;SZ_Ny(P zA9tJgOI5aN=ffJG>|on39d}%{H!VM=SaiuJ_||cQ;KhpOvnSoVb?yn%@1_TFoSQ!e z?DOeo+;=&DuU@4FTjN~G5`LD?VQc3+IrQXHQsX{t@Ao|`*SDmFf6-X}=W}3;M5Vxk zl5Uk#DV6WeZmAHDKQ}*kd-v`Aob!I(-tYCrSMJCYj^^)2H#FrWxZO^k$=RsesT_E2 zR{pLlKR#^Ud)Kp%>193Jt?K*X8M|LtI!@ni^XZ@6ak1jrKNqXl{V`w8IkP|d zv#x)WBAu~{)AgX2anPqt(^8 z>x^iQEukgL-E*w2ER9@ndG^~WdI1I{2506sE&43p;?9!u=P@(8C_|k}>RY4tGEq9e z9$LKToPSCqX-)kS)`JhW**2be{IW~=1H8=1Y^Sz6q!bC*jS^yE*OXIGV;A)se$Pdk@;4N&mo#)dn9T3~ zb4Jh45Rp4JZ<=hDbM2YY5NUF;B5~~-TW6wZR!1YEu#Lvkk~9{g`kTm?U&uX z;v_^lr9AZ?DW<-aI3}F&&-Z1CLTS>ZFHtZ&1l1A7gKL9e)ri2ro8sl z`fF?W%_*i)oF}^FFn7rIZB5K=%eH27pSXHXeNDp3r5kUs8?Ja0s4vMIof^Kp?4Jlv zxn||NwD^L`Ba^T3DTqAjTbEiXQ|9OJ!DI5f6Tf^<>xhbp1jDgHN4t$&_V_3%np zY|F3G=?iC{miYW}A!pgk2_42Bs(&w)OFX~#$o5_1<=ZVQy;^QR)NY;`eOTz0jF#?) z{h=35v3mrmybxQWp|Csf)a%kv8QY5<9@foq$wfDtIz_9tGOW$Cj#DmcpWeKK)y$}6 zg?^mvp9#Hh{k*>J5o}?wxYy9-Xn5<8qx8~qMk~~q7qitxd@j+xnVXfj$1}fTU4ry4 z>Al7_C+_|K^zh}J0B=SnduH549I%uFg9b(rMNEMg;LXYgQp*U0K|uN;u)t(s008^k Ba%TVl diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.8.7-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.8.7-compact.zip deleted file mode 100644 index ed7cbdfc8702c9d83c4ec1c0664c07de40bf2e18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1351 zcma*ndo{yoSsq&(j^WA{w=s|785L8m zywXBzTp4-o92dQiJ7Tf&mdEmlaozj>J?DPEe|-P>{{8VlD}o&W1z;a=ica-3vFU{s zf&n1uAOIW(03eJKNG6ekXlBIFPz0S4N(hRkQfLtbA}t`892JDPNvDKE!Aih207w7; zJ2v}<#iqrrNAG)I+NwP42qzmf>m;RNwd{>}%8kgHskYcs!4<{PMU^`V-OXNxAyU6d zb`QVUeRd6BkT zWt+>F@tTbNk_gW6u0Y0o&x>dcLN6C5;0!fGi`IvlQ8HJZcIoars~yi-q5jT80R>Q| zS+f4+-usk4`qmcenm%1hSD3mD5yy`D1UF9FoV_PFv$SO|Iz)f4USbr#X;lU-$hf*V z&+E5&WB3(mp|&6H2^ybhqcRXnuVrc+12@zyi!irz<>Jyjde7UtQYn2|qdQ~1;mitA z&3AOxFx5p7-@*m|ro|$z!xFD)*{XKi^{sH(KC{%wC(j^`w-!1tHp=NRu_SFFEzWGl z|GUEXRkNI7W0bj3i>b;S*?4cB=#ayyi<}>f!tL@DKCdj3Sq)_dHxap+G7df^t4*~! zF>-D-5^utgSp>}PuB=`Cw; zh_4A_*=3MA_!v9CouzhZC7#itQC(Cm&*t~#!lD%iyes%V$)C9!@BH_q*G2QpNFpI0 z^S0$&vWu?1k3X#>LLJCDBJlRXe$qf#q-@7@1CYNAjIHud;G0bCpvcWFWXHHgDrto6 zO6ppw)Q`)~R&8{Hdn#;|4|Prt{_6cIaxAj2t>n@-ZdE;^02@>yIZN;k%)?E?cr(5q z&cTaNU*--}d;XH+Zh*OIDMmZ!!?cl4uLMi%B( z{BQx^!?HFf*IPcpkAf`_yd0;g<5%x}p2`m0HV>A=8Dn_e?A?yYNX?pBhV|M2^1LW> zCSUipyeM^0`zfkFfTew)y}~fah2o}NkK1~o9MfSZ-Jbd4+FC(VAz(nXh?9O2y)^Fm zpuNJTna1gX;_!7FDMTf*`y(sdOu=c%D+r{jt}I8Hv?t{r8!#%&Eq9vufs_TbWW3SV yx77YQBxn0syz#6D8l>Q$_}{?o824`yK>y7D;m!lC1o`I++9`HtM|ZdcfWHCe=6;$0 diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.8.8-compact.zip deleted file mode 100644 index 1e0c465096bfda1435f507709382f51266078d76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1339 zcma*nYdF&j00!{C4b@yWi7q-jA$m0TJx=XxGmBi(VHOUP`-EYe>vGE)GNR}-my(4< zE=j}AAH^M(CI3~c55=o;Tkd*^G0e}er zST;KlDMf}C4~QDkN`K z+wjow%cgyPUn z!Uo#v@bVl#e?Nkq`cak@j^Y1QfRL;b)eG0Q0~>Deq_(gi_a_5G7RkNRw1+7yqdtA7 zn5+Qke9>3kwKCJTPT^MVM;5*hAATVsBdUd`UOld@P@=C!sv_N`B#>d>Ws>By9aevM zV0TndjHHy~d%u}hH*6{~F-^zrc}Y4Bh#p)rZM9VFGQZjpe<9*ILD3iHu4{O^ld)Qv zlF~$(I^W+pdHdrNl&Y1{k(7}$P@oxu%e)QJ1ixC&TmxyPbdMV{EwTzV4 z*?LQ;!$IvaZ+Ee?>dEHInfq;IxW^y^PfqIiV2*s@`3_}YM~lge#dV0hTA0ns5JRK? zHG2DNtj`Lmm`8253VlTkSH!PaYKzU(DvRbO$;mNJOK+^f1vOGla?uCb8m^k=Wr({6 z-5hW&9E2$zFIQaAgr_21bun)tIuHv9-Egm_NF64( zG?L}ADg9dDgH4`Z-6|re1Cq);st+Y6Sf_VCnrS=xUguUhKL^#*VN?WNv<;Hn39L}F z@!OUcHVp|=uT2~23E-@5IOBv}TYMY%xj}lpRB!mjhAY;;sJ=GI@Y&QFGT!I0f{bu1 zFjK3H){b^!abkoc5Rv5C70>hJ@OV&>F_yz zOJR^l{e7`g1wG?1rdON!Vj`p1%~WTs(4@rx1hZ10Y4Jl1i9iIaSETb*zs<_OhxJ31Z>wfAZ+XZWX8Z;l&Y>aeLMwpzCX439W zVjtrPozJ7q4-F2FoJo_n=?ic0KXuM{brwOBtSmE@~eeZaqQ&X*{ zF;!03=x@}^Ejt{f7KnPkcJ*RZklMaWm{tWBRn7PVnbzS%4+;pnZ6;8|AlGlIB=695 zBTVxfh>DO;APkxUzcRso=h<-$`g+26a_%~KCia^{k6SKor|&#Zzmz1qF}JCe8#cl& zNy=kO^D_+U`$^s@hauaR1F&C4v+m}#tQU&VO7Ui&70m}6&lW9pVMWI?P`=-%=fz_L mdl?W8{NJeUx%O|EGXKo~A&y`#C;!h^X0OD(9o!=l0R9G`VPskW diff --git a/tests/ast-parsing/compile/modifier-all.sol-0.8.9-compact.zip b/tests/ast-parsing/compile/modifier-all.sol-0.8.9-compact.zip deleted file mode 100644 index 7c12e42597c8339a61e5a57297db71823cb37249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1347 zcma*nZ9LNn00;2DHlv!PdCWu8VdQd&U7jKjJz(9IaPpWHYql9yOBs#zV2AUxWMX-k zjo3L|1a<+o06PF{N{sIkF696l z3;?+r0AK~=;}ZxYvX1$0if$ayTwjeBn< zEfBvvfn}VxZ2Y-yS5WV;%q~5>cpB=;+*P)h^XzYII{0OydqB;o078ud)up;@l$s;v zVMZO1jiWxDmC#wjC0odvqo7Oi>lKtObfsH;pHl)M8=L zmEX3F9cA{0&Qls3@Fsrfx(B}EaEACmg~M$8H`3ipzRF;r=`%u%C}M7fSqtbMhm4o} zEUVNgAiF?5cF*E96@PgjP8cnf*5{A3jXPn;t{KB6pW|NKk1}*aNgvAkDS(XIV0cRI znKzIrLV1|@zj)@uL^zC?l?(M%MP^Rn z?`v}F+jtLHr@P?ssJt_pb_Qc4lvP`P;{qnh#@`2#IZLm&{ec{a9@e;K8iq1etmzHW z%_?A^@;F&P3 zwYHs8Y5!BdwfLPPvIV*9)eyh;cv{+uLH-n^oSKknn4d*E6z$$GzB6@VgjAM(xMdqg z)N14kmlL(@F@he0@tEp;qqsL&ne9UMX}4h3E#mZbi8{i^cdmUQMj5Z@G>Ui4RJ(@0yD9wi`asuUaw5a@F0_iL={4cUOqJA1 zx*|Oa%Ch}+Px&j*jx=R2)xFScE)Av~eR&W{OYUUyODpuZqjWlQ7{$%I>9MOerCgaj zWxsn4@R*z4!HHLuFQ*^ZY$z-s z4~;vhHwI4>Y4qbf=#P<+SJqTj_TQ0bW6U|-&3vVLrtX;^ho-XDW^&(`p4?tS1rwPD zEOnR4Ig6mn+d}TGIg>H&V8%Yyu1?0(2p#eq t;EMS)brp=a(iRucf8)04+rObJeVzY99mZQ3^7X5@KL7#%4ggtPJ5|b~jD;St6FLKbU~a+sJ{#xJLRC`5B$z%M z6~}a>q`zIOgcHE+aMFlC`MWOJox5zGRRx{uB_(Qvx-^HK^X;&eDpu~w7wHxTkfZ8i zrJ=7$*~@YxvKFF|Ncq% zwkg?Ud$H~toX2)`rc$*7nw_mflF9kAvLo?lcgPE_0d#B7bez$uMJEM3mO*FtlxPce2RbBs8q usmhh>94OEHCGZYVO928u13v%)01g0ITsu|Dql|?flY|9X25bcY00027upt8g delta 611 zcmV-p0-XKe3*!qDP)h>@KL7#%4gmaU$5i+dnSUX%6FLKbTjv%OpuO!hd5a-vfBvEP&%dI5q^_&%xKp1s4Cw!qN@!jY8hM;kJV(O1LM@Z*=OU-T zRcMRXNQ1atc;UiJ|BXzb_vLG2=WFA|bo*#f0nE$epHoVh=3ARI1o=^in^WLix({9z zg8Rl}O*7Gdu$_Zxa_i~vH&B4#$AQcZdPBDa%|wFfgvZqLipwI%MKFMueJVz#0LwqA z*5u*)EDC!7c;{?54nz<1RK$>~qY{+5dy6`;K*~(AaH!$6f9Kl zxSMi$Fp;Ta%_z}~zy(yB>?N>0x_*NYgz3ydvorC3Dl`7xonC(z$a<_uJdHm8z$VJl*$`x4Efg19aYf}HO$d=}PB7nnrtko*x$Q#@ zzU88db6g+N&O9w)i$;^J=dwRaK-?ORgr1DrP-=+dMI7TTw7s@~O#V8Z<7AIb)uY>L zG6Oq*D#2`pc~2ZL1K@KL7#%4ggtPJ5}oLIoKVs6FUQcJf^C$J&|LM>)q+MCKU?g zi4~?9-i7pAt|eb1 z^3O`E=W&nh^1T-q#9fVW$==5Ianij4Gx*JY3sbI?wz?-SahgEv<84IbQ#m?l`qYG) zSHkfm4LDPO=U^83n!Kfvcwu?xV{!lI@7z}P^%~C*86R;XpQ!ze5cJ5CyIQduF6o=~ zxR3O6jzKq9d&0SG?pfoOeTWmh>Z&Wr;%wf%#5^jNC*UcC64t89G^WoS_zWYM-OBWe zb1zXC^1M1Q12Ey7cdio@>ro~ji(md{w8-=394xqh>0}Ea99IUZwEBnS_GMh2hVln0 zB<4rm)#a_8id%=>VfHpbIp(kEkSz_wfJtobw6k?n!ZjqZPL(BX7{^`ZB~Hw|ZlM^} z#jBms68&w~sMrsLqj@bTh#Kb=o+@zG3}a`4?M;mrKiHTJ$lJffYNSsR1a1dY;;;P6Z?}`PrY8ijlTKB5QxV zYFIw(kWn6`5;2b(Kgcg31Fmr}9+Ebto-SGDTL>)~?Z*gs*N>4>`cxJES(-pC;H9+(GMY(QPO6RY2h_ s4M}qE8~tm(Ay7*J0zU&k00ICG09jl+RqF0J*d3FD1z84b1poj504)zEZ~y=R delta 609 zcmV-n0-pWf3*rkCP)h>@KL7#%4gmdV$5bKr=X)Tr6FUQcIA-sMwL)lcp*sml4|d0{ z#A8xq3$2IJ*wqv~wAiOUD9^m zhnInV1zG|WWu8EUa{e3388(DV?9@gTrh7(0p}*ecTKGdbKmG1(6*?m+@VK_+^dxq* z0`#HTpg!jgb|F>T(T&{d_Gs7wkHpUQB#LiYQBi__M<(on6@ov*;!pr&;F;R4Lj|I| zNcUaXiqOe-Jj3`&L-@lRK$ZO0#uI*N-!%i#1&1#Yyg-$wabUX58z7g|=~fUOGydZQ zWxpe3nN@j_KtN$T*C>|{-;N2zB;Jl*JBrE@24(Y_2v47+9UTl~rkA0U9-}9L{dC3T z%l6iP>fT4WyISY6SI@PkMM@I(fb<=;Z|m)cQpTtu&*)xqqbWYz{ZX;>W3a=GhMZlg ztm-|V)6BJcscz1tv&QaOKQ}V^GmvRlw{dbnIoa2m2wHK+Iq&qV-_`bwjDCc}KhH}l zZ+v1@KL7#%4ggzRJ5|;MbOf;ya07p=ID)Wf2adm41a^ADiP`Fw zDQtm`5RN=pOjVZ!dg-$5BMOmJ6~Zw%zjYX-nI=Au8`wP$k&IhiR+ssGf^Vf5M8x4k zSQ=6A2li<}2Amedyb0dX90150K~$=8yWgrjuxt@lv(?%a)8y4Ps9MzDXtLkABYw@# z93ritOM`#trFZ$P54`F3Depggsc=pd3z#ia7$D2@+WHLzh1zWG!FYFGFNs7*o~^0jYNNm_DcI~1h$^Y#)Hh#X5OUEyyjlk zuk~>+X5i9;J63Obv=-*PnMd!yWu8}oaj^QRJc#-fx?(#67?rmx3!GI^ua#bTu7Qtj zcKIZPTFQ-*;B(8PqN_nZ+=`C|0=yyXL~j4fM(vtzY7_j->fI$T8S);o$QhIQM#`mu z!ykW>mbHs=vP5{y+>n%>)s?8)!y81$ao6Qa9W$^}!sLsx-El@ZyEf#OkPPnB7Cpc%zG#+sZ*NgloNzo6q4fn+g*? z80D8enjRH6WLeq*p*SSmFh&Y^-@KL7#%4gd;i$5g0Pyo#|Ba07pap4GB4}0m3LZJ*Y<*xLuYGy2M5~X|)sq0ft z-daq$Jm-4^A8Pq<3{f86h8YxII1Iy76ot&x<*s-M2AaMJY{}y-sHds*hx-+fn4| zAltmC=uQr9w@{ySrq|*ok%WMF@uHIjv`YCzUkGvg+Q`%2-NWbZDfL{BZUbyT(fS5g zvoJsvfHF5MYj2dnS7y?-;IrJ0K612i* zie4k;*?ufG<@|wgV(p$ZcYblCAcv5Xh4w9Y#vP7k2*Z^gYJhN64J$9oO_`Pd>J<@+ bP)h*@KL7#%4ggzRJ5|gW-RDOI004^@001zP!38t1PBjC6^5x?T z`OZzZ<3MJJ6D8^3QM~&Z&EzEGc=W+VkrYzH%CM2ve@aXn->Ap9q-P76p&J(GKTPz~ z5*7+AWe?6_>F93}18I;za&Q*rtvb=Kir16VCt_9i1f%;~*&*4cUh5xw(WG3DvBnW|5FCxMXjw&pl)H~P zW!D&^cJ_xN1C8q9 z(dGQCPh@lkWf}ps!LmVk%TTea&>vyb3Z zv?!gi!jWz=7bE9yR+yY{IYW(nPlVt6UbFBB1Vf|2&;KI>F?fplJe8khe#J;U@bF8} z1us5|2xg-$D-wZ^hxdv}=g~y80yuZZdqx9;3Gatp$ok_bd*;|HumaEqvZJvs5lYJ# tlx_l5$^W2I6;Du00Rle*KL7#%4ggzRJ5|gW-RDP>s|8sGl?4C*006T677_pe delta 608 zcmV-m0-ybf42ldJP)h>@KL7#%4gd>j$5b=sctl7A004^@001zPzy&k0PBjC69NEUM zDuc*rSpFHWUcv$l+t0ptMP)=%#;{!!S_LPVr8|O_XcrgqWQ!ksPP;yoz)Ss60m?mF zoRR*%>>^9|B#PljPI=#t^!!kT;c|dd1-F?g3<{fDcJdfsfV*WJ6~@b5(35qfACX7& zItW98hhHqJ{$CRVA1~d8i&5uu^Gk_8YKey4 zg2gp*wDd*o!Ay@6?yah!+=FGo@ss|nK_PHVQjM`8xhqt2j9}>7i*le)-cB#b4$S?` z>^`+qtdo_rWRsSN2h#wOLL$OQA;^x6C_Dn*=n)sGO3sDo6P28M0l^A?IXi{(73>S$Gu0IrSiM_%>D^?}aAVtzhh1#L$`mV-9B(&5DToBGN8f{MADG%&e zqnwQ7$@g_t;Ho#irHf~OrJPlKmR=sVJ~%j^ODZxgAmnhv#Jxj0#7y24SoBx=@ke|N zQbi%EHap`p9qVc;Z3a!t?)%onk*c~MOk(K^qEZu5+gD(TG#*vanHP5&;binauZw|D5IpWIZh2wU23IE%q7YTg ux@t)W4Q&4NibPdVO928u13v%)01f~PX~$GE=6FO%ld1(-29^Z?00009Ulh>* diff --git a/tests/ast-parsing/compile/modifier_identifier_path.sol-0.8.12-compact.zip b/tests/ast-parsing/compile/modifier_identifier_path.sol-0.8.12-compact.zip index 7e6e7a65f51548b536874d0ceb6ffd7a06530898..6159756b985c81d7e4414087f5196590fae8d3e3 100644 GIT binary patch delta 607 zcmV-l0-*hf42cXIP)h>@KL7#%4ggzRJ5}G#!(K-P004^@001zPzXda~PBjC6ki50s z-ymFfN;ym#PC%G{Uxg(`cWH;(U@T0+Ww~s-o-Em5_Ndy?bytvU{Y^1{x zS@_fc29n&0T4_sX5%b#z^GZX16zObBtpM{BHCL=^(lI;JSVYizk2%GBzeHuaMf@Lj zQ%S)1$+P{4O$jt~7_?KcLSXkNvT1LYx3y)uTobi}F*KA7a?@oQs_L^D??=g> z^MzxTDF61RE8K+r3Dmab!?7`!=y%kDnzWPyTssD zD_ER_%O>hpwI`6X^6~L&EIVib%D4_`-47I+OcCF_PW_`wZ#UCEz~QXwu1CicS|_*4 zZ(wd`M>1J$Wnl)Of5d{4hZRlW*4G@W%7!jT_AWXYXLq=y!X^lM%j`}_ojH>6vj39d zMQz6*y*dbJMaSgH$mNQEgtC6nXE3{)%n{^HHISZgVIa|k9-+Xa9B-)}`@+IdHgym; zGIUmTi0F)z&j13l&9f5RX@BZSZJ`&$A=}fS>tW>DKpA5CZIN^d#{GaO|B$jTt#*>t zt$hcxL<~hFw@-h$H9{`@KL7#%4gd^k$5aWAw^l|4004^@001zPzy&k0PBjC66a9Lj zkE}H-YU!4+)=La~IgPqoEXSOGG`^t=)n~+!*~7J^50zV|w<3W`QG{xFq?tI5E|&PF zbqOo>Mkgv6%mrtc?+2mGmXmxI#|Xb8FElVe&a}BmQJs@-)#KgqJeKFxy#Weu%nBQ9 zFNLLLQ$!H16+?t4ZJ}7qTOxvgtB`SzNR~F&4cI$E6R*JWNM)^G;YiJR!ZGQEq!d%p zv*47XhXlt(^Z`okx<9EidcqA~{}Ul^c?A0|QR-O-$%WMrK2Y_rvvo!Z0KnZ^S#3Q7 z!@wSgo9OBp*5nCQ``^6=#&ESMK%V`qVIK64tu^y-m3-MJBS#a8Ed-O?86kkskgaIS=H3FdQWo(4RBF|aV8Oxe?}=(_QjCo zPoPKO)I(NdodpD?!$fn$ZAs`42IxBWVAQWNRGM*x9*a2MTi;VTh($ diff --git a/tests/ast-parsing/compile/modifier_identifier_path.sol-0.8.13-compact.zip b/tests/ast-parsing/compile/modifier_identifier_path.sol-0.8.13-compact.zip index 47066aa8b650a72f72f2a5098cee0c3179304acb..41d76763d5d1542974c67619e73de821451c060f 100644 GIT binary patch delta 598 zcmV-c0;&Cn42KLGP)h>@KL7#%4ggzRJ5>OBI`%~c004^@001zPz6CR}PBa65dJD(q zheUD4G-$bss#4tew+48+mIWJVKWlLwllJ7nzn{78M#^4Yt{*Y+y9}dQSk0)F_#s(2 z7{3plY(&T{5t;P&&-8XpO^y+W>;x8cTq~TBgS~SL z>HyEoclQ?;Q@~a@6u!Lme~W{ReSit%BR#w6IvP?kvV{iUuED;XhyK{Ooyh5!$S>ls zffxmepxaFy+rPzZfu00k2&aXAg)-@ff^R%Q$fs4p?{W?$y}G_1kl!S~`#1~yj6e1n zoAT+*q8Bvtk^J4Y-!i&?YY=S1!=n^=rqiZQnq43w96(@+J{kR@DVV8B7?08jFN(eQq2Pqp3ymZtX5MI5^5hCB~!86KJ**J z?;z|{sqZDVt0I0f$rWQ^qGMMozngS$?mLuk&KDWjdXTj%9?e53k630Mq97?nHY~b| kvL&E@|NWkv!ca>A0zU&k00ICG09#x;RRDTA_LHXtU`SLO{Qv*} delta 598 zcmV-c0;&Cn42KLGP)h>@KL7#%4gj2q4^_5aBqc=!004^@001zPz6CR}PBa65d7ut8 z4l~K0a#Al%R1FSq{MPZIk+&{_C$yAnSz}C*adu&uqZkYSmCV;G1 zt4+`GS63Y0C4xOEy9nMXeBbtR4J3r&(Y2QGu9chXMu;Jq8d4?QTHKD!VB$8WiA$-l zr-Lx&8L#a*DN*h#$F|TFf5*9h)6t8xMdKd7V#S}uK*J`w+R%Bye$Jb1K}9BDRWN*I z_cE-*K=&j-*$1j!GGBNL@4)q9|FP43gEcyIvP9!B zn3I>DnPmDvOlr0b$%;yUN0;c9eqyHA zi1lp)_`9pKc3r@4nlR7cVi@4WE^r$0(&zmv#0aiEys)nylBV#_7M6aaoI0!R>v*jT zDk^0KIJB-UcbPLyb#DhB9Q&NSIz5d^Tjpf8_~Z$q>{L`Fc8nS+memZM|8;z-ulc%e k*L}N!<^7ScpioNz0zU&k00ICG0Gx>rRkmIvC6lKGV3V&NBme*a diff --git a/tests/ast-parsing/compile/modifier_identifier_path.sol-0.8.14-compact.zip b/tests/ast-parsing/compile/modifier_identifier_path.sol-0.8.14-compact.zip index 01de606fb0b89b11c3e1f9e845ae07c456fddd3b..eac4ef5fe7a3d4b126f71de2dada790ae6699198 100644 GIT binary patch delta 607 zcmV-l0-*hh42cXIP)h>@KL7#%4ggzRJ5`UKOc6%~004^@001zP!38t1PBjC6v5vJE zXk~kjBP}Y$buw?Sp)iC^j${a34J$Zak*wMMoa%7&33Q}L)x3<}?djed61VrDO zUSDyi;CwRx4IB;^caDDxYAeTgp~$E=0TzN47nqR-a0+NIh2s79e~2BSb3M z_Q10BP^?d34J4yJ^K54HT>>~xDOuRxj5>ahOL*g4ZPTKSs`N$dSZyAEfb057>l*Bp z?8VC+@{VfFk3OOx705k0Oy^p^hId9XaL@m#Ovx1g+|GtjKvr*lCF}ltFZkOr>vC7T zy-#R4N<&zQv5OhVKrw;iIx!HmaaV14O@@8A2o#6im44FWLL~8%6n)^1M6N+V-3?iO zZ*~H-P)FF71M)`{C!W`VyUuj4ZgyPO%Mes zvWdQNSNdFAmb#J%OKu>;{q~W(aqc@w^1%4IcfMLH{f#YOr|eC9$XFR2ZX^_^(bj0& zt6>`$+TLn~R58|irB@{djIC6yy1X~kiLfqp94=aiyaVq}#?XZ;c`W~3@mMxVf((4? t(``$bVU_pFR`yU!0Rle*KL7#%4ggzRJ5`UKOc6(us|8sGl?4C*0093H8xa5i delta 608 zcmV-m0-ybf42ldJP)h>@KL7#%4gj5r4^>qTumng2004^@001zPzy&k0PBjC6SsY^2 z4ZcQPg8hS5r42Knw52(KIRT!FaOuiVq@AK~Z61|SdrthXRpNV2{u9a*IB8O$sSR8f zn3|!`%s?s1^7QH-Sni$oFZAw}b2T^i--m*IVLoWm&IX88|J=eU(%8o@f;Xh|0&c4$ z_JNB&j8I!_ldnPhcgxc`jdFN@PmeDW#Wh0%#-NdRU&~x?XF!#R2;dWlH?HN%I|yAQ z9r+>T_}MFq#kDNvG4#fMtkl*Q-6(cmBZ`@xvml7u-~t0d2^J^&h>kN|XG-aX?}h6T z)*S**o=-ktly=8>tC9^rXp|<{_AD7txR+enMT;2E)=$$zPzZtDV0K)8L6R*+bE1hJ z*M;rh@eBFl^cCbE>Z!_eVnP6qYuj`Gn{!c>@5`&j--ZHpP);KD5`xbE<7 zwd$vgd7?L6&Eu=Sfm@;tnM|KSg$cymn{xQM`vJ0Lw}p+UYvtSB^pEIcTi~V=MMVX6 z8AkX+Y_512tJf94#+~7RlUvMbJSe|ysXU4P2y^Wq{L+@(UYH2$YH|a}yU@21o7yZ< zLC2GIb|DruMmsQ@LGS(g{b2P+o+^3@KL7#%4gg$SJ5~3eq-9636L156@`Vuzq$zClNDSk2-X|fTY@kot$O^(1PS%%dQF>o^jnq8I-kTNckwoe4gQAP1ayM-LiDn7? zb_^#4$gB#QrJ&8lu60(3?fCsKKOPFOCpK*Ai`9DF*Sp-FL^$!~2RheFHxkK1C`P@k zIVZ+Zl^HdE-Jv<198jPvKSumW4w9{xNiuEQWy6AV2`TKS?0=))z2+=IKxMp{p|KKy z$Ik&y$sj_9B0|>BUo>iggUA|ll9#l%k zvNlonlp&v>7cX7JAb0d9t)TmY`=n|4>H3H!zql zpw~>ZF+KYH3p=P$fYlePN1)SsIb#Q3=OoXh{ zvU+_^?ln71M`P1YMa@qO@t7FhQ0+tH&}92n3HX|318A|36q~ze(cJGfZ5kw-%ktAu z&s1`fj?KFcta6>xhukpfxZAS6IL^u=z3fLTn-5|<{6$W>SnZx%IrOz$E#>(bHRVuC h0Rle*KL7#%4gg$SJ5~3eq-95wtOZ#Hl?4C*005|38{hx{ delta 609 zcmV-n0-pVe42ujKP)h>@KL7#%4gjEu4^<0eWsFG$004^@001zPzy&k0PBjC6rfE}) zB^*BvDdJravy87srucen*H@!-SuW0hDp2-V8k%ie^Y7;%3Q^TO$KMk)GFk3{k^Hc< zDslpj0P%x#5a4=73DX&ls9X7Z48FPr>)=w^q3RSNf~Dj7E>`}zZ-g2{5^G8E1Q$$o z6d=5teAMQ$dN2RzDgWNLE$4oJliq)dioTC)odkV(`Ga!iVwYw3IL*LbO0zKT-^gzw ztxEH^-SVv!j?aY!eiO63(2U8Ln%KISk;7pkGMPiO2jB1GjNm2Zv-_UH@9F>}M$s1c zrdd(NvOIwCfsXkX9P|qXQp_tu`<_497j5ARIQFj2*-hT=g0uPA2n+##px+Up`0i!_ zwl2S)@N#iY%KpbBV?du4@t0{~crS&*1{@Z?utD}bHhb`gwg#0~ z)XChh7Q_{u5yvUZc(@FS{T#Z#?OHWHg4Uy2*${u--Fl7NMRZi7LHZVmoMP(=+$ub< zoJY5Y`b1tgUMCRJsQSZyvl;IDgY#)jNx-q$;O)-S~a{fbeZ7f$(G|r9=yPEePBQfKsUs@p+-%g{8pjU z1P`h3;4W~C@gWr+V#s;PWG?u{2-YS>!YYigPw*}gw+Ap!dE-+p*i>NNZ{JqVp8Fh7 v^Eh?bBol4_5rS+0P)h*@KL7#%4ggwQJ5}n6t0?5^jkA_UC!c*$}RBExhs zlpGgqp|BCC$Kl?$Z3ii?ad#wmc;KBJq#>VHJ<8us3XSoGHYT-5`F}xgGQ) z!Y<+hP|jj-t(6CNdPS>EB2G{z(?pNqa~f1kSF3QKb=b^iADrP$!E?5m0v0cO$fd0j zJ74sFvK+u@h>bU7?pc2ozj|nO=>1&O?MM^Axf6L{`Vw?qfeK}I=(YF(u|`#PK@S`43Ok2Z11&CJP@v{xQ|5X u)kM_bi%-}4X-0`qO928u13v%)01g0JTsu|rq>~Iflb{7z28aa!0002G$|L&# delta 611 zcmV-p0-XK)3;zofP)h>@KL7#%4gdgY$5hJ834J}W6IKI%NDbaOQ%ySh?1Wo|2JN1= z>aa=Q&k_ShBt~=kyN{`7vcv8rxdRUGf+EBzsW7zPaDvjKYdQooNNf?#mh0a4TsMrO3 zA&|;1lG=(EhNCOoS&X~)Q1uH#t()Jkq#bVv?ZbsjI#m`J9O1*E>8gF-jerfc+hd#L zvSinTwh1>>oBjiJp<*sYM$_9UA(3iI_^(I?w~tMGcjNK)Lnn^vJ#fBm}9k39@L z|B*sF&+ciR&lW)W1d)9qj}~Tt<9;`S5i+@5*s(4SV0PZ}8!RcX8rbT4Uv>zub}m4F z5Xd`bFUr_@6vb-tIDCMZt5jv{CDkOvo3p(>>HCg!M|$hD7d(A!%_pPH;|dV_;wk|Nqy0xr|Ut0Rle*KL7#%4gdgY$5hJ834J}2odsD2iv<7x005D{FaQ7m diff --git a/tests/ast-parsing/compile/modifier_identifier_path.sol-0.8.3-compact.zip b/tests/ast-parsing/compile/modifier_identifier_path.sol-0.8.3-compact.zip index 728beb81f1b5d58e398ac780e49e1a6831ebadaa..c5b0b7f1abd00a7835c99d311b22e2619d5f4169 100644 GIT binary patch delta 609 zcmV-n0-pVW41f$1P)h>@KL7#%4ggwQJ5_uJw(>r)6Ila)v%<1V3dIwif}G8Q%*AGi zBvkP7f!U z(i3rdL(GWusqHasI!CDixXpg5Yp11fS#ElFUcD|D)#>O=YxdqJh$^ooIpU8d05gu#F;pAEn+&8bxqj zLRHm%#dxuN)ko<>{Dbj>`=R@VU_;tb8zNq&kT@@Ho4;EH!;f{*s778e#TN0MM_x}P zsWt?O;t=kbnREmMP#US)jLrOMX4?bm*57G4%3vXSIyL(n4)04C?X?+LZF_--6(+`; v(yxOMStebZ{)sT-P)h*@KL7#%4gdma$5bMBXe~dn6Ila)u^!6l$+_&8`1&ScbkN$n zD}d4-zi%aCz9y;;sIT*YC96Bq@RpQNjt+T-kilw8Jo!brX{Q99p15SWdVRhCOMh~G z2epW5XW*PW&~({Tl{o&74HcUpvo;}EaF*wo#YJrOSmslpxz}980y!*)I$b!8_dry9G%g391^z zg2u+X7U=1Mg9HgldcBLQxTl=A$fIYf&8+3AK_(NTaU11MbUHQn+OvZ;rC47i^<$%3 z!FStMDzKBXS(z~|BZy*CaE3wCxgltL%JZVZW`MSTy5Pv2+2IM}X7?4(xyDi}^cZ~b zL818e!+=^QHCd|k7mhP~N|>Q^48dPhfF#a_yR(IiMh9#ysPP{qX}QJPye_gP#JZc2 z5{aetXY>E-#8y0U#_<#CZ z#PW)o3Yj1&{MWDFVksuC52k~+aL$Z1wE4}EskrN|tSeki0CDCT#A8Lux;ARGYpR3dk1EkBc?1z84-1poj503p;O_5c6? diff --git a/tests/ast-parsing/compile/modifier_identifier_path.sol-0.8.4-compact.zip b/tests/ast-parsing/compile/modifier_identifier_path.sol-0.8.4-compact.zip index 1eb88493e65a540d7a635b94019e1ceb5f093d32..fb11df4aef1e488ce17f8d5d784912f24a048cb6 100644 GIT binary patch delta 606 zcmV-k0-^nc41)|4P)h>@KL7#%4ggwQJ5`M9iOxZ>6JG;=sEJ)$JcXy3IX0c~;RcH% zLSIawv-oNXuhXm=&q+Nz*5knJ1=jT=DNmz-HEc}g$!inq+W;GA9$u3xOa3xrEkls2 zpHGSKej!|TkU}WcWkZLkLF)3mSn*I=5es-i$8<5m43LDD#VL~SdE9-l(kH};5gZRa z@c@LTffp=)%tGhKMK9@GUxny@f*8@~>LF!iyBrYbpn4LjB!N{oM#^C}6TBs=t@{yG z!Z|S}&B#2v;XtOOBv6XXDPkACnOhlU?Zlsr-g7GM&O&g3Hn;%1yMWIHXxB5h@@ z4*o_$?mBX4TZ*|tcB3rwc~x~}h&vX^b7i}g+YVuW;^RQ@OGXOARX9+#ekcnrzeTKw zjg|5ahZFvg?UjM9n>y|H2*wrHqegf7_xG9u`-NLy4MKvJxR;BQZ{=LrrEj>qx7Dn_ zTFE)O_cSt7%3V8g+TyCt&kNc}VE;=mw4=n+3qa)dUCPtMThfKEe3F~=_ zmj}_A^g%d}N)XH&$OBmkdwspTJ$VrM*Bh7>3hp2w5OQ&LkWo70DQ3jnB3$7XBSbTl zJXzLS&3z3Ngn(T!4KqPZ-Q{kdV4kg_#sz4AV**Dr s!3@KL7#%4gdpb$5f@naMePw6JG;=rON4MkAMOg8Sb+Iir08L zaHFgZHT;x+#AdK)@6tKI9A4)HEt{7hD_&aKUI}m`@dWX$M*a5Kb@7c!$HyAsW7A zv5y#BY1+eoB5~4Nfb0inV}vurZ2?BtU}gQxz5wQL`40E}iu?kJs`Qt1zWv0Gkp2h8 zaeDSBgNrf!seA;nr0WDeCn2c+qx0JgZEpPGS%-QHz^o9?#Romb#=-djNmaCpIpt}Egw3d7Ddf>G zn)3pGk8sA(lq@dd4|opZ*DNS1hQ=tw=Z6BbW$BTd0CT_`+WH2Y4Bw3Ed!__{a-D;+ zZMCG=7em}7zq#Z+$h&3i&G&ZS=&XrYAoRa8JPjbK$NV%fTUHxdzoAfX(2~(%_DK?i z!IARTv$ecT>3wi`dw7z+8|s}X?Oy|>s^YgdriQ7Vu<=_b4-s0+y62kP!e@KL7#%4ggwQJ5~Cr>tjH%6JG;=aN_UgWaEM(l_l~qldY8g z;>oSO;M$R*b+OXiK;+OqZ~~iz3DANltw;R(0X;#plDC0|h8R$FPeBQBh5NJPC+X%< znaQKZ)t$RrR?(NY{u4kB2h^#Wj-QG4N|;pZMTQ|C6X zGFo6eZdNb?{LnW?6L2R~)rGFY$cQr9chQu&!Xl78w>Gw@36E#CtO=@^$@5TAv8@S4 z!X^oS8-K~g;+>ucxF`1B-5!|&WPo?$3f2XvuDh!VD?OUuz(yIFvP38RH+KZb(}U!X zvnfbGFM@q^d~y72z!O!Vpt}z$G}Rtd@=eUQB8yhy%q@@{g+q-*<5$PZdcM_aSuJT< z%GJ{JJGxpY!F*ioV=A!pBROo!I9-HWHRtg))wM`+(l?aQt>0(URLCW93uHNI+Gjx0 rPc}3Ef$Ap!P)h*;00000)>t1c delta 607 zcmV-l0-*hZ41^35P)h>@KL7#%4gdvd$5d^8zGp(Q6JG;=ZqP1fp}MqZmCuvaCj2Im z&!~}-n6Pi8Qjg9 z@(W3{c=sWHju)Wv-h(|(f;(n?Mex<4ym=gmwy-!^yz`uzt|&Skh@k)9V={bYUvIfa zBkNUtof{Ak6@^(S4e~Tru+V-_P$0W|ozV0@GAf}yGb9d&IC3TDLAyl7iX!La{U#IY zp-rw?$myDb6S+<^2U`Gqog(qV#d$DH7UMM^yv$^OfZC89Y#Ow}JDL5Pqx!U`%5`XO z-hWn;%z+mgRcRNX*t@~#py&@Iv*YQ*+Ln8-$W6JKzr@yoi9(6a=nOQVw7L8ETEd&> zE+is<%Dq!z#6*+dWOo4)T`;DWP`dCGzxz(&e2G+6E}x9Q?Pp=}Hu{de8^K!n8x81J zB?Y&CR_Y><9oIUh8CVqnQ9ARP*i(m$gaDe2)<@%PmJaV0;KhiIIMhJ@uA_Wy2a0Gi z^5m}8AXsFUU3!f287m*1DcjyA`i0M;Wbz@03V1(Q98fNn+pDK2$e3n)x0o8tZ}Tokm!w++=V? tH9fPO=KtwY)(%ih0Rle*KL7#%4gdvd$5d^8zGp&{qXk(8kOcq$000>=B%A;M diff --git a/tests/ast-parsing/compile/modifier_identifier_path.sol-0.8.6-compact.zip b/tests/ast-parsing/compile/modifier_identifier_path.sol-0.8.6-compact.zip index 6fd91e0e7fd494f1f97ef51881c70b1cbfc6a740..b157c944e557e14e734161c55bebe7c7c6d9c96e 100644 GIT binary patch delta 604 zcmV-i0;Bze41o+2P)h>@KL7#%4ggwQJ5^pcY1Tin6JG;=rtT^x0?DkqR~tl|tHm1t zS}jH?!T}ElL-k1d{}l{MwP>Vi7vK{~`F_CLo~ zgA1o=dzh3K7BbP_zNSQVsto3{tk7Lk2tB>ExFp{>GPiIhU=5|t%Gto%f1_jVwjRIP zdBmsS&*#~H1uTmUow)VkM9Riu#I`YAauIy+$Ipd3Ulf z$LQj^@stH+wbk!+9Fp+&uU;>~6odhoAXj>ad46{C(y@U*M@Y(Kun`-vHL#!r&5V4= zhxUYjl>;a=F;Xp;VAq#n0WO|r>|)hNy^fgqYsnvK(SPh&2j~jaDXl?^D)j@4BR>~@Z>klY6jOa2P;=F9+0m^L q$KU^}a3+{gO928u13v%)01g0JTsu`>H)+;Clcfb&28{&(0001du^0;g delta 607 zcmV-l0-*hY41^35P)h>@KL7#%4gdye$5e3=wQxeQ6JG;=q&?m#aI?ndd!HK-M#5Li zJWg!?HJ)rF!&IWp5W=KguEAJ56X*M}>(QC@ZX@J_Uu|~O=%5qDZtpAsb6FYgtda*D+tdsM3*eX=3BcCNseGcSOOB za%brzohx&H{1f0?VJlr3>`592o=#_FYsHi4-9)jK)n5G$?d$^Fg|x0)nI^OfM-IKB+$=NVwcu1+%vJCyRT_i>FI}Emb|mcpu^y)9+k{WZ8>0wTMPUa==6igaor!3`FLR;gD7)rd%{UY;>Zl~k89kV zF#_J^Qhov*qW+!%oS&nxDTChb=I0sD2lm|M%#TwK@;u=}obimE=u`WRqSwqNA|FjO zvXD)Gy9-^HVe`C$PvAP>&?ap6Uc$fimnA(k@1NFqil{SK(QhaD=ybv>CKf;bjitXW z$Md3F$dXt3fskly6Xn2&;RuUNtRGc0Rle*KL7#%4gdye$5e3=wQxd{q6Jw7kOcq$0061@AhG}e diff --git a/tests/ast-parsing/compile/modifier_identifier_path.sol-0.8.7-compact.zip b/tests/ast-parsing/compile/modifier_identifier_path.sol-0.8.7-compact.zip index 041c5ea9eae38b1ceca80bbaf2342fa0adb0a084..a5d2432e063f66f8a9d57d5ad4c2647785f0fceb 100644 GIT binary patch delta 618 zcmV-w0+s!S41)|CP)h>@KL7#%4ggwQJ5{XMxqCqc005X6001zPy#+I|P9y_=Z=7%9 z+hy17ov9I-dO(u+ZVLUhnctAH2|!-~ry+mYg9h9Eax+DC6-Du%O@tAxON{(FtJbee zwX93KH2{WyJQ+BIWUKZO>P304dPl!{iUI*5mc&fH>+Rj8mlB~igoTw&QEM_)z!5sH z?u3U{iuVJWM+~M6L4fcb5S5{Ss`k%&R+M~DIyYst!YAFJj!HSo8Rdok^qk{AjIQQD zyf339r65QfI`C9a@t^NYBK~Qk#64i3`1|b(n8Jy?e@}W8DTOH`U{P!dG7*=A>#h)C zr7ELFr)TS;?D@T^Ho>hXQX~ay#16?uBo9Z1>iqW)|8sBrEaVXUH3Nfx@M193j=SQ- zuWR0`<1ikb`a5qm0w+#*$R?s=q_%Igg?qd)Fs@z{@UObD@5eX8ccN!~VT??M_@KL7#%4gd#f$5ba_Ia@@r6JG;=ZC$Z>sp`bT%IShFagQ_c zcc#gQZ24gh2Mx!3g8r8Xq;0Vr3IMdwV;?Rd$>P}e5suVts@1s7D@ewnzYKd6S7*-9i*hnVUc@~rL2OVb*BsInR6_+bdp|;SiF0Z)E zO_-eCB-z5cB~qI((w<)4(}Afy{1hEuwfN!|{ynm}*dplYLDWI*mPA!v4y?FfnXHnx zG{9n-CVoC8FZbOHB=s?#kaef@#1z%FVo~r%$ZVp_I1mpwXWdr}h!B;(1B0A7@LZolB~8Mb!BdWPfBe^32bx-Hy|ss6 v%C%`A`NJ*$9DJexP)h*@KL7#%4ggwQJ5_twZ;Lvy6JrB^_{OZ}yS?^{7B^vi&r)TmJ7yom|I`9yLyy z!K}4!^dgl+kwv=Swkgmo9StF%ZC`NY(?B!fJn>o(krz@-%4Yy$$ExTBJd z*lK4`Lw`_uVt!|9h||g29L>xV@55ygMpS61OY3MB4wSt$m{SI<<*CrqFTm7qmGewI z&55v`GT|I#*Onl9p_^RqXT}TEUw9m&7YWg@e_d{WE$K=Hd~x0>e5b$^TAD`eYz?{| zMZ)=vsen$d_kG9J4yZkdesZz}B?P8NPQnwnK!|s59|P4Dj>+%p?`NGsC%7e9x+a8i zfS=0Na4Mai_c@WLbTk6_bvjziBZQa}I(d14>Hg3g+ zG`|Oa!s1u${m`&v7pyX#yzkI8=7IIe5@)prYF`j)pB%hHe^`RJ>&#vFAOCM`B##i1 zqn{gi2>!2?(?!oW0HGiCp4ClCl=VGdSyXH*v$H6Ku?BZ$vF1RpB_TP&22cL0scKM5 h0Rle*KL7#%4ggwQJ5_twZ;LvUo&{M3hy?%u007KE7+3%R delta 596 zcmV-a0;~P}3;hcdP)h>@KL7#%4gd&g$5d)2;~hJ(6JrB^E8goK6nH{V&t+H*8B>+| zs;wJXwaY$T&$n{U(P{RgM;tOOmecPeu;UWHkX|1=C__i3$>orQAtM^(@OV#em69B(qT_)+IafwPk_1i{A zjDC2JfDh)4gC^7gquJ=9t{8={5H@&T;KxpctUmgGQofZBtmG1V^4O^zJYJ$KcZ%+` zIl_F8Kt#lQ=UHWC8*Q?I>Z|Z6V3>p3xG^Vj^%5DFCiq4+wr@pÐJm{^=Bw;Xed~ z@R*WaQDfWfiWA@_I3rwJ2>28x_nbb(g4JQ)2(7Vb$^?_!#BJBTjw{9L#a4>t6$DUj z!c)F~^U@HqT!=Lxy%!rbmthO*B1FU@KL7#%4ggzRJ5|ump1nl{004>?001zPzy&k0PBjC6_pH`U zdoRN@WbBm4Zao4Nq=PMk4CoHO27cPbF&N)mtGom7gft~1cE5B9Xd@HSPuu`4H z>b4FWN=SIi6IH)ow2mBckvg5-+8iRpdR>Q6=*83W3cpVofe|)lyM2gh77&b6n%c9T znPs16-q{KVr;%JH!$xqb8}&m);*RWM0BlKTtS10?tCl3bQ=MlSW|u*KxLL}w+l|^ph z6TMU&mpVv%<7Lyo?VWFbr4<^q-31eFanf(ki|j^iBT0UX9fqD=8hQIA!>1S}Kt~K> zcxnc=er!Vj3#~)}8E()0mXQv~c-Z`ySu);Qna7@KL7#%4gd;i$5dP7w3SB%004>?001zPz6CR}PBjC6rNk2o zMyFO1w_j_hx@lT)r1fA7FlD+j)`%je)vnuuek;KzN+GEh<&FbbbmOQ)t2Zc>@1Exvi8{tK?wrwJu(^x$=tNlA9d~UO|7$ z!0>dRu#SWC(3{}9_$D~KHJ2^&iZSAYDj#+Rk$C9gZZbK`K@AtPh7WDP&^X|hB4-iQd-qeks0Y& zhjd@soYfG=s@oB-a7+G&0=dB2+5B7xSD$cn^L%U}7J%y{k4^2zI7;15lS@D%26HAA zQsWZuSyZb8u3;yHJ|h3ZnZf{)A)|GUVshybi|B tV=Ng-9{=XN)R$080Rle*KL7#%4gd;i$5dP7w3SDbs0CRDl?4C*001$P51;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.7.0-legacy.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.0-legacy.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.0-legacy.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.7.1-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.1-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.1-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.7.1-legacy.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.1-legacy.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.1-legacy.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.7.2-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.2-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.2-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.7.2-legacy.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.2-legacy.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.2-legacy.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.7.3-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.3-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.3-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.7.3-legacy.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.3-legacy.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.3-legacy.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.7.4-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.4-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.4-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.7.4-legacy.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.4-legacy.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.4-legacy.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.7.5-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.5-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.5-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.7.5-legacy.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.5-legacy.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.5-legacy.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.7.6-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.6-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.6-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.7.6-legacy.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.6-legacy.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.7.6-legacy.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.8.0-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.0-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.0-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.8.1-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.1-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.1-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.8.10-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.10-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.10-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.8.11-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.11-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.11-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.8.12-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.12-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.12-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.8.13-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.13-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.13-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.8.14-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.14-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.14-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.8.15-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.15-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.15-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.8.2-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.2-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.2-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.8.3-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.3-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.3-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.8.4-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.4-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.4-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.8.5-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.5-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.5-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.8.6-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.6-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.6-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.8.7-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.7-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.7-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.8.8-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.8-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.8-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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-0.7.0.sol-0.8.9-compact.json b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.9-compact.json new file mode 100644 index 000000000..eaca6e24a --- /dev/null +++ b/tests/ast-parsing/expected/modifier-0.7.0.sol-0.8.9-compact.json @@ -0,0 +1,12 @@ +{ + "A": { + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "m()": "digraph{\n}\n" + }, + "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/modifier-0.7.0.sol b/tests/ast-parsing/modifier-0.7.0.sol new file mode 100644 index 000000000..24240ad5e --- /dev/null +++ b/tests/ast-parsing/modifier-0.7.0.sol @@ -0,0 +1,27 @@ +abstract contract A{ + modifier m() virtual; + + function f() public m(){ + + } +} + +contract C { + modifier onePlaceholder() { + _; + } + + modifier multiplePlaceholders() { + _; + _; + _; + } + + modifier acceptsVar(uint a) { + _; + } + + modifier noParams { + _; + } +} diff --git a/tests/test_ast_parsing.py b/tests/test_ast_parsing.py index 506ee3d6b..0e7ae2152 100644 --- a/tests/test_ast_parsing.py +++ b/tests/test_ast_parsing.py @@ -12,13 +12,13 @@ from solc_select.solc_select import installed_versions as get_installed_solc_ver from crytic_compile import CryticCompile, save_to_zip from crytic_compile.utils.zip import load_from_zip - from slither import Slither from slither.printers.guidance.echidna import Echidna SLITHER_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) TEST_ROOT = os.path.join(SLITHER_ROOT, "tests", "ast-parsing") + # pylint: disable=too-few-public-methods class Test: def __init__(self, test_file: str, solc_versions: List[str], disable_legacy: bool = False): @@ -282,7 +282,11 @@ ALL_TESTS = [ ), Test( "modifier-all.sol", - ALL_VERSIONS, + VERSIONS_04 + VERSIONS_05 + VERSIONS_06, + ), + Test( + "modifier-0.7.0.sol", + VERSIONS_07 + VERSIONS_08, ), Test("library_implicit_conversion-0.4.0.sol", VERSIONS_04), Test( @@ -466,15 +470,15 @@ def test_parsing(test_item: Test): path_list = re.findall(r"\['(.*?)'\]", change.path()) path = "_".join(path_list) with open( - f"test_artifacts/{test_item.test_file}_{path}_expected.dot", - "w", - encoding="utf8", + f"test_artifacts/{test_item.test_file}_{path}_expected.dot", + "w", + encoding="utf8", ) as f: f.write(change.t1) with open( - f"test_artifacts/{test_item.test_file}_{version}_{flavor}_{path}_actual.dot", - "w", - encoding="utf8", + f"test_artifacts/{test_item.test_file}_{version}_{flavor}_{path}_actual.dot", + "w", + encoding="utf8", ) as f: f.write(change.t2) From 7951ec1c4e68b09d46c551a0aaeb9b1e163f238b Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Tue, 27 Sep 2022 11:56:18 +0200 Subject: [PATCH 50/87] Minor --- tests/test_ast_parsing.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_ast_parsing.py b/tests/test_ast_parsing.py index 0e7ae2152..f94103893 100644 --- a/tests/test_ast_parsing.py +++ b/tests/test_ast_parsing.py @@ -470,15 +470,15 @@ def test_parsing(test_item: Test): path_list = re.findall(r"\['(.*?)'\]", change.path()) path = "_".join(path_list) with open( - f"test_artifacts/{test_item.test_file}_{path}_expected.dot", - "w", - encoding="utf8", + f"test_artifacts/{test_item.test_file}_{path}_expected.dot", + "w", + encoding="utf8", ) as f: f.write(change.t1) with open( - f"test_artifacts/{test_item.test_file}_{version}_{flavor}_{path}_actual.dot", - "w", - encoding="utf8", + f"test_artifacts/{test_item.test_file}_{version}_{flavor}_{path}_actual.dot", + "w", + encoding="utf8", ) as f: f.write(change.t2) From 58c37ea7858777220af52a21d512a8c75050223d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Tue, 27 Sep 2022 19:03:54 -0300 Subject: [PATCH 51/87] Version check --- slither/tools/doctor/__main__.py | 45 ++++++++++++++++++++++++++++---- slither/tools/doctor/packages.py | 24 +++++++++++++++++ 2 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 slither/tools/doctor/packages.py diff --git a/slither/tools/doctor/__main__.py b/slither/tools/doctor/__main__.py index 74f854672..d1d73df2f 100644 --- a/slither/tools/doctor/__main__.py +++ b/slither/tools/doctor/__main__.py @@ -4,6 +4,8 @@ from pathlib import Path from crytic_compile import cryticparser import crytic_compile.crytic_compile as crytic_compile + +from slither.tools.doctor.packages import get_installed_version, get_github_version from slither.utils.colors import red, yellow, green @@ -25,9 +27,43 @@ def parse_args(): return parser.parse_args() +def show_versions(): + print("## Software versions", end="\n\n") + versions = { + "Slither": (get_installed_version("slither-analyzer"), get_github_version("slither")), + "crytic-compile": ( + get_installed_version("crytic-compile"), + get_github_version("crytic-compile"), + ), + "solc-select": (get_installed_version("solc-select"), get_github_version("solc-select")), + } + + outdated = { + name + for name, (installed, latest) in versions.items() + if not installed or not latest or latest > installed + } + + for name, (installed, latest) in versions.items(): + color = yellow if name in outdated else green + print(f"{name + ':':<16}{color(installed or 'N/A'):<16} (latest is {latest or 'Unknown'})") + + if len(outdated) > 0: + print() + print( + yellow( + f"Please update {', '.join(outdated)} to the latest release before creating a bug report." + ) + ) + else: + print() + print(green("Your tools are up to date.")) + + print(end="\n\n") + + def detect_platform(project: str, **kwargs): - print("## Project platform") - print() + print("## Project platform", end="\n\n") path = Path(project) if path.is_file(): @@ -73,8 +109,7 @@ def detect_platform(project: str, **kwargs): def compile_project(project: str, **kwargs): - print("## Project compilation") - print() + print("## Project compilation", end="\n\n") print("Invoking crytic-compile on the project, please wait...") @@ -91,9 +126,9 @@ def compile_project(project: str, **kwargs): def main(): args = parse_args() - kwargs = vars(args) + show_versions() detect_platform(**kwargs) compile_project(**kwargs) diff --git a/slither/tools/doctor/packages.py b/slither/tools/doctor/packages.py new file mode 100644 index 000000000..6cbf48f89 --- /dev/null +++ b/slither/tools/doctor/packages.py @@ -0,0 +1,24 @@ +from importlib import metadata +import json +from typing import Optional +from packaging.version import parse, LegacyVersion, Version +import urllib + + +def get_installed_version(name: str) -> Optional[LegacyVersion | Version]: + try: + return parse(metadata.version(name)) + except metadata.PackageNotFoundError: + return None + + +def get_github_version(name: str) -> Optional[LegacyVersion | Version]: + try: + with urllib.request.urlopen( + f"https://api.github.com/repos/crytic/{name}/releases/latest" + ) as response: + text = response.read() + data = json.loads(text) + return parse(data["tag_name"]) + except: + return None From fd7edd65456fc8104f731e4c58ca8170008b265c Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Thu, 29 Sep 2022 11:19:50 +0200 Subject: [PATCH 52/87] Update solc version recommendations --- slither/detectors/attributes/incorrect_solc.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/slither/detectors/attributes/incorrect_solc.py b/slither/detectors/attributes/incorrect_solc.py index 5292c19e3..c12d7846d 100644 --- a/slither/detectors/attributes/incorrect_solc.py +++ b/slither/detectors/attributes/incorrect_solc.py @@ -43,7 +43,14 @@ Deploy with any of the following Solidity versions: - 0.5.16 - 0.5.17 - 0.6.11 - 0.6.12 - 0.7.5 - 0.7.6 -- 0.8.4 - 0.8.7 +- 0.8.16 + +The recommendations take into account: +- Risks related to recent releases +- Risks of complex code generation changes +- Risks of new language features +- Risks of known bugs + Use a simple pragma version that allows any of these versions. Consider using the latest version of Solidity for testing.""" # endregion wiki_recommendation @@ -65,10 +72,7 @@ Consider using the latest version of Solidity for testing.""" "0.6.12", "0.7.5", "0.7.6", - "0.8.4", - "0.8.5", - "0.8.6", - "0.8.7", + "0.8.16" ] # Indicates the versions that should not be used. From 104a4790e56f3497b261cdd2bedecb3eac530daf Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Thu, 29 Sep 2022 12:23:15 +0200 Subject: [PATCH 53/87] Minor --- slither/tools/upgradeability/__main__.py | 8 ++++---- tests/check-upgradeability/test_10.txt | 2 +- tests/check-upgradeability/test_2.txt | 2 +- tests/check-upgradeability/test_3.txt | 2 +- tests/check-upgradeability/test_4.txt | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/slither/tools/upgradeability/__main__.py b/slither/tools/upgradeability/__main__.py index d772029d0..414a4c175 100644 --- a/slither/tools/upgradeability/__main__.py +++ b/slither/tools/upgradeability/__main__.py @@ -166,7 +166,7 @@ def _checks_on_contract( for d in detectors if (not d.REQUIRE_PROXY and not d.REQUIRE_CONTRACT_V2) ] - return _run_checks(detectors_), len(detectors) + return _run_checks(detectors_), len(detectors_) def _checks_on_contract_update( @@ -175,14 +175,14 @@ def _checks_on_contract_update( detectors_ = [ d(logger, contract_v1, contract_v2=contract_v2) for d in detectors if d.REQUIRE_CONTRACT_V2 ] - return _run_checks(detectors_), len(detectors) + return _run_checks(detectors_), len(detectors_) def _checks_on_contract_and_proxy( detectors: List[Type[AbstractCheck]], contract: Contract, proxy: Contract ) -> Tuple[List[Dict], int]: detectors_ = [d(logger, contract, proxy=proxy) for d in detectors if d.REQUIRE_PROXY] - return _run_checks(detectors_), len(detectors) + return _run_checks(detectors_), len(detectors_) # endregion @@ -279,7 +279,7 @@ def main() -> None: number_detectors_run += number_detectors # If there is a V2, we run the contract-only check on the V2 - detectors_results, _ = _checks_on_contract(detectors, v2_contract) + detectors_results, number_detectors = _checks_on_contract(detectors, v2_contract) json_results["detectors"] += detectors_results number_detectors_run += number_detectors diff --git a/tests/check-upgradeability/test_10.txt b/tests/check-upgradeability/test_10.txt index 1527735c5..3d317aca5 100644 --- a/tests/check-upgradeability/test_10.txt +++ b/tests/check-upgradeability/test_10.txt @@ -10,4 +10,4 @@ Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#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 -INFO:Slither:4 findings, 18 detectors run +INFO:Slither:4 findings, 21 detectors run diff --git a/tests/check-upgradeability/test_2.txt b/tests/check-upgradeability/test_2.txt index 7641e8335..dcf910c00 100644 --- a/tests/check-upgradeability/test_2.txt +++ b/tests/check-upgradeability/test_2.txt @@ -4,4 +4,4 @@ Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#initiali 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:2 findings, 22 detectors run +INFO:Slither:2 findings, 25 detectors run diff --git a/tests/check-upgradeability/test_3.txt b/tests/check-upgradeability/test_3.txt index b3c7c0a15..fb694d5fb 100644 --- a/tests/check-upgradeability/test_3.txt +++ b/tests/check-upgradeability/test_3.txt @@ -20,4 +20,4 @@ Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#extra-va 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:6 findings, 22 detectors run +INFO:Slither:6 findings, 25 detectors run diff --git a/tests/check-upgradeability/test_4.txt b/tests/check-upgradeability/test_4.txt index 4e32dc904..4752eb706 100644 --- a/tests/check-upgradeability/test_4.txt +++ b/tests/check-upgradeability/test_4.txt @@ -17,4 +17,4 @@ Reference: https://github.com/crytic/slither/wiki/Upgradeability-Checks#extra-va 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:5 findings, 22 detectors run +INFO:Slither:5 findings, 25 detectors run From d8f0b99a15fb3b1fb5a2d3b65ca00114c177ea0f Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Thu, 29 Sep 2022 14:53:08 +0200 Subject: [PATCH 54/87] black --- slither/detectors/attributes/incorrect_solc.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/slither/detectors/attributes/incorrect_solc.py b/slither/detectors/attributes/incorrect_solc.py index c12d7846d..4f1675b19 100644 --- a/slither/detectors/attributes/incorrect_solc.py +++ b/slither/detectors/attributes/incorrect_solc.py @@ -65,15 +65,7 @@ Consider using the latest version of Solidity for testing.""" ) # Indicates the allowed versions. Must be formatted in increasing order. - ALLOWED_VERSIONS = [ - "0.5.16", - "0.5.17", - "0.6.11", - "0.6.12", - "0.7.5", - "0.7.6", - "0.8.16" - ] + ALLOWED_VERSIONS = ["0.5.16", "0.5.17", "0.6.11", "0.6.12", "0.7.5", "0.7.6", "0.8.16"] # Indicates the versions that should not be used. BUGGY_VERSIONS = [ From 2ea2f0a3f7a66d43ca2756cb47ef41e62d451217 Mon Sep 17 00:00:00 2001 From: Paladin - Team Account <87263486+JorgeAtPaladin@users.noreply.github.com> Date: Thu, 29 Sep 2022 21:00:35 +0200 Subject: [PATCH 55/87] fix: self.is_valid_type requires Co-authored-by: alpharush <0xalpharush@protonmail.com> --- slither/detectors/variables/possible_const_state_variables.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/detectors/variables/possible_const_state_variables.py b/slither/detectors/variables/possible_const_state_variables.py index 245f81a91..1d18da5a8 100644 --- a/slither/detectors/variables/possible_const_state_variables.py +++ b/slither/detectors/variables/possible_const_state_variables.py @@ -46,7 +46,7 @@ class ConstCandidateStateVars(AbstractDetector): @staticmethod def _valid_candidate(v): - return _is_valid_type(v) and not (v.is_constant or v.is_immutable) + return self._is_valid_type(v) and not (v.is_constant or v.is_immutable) # https://solidity.readthedocs.io/en/v0.5.2/contracts.html#constant-state-variables valid_solidity_function = [ From 2f7e4ac6a9bfabd197fbda6b417f4073055a8130 Mon Sep 17 00:00:00 2001 From: Paladin - Team Account <87263486+JorgeAtPaladin@users.noreply.github.com> Date: Thu, 29 Sep 2022 21:01:01 +0200 Subject: [PATCH 56/87] cleanup: tidied up if statement Co-authored-by: alpharush <0xalpharush@protonmail.com> --- .../detectors/variables/possible_const_state_variables.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/slither/detectors/variables/possible_const_state_variables.py b/slither/detectors/variables/possible_const_state_variables.py index 1d18da5a8..c7b2e2ab1 100644 --- a/slither/detectors/variables/possible_const_state_variables.py +++ b/slither/detectors/variables/possible_const_state_variables.py @@ -37,10 +37,8 @@ class ConstCandidateStateVars(AbstractDetector): t = v.type if isinstance(t, ElementaryType): return True - if isinstance(t, UserDefinedType): - type_t = t.type - if isinstance(type_t, Contract): - return True + if isinstance(t, UserDefinedType) and isinstance(t.type, Contract): + return True return False From d956569474d23cee36e8ef628134843d81ccc78d Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Mon, 3 Oct 2022 12:09:02 +0200 Subject: [PATCH 57/87] Update tests --- ...ide_before_multiply.sol.0.4.25.DivideBeforeMultiply.json | 6 +++--- ...ide_before_multiply.sol.0.5.16.DivideBeforeMultiply.json | 6 +++--- ...ide_before_multiply.sol.0.6.11.DivideBeforeMultiply.json | 6 +++--- ...vide_before_multiply.sol.0.7.6.DivideBeforeMultiply.json | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) 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 index d164f9c60..9c2064da9 100644 --- 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 @@ -110,10 +110,10 @@ } } ], - "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", + "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", + "id": "e0d9e5f7d421dadadf4b22750bde5233357fa2a413478117848de6e44ba9c314", "check": "divide-before-multiply", "impact": "Medium", "confidence": "Medium" 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 index 6aee4f301..895721fd4 100644 --- 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 @@ -110,10 +110,10 @@ } } ], - "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", + "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", + "id": "201417019df7d5dedc2b65c695ccdce8dbd171768bb64e4bae44c2b6e81bb96b", "check": "divide-before-multiply", "impact": "Medium", "confidence": "Medium" 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 index 2639708b2..c250c523c 100644 --- 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 @@ -110,10 +110,10 @@ } } ], - "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", + "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", + "id": "c84a7841250790acbb447d31715ca8f7818170927909d599cbc08f49ce8a665d", "check": "divide-before-multiply", "impact": "Medium", "confidence": "Medium" 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 index 69310a741..7c68d8531 100644 --- 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 @@ -110,10 +110,10 @@ } } ], - "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", + "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", + "id": "1978edf9df9f9dc18d8c90bb008cca4bb4b0e811fd840a337ce006fcf38c7e82", "check": "divide-before-multiply", "impact": "Medium", "confidence": "Medium" From 9b51fb852d63f6b9ae9dc615bf11e3b00b5d19ba Mon Sep 17 00:00:00 2001 From: Paladin - Team Account <87263486+JorgeAtPaladin@users.noreply.github.com> Date: Mon, 3 Oct 2022 13:53:24 +0200 Subject: [PATCH 58/87] fix: call _is_valid_type correctly Co-authored-by: alpharush <0xalpharush@protonmail.com> --- slither/detectors/variables/possible_const_state_variables.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/detectors/variables/possible_const_state_variables.py b/slither/detectors/variables/possible_const_state_variables.py index c7b2e2ab1..9ae30d254 100644 --- a/slither/detectors/variables/possible_const_state_variables.py +++ b/slither/detectors/variables/possible_const_state_variables.py @@ -44,7 +44,7 @@ class ConstCandidateStateVars(AbstractDetector): @staticmethod def _valid_candidate(v): - return self._is_valid_type(v) and not (v.is_constant or v.is_immutable) + return ConstCandidateStateVars._is_valid_type(v) and not (v.is_constant or v.is_immutable) # https://solidity.readthedocs.io/en/v0.5.2/contracts.html#constant-state-variables valid_solidity_function = [ From b5e6ebbc36c3c5e62168211ec2e96f1c709eeab1 Mon Sep 17 00:00:00 2001 From: bohendo Date: Mon, 3 Oct 2022 12:24:39 -0400 Subject: [PATCH 59/87] add block member to srs class --- slither/tools/read_storage/read_storage.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/slither/tools/read_storage/read_storage.py b/slither/tools/read_storage/read_storage.py index f71719c9c..fd881c05e 100644 --- a/slither/tools/read_storage/read_storage.py +++ b/slither/tools/read_storage/read_storage.py @@ -53,15 +53,16 @@ class SlitherReadStorageException(Exception): # pylint: disable=too-many-instance-attributes class SlitherReadStorage: def __init__(self, contracts: List[Contract], max_depth: int) -> None: + self._checksum_address: Optional[ChecksumAddress] = None self._contracts: List[Contract] = contracts - self._max_depth: int = max_depth self._log: str = "" + self._max_depth: int = max_depth self._slot_info: Dict[str, SlotInfo] = {} self._target_variables: List[Tuple[Contract, StateVariable]] = [] self._web3: Optional[Web3] = None - self._checksum_address: Optional[ChecksumAddress] = None - self.storage_address: Optional[str] = None + self.block: Union[str, int] = "latest" self.rpc: Optional[str] = None + self.storage_address: Optional[str] = None self.table: Optional[MyPrettyTable] = None @property From 2b9f192b39a8327ec7d3131ee56f48e6547c26bf Mon Sep 17 00:00:00 2001 From: bohendo Date: Mon, 3 Oct 2022 12:33:42 -0400 Subject: [PATCH 60/87] fix lint warnings --- slither/tools/read_storage/__main__.py | 9 ++++----- tests/test_read_storage.py | 1 - 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/slither/tools/read_storage/__main__.py b/slither/tools/read_storage/__main__.py index 88c381ac7..1a8901321 100644 --- a/slither/tools/read_storage/__main__.py +++ b/slither/tools/read_storage/__main__.py @@ -128,11 +128,10 @@ def main() -> None: srs = SlitherReadStorage(contracts, args.max_depth) - if args.block: - try: - srs.block = int(args.block) - except ValueError: - srs.block = str(args.block) + try: + srs.block = int(args.block) + except ValueError: + srs.block = str(args.block or "latest") if args.rpc_url: # Remove target prefix e.g. rinkeby:0x0 -> 0x0. diff --git a/tests/test_read_storage.py b/tests/test_read_storage.py index 61ebc0653..67a89dae8 100644 --- a/tests/test_read_storage.py +++ b/tests/test_read_storage.py @@ -112,7 +112,6 @@ def test_read_storage(web3, ganache) -> None: srs = SlitherReadStorage(contracts, 100) srs.rpc = ganache.provider - srs.block = "latest" srs.storage_address = address srs.get_all_storage_variables() srs.get_storage_layout() From 4bafbf9f5777cf6dd43768887e113535d0216398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Mon, 3 Oct 2022 18:06:48 -0300 Subject: [PATCH 61/87] Add bold to colors class --- slither/utils/colors.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/slither/utils/colors.py b/slither/utils/colors.py index 14fc4b345..5d688489b 100644 --- a/slither/utils/colors.py +++ b/slither/utils/colors.py @@ -10,6 +10,7 @@ class Colors: # pylint: disable=too-few-public-methods YELLOW = "\033[93m" BLUE = "\033[94m" MAGENTA = "\033[95m" + BOLD = "\033[1m" END = "\033[0m" @@ -83,6 +84,7 @@ yellow = partial(colorize, Colors.YELLOW) red = partial(colorize, Colors.RED) blue = partial(colorize, Colors.BLUE) magenta = partial(colorize, Colors.MAGENTA) +bold = partial(colorize, Colors.BOLD) # We enable colorization by default if the output is a tty set_colorization_enabled(sys.stdout.isatty()) From 5faddb4e7f23e5c42024ef91222ae33c2da0c447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Mon, 3 Oct 2022 18:07:36 -0300 Subject: [PATCH 62/87] Separate title printing into a context manager --- slither/tools/doctor/__main__.py | 35 +++++++++++++------------------- slither/tools/doctor/utils.py | 28 +++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 21 deletions(-) create mode 100644 slither/tools/doctor/utils.py diff --git a/slither/tools/doctor/__main__.py b/slither/tools/doctor/__main__.py index d1d73df2f..e7d7929e3 100644 --- a/slither/tools/doctor/__main__.py +++ b/slither/tools/doctor/__main__.py @@ -6,10 +6,11 @@ from crytic_compile import cryticparser import crytic_compile.crytic_compile as crytic_compile from slither.tools.doctor.packages import get_installed_version, get_github_version +from slither.tools.doctor.utils import report_section, snip_section from slither.utils.colors import red, yellow, green -def parse_args(): +def parse_args() -> argparse.Namespace: """ Parse the underlying arguments for the program. :return: Returns the arguments for the program. @@ -27,8 +28,7 @@ def parse_args(): return parser.parse_args() -def show_versions(): - print("## Software versions", end="\n\n") +def show_versions() -> None: versions = { "Slither": (get_installed_version("slither-analyzer"), get_github_version("slither")), "crytic-compile": ( @@ -59,12 +59,8 @@ def show_versions(): print() print(green("Your tools are up to date.")) - print(end="\n\n") - - -def detect_platform(project: str, **kwargs): - print("## Project platform", end="\n\n") +def detect_platform(project: str, **kwargs) -> None: path = Path(project) if path.is_file(): print( @@ -105,32 +101,29 @@ def detect_platform(project: str, **kwargs): else: print(green("A single platform was detected."), yellow("Is it the one you expected?")) - print(end="\n\n") - def compile_project(project: str, **kwargs): - print("## Project compilation", end="\n\n") - print("Invoking crytic-compile on the project, please wait...") try: crytic_compile.CryticCompile(project, **kwargs) except Exception as e: - print(red("Project compilation failed :( The following error was generated:"), end="\n\n") - print(yellow("---- snip 8< ----")) - logging.exception(e) - print(yellow("---- >8 snip ----")) - - print(end="\n\n") + with snip_section("Project compilation failed :( The following error was generated:"): + logging.exception(e) def main(): args = parse_args() kwargs = vars(args) - show_versions() - detect_platform(**kwargs) - compile_project(**kwargs) + with report_section("Software versions"): + show_versions() + + with report_section("Project platform"): + detect_platform(**kwargs) + + with report_section("Project compilation"): + compile_project(**kwargs) # TODO other checks diff --git a/slither/tools/doctor/utils.py b/slither/tools/doctor/utils.py new file mode 100644 index 000000000..631095ba3 --- /dev/null +++ b/slither/tools/doctor/utils.py @@ -0,0 +1,28 @@ +from contextlib import contextmanager +import logging +from typing import Optional +from slither.utils.colors import bold, yellow, red + + +@contextmanager +def snip_section(message: Optional[str]) -> None: + if message: + print(red(message), end="\n\n") + + print(yellow("---- snip 8< ----")) + yield + print(yellow("---- >8 snip ----")) + + +@contextmanager +def report_section(title: str) -> None: + print(bold(f"## {title}"), end="\n\n") + try: + yield + except Exception as e: + with snip_section( + "slither-doctor failed unexpectedly! Please report this on the Slither GitHub issue tracker, and include the output below:" + ): + logging.exception(e) + finally: + print(end="\n\n") From 16393d51fe1baefe0aa6ca4ba8487e4d4872db84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Mon, 3 Oct 2022 19:21:31 -0300 Subject: [PATCH 63/87] Separate checks into a module --- slither/tools/doctor/__main__.py | 105 ++---------------------- slither/tools/doctor/checks/__init__.py | 18 ++++ slither/tools/doctor/checks/platform.py | 59 +++++++++++++ slither/tools/doctor/checks/versions.py | 58 +++++++++++++ slither/tools/doctor/packages.py | 24 ------ 5 files changed, 140 insertions(+), 124 deletions(-) create mode 100644 slither/tools/doctor/checks/__init__.py create mode 100644 slither/tools/doctor/checks/platform.py create mode 100644 slither/tools/doctor/checks/versions.py delete mode 100644 slither/tools/doctor/packages.py diff --git a/slither/tools/doctor/__main__.py b/slither/tools/doctor/__main__.py index e7d7929e3..94ae865ec 100644 --- a/slither/tools/doctor/__main__.py +++ b/slither/tools/doctor/__main__.py @@ -1,13 +1,9 @@ import argparse -import logging -from pathlib import Path from crytic_compile import cryticparser -import crytic_compile.crytic_compile as crytic_compile -from slither.tools.doctor.packages import get_installed_version, get_github_version -from slither.tools.doctor.utils import report_section, snip_section -from slither.utils.colors import red, yellow, green +from slither.tools.doctor.utils import report_section +from slither.tools.doctor.checks import ALL_CHECKS def parse_args() -> argparse.Namespace: @@ -28,104 +24,13 @@ def parse_args() -> argparse.Namespace: return parser.parse_args() -def show_versions() -> None: - versions = { - "Slither": (get_installed_version("slither-analyzer"), get_github_version("slither")), - "crytic-compile": ( - get_installed_version("crytic-compile"), - get_github_version("crytic-compile"), - ), - "solc-select": (get_installed_version("solc-select"), get_github_version("solc-select")), - } - - outdated = { - name - for name, (installed, latest) in versions.items() - if not installed or not latest or latest > installed - } - - for name, (installed, latest) in versions.items(): - color = yellow if name in outdated else green - print(f"{name + ':':<16}{color(installed or 'N/A'):<16} (latest is {latest or 'Unknown'})") - - if len(outdated) > 0: - print() - print( - yellow( - f"Please update {', '.join(outdated)} to the latest release before creating a bug report." - ) - ) - else: - print() - print(green("Your tools are up to date.")) - - -def detect_platform(project: str, **kwargs) -> None: - path = Path(project) - if path.is_file(): - print( - yellow( - f"{project!r} is a file. Using it as target will manually compile your code with solc and _not_ use a compilation framework. Is that what you meant to do?" - ) - ) - return - - print(f"Trying to detect project type for {project!r}") - - supported_platforms = crytic_compile.get_platforms() - skip_platforms = {"solc", "solc-json", "archive", "standard", "etherscan"} - detected_platforms = { - platform.NAME: platform.is_supported(project, **kwargs) - for platform in supported_platforms - if platform.NAME.lower() not in skip_platforms - } - platform_qty = len([platform for platform, state in detected_platforms.items() if state]) - - print("Is this project using...") - for platform, state in detected_platforms.items(): - print(f" => {platform + '?':<15}{state and green('Yes') or red('No')}") - print() - - if platform_qty == 0: - print(red("No platform was detected! This doesn't sound right.")) - print( - yellow( - "Are you trying to analyze a folder with standalone solidity files, without using a compilation framework? If that's the case, then this is okay." - ) - ) - elif platform_qty > 1: - print(red("More than one platform was detected! This doesn't sound right.")) - print( - red("Please use `--compile-force-framework` in Slither to force the correct framework.") - ) - else: - print(green("A single platform was detected."), yellow("Is it the one you expected?")) - - -def compile_project(project: str, **kwargs): - print("Invoking crytic-compile on the project, please wait...") - - try: - crytic_compile.CryticCompile(project, **kwargs) - except Exception as e: - with snip_section("Project compilation failed :( The following error was generated:"): - logging.exception(e) - - def main(): args = parse_args() kwargs = vars(args) - with report_section("Software versions"): - show_versions() - - with report_section("Project platform"): - detect_platform(**kwargs) - - with report_section("Project compilation"): - compile_project(**kwargs) - - # TODO other checks + for check in ALL_CHECKS: + with report_section(check.title): + check.function(**kwargs) if __name__ == "__main__": diff --git a/slither/tools/doctor/checks/__init__.py b/slither/tools/doctor/checks/__init__.py new file mode 100644 index 000000000..762c60b5d --- /dev/null +++ b/slither/tools/doctor/checks/__init__.py @@ -0,0 +1,18 @@ +from typing import Callable, List +from dataclasses import dataclass + +from slither.tools.doctor.checks.platform import compile_project, detect_platform +from slither.tools.doctor.checks.versions import show_versions + + +@dataclass +class Check: + title: str + function: Callable[..., None] + + +ALL_CHECKS: List[Check] = [ + Check("Software versions", show_versions), + Check("Project platform", detect_platform), + Check("Project compilation", compile_project), +] diff --git a/slither/tools/doctor/checks/platform.py b/slither/tools/doctor/checks/platform.py new file mode 100644 index 000000000..412b6d37f --- /dev/null +++ b/slither/tools/doctor/checks/platform.py @@ -0,0 +1,59 @@ +import logging +from pathlib import Path + +import crytic_compile.crytic_compile as crytic_compile + +from slither.tools.doctor.utils import snip_section +from slither.utils.colors import red, yellow, green + + +def detect_platform(project: str, **kwargs) -> None: + path = Path(project) + if path.is_file(): + print( + yellow( + f"{project!r} is a file. Using it as target will manually compile your code with solc and _not_ use a compilation framework. Is that what you meant to do?" + ) + ) + return + + print(f"Trying to detect project type for {project!r}") + + supported_platforms = crytic_compile.get_platforms() + skip_platforms = {"solc", "solc-json", "archive", "standard", "etherscan"} + detected_platforms = { + platform.NAME: platform.is_supported(project, **kwargs) + for platform in supported_platforms + if platform.NAME.lower() not in skip_platforms + } + platform_qty = len([platform for platform, state in detected_platforms.items() if state]) + + print("Is this project using...") + for platform, state in detected_platforms.items(): + print(f" => {platform + '?':<15}{state and green('Yes') or red('No')}") + print() + + if platform_qty == 0: + print(red("No platform was detected! This doesn't sound right.")) + print( + yellow( + "Are you trying to analyze a folder with standalone solidity files, without using a compilation framework? If that's the case, then this is okay." + ) + ) + elif platform_qty > 1: + print(red("More than one platform was detected! This doesn't sound right.")) + print( + red("Please use `--compile-force-framework` in Slither to force the correct framework.") + ) + else: + print(green("A single platform was detected."), yellow("Is it the one you expected?")) + + +def compile_project(project: str, **kwargs): + print("Invoking crytic-compile on the project, please wait...") + + try: + crytic_compile.CryticCompile(project, **kwargs) + except Exception as e: + with snip_section("Project compilation failed :( The following error was generated:"): + logging.exception(e) diff --git a/slither/tools/doctor/checks/versions.py b/slither/tools/doctor/checks/versions.py new file mode 100644 index 000000000..b7fbb1e13 --- /dev/null +++ b/slither/tools/doctor/checks/versions.py @@ -0,0 +1,58 @@ +from importlib import metadata +import json +from typing import Optional +from packaging.version import parse, LegacyVersion, Version +import urllib + +from slither.utils.colors import yellow, green + + +def get_installed_version(name: str) -> Optional[LegacyVersion | Version]: + try: + return parse(metadata.version(name)) + except metadata.PackageNotFoundError: + return None + + +def get_github_version(name: str) -> Optional[LegacyVersion | Version]: + try: + with urllib.request.urlopen( + f"https://api.github.com/repos/crytic/{name}/releases/latest" + ) as response: + text = response.read() + data = json.loads(text) + return parse(data["tag_name"]) + except: + return None + + +def show_versions(**kwargs) -> None: + versions = { + "Slither": (get_installed_version("slither-analyzer"), get_github_version("slither")), + "crytic-compile": ( + get_installed_version("crytic-compile"), + get_github_version("crytic-compile"), + ), + "solc-select": (get_installed_version("solc-select"), get_github_version("solc-select")), + } + + outdated = { + name + for name, (installed, latest) in versions.items() + if not installed or not latest or latest > installed + } + + for name, (installed, latest) in versions.items(): + color = yellow if name in outdated else green + print(f"{name + ':':<16}{color(installed or 'N/A'):<16} (latest is {latest or 'Unknown'})") + + if len(outdated) > 0: + print() + print( + yellow( + f"Please update {', '.join(outdated)} to the latest release before creating a bug report." + ) + ) + else: + print() + print(green("Your tools are up to date.")) diff --git a/slither/tools/doctor/packages.py b/slither/tools/doctor/packages.py deleted file mode 100644 index 6cbf48f89..000000000 --- a/slither/tools/doctor/packages.py +++ /dev/null @@ -1,24 +0,0 @@ -from importlib import metadata -import json -from typing import Optional -from packaging.version import parse, LegacyVersion, Version -import urllib - - -def get_installed_version(name: str) -> Optional[LegacyVersion | Version]: - try: - return parse(metadata.version(name)) - except metadata.PackageNotFoundError: - return None - - -def get_github_version(name: str) -> Optional[LegacyVersion | Version]: - try: - with urllib.request.urlopen( - f"https://api.github.com/repos/crytic/{name}/releases/latest" - ) as response: - text = response.read() - data = json.loads(text) - return parse(data["tag_name"]) - except: - return None From be9199e0afab7fe65373ef676ba545aa39f5e847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Mon, 3 Oct 2022 19:49:18 -0300 Subject: [PATCH 64/87] Fix pylint warnings --- slither/tools/doctor/checks/platform.py | 4 ++-- slither/tools/doctor/checks/versions.py | 7 ++++--- slither/tools/doctor/utils.py | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/slither/tools/doctor/checks/platform.py b/slither/tools/doctor/checks/platform.py index 412b6d37f..91d0d16eb 100644 --- a/slither/tools/doctor/checks/platform.py +++ b/slither/tools/doctor/checks/platform.py @@ -1,7 +1,7 @@ import logging from pathlib import Path -import crytic_compile.crytic_compile as crytic_compile +from crytic_compile import crytic_compile from slither.tools.doctor.utils import snip_section from slither.utils.colors import red, yellow, green @@ -54,6 +54,6 @@ def compile_project(project: str, **kwargs): try: crytic_compile.CryticCompile(project, **kwargs) - except Exception as e: + except Exception as e: # pylint: disable=broad-except with snip_section("Project compilation failed :( The following error was generated:"): logging.exception(e) diff --git a/slither/tools/doctor/checks/versions.py b/slither/tools/doctor/checks/versions.py index b7fbb1e13..909bccf55 100644 --- a/slither/tools/doctor/checks/versions.py +++ b/slither/tools/doctor/checks/versions.py @@ -1,9 +1,10 @@ from importlib import metadata import json from typing import Optional -from packaging.version import parse, LegacyVersion, Version import urllib +from packaging.version import parse, LegacyVersion, Version + from slither.utils.colors import yellow, green @@ -22,11 +23,11 @@ def get_github_version(name: str) -> Optional[LegacyVersion | Version]: text = response.read() data = json.loads(text) return parse(data["tag_name"]) - except: + except: # pylint: disable=bare-except return None -def show_versions(**kwargs) -> None: +def show_versions(**_kwargs) -> None: versions = { "Slither": (get_installed_version("slither-analyzer"), get_github_version("slither")), "crytic-compile": ( diff --git a/slither/tools/doctor/utils.py b/slither/tools/doctor/utils.py index 631095ba3..bc6112cc8 100644 --- a/slither/tools/doctor/utils.py +++ b/slither/tools/doctor/utils.py @@ -19,7 +19,7 @@ def report_section(title: str) -> None: print(bold(f"## {title}"), end="\n\n") try: yield - except Exception as e: + except Exception as e: # pylint: disable=broad-except with snip_section( "slither-doctor failed unexpectedly! Please report this on the Slither GitHub issue tracker, and include the output below:" ): From b96e0eef767ccb87188e6eaac77f295681d38dd8 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Tue, 4 Oct 2022 10:47:13 +0200 Subject: [PATCH 65/87] Improve yul parsing --- CONTRIBUTING.md | 4 ++-- slither/solc_parsing/yul/parse_yul.py | 13 +++++++++++-- .../compile/yul-0.8.0.sol-0.8.0-compact.zip | Bin 5732 -> 5861 bytes .../compile/yul-0.8.0.sol-0.8.1-compact.zip | Bin 5840 -> 5979 bytes .../compile/yul-0.8.0.sol-0.8.10-compact.zip | Bin 6020 -> 6188 bytes .../compile/yul-0.8.0.sol-0.8.11-compact.zip | Bin 6020 -> 6193 bytes .../compile/yul-0.8.0.sol-0.8.12-compact.zip | Bin 6029 -> 6177 bytes .../compile/yul-0.8.0.sol-0.8.13-compact.zip | Bin 5771 -> 6180 bytes .../compile/yul-0.8.0.sol-0.8.14-compact.zip | Bin 5768 -> 6181 bytes .../compile/yul-0.8.0.sol-0.8.15-compact.zip | Bin 5773 -> 6181 bytes .../compile/yul-0.8.0.sol-0.8.2-compact.zip | Bin 5888 -> 6062 bytes .../compile/yul-0.8.0.sol-0.8.3-compact.zip | Bin 5891 -> 6059 bytes .../compile/yul-0.8.0.sol-0.8.4-compact.zip | Bin 5974 -> 6132 bytes .../compile/yul-0.8.0.sol-0.8.5-compact.zip | Bin 5997 -> 6174 bytes .../compile/yul-0.8.0.sol-0.8.6-compact.zip | Bin 6006 -> 6180 bytes .../compile/yul-0.8.0.sol-0.8.7-compact.zip | Bin 6000 -> 6181 bytes .../compile/yul-0.8.0.sol-0.8.8-compact.zip | Bin 5998 -> 6162 bytes .../compile/yul-0.8.0.sol-0.8.9-compact.zip | Bin 6010 -> 6178 bytes .../yul-0.8.0.sol-0.8.13-compact.json | 2 +- .../yul-0.8.0.sol-0.8.14-compact.json | 2 +- .../yul-0.8.0.sol-0.8.15-compact.json | 2 +- tests/ast-parsing/yul-0.8.0.sol | 14 ++++++++++++++ 22 files changed, 30 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 798dcc96b..3a30595ec 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -68,8 +68,8 @@ To see the tests coverage, run `pytest tests/test_detectors.py --cov=slither/d ### Parser tests - Create a test in `tests/ast-parsing` -- Run `python ./tests/test_ast_parsing.py --compile`. This will compile the artifact in `tests/compile`. Add the compiled artifact to git. -- Run `python ./tests/test_ast_parsing.py --generate`. This will generate the json artifacts in `tests/expected_json`. Add the generated files to git. +- Run `python ./tests/test_ast_parsing.py --compile`. This will compile the artifact in `tests/ast-parsing/compile`. Add the compiled artifact to git. +- Run `python ./tests/test_ast_parsing.py --generate`. This will generate the json artifacts in `tests/ast-parsing/expected_json`. Add the generated files to git. - Run `pytest ./tests/test_ast_parsing.py` and check that everything worked. To see the tests coverage, run `pytest tests/test_ast_parsing.py --cov=slither/solc_parsing --cov-branch --cov-report html` diff --git a/slither/solc_parsing/yul/parse_yul.py b/slither/solc_parsing/yul/parse_yul.py index 05974ae65..0fbb4d790 100644 --- a/slither/solc_parsing/yul/parse_yul.py +++ b/slither/solc_parsing/yul/parse_yul.py @@ -675,7 +675,7 @@ def parse_yul_variable_declaration( the assignment """ - if not ast["value"]: + if "value" not in ast or not ast["value"]: return None return _parse_yul_assignment_common(root, node, ast, "variables") @@ -807,7 +807,16 @@ def parse_yul_identifier(root: YulScope, _node: YulNode, ast: Dict) -> Optional[ def parse_yul_literal(_root: YulScope, _node: YulNode, ast: Dict) -> Optional[Expression]: kind = ast["kind"] - value = ast["value"] + + if kind == 'string': + # Solc 0.8.0 use value, 0.8.16 use hexValue - not sure when this changed was made + if "value" in ast: + value = ast["value"] + else: + value = ast["hexValue"] + else: + # number/bool + value = ast["value"] if not kind: kind = "bool" if value in ["true", "false"] else "uint256" diff --git a/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.0-compact.zip b/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.0-compact.zip index b302d81295eebe32f31f9ac5b24779655c9f344a..978d4f3691fcbcd80a98fe5e923e59debda7cdf8 100644 GIT binary patch delta 5770 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 I761SM06^?6r~m)} delta 5640 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 diff --git a/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.1-compact.zip b/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.1-compact.zip index cd27fa7897fee73b33f07fa376c3fe1bde655757..4bec78ff94862e7a2b11c6843499d2986c925d81 100644 GIT binary patch delta 5889 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 XPXTVX761Tel9PoNMF#d3000008&E;o delta 5756 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 diff --git a/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.10-compact.zip b/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.10-compact.zip index 5113c34657f3f6fb32a741ac76141406581db00e..3bb97a3180657fc752f8eb67cbada173399060b5 100644 GIT binary patch delta 6100 zcmV;_7c1z5FRU;aP)h>@KL7#%4gj@PL{&}=1M!F#002Rikr+^aG4tx6-~i_Z*7ej5 z0z`c^2)IK2?Jk2OFU89G@O%A%dRt)nsJJD^W?y!v%6Aaq6{>@>IH0g^h&tjc|Csnv zqHUfg7pW^}DM53&C#bWv)+uc|1^fkP*#j3f<;p)SZn)D z_v8Q_E~7Zkwmn z=&$BbTt)kT;YpvnR^NG%eL%RM-6Qbde&o3oD>C1=1gB6ca#ig zkw;Dq1S=EC9gQgnF?t%dRtCjS1IN<*`)&I=?E1l|jA9I9pr;Dh4j!U4c7oG_=pSzn z>vIV#pTxYVeiJftA4o1DygIajTTJm6uFi{1&c(xj(rT!03Z>g;BP!m?G&`lGk7T1{ z(7u=O@K;%eb;syu{EuR=$tX0$eaRpZmTf^{fJ_+Jt{ObR{JR}7v znwRs`JMYbO5*kt(^B15s$@W*4T*Ob#3;!A`KmL5HF$Wy`|H2 zi&y4xD8udRgJ=38E%6Q#ljAx`N=s7xd`|C5YSZqB!sR~re@`wp^?wO@ zDO1-AO;T{)`DZ!JDGjj9@~C!s*cLW6?w&LZ%&lv)ymt?; z(bF~22me@ClCcSces_SM)s^MzR$@*3wOa|Z^F@X^tHHnCc=(ohg7mC^ z&Lc?_cKpWStI%gCIelB{&8P&g%(n4=)oA}859=>MHu}Z?jgFp?*;#8Z?}k@8Vujj- zKoYZ)X~#=nFyH8>HR6or)^k=SLm+DMqn=fr!!{^wy0cmKUnK*62;r5kd5uCR^`4V;ff{S0KQJvXE`GWBZm zf)kkCO-fK!_{Z&5f!Odw+7Xz4j7zL&QRre-(t+}gzv{wk#E+XxHW({6j#=|yN^;GgmZn71aagnoc)!_@+L`$2i)PM?+G8U%8yZNqu8#P))cWe%Sl%0y z-K$)9aE`*tue2RJansdwt3xlppa{A!_x@EnMUeIss#3F$C@BX!^#W;Qij zVdE5Mp>SyWzzI)-8q@VNl_;NI{chfXyP+z6&2E8k3ibsj4FWzDuz4x)}}4br=M1a1eC7hd8As0*o1 z{=1LD_;D6-biCxc9=Z2_vr@W^QhV1*Q5cua)@D)Myow`W;DQ)7d;OllI`bp~nlC^u zKsyLtmdiSlRo!Q&4Z{eY25-ud9-s?}MQ}QD!6de1UbRSBqE6EI4h%|ED>j`|oMVH88?Ias%h zA(e5J@Hb%9p>Vv7G~popD$kYua+eJ_@@aJeqwfs46{3X*FdNpsM{R#(gjxdX9=&?o z%KFmHC$`_~l5ts}g{N@4L#{}Ra7I}KcC&p@VfQ0(`ns&i5XWSs-=u?Wb6e!Gs$fPH z#;R)>%~{x!NvvyL1o03STCi0aPWMFWkyEiCu`U zwpg-oa^9%;k8O)=eDx&G+PiS>x(b8=8AP`7(y@FFwV*CpPbgcixH+(R=|X z1YZ1egwdCC=&N!W1`xwe>USylXZ-_HSrj5}LamXq!4$s+WlHz^o|aXKn& zbM|n>mVzIDnv#f{MhW}oTjBd)0S2&Oh<@l54Wb$S#Q*}8vj(-;m;5U072KZQUACgN zb7_g0n0=teaR{xHuq9eTvq;!7tv3kVgs}w=v^)=f6%7Jo+7DBt{~A&3ILz`2o&CG{ zomSfnab?UXpFeQQewL%zxvD33Sw+^y^97JQ>RhIOV~hS9&j0Y<>7i$u?kJ1K`7dk% zi-(+`Raoqs4mHTyHTaE7PJx_>o?y zVnKDF)ZKl41f|XPpII^|Nm@aK@Mj{+7OIHWNUYvXl*&K-pQIds#4WvJY~abP(@55; zhE6&52)RfoB@O`BYr&%wkz*@R$!J0bin~(!w+5_g% z+|oMa#O8*hXW_BXD6IO9+_{lT!=fD>&rR zrZoqj{Rqh`R!*Q-@@Tpa+re*SR%D;w4hWImXFoF#N7LAroV=e8Q$fr364lE)o0KJg zrv)HNUq3Nj@eA~Oc`ORc>r@mZ^sdcAn|5kTpFWk1s`>ni^ zMM<~u{K?b*|D)SCLU`BF%n=kq(ENGoW5Wq95w(lEQJucbR<@I>5TD=RV%S7b!Dv|L z(4X{co@w7t=sd0PwJ*AZezNnM8VLe_l*s%`nUqExW4SDeRN1P~emV*i7=;wq2pkyV z;ujWhtaha*5w|Q~pw-Z!ZX8onN?kFLQZwQZ=fu(T%`xUs$}7)Joek;7%g2l68^iV( zodJ&P_E{r>Do3a^R)5}JAGqW>r^#rMzwA1}*`rjVIB%uTf2Nsi(EGB>pbuAnYk$Dv zngbi++}{8OpG@6|Q9YolN-(1EAi-bYTlrr3KNTniR}jXm%AlX6m~DO6->7bza|+GH zUBC>!kZE^{Q&~soaBZwkBY2HBEq@;mn0N6tJjFw1Rj$dHk_S!pJwI%{2CV;E5X*+r zLcL&7xxgH-UrT5UOWarKD~G&)sBdy8>pVfkPAChm>)8|%u6%=7ZUfltmfD2Qo>7c!JKR>D;Tla!AI@8dgQvXc$ zDidnR4Z-ByqxGaqhvd>ZovxGUy&D(jGB%rer+!K9_Zwm-`I{PE(yMB)tWk&un)S*D z{O&XF0e9>m7gV;0sso6BJwl;3Y|L;vOb`RMB?ezFLa1j04g$n>u(!}F!fn4OqPWip{!N`9Mh^xekv!F+Vazf(;exA$Lj>pCUclEsJ za%E-3lp2iC$qz(-{zS2tl|F^9^u++vCdbH`m=LA`+EW1WbOTOkYQK(CZnmI#z^Puw zFqKy;FKBt}-g4YaPXrIqkoKs>hjJG+bGqRDz#hz>%?sW*Yg4`ugSJe-YB62>4jleU zng%>+LPIvF_UPS9C6yVE4@LnpX#F7~3_{nGq|d9IKSBfuToG|BoRnvm&O9X@$@<2)!s`@LbmY5?nA#tY!T0o`yOJRX z5cu>?BU=1_`NI7#f;E;eD_}wg5N{KINe=tq0`Okq-!o0%N(5okh*KUg4!q9_x%Bco z0#bx{iJXo{ecNH-JXo)-Qtf>mTEV7DPg*qK=?D)C%`mLY{H$0Br9yE`CclK@nAZ^zK--+eyBSm=i3cL+` zz(E?tEsbo(0v|>9ro)h4p52+%ia!7<0Wgo_a7)DxNQV%x3=gx9)7>=VT*?&KDBo2K=JVJlb4AXw7$yj*tegdwDw_1$Amt}!K9zkR2y?+F)%s1EUH%+6yjp3gZ*6x~ai z==eQA726NGVTer}&`hFL!E*F((s^Ml^$DMU0(V5XZhp6JvlZcaELJp!=?y!7N?vou zVwm4d0;V3G-buKOZcp1Ohn+@+@np*=9+NT%rjc+z;Y{hnG*sB&ZpiRZ8G29fBoWQf z_N{zPNI%JMs{{BR({yXfwaX59BVqwB=BiHC<$7XC`TsAW($)^9Bx<|O+<(HP8ak4H zK0V%lEMLO$)x*90U`ZKH1Cl===pKptV6CR*NACmB6npt)YV8hkx19s7H+>ypd*d0L zq%>i)5*2S!Ul7HoL%u=5;}-K^aH;`J7T}o{Zx=OPNnJ_p^DgjTChqIYrGjJLm#rFp z{t$kcM!yG475{AdE5fmAAw<3jnj4 zRl2fFs;B20S2msQbPBZRb+dQ6XNl*eP1qURPpJJu0BKKM$^#ul9JUM{wjjh=O@d2_ zy}5L(&hX@<)LmB41TKtetZl+B$9?r5iynn6GuD$?6~F?!g1>(O)%@)=Jb@*DVMLR! zO7_tm&}w#&_=HAYWrfWF53?3@PsiU<&RYnfAN6S3J#0yGgPn+3HLGK z!gabel+ZUkxQCK4( ziyjmK@W;HHzY?dmew2(&r%Kw8fm|J~R4d)|`E6{@9-v8_JIbMBM*f0-j8afR31&I> z4Q!#sMT0R~GG z%S~X|5%2>M*9=qRPh&2Bq;@B}!q=#uV6B)Js3x|PsQQey{J?zYKL}m~sd=USYv|gJ z;OCNy!>nxs;X84pI)$2O*`uC#=U3`_k}P}OWf~K`%4WfLqck;@!sp~Z%BF<(qh&V@1KO3hjxg{^}b*{Ru(sZ5TT^7c0dwp5jC$3 zYXikjT3DrhU<$z#EI@k|f>L5`x5jmT=9GXqADlEBaS_^x_>Q8_?!70L12)=VNU4Ce z)ak%|mXitKxSUe#{58Kcy1z@Hz{|^2vF!TBX0it~tL&Alko^9G$~+3=Pp52*-8Idl zO~t}Fw8_crvtg`%ETSGBC|ZYZkjr4Ot-koxr`8<@FcR+$pNs-&1Zf=v`L|wvg@JnV zQ5~pc65ut()r|k_iu_6vFFUsv!)QmEf1js?rR^9M;e!i)SdmH;MHDurgHKW@vc|D1 zx#nYchO_v3-IH6L12)Q?NyX;0>0pTs?=!nU<)}cTsT68|=NU5gNxTc%xSC~SUIdGF z<5g60GDQ{~(f-e!KU!!#L z2A3N)5|8VDZYf6$6il`r9NG>APVJWIW6L|1`xp$ExqPoO zEI&r&KDP~I%&ZeX38(hSLA|J2w1?Hyn`O0>#`6~TrIJO#FhLRCMj6?BHfN(=c&=R} zJCiJ#kPN^u1zNun291#QVoV@;kFY;P{9ooSeoStE+4&bYw5wZjeC{4eOgNVSH$Eng zoiCnu#UvC^?bKs4aW1WS*P%2<*VtpumGxtLI^sJrmTod%>4RDAJ@waae0$K} zgD~2E=afmU;dhD585{(v8t)F?GyTi^KP4stCHB(-!uuAd()$g=5m=XMjRDLk z_sB7Q&!l=OZ7byerKn00vue1dnLjt;FkeD{YsZDC=zE52Fyy<7u+o*w4j;B?!$p7i zNV??!spGk@0%qOb1gs}kMe)nWZ- zX{`4+@8mZqMX!J>ADLF_9sQFeb1k7vD-5dRK$Es4mWP|rJ$uVZM0)at%ddtRKBd%u zn2)n68GXQN(UCwu*3q7pq7F6FL85svHI6brTyOzX$2?A0%y6$#PFS;tUgp)CN}(f$ zmK%U$mgM5ya~JOf5bPgM3FK`_R3D7M>@3u1Wi0P|>47B_<&xrKh)T|1ZiM-PdM_B` z*$Fp;HSe{Vy7!YO13HJqyZv?I8(q98-4X^e`^~4>ssGE;z+q5J0Rle*KL7#%4gj@P aL{&}=1M!F#002RilQ|bf2FDiw0002KgxvE0 delta 5931 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 ZRfMgN^?(-u06~?LKo&&?zZU=i005eZ$|nE- delta 5680 zcmV-07SHLVFpDi1P)h>@KL7#%4giW|=2R>L5ufK3000$;kr+^aG9R(pgvZ?IedlGw z_-vSe8p2>b(e=VHZU?onRCG<1uDSSR*G5){YAx?`FI2Qq32U&2%q?)WS4wsF$dmnO z`Kq8e$-JTFmyL>P#<&rebtS<#z&w<&wH~7s9`-lflNM@JHlYIuGu>gyeM@;y5sSeu zWF5xV_Haa^Jr#0)PydGU^+D(SDqz0udNccw&r|vd&Y+6Sk^kd2wdn4SgZ+K_oq5Nl zobk&n@5Gk;?chOER$V9)uD9=fqvlikM)xgaVDZuG4`h@?8V*{uBI41Nzivh_qp0W#?Sj>&YNla_HC-<8rz6kcTZbzpQ)(2(#wC1(3(BI(~! z#}rI5*I#;n8^eqx0i}VivBQ~<8LxZ^knRN=H-@cNWSekP|DRuefD_l#ue4&&dzP%B zvLzKSMMCLbiarSBaK%e7IpedEYc?Z*3$@ib#z@lSf?mmt{oz60Ia^ohZ&G1_uH)lM z=mq9sdT(;jkG5^Jvb<@-BjM44qf>}OA^d22Se|NsbfC*7?FM?%94LAYVj^ZmBB2zp zBk!@3cf|Nd}`LEnCY#ry2ImWD2qNnx+CE1k!j6<-0OIcY?!|%&3^7J2yd7N6J4ZIo~!VyjG z7>^rF+P|jnq8RB_z@Hl)RwquqTYuT`NOKs?!01?{3DC(7T~Id&_lniQ~ZKcSRS=unzfw*L_mbXN{$Q zm@~aE7Q0u2ZHS~)h&*cLOi1OS<68kHd~Y!=U0{eMbC$N4qI_=Lapn`w6V zTr45d0hU?s5B`T=A3Q3K;h-ZVF zI*0pqMy+SYS_a#c&`m`-9ta1FVXm#4Ag$6LMjD;kW7`T@kHl`(I4QPn%o=z0xXw%^&HD zYw-$~=R|oc$gJe*-~(y;yG8u%3u z|A)gx)e4lg=!Mbz|7QHgh3@nZOVJw`xWVa)u)Sg!M`=yG2f~yT2F#{^*x;mbH>|&5 zZ_Cwss>Q-kr|=MOGKjFH`IgE!p{F)m^>ak#nzOU5VvyvJ{{g-rBFPBMlcyGl1`G^M zI_`{`)+E!iFK|$GKoY6m*sEx`Q;Hcdd7($BL$1eq)xPOy?Z5Vce93TKa!Mlrf=FnY zJ&tMjoC-Woy6aH2$63ICLb^?J)?|AYcy)fHS&;Tz5vw8iOB-bXo_}oG%O}_Yx@T_h z^1`yFM0M!$G1qv^OzIb(EiitTubF{tIyTx|pJo#mg8H)%WAruW8K121Rp?JAbxJKF z1WrH%OCiJvZb3!;SIdMsw z2ry=n&(Ky3k@G))Qc`N5)PEu_3JX!;-+*Qi4$r*3ULP63T^?2zc`>G!lwf~#H~0+w z&nAhSkcs}Z6z-U-xNvi=H}P_U%~0viDa=RaVu|}LQXcs-9m2oPp=R5Fw3eDcZ<;XD zhGg&GE>K`EcN12K_HBoe5PdaW{2-MYr+7vHAAVt z_=7O;|I5IP2BbT)1*1tos3XYd#1fao0ClIWOy@oHb}+gS{EY9>Av;>u?PQc4qbaf8 zf{`Y9ieFIhf_;i8UYj8aO<%h`J!qGw2~A%#L^6$**gNd(% zW#B@D77@iJ)r#ew7F6@>j-vA+9oNO!L;Rw^{v7$WTd;mK7B44%bKU}wi?7@|Z^7I~ z{H>pQG~`L5IWp43@PixN1Ar}69H>GNXHsMk{Av|{-KU)Fe6R$1STZ0B-9AYQe?8l1|%;v8~SZm=ERN3zLLG)ls^^BqB_d{NowDfPv?P;2Yv(d=Evn?^tiDC z+AtG;rBm6fV~|s6xB5}~w#axtQCpw(TK-WTkJ_ymc8902`f^uX=YirC#AQ)J(oWo4^4?BUB_)-WHbY8%Jbg4r1%o=%%NgXck;eW!3HK8Y%>$6gb zzJ>;H`EFTcw}DKappu8?w07?KkoNs}`QjNtTLuJQp6H$Gc>{iOuv*%VO(Zf;t!WTo z&$8w^`2I+GB$z$9L#8-c`HSCa&k~G{rXpYI+3^2wfq?Ms@>{#J-cT61FHSt5f$(a7 zGL<_8-c)eXy)BJfS;q@k%}YX)tss@GDuh1t-viRM29)mH^#1Q2Hd*-#QhZqNp+nUK zw+-2?ehwbTil`7O0&@OjeINo5cD4WK-O&Wn1$~f6rZ{RrSHh+EkrW);^b`MCarKzT zLW!XuaV=|^!+JQGT76ik4EUNo?{SuYsa%cr27OWuamCAH*5gzNSbxR)dxWGlJX zRc8WYp*1y1Zz9YOoRI0U^f41R>)8Do7nrb-$^<49_}^k+u^o0;tp48n*C%dT@h5EF zoNRt;=G`CY_LUsXsAiOQi^#K&)3;1#_$@bxqQi+Z{v)3x!+7+D!SooL3#ny)s`%PD zjeg>rc2X*eOieALEKRuKAfqO>$E`A1VM_H~DjFvYRiXR##_?How)|L|P-VfRK{Gtc!<_LwR? z1+ctulimHt$=;#UlM3=s1nN$I(=|Y+c)|T9)!K1sM=ZlnW3xzm(PoyBgbBU0{9LE% za>qqXBfGp?R2EF|$0ZHD(e`o`xfAxTQ>Zyrw_weKjK1o5l&8+m>%v%p%88INGsr7{ zNEg*yd{2IWbq-I@y6UvG7P3u7X}uK)v^C*R?2wS_8)1W#{r(`h)!t8k9(Zzb;-2E| ztQf4d`x>JpNA5fsWtnc6|3lW9PZKm8kY-w*cjjj2 ztZK`8!|@M5!Bb9ioihEMoqYx40l{b+CsU|&MhQc0G@nIpHz6R`&QvOYGclPX`hLeb z>KqTvN5nqXa(MY2xtI5Uxw6KpTl8=MeG*XZfh&nD)VRfKq~h&X!T#w@7;miRC+cjn zyBGKdRdtXzpGa2YNN;@Ev-Xatd_)4Ad3CCJioBG}AW6mc6YYa;<2eS5TImOO?-Bx9 zEPw-@$mlWwo>ucB0P@++%5trB*fc|ETo!YX1^Y|%q2o~hcCc1|Oa=@Lq~7&-fIKlD z%F)x%J0i*UK}id)jbn^pw;AT|#ST;4mVx2+;8sGY;!6*Gol5Eh0Q73LDeF(0a^}Sn zN#CMas?6L~FImlt!(VDJ_snlgL+j3ZB(ccw0eW3X;Yd~L&s?buy;!Bj-#{^9jiVG( zKA@nV0f{Tu{POyLA>3q4b{5S6u?UgI(COih?TuH%v-YTg->^)%Vn3oQ>97xxWP<*% zi6yH4uc5or0haq9;}ou=oBN1N&kvql4?Ur;;Z`?d1m=rG;3*aVo-zvvswASJ8Lb4d zNI!DXaK4MiXtUOc4VJ~>&Y0QhDP6;AR8i6caSI*7bopF=VQGegZ!JP{j=;)svRf>N z5O?$l=84-03&_K>E8DTv#qMdG&i2N~hcL;RHhPz&rtw!PaWqLu=xsezpVp zv6dXseBX)Xa#3|)BSE(#EAiWOC-w@h&_u%UZQd!J$>=+=j?boEcs-C!FlV;rcgM;z zP&_#dGO7Lb(S4OVC}y!h}IV9D8;?Va97}o0e17cfX~Q(P8c;9To|c+tifza4* zarJ(GqVDBM1C_iKHoETYwcdR0l5ZO3JP&4yy8Kz_8|UGV%Wm_fE3hS+%PRst8&7OJ zC`$h=i(k@A%95&5{TGJh3=(BrJyD#m+sQ$N7T+s%@U~G^Q(Jo`E=2jpO4m8GFOt7p zP|9C{Cv->;woUY1x(Q-yPNnC^mu3xob*;dE6;=nl{Kbn#kFBlaX4keuR(maXo&9@D zSMA|vI+FELdpHAWZY*`jV=69U)*w5skr{)kH;LiP5oX+ir@bXscZ`R%b!x)=FtF$BF_T%c{@$G3xykaz$E#9 zFzv-eB~{!FV#3uJrq6}5tJ>F;Yh#mIB5*S-*pJ<+;3UeYLs?!i8Vq0dxx!%pFthl= zn;_s5sJ((i2&sUu0&IDx?W}Gj4|s^3I*?M2ELCGk{70MXYo6Ga)j43hZK;x9m;ZcY zzMNN*s6qhF%D?Be7*dqz?P&=eU#sAMF@#k;6giycQHQ3j+{W58z9zEpVJ}>7 zLu9X@uSR#OWKQxw8X&`_tbW|seeSAh1EwuGo(J??)D1xLmVL|B9aPV5q@;w&V#=aX zab3E5wH`jzcN`}!FGKi&HNP+Y6>A(|`QibLt45)mM6R@CF1#_laz(nDgi&OP_%8TJ zl5tb@df#8={j;jxu96w_-3^(4kE#UY2LC#Z7gm0Ug6cE=r>JCPzW_O>jZIdiOL;OJ zS#|QAbq`+hc$j1hTn5ny@PUDIlR{VUvfM`A=>quNFpgEH9)m=mdmw)VVH0$Az+tyA zk6k*Ik~0%_nH$fMyfh?V{Ea)eWDSj7)p;=O})dn0ZP>@3M&VUdi_ThU9ZwiyN0!~?70^& z^`|TV9Q%j*oFQAvxsVD8xSF1!n-hr}cl_ktH%VI+3tQg9V|6zXRGTrr3 z{>{C{^>5Oo;daxpCy>K`jd1GGXtBepHM4Y8dm#&#)XOo;(xk5XyF+JNSwf`-j!O}I z>ynJ(Nqx*)2Jaedt7qK-v5%$>;kG=e)M#LnQOO+=FOS4`wg_q~4|+^W%mCMG#$#o9 z-#7ubX=}X_a%ocgY0;b@*CiPa-lQ;*v!lr#GEKZpO>OCt8hCquhvXt+U8q~M>S!tW z0249ko8G5c6{n(#8AS2;o=4Bzjy*CPV(VZiZ&APDXS3&5x>K7&(f{+#KX^Vapw)2a z0FYwr8#PJf3C#S1yxx3CjgBgjre`G?5#TSQU6}!Phm4sJoWigCi4>_+x5@$kBAS+Z zR@yN;ztKQweqLICQYM0AhCM;+KaF>xHgqzWl>e*2TeI1;2gCAt2c+@9aqe0P!bW_Q zY}W`E1F225zwL>D*LRq+wD&#P@0B&rXCU8jawE`5*Y2;+u-hqnZ9Xf2^v!YpuI|Lp`fbfwLfo@r5 zWK#tDD?!4S^RC6h)N7N6L|ALob;q4N8^g=+)ahWsjeH7eJ*DFjtyej@`@BMj3 zIQJOk*uzOX6L#zFu`yS5oL4td#D?0NUkQs*C;-2h3GV*mbsF8@fdNou>c$>PvfxLsHN{Z6fw@ZS} zy~p^$AjdgXA2fT@lRClA+8YI@*gS)x4mtEi;(rN$5G5Ii=j<5)+)vT9E~O%O0F9in zcvKoi3$E)UWiwnhg*kxd<8~Wks$hU0)4VS-U^m&0Nq}q#2($5fiextWDl{IK^Njn` z?>qQyA?6Cim{KFl6s_UMY}|dlDaT58LRfw1DgMpuoKQ;v0zU&k00ICG0E%ShR4fA# WpXU_>000$;li3$V1|}8&0002o%R=S= 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 index a3688063592f63b0a26fc1a926c8aab9ca1baf94..10447105bb8fc6b2ba1508b737857736db48c5ed 100644 GIT binary patch delta 6100 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 aL{-WQSQ3F3002RilRXwi2EZ2p0001D0>R7x delta 5677 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 T000#Mh?CkEMFt}l00000y-eSG 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 index cb145b39d1ce8e40cce5d479643cb87baa58399b..e7cdd8058cb5ab3a98f967d75a8188e13cacf78f 100644 GIT binary patch delta 6093 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 YiQG#D=@kF~6^N7C7exjr761SM0Iz`t%m4rY diff --git a/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.2-compact.zip b/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.2-compact.zip index dcbfc0f06da8513bf9b49b5c7570c6317af3fc6b..a82c5d9a5b2364d0a4ef2b6c12bd85a538bc6351 100644 GIT binary patch delta 5973 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 diff --git a/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.3-compact.zip b/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.3-compact.zip index f88b7f600c87697ee09b3d0a53d4cc43f8d98b43..d4e6e218626200df573a94bc6daa04f42a1855ef 100644 GIT binary patch delta 5970 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 ZRd8!A1b`O+07{mVD;GruzZU=i000l-sLlWY delta 5931 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 N=odBy5f=ae008`tbD01D diff --git a/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.7-compact.zip b/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.7-compact.zip index 1475b4e6da739bc9ae98da748291c2630c3de210..564233c3f4d2a13d8ce25b31d68e55e8f8a0395d 100644 GIT binary patch delta 6093 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 T7XSc=mXjqHMFzkZ00000Ut-i2 delta 5931 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 zGKSFrP)h*PMApigX0000000000fB^si004QD N?-wuz3l{(Y007qfZU_JX diff --git a/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.8-compact.zip b/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.8-compact.zip index f2427cdea3e629bb7d67ae483c3a66180612f8fb..d972371ee2fb4107df90d379e39e6274b1eb7f10 100644 GIT binary patch delta 6074 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 delta 5931 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 diff --git a/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.9-compact.zip b/tests/ast-parsing/compile/yul-0.8.0.sol-0.8.9-compact.zip index cd395e00b2152fae88025db50f10b0b15758ca02..f098c52a04cd54d8c64119ae062c14de9af1ff9d 100644 GIT binary patch delta 6097 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\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(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: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n18->19;\n19[label=\"Node Type: NEW VARIABLE 19\n\"];\n19->20;\n20[label=\"Node Type: EXPRESSION 20\n\"];\n20->21;\n21[label=\"Node Type: NEW VARIABLE 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: NEW VARIABLE 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: EXPRESSION 28\n\"];\n28->29;\n29[label=\"Node Type: EXPRESSION 29\n\"];\n29->30;\n30[label=\"Node Type: NEW VARIABLE 30\n\"];\n30->31;\n31[label=\"Node Type: EXPRESSION 31\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 index c7716d2db..b58e03af7 100644 --- 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 @@ -1,7 +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(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: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n18->19;\n19[label=\"Node Type: NEW VARIABLE 19\n\"];\n19->20;\n20[label=\"Node Type: EXPRESSION 20\n\"];\n20->21;\n21[label=\"Node Type: NEW VARIABLE 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: NEW VARIABLE 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: EXPRESSION 28\n\"];\n28->29;\n29[label=\"Node Type: EXPRESSION 29\n\"];\n29->30;\n30[label=\"Node Type: NEW VARIABLE 30\n\"];\n30->31;\n31[label=\"Node Type: EXPRESSION 31\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 index c7716d2db..b58e03af7 100644 --- 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 @@ -1,7 +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(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: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n18->19;\n19[label=\"Node Type: NEW VARIABLE 19\n\"];\n19->20;\n20[label=\"Node Type: EXPRESSION 20\n\"];\n20->21;\n21[label=\"Node Type: NEW VARIABLE 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: NEW VARIABLE 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: EXPRESSION 28\n\"];\n28->29;\n29[label=\"Node Type: EXPRESSION 29\n\"];\n29->30;\n30[label=\"Node Type: NEW VARIABLE 30\n\"];\n30->31;\n31[label=\"Node Type: EXPRESSION 31\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/yul-0.8.0.sol b/tests/ast-parsing/yul-0.8.0.sol index 663c3372c..449df9135 100644 --- a/tests/ast-parsing/yul-0.8.0.sol +++ b/tests/ast-parsing/yul-0.8.0.sol @@ -70,3 +70,17 @@ function at(address _addr) view returns (bytes memory o_code) { extcodecopy(_addr, add(o_code, 0x20), 0, size) } } + + +function test(){ + + assembly { + let v + } + + assembly { + let v := "test" + } + +} + From 7151478490ea30270b049d411c02d9f34c4dbb93 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Tue, 4 Oct 2022 10:48:20 +0200 Subject: [PATCH 66/87] Minor --- slither/solc_parsing/yul/parse_yul.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/solc_parsing/yul/parse_yul.py b/slither/solc_parsing/yul/parse_yul.py index 0fbb4d790..8c9ee427e 100644 --- a/slither/solc_parsing/yul/parse_yul.py +++ b/slither/solc_parsing/yul/parse_yul.py @@ -808,7 +808,7 @@ def parse_yul_identifier(root: YulScope, _node: YulNode, ast: Dict) -> Optional[ def parse_yul_literal(_root: YulScope, _node: YulNode, ast: Dict) -> Optional[Expression]: kind = ast["kind"] - if kind == 'string': + if kind == "string": # Solc 0.8.0 use value, 0.8.16 use hexValue - not sure when this changed was made if "value" in ast: value = ast["value"] From 07964f93f0e518ccf82efa51bb8cb65fb4bf2ee6 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Tue, 4 Oct 2022 11:19:56 +0200 Subject: [PATCH 67/87] Improvements --- slither/core/declarations/contract.py | 7 +++ slither/core/variables/state_variable.py | 44 +------------------ .../permit_domain_signature_collision.py | 34 ++++++++------ 3 files changed, 29 insertions(+), 56 deletions(-) diff --git a/slither/core/declarations/contract.py b/slither/core/declarations/contract.py index 5d65d5cc5..cfa75f251 100644 --- a/slither/core/declarations/contract.py +++ b/slither/core/declarations/contract.py @@ -316,6 +316,13 @@ class Contract(SourceMapping): # pylint: disable=too-many-public-methods """ return list(self._variables.values()) + @property + def state_variables_entry_points(self) -> List["StateVariable"]: + """ + list(StateVariable): List of the state variables that are public. + """ + return [var for var in self._variables.values() if var.visibility == "public"] + @property def state_variables_ordered(self) -> List["StateVariable"]: """ diff --git a/slither/core/variables/state_variable.py b/slither/core/variables/state_variable.py index 5fd600be0..c9a90f36b 100644 --- a/slither/core/variables/state_variable.py +++ b/slither/core/variables/state_variable.py @@ -1,9 +1,7 @@ -from typing import Optional, TYPE_CHECKING, Tuple, List +from typing import Optional, TYPE_CHECKING from slither.core.children.child_contract import ChildContract from slither.core.variables.variable import Variable -from slither.utils.type import export_nested_types_from_variable -from slither.core.solidity_types.type import Type if TYPE_CHECKING: from slither.core.cfg.node import Node @@ -23,46 +21,6 @@ class StateVariable(ChildContract, Variable): """ return self.contract == contract - ################################################################################### - ################################################################################### - # region Signature and return type of state variable getters - ################################################################################### - ################################################################################### - - @property - def signature(self) -> Tuple[str, List[str], List[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) + ")" - - @property - def solidity_signature(self) -> Optional[str]: - if self.visibility in ["public", "external"]: - name, parameters, _ = self.signature - return f"{name}({','.join(parameters)})" - return None - - @property - def return_type(self) -> Optional[List[Type]]: - if self.visibility in ["public", "external"]: - return [self.type] - return None - # endregion ################################################################################### ################################################################################### diff --git a/slither/detectors/functions/permit_domain_signature_collision.py b/slither/detectors/functions/permit_domain_signature_collision.py index 3a4fdd2f9..7142d7cf1 100644 --- a/slither/detectors/functions/permit_domain_signature_collision.py +++ b/slither/detectors/functions/permit_domain_signature_collision.py @@ -1,9 +1,13 @@ """ Module detecting EIP-2612 domain separator collision """ -from slither.utils.function import get_function_id -from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification +from typing import Union, List + +from slither.core.declarations import Function from slither.core.solidity_types.elementary_type import ElementaryType +from slither.core.variables.state_variable import StateVariable +from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification +from slither.utils.function import get_function_id class DomainSeparatorCollision(AbstractDetector): @@ -39,24 +43,28 @@ contract Contract{ domain_sig = get_function_id("DOMAIN_SEPARATOR()") for contract in self.compilation_unit.contracts_derived: if contract.is_erc20(): - for func in contract.functions_entry_points + contract.state_variables: - # Skip internal and private variables - if func.solidity_signature is None: - continue + funcs_and_vars: List[Union[Function, StateVariable]] = contract.functions_entry_points + contract.state_variables_entry_points # type: ignore + for func_or_var in funcs_and_vars: # External/ public function names should not collide with DOMAIN_SEPARATOR() hash_collision = ( - func.solidity_signature != "DOMAIN_SEPARATOR()" - and get_function_id(func.solidity_signature) == domain_sig + func_or_var.solidity_signature != "DOMAIN_SEPARATOR()" + and get_function_id(func_or_var.solidity_signature) == domain_sig ) # DOMAIN_SEPARATOR() should return bytes32 - incorrect_return_type = ( - func.solidity_signature == "DOMAIN_SEPARATOR()" - and func.return_type[0] != ElementaryType("bytes32") - ) + incorrect_return_type = func_or_var.solidity_signature == "DOMAIN_SEPARATOR()" + if incorrect_return_type: + if isinstance(func_or_var, Function): + incorrect_return_type = ( + not func_or_var.return_type + or func_or_var.return_type[0] != ElementaryType("bytes32") + ) + else: + assert isinstance(func_or_var, StateVariable) + incorrect_return_type = func_or_var.type != ElementaryType("bytes32") if hash_collision or incorrect_return_type: info = [ "The function signature of ", - func, + func_or_var, " collides with DOMAIN_SEPARATOR and should be renamed or removed.\n", ] res = self.generate_result(info) From 43011717f19b821d0f29a113527270d12cb891bd Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Tue, 4 Oct 2022 11:36:27 +0200 Subject: [PATCH 68/87] Update test --- tests/test_function.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_function.py b/tests/test_function.py index 632096a97..5535604a9 100644 --- a/tests/test_function.py +++ b/tests/test_function.py @@ -266,14 +266,15 @@ def test_function_can_send_eth(): assert functions["highlevel_call_via_external()"].can_send_eth() is False -def test_public_variable(): +def test_public_variable() -> None: solc_select.switch_global_version("0.6.12", always_install=True) slither = Slither("tests/test_function.sol") contracts = slither.get_contract_from_name("TestFunction") assert len(contracts) == 1 contract = contracts[0] var = contract.get_state_variable_from_name("info") + assert var assert var.solidity_signature == "info()" assert var.signature_str == "info() returns(bytes32)" assert var.visibility == "public" - assert var.return_type[0] == ElementaryType("bytes32") + assert var.type == ElementaryType("bytes32") From 996712c26df1814052126c27ef28672a50fe25f5 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Tue, 4 Oct 2022 13:43:08 +0200 Subject: [PATCH 69/87] Update readme --- README.md | 158 +++++++++++++++++++++++++++--------------------------- 1 file changed, 80 insertions(+), 78 deletions(-) diff --git a/README.md b/README.md index 588ae6ee8..8765e0125 100644 --- a/README.md +++ b/README.md @@ -54,83 +54,85 @@ Use [solc-select](https://github.com/crytic/solc-select) if your contracts requi 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#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 -7 | `rtlo` | [Right-To-Left-Override control character is used](https://github.com/crytic/slither/wiki/Detector-Documentation#right-to-left-override-character) | High | High -8 | `shadowing-state` | [State variables shadowing](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variable-shadowing) | High | High -9 | `suicidal` | [Functions allowing anyone to destruct the contract](https://github.com/crytic/slither/wiki/Detector-Documentation#suicidal) | High | High -10 | `uninitialized-state` | [Uninitialized state variables](https://github.com/crytic/slither/wiki/Detector-Documentation#uninitialized-state-variables) | High | High -11 | `uninitialized-storage` | [Uninitialized storage variables](https://github.com/crytic/slither/wiki/Detector-Documentation#uninitialized-storage-variables) | High | High -12 | `unprotected-upgrade` | [Unprotected upgradeable contract](https://github.com/crytic/slither/wiki/Detector-Documentation#unprotected-upgradeable-contract) | High | High -13 | `arbitrary-send` | [Functions that send Ether to arbitrary destinations](https://github.com/crytic/slither/wiki/Detector-Documentation#functions-that-send-ether-to-arbitrary-destinations) | High | Medium -14 | `controlled-array-length` | [Tainted array length assignment](https://github.com/crytic/slither/wiki/Detector-Documentation#array-length-assignment) | High | Medium -15 | `controlled-delegatecall` | [Controlled delegatecall destination](https://github.com/crytic/slither/wiki/Detector-Documentation#controlled-delegatecall) | High | Medium -16 | `delegatecall-loop` | [Payable functions using `delegatecall` inside a loop](https://github.com/crytic/slither/wiki/Detector-Documentation/#payable-functions-using-delegatecall-inside-a-loop) | High | Medium -17 | `msg-value-loop` | [msg.value inside a loop](https://github.com/crytic/slither/wiki/Detector-Documentation/#msgvalue-inside-a-loop) | High | Medium -18 | `reentrancy-eth` | [Reentrancy vulnerabilities (theft of ethers)](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities) | High | Medium -19 | `storage-array` | [Signed storage integer array compiler bug](https://github.com/crytic/slither/wiki/Detector-Documentation#storage-signed-integer-array) | High | Medium -20 | `unchecked-transfer` | [Unchecked tokens transfer](https://github.com/crytic/slither/wiki/Detector-Documentation#unchecked-transfer) | High | Medium -21 | `weak-prng` | [Weak PRNG](https://github.com/crytic/slither/wiki/Detector-Documentation#weak-PRNG) | High | Medium -22 | `enum-conversion` | [Detect dangerous enum conversion](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-enum-conversion) | Medium | High -23 | `erc20-interface` | [Incorrect ERC20 interfaces](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-erc20-interface) | Medium | High -24 | `erc721-interface` | [Incorrect ERC721 interfaces](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-erc721-interface) | Medium | High -25 | `incorrect-equality` | [Dangerous strict equalities](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-strict-equalities) | Medium | High -26 | `locked-ether` | [Contracts that lock ether](https://github.com/crytic/slither/wiki/Detector-Documentation#contracts-that-lock-ether) | Medium | High -27 | `mapping-deletion` | [Deletion on mapping containing a structure](https://github.com/crytic/slither/wiki/Detector-Documentation#deletion-on-mapping-containing-a-structure) | Medium | High -28 | `shadowing-abstract` | [State variables shadowing from abstract contracts](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variable-shadowing-from-abstract-contracts) | Medium | High -29 | `tautology` | [Tautology or contradiction](https://github.com/crytic/slither/wiki/Detector-Documentation#tautology-or-contradiction) | Medium | High -30 | `write-after-write` | [Unused write](https://github.com/crytic/slither/wiki/Detector-Documentation#write-after-write) | Medium | High -31 | `boolean-cst` | [Misuse of Boolean constant](https://github.com/crytic/slither/wiki/Detector-Documentation#misuse-of-a-boolean-constant) | Medium | Medium -32 | `constant-function-asm` | [Constant functions using assembly code](https://github.com/crytic/slither/wiki/Detector-Documentation#constant-functions-using-assembly-code) | Medium | Medium -33 | `constant-function-state` | [Constant functions changing the state](https://github.com/crytic/slither/wiki/Detector-Documentation#constant-functions-changing-the-state) | Medium | Medium -34 | `divide-before-multiply` | [Imprecise arithmetic operations order](https://github.com/crytic/slither/wiki/Detector-Documentation#divide-before-multiply) | Medium | Medium -35 | `reentrancy-no-eth` | [Reentrancy vulnerabilities (no theft of ethers)](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-1) | Medium | Medium -36 | `reused-constructor` | [Reused base constructor](https://github.com/crytic/slither/wiki/Detector-Documentation#reused-base-constructors) | Medium | Medium -37 | `tx-origin` | [Dangerous usage of `tx.origin`](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-usage-of-txorigin) | Medium | Medium -38 | `unchecked-lowlevel` | [Unchecked low-level calls](https://github.com/crytic/slither/wiki/Detector-Documentation#unchecked-low-level-calls) | Medium | Medium -39 | `unchecked-send` | [Unchecked send](https://github.com/crytic/slither/wiki/Detector-Documentation#unchecked-send) | Medium | Medium -40 | `uninitialized-local` | [Uninitialized local variables](https://github.com/crytic/slither/wiki/Detector-Documentation#uninitialized-local-variables) | Medium | Medium -41 | `unused-return` | [Unused return values](https://github.com/crytic/slither/wiki/Detector-Documentation#unused-return) | Medium | Medium -42 | `incorrect-modifier` | [Modifiers that can return the default value](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-modifier) | Low | High -43 | `shadowing-builtin` | [Built-in symbol shadowing](https://github.com/crytic/slither/wiki/Detector-Documentation#builtin-symbol-shadowing) | Low | High -44 | `shadowing-local` | [Local variables shadowing](https://github.com/crytic/slither/wiki/Detector-Documentation#local-variable-shadowing) | Low | High -45 | `uninitialized-fptr-cst` | [Uninitialized function pointer calls in constructors](https://github.com/crytic/slither/wiki/Detector-Documentation#uninitialized-function-pointers-in-constructors) | Low | High -46 | `variable-scope` | [Local variables used prior their declaration](https://github.com/crytic/slither/wiki/Detector-Documentation#pre-declaration-usage-of-local-variables) | Low | High -47 | `void-cst` | [Constructor called not implemented](https://github.com/crytic/slither/wiki/Detector-Documentation#void-constructor) | Low | High -48 | `calls-loop` | [Multiple calls in a loop](https://github.com/crytic/slither/wiki/Detector-Documentation/#calls-inside-a-loop) | Low | Medium -49 | `events-access` | [Missing Events Access Control](https://github.com/crytic/slither/wiki/Detector-Documentation#missing-events-access-control) | Low | Medium -50 | `events-maths` | [Missing Events Arithmetic](https://github.com/crytic/slither/wiki/Detector-Documentation#missing-events-arithmetic) | Low | Medium -51 | `incorrect-unary` | [Dangerous unary expressions](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-unary-expressions) | Low | Medium -52 | `missing-zero-check` | [Missing Zero Address Validation](https://github.com/crytic/slither/wiki/Detector-Documentation#missing-zero-address-validation) | Low | Medium -53 | `reentrancy-benign` | [Benign reentrancy vulnerabilities](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-2) | Low | Medium -54 | `reentrancy-events` | [Reentrancy vulnerabilities leading to out-of-order Events](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3) | Low | Medium -55 | `timestamp` | [Dangerous usage of `block.timestamp`](https://github.com/crytic/slither/wiki/Detector-Documentation#block-timestamp) | Low | Medium -56 | `assembly` | [Assembly usage](https://github.com/crytic/slither/wiki/Detector-Documentation#assembly-usage) | Informational | High -57 | `assert-state-change` | [Assert state change](https://github.com/crytic/slither/wiki/Detector-Documentation#assert-state-change) | Informational | High -58 | `boolean-equal` | [Comparison to boolean constant](https://github.com/crytic/slither/wiki/Detector-Documentation#boolean-equality) | Informational | High -59 | `deprecated-standards` | [Deprecated Solidity Standards](https://github.com/crytic/slither/wiki/Detector-Documentation#deprecated-standards) | Informational | High -60 | `erc20-indexed` | [Un-indexed ERC20 event parameters](https://github.com/crytic/slither/wiki/Detector-Documentation#unindexed-erc20-event-parameters) | Informational | High -61 | `function-init-state` | [Function initializing state variables](https://github.com/crytic/slither/wiki/Detector-Documentation#function-initializing-state) | Informational | High -62 | `low-level-calls` | [Low level calls](https://github.com/crytic/slither/wiki/Detector-Documentation#low-level-calls) | Informational | High -63 | `missing-inheritance` | [Missing inheritance](https://github.com/crytic/slither/wiki/Detector-Documentation#missing-inheritance) | Informational | High -64 | `naming-convention` | [Conformity to Solidity naming conventions](https://github.com/crytic/slither/wiki/Detector-Documentation#conformance-to-solidity-naming-conventions) | Informational | High -65 | `pragma` | [If different pragma directives are used](https://github.com/crytic/slither/wiki/Detector-Documentation#different-pragma-directives-are-used) | Informational | High -66 | `redundant-statements` | [Redundant statements](https://github.com/crytic/slither/wiki/Detector-Documentation#redundant-statements) | Informational | High -67 | `solc-version` | [Incorrect Solidity version](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-versions-of-solidity) | Informational | High -68 | `unimplemented-functions` | [Unimplemented functions](https://github.com/crytic/slither/wiki/Detector-Documentation#unimplemented-functions) | Informational | High -69 | `unused-state` | [Unused state variables](https://github.com/crytic/slither/wiki/Detector-Documentation#unused-state-variable) | Informational | High -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-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 -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) +2 | `arbitrary-send-erc20` | [transferFrom uses arbitrary `from`](https://github.com/trailofbits/slither/wiki/Detector-Documentation#arbitrary-send-erc20) | High | High +3 | `array-by-reference` | [Modifying storage array by value](https://github.com/crytic/slither/wiki/Detector-Documentation#modifying-storage-array-by-value) | High | High +4 | `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 +5 | `multiple-constructors` | [Multiple constructor schemes](https://github.com/crytic/slither/wiki/Detector-Documentation#multiple-constructor-schemes) | High | High +6 | `name-reused` | [Contract's name reused](https://github.com/crytic/slither/wiki/Detector-Documentation#name-reused) | High | High +7 | `protected-vars` | [Detected unprotected variables](https://github.com/crytic/slither/wiki/Detector-Documentation#protected-variables) | High | High +8 | `public-mappings-nested` | [Public mappings with nested variables](https://github.com/crytic/slither/wiki/Detector-Documentation#public-mappings-with-nested-variables) | High | High +9 | `rtlo` | [Right-To-Left-Override control character is used](https://github.com/crytic/slither/wiki/Detector-Documentation#right-to-left-override-character) | High | High +10 | `shadowing-state` | [State variables shadowing](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variable-shadowing) | High | High +11 | `suicidal` | [Functions allowing anyone to destruct the contract](https://github.com/crytic/slither/wiki/Detector-Documentation#suicidal) | High | High +12 | `uninitialized-state` | [Uninitialized state variables](https://github.com/crytic/slither/wiki/Detector-Documentation#uninitialized-state-variables) | High | High +13 | `uninitialized-storage` | [Uninitialized storage variables](https://github.com/crytic/slither/wiki/Detector-Documentation#uninitialized-storage-variables) | High | High +14 | `unprotected-upgrade` | [Unprotected upgradeable contract](https://github.com/crytic/slither/wiki/Detector-Documentation#unprotected-upgradeable-contract) | High | High +15 | `arbitrary-send-erc20-permit` | [transferFrom uses arbitrary from with permit](https://github.com/trailofbits/slither/wiki/Detector-Documentation#arbitrary-send-erc20-permit) | High | Medium +16 | `arbitrary-send-eth` | [Functions that send Ether to arbitrary destinations](https://github.com/crytic/slither/wiki/Detector-Documentation#functions-that-send-ether-to-arbitrary-destinations) | High | Medium +17 | `controlled-array-length` | [Tainted array length assignment](https://github.com/crytic/slither/wiki/Detector-Documentation#array-length-assignment) | High | Medium +18 | `controlled-delegatecall` | [Controlled delegatecall destination](https://github.com/crytic/slither/wiki/Detector-Documentation#controlled-delegatecall) | High | Medium +19 | `delegatecall-loop` | [Payable functions using `delegatecall` inside a loop](https://github.com/crytic/slither/wiki/Detector-Documentation/#payable-functions-using-delegatecall-inside-a-loop) | High | Medium +20 | `msg-value-loop` | [msg.value inside a loop](https://github.com/crytic/slither/wiki/Detector-Documentation/#msgvalue-inside-a-loop) | High | Medium +21 | `reentrancy-eth` | [Reentrancy vulnerabilities (theft of ethers)](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities) | High | Medium +22 | `storage-array` | [Signed storage integer array compiler bug](https://github.com/crytic/slither/wiki/Detector-Documentation#storage-signed-integer-array) | High | Medium +23 | `unchecked-transfer` | [Unchecked tokens transfer](https://github.com/crytic/slither/wiki/Detector-Documentation#unchecked-transfer) | High | Medium +24 | `weak-prng` | [Weak PRNG](https://github.com/crytic/slither/wiki/Detector-Documentation#weak-PRNG) | High | Medium +25 | `domain-separator-collision` | [Detects ERC20 tokens that have a function whose signature collides with EIP-2612's DOMAIN_SEPARATOR()](https://github.com/crytic/slither/wiki/Detector-Documentation#domain-separator-collision) | Medium | High +26 | `enum-conversion` | [Detect dangerous enum conversion](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-enum-conversion) | Medium | High +27 | `erc20-interface` | [Incorrect ERC20 interfaces](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-erc20-interface) | Medium | High +28 | `erc721-interface` | [Incorrect ERC721 interfaces](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-erc721-interface) | Medium | High +29 | `incorrect-equality` | [Dangerous strict equalities](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-strict-equalities) | Medium | High +30 | `locked-ether` | [Contracts that lock ether](https://github.com/crytic/slither/wiki/Detector-Documentation#contracts-that-lock-ether) | Medium | High +31 | `mapping-deletion` | [Deletion on mapping containing a structure](https://github.com/crytic/slither/wiki/Detector-Documentation#deletion-on-mapping-containing-a-structure) | Medium | High +32 | `shadowing-abstract` | [State variables shadowing from abstract contracts](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variable-shadowing-from-abstract-contracts) | Medium | High +33 | `tautology` | [Tautology or contradiction](https://github.com/crytic/slither/wiki/Detector-Documentation#tautology-or-contradiction) | Medium | High +34 | `write-after-write` | [Unused write](https://github.com/crytic/slither/wiki/Detector-Documentation#write-after-write) | Medium | High +35 | `boolean-cst` | [Misuse of Boolean constant](https://github.com/crytic/slither/wiki/Detector-Documentation#misuse-of-a-boolean-constant) | Medium | Medium +36 | `constant-function-asm` | [Constant functions using assembly code](https://github.com/crytic/slither/wiki/Detector-Documentation#constant-functions-using-assembly-code) | Medium | Medium +37 | `constant-function-state` | [Constant functions changing the state](https://github.com/crytic/slither/wiki/Detector-Documentation#constant-functions-changing-the-state) | Medium | Medium +38 | `divide-before-multiply` | [Imprecise arithmetic operations order](https://github.com/crytic/slither/wiki/Detector-Documentation#divide-before-multiply) | Medium | Medium +39 | `reentrancy-no-eth` | [Reentrancy vulnerabilities (no theft of ethers)](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-1) | Medium | Medium +40 | `reused-constructor` | [Reused base constructor](https://github.com/crytic/slither/wiki/Detector-Documentation#reused-base-constructors) | Medium | Medium +41 | `tx-origin` | [Dangerous usage of `tx.origin`](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-usage-of-txorigin) | Medium | Medium +42 | `unchecked-lowlevel` | [Unchecked low-level calls](https://github.com/crytic/slither/wiki/Detector-Documentation#unchecked-low-level-calls) | Medium | Medium +43 | `unchecked-send` | [Unchecked send](https://github.com/crytic/slither/wiki/Detector-Documentation#unchecked-send) | Medium | Medium +44 | `uninitialized-local` | [Uninitialized local variables](https://github.com/crytic/slither/wiki/Detector-Documentation#uninitialized-local-variables) | Medium | Medium +45 | `unused-return` | [Unused return values](https://github.com/crytic/slither/wiki/Detector-Documentation#unused-return) | Medium | Medium +46 | `incorrect-modifier` | [Modifiers that can return the default value](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-modifier) | Low | High +47 | `shadowing-builtin` | [Built-in symbol shadowing](https://github.com/crytic/slither/wiki/Detector-Documentation#builtin-symbol-shadowing) | Low | High +48 | `shadowing-local` | [Local variables shadowing](https://github.com/crytic/slither/wiki/Detector-Documentation#local-variable-shadowing) | Low | High +49 | `uninitialized-fptr-cst` | [Uninitialized function pointer calls in constructors](https://github.com/crytic/slither/wiki/Detector-Documentation#uninitialized-function-pointers-in-constructors) | Low | High +50 | `variable-scope` | [Local variables used prior their declaration](https://github.com/crytic/slither/wiki/Detector-Documentation#pre-declaration-usage-of-local-variables) | Low | High +51 | `void-cst` | [Constructor called not implemented](https://github.com/crytic/slither/wiki/Detector-Documentation#void-constructor) | Low | High +52 | `calls-loop` | [Multiple calls in a loop](https://github.com/crytic/slither/wiki/Detector-Documentation/#calls-inside-a-loop) | Low | Medium +53 | `events-access` | [Missing Events Access Control](https://github.com/crytic/slither/wiki/Detector-Documentation#missing-events-access-control) | Low | Medium +54 | `events-maths` | [Missing Events Arithmetic](https://github.com/crytic/slither/wiki/Detector-Documentation#missing-events-arithmetic) | Low | Medium +55 | `incorrect-unary` | [Dangerous unary expressions](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-unary-expressions) | Low | Medium +56 | `missing-zero-check` | [Missing Zero Address Validation](https://github.com/crytic/slither/wiki/Detector-Documentation#missing-zero-address-validation) | Low | Medium +57 | `reentrancy-benign` | [Benign reentrancy vulnerabilities](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-2) | Low | Medium +58 | `reentrancy-events` | [Reentrancy vulnerabilities leading to out-of-order Events](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3) | Low | Medium +59 | `timestamp` | [Dangerous usage of `block.timestamp`](https://github.com/crytic/slither/wiki/Detector-Documentation#block-timestamp) | Low | Medium +60 | `assembly` | [Assembly usage](https://github.com/crytic/slither/wiki/Detector-Documentation#assembly-usage) | Informational | High +61 | `assert-state-change` | [Assert state change](https://github.com/crytic/slither/wiki/Detector-Documentation#assert-state-change) | Informational | High +62 | `boolean-equal` | [Comparison to boolean constant](https://github.com/crytic/slither/wiki/Detector-Documentation#boolean-equality) | Informational | High +63 | `deprecated-standards` | [Deprecated Solidity Standards](https://github.com/crytic/slither/wiki/Detector-Documentation#deprecated-standards) | Informational | High +64 | `erc20-indexed` | [Un-indexed ERC20 event parameters](https://github.com/crytic/slither/wiki/Detector-Documentation#unindexed-erc20-event-parameters) | Informational | High +65 | `function-init-state` | [Function initializing state variables](https://github.com/crytic/slither/wiki/Detector-Documentation#function-initializing-state) | Informational | High +66 | `low-level-calls` | [Low level calls](https://github.com/crytic/slither/wiki/Detector-Documentation#low-level-calls) | Informational | High +67 | `missing-inheritance` | [Missing inheritance](https://github.com/crytic/slither/wiki/Detector-Documentation#missing-inheritance) | Informational | High +68 | `naming-convention` | [Conformity to Solidity naming conventions](https://github.com/crytic/slither/wiki/Detector-Documentation#conformance-to-solidity-naming-conventions) | Informational | High +69 | `pragma` | [If different pragma directives are used](https://github.com/crytic/slither/wiki/Detector-Documentation#different-pragma-directives-are-used) | Informational | High +70 | `redundant-statements` | [Redundant statements](https://github.com/crytic/slither/wiki/Detector-Documentation#redundant-statements) | Informational | High +71 | `solc-version` | [Incorrect Solidity version](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-versions-of-solidity) | Informational | High +72 | `unimplemented-functions` | [Unimplemented functions](https://github.com/crytic/slither/wiki/Detector-Documentation#unimplemented-functions) | Informational | High +73 | `unused-state` | [Unused state variables](https://github.com/crytic/slither/wiki/Detector-Documentation#unused-state-variable) | Informational | High +74 | `costly-loop` | [Costly operations in a loop](https://github.com/crytic/slither/wiki/Detector-Documentation#costly-operations-inside-a-loop) | Informational | Medium +75 | `dead-code` | [Functions that are not used](https://github.com/crytic/slither/wiki/Detector-Documentation#dead-code) | Informational | Medium +76 | `reentrancy-unlimited-gas` | [Reentrancy vulnerabilities through send and transfer](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-4) | Informational | Medium +77 | `similar-names` | [Variable names are too similar](https://github.com/crytic/slither/wiki/Detector-Documentation#variable-names-too-similar) | Informational | Medium +78 | `too-many-digits` | [Conformance to numeric notation best practices](https://github.com/crytic/slither/wiki/Detector-Documentation#too-many-digits) | Informational | Medium +79 | `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 +80 | `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 For more information, see - The [Detector Documentation](https://github.com/crytic/slither/wiki/Detector-Documentation) for details on each detector @@ -249,4 +251,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/). \ No newline at end of file +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 864e1adca24f0957ccb2964ab59b39fbde4b8d96 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Wed, 5 Oct 2022 10:14:26 +0200 Subject: [PATCH 70/87] Fix deps install --- setup.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 4b0c5e8e0..edff7c684 100644 --- a/setup.py +++ b/setup.py @@ -15,7 +15,7 @@ setup( "prettytable>=0.7.2", "pysha3>=1.0.2", # "crytic-compile>=0.2.3", - "crytic-compile", + "crytic-compile@git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile", ], extras_require={ "dev": [ @@ -28,7 +28,6 @@ setup( "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, long_description_content_type="text/markdown", From a008df72bc8ffd6b220ac775d6fd5b9048d00e1d Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Wed, 5 Oct 2022 15:15:17 +0200 Subject: [PATCH 71/87] 0.9.0 --- setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index edff7c684..a9aff790d 100644 --- a/setup.py +++ b/setup.py @@ -8,14 +8,14 @@ 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.3", + version="0.9.0", packages=find_packages(), python_requires=">=3.8", install_requires=[ "prettytable>=0.7.2", "pysha3>=1.0.2", - # "crytic-compile>=0.2.3", - "crytic-compile@git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile", + "crytic-compile>=0.2.4", + # "crytic-compile@git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile", ], extras_require={ "dev": [ From 2e105ee7cc122a9a6ec997b933a3553091dc97dc Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 5 Oct 2022 16:11:30 -0700 Subject: [PATCH 72/87] fix: text for too recent version --- slither/detectors/attributes/incorrect_solc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/detectors/attributes/incorrect_solc.py b/slither/detectors/attributes/incorrect_solc.py index 4f1675b19..d6838328e 100644 --- a/slither/detectors/attributes/incorrect_solc.py +++ b/slither/detectors/attributes/incorrect_solc.py @@ -59,7 +59,7 @@ Consider using the latest version of Solidity for testing.""" OLD_VERSION_TXT = "allows old versions" LESS_THAN_TXT = "uses lesser than" - TOO_RECENT_VERSION_TXT = "necessitates a version too recent to be trusted. Consider deploying with 0.6.12/0.7.6/0.8.7" + TOO_RECENT_VERSION_TXT = "necessitates a version too recent to be trusted. Consider deploying with 0.6.12/0.7.6/0.8.16" BUGGY_VERSION_TXT = ( "is known to contain severe issues (https://solidity.readthedocs.io/en/latest/bugs.html)" ) From 844ab69061383cec1c5973a0851ca3abfe76d919 Mon Sep 17 00:00:00 2001 From: PatrickAlphac <54278053+PatrickAlphaC@users.noreply.github.com> Date: Thu, 6 Oct 2022 11:19:13 -0400 Subject: [PATCH 73/87] updated formatting of Unprotected upgradeable contract so syntax highlighting applies in github wiki --- .../statements/unprotected_upgradeable.py | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/slither/detectors/statements/unprotected_upgradeable.py b/slither/detectors/statements/unprotected_upgradeable.py index c91b5bb16..25be6a5ae 100644 --- a/slither/detectors/statements/unprotected_upgradeable.py +++ b/slither/detectors/statements/unprotected_upgradeable.py @@ -65,21 +65,22 @@ class UnprotectedUpgradeable(AbstractDetector): # region wiki_exploit_scenario WIKI_EXPLOIT_SCENARIO = """ - ```solidity - contract Buggy is Initializable{ - address payable owner; - - function initialize() external initializer{ - require(owner == address(0)); - owner = msg.sender; - } - function kill() external{ - require(msg.sender == owner); - selfdestruct(owner); - } +```solidity +contract Buggy is Initializable{ + address payable owner; + + function initialize() external initializer{ + require(owner == address(0)); + owner = msg.sender; + } + function kill() external{ + require(msg.sender == owner); + selfdestruct(owner); } - ``` - Buggy is an upgradeable contract. Anyone can call initialize on the logic contract, and destruct the contract.""" +} +``` +Buggy is an upgradeable contract. Anyone can call initialize on the logic contract, and destruct the contract. +""" # endregion wiki_exploit_scenario WIKI_RECOMMENDATION = ( From ac7c2a65451c3d4b73711c7e6966bf7bf5affa9b Mon Sep 17 00:00:00 2001 From: Dario Date: Wed, 12 Oct 2022 10:33:46 +0200 Subject: [PATCH 74/87] Fix detection of library events Fixes https://github.com/crytic/slither/issues/1407 --- slither/slithir/convert.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index 829a23e92..a35c50220 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -827,7 +827,7 @@ 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 ins.ori.variable_left.events_as_dict: + if str(ins.ori.variable_right) in [f.name for f in ins.ori.variable_left.events]: eventcall = EventCall(ins.ori.variable_right) eventcall.set_expression(ins.expression) eventcall.call_id = ins.call_id From 66605e0a3473c353669f196250f207b758063479 Mon Sep 17 00:00:00 2001 From: Emre Tepe Date: Sat, 15 Oct 2022 04:59:34 +0300 Subject: [PATCH 75/87] Update __main__.py changed mainet to mainnet --- slither/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/__main__.py b/slither/__main__.py index 98320c76a..70357586e 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -291,7 +291,7 @@ def parse_args( usage += "\ntarget can be:\n" usage += "\t- file.sol // a Solidity file\n" usage += "\t- project_directory // a project directory. See https://github.com/crytic/crytic-compile/#crytic-compile for the supported platforms\n" - usage += "\t- 0x.. // a contract on mainet\n" + usage += "\t- 0x.. // a contract on mainnet\n" usage += f"\t- NETWORK:0x.. // a contract on a different network. Supported networks: {','.join(x[:-1] for x in SUPPORTED_NETWORK)}\n" parser = argparse.ArgumentParser( From 55e5bd2ddf1d858650fdffb961efc1ec0091717c Mon Sep 17 00:00:00 2001 From: zhiqiangxu <652732310@qq.com> Date: Tue, 18 Oct 2022 22:53:20 +0800 Subject: [PATCH 76/87] remove redundant get_scope calls --- slither/solc_parsing/slither_compilation_unit_solc.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/slither/solc_parsing/slither_compilation_unit_solc.py b/slither/solc_parsing/slither_compilation_unit_solc.py index 3054b4470..d12bda1b4 100644 --- a/slither/solc_parsing/slither_compilation_unit_solc.py +++ b/slither/solc_parsing/slither_compilation_unit_solc.py @@ -257,7 +257,6 @@ class SlitherCompilationUnitSolc: scope.accessible_scopes.append(get_imported_scope) elif top_level_data[self.get_key()] == "StructDefinition": - scope = self.compilation_unit.get_scope(filename) st = StructureTopLevel(self.compilation_unit, scope) st.set_offset(top_level_data["src"], self._compilation_unit) st_parser = StructureTopLevelSolc(st, top_level_data, self) @@ -279,7 +278,6 @@ class SlitherCompilationUnitSolc: self._variables_top_level_parser.append(var_parser) scope.variables[var.name] = var elif top_level_data[self.get_key()] == "FunctionDefinition": - scope = self.compilation_unit.get_scope(filename) func = FunctionTopLevel(self._compilation_unit, scope) scope.functions.add(func) func.set_offset(top_level_data["src"], self._compilation_unit) @@ -290,7 +288,6 @@ class SlitherCompilationUnitSolc: self.add_function_or_modifier_parser(func_parser) elif top_level_data[self.get_key()] == "ErrorDefinition": - scope = self.compilation_unit.get_scope(filename) custom_error = CustomErrorTopLevel(self._compilation_unit, scope) custom_error.set_offset(top_level_data["src"], self._compilation_unit) From 65ff5894c02c302b1dd5939d6bc57f26fb496884 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 18 Oct 2022 15:59:52 -0500 Subject: [PATCH 77/87] fix triage prompt not displaying --- slither/detectors/abstract_detector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/detectors/abstract_detector.py b/slither/detectors/abstract_detector.py index 528981c92..4ebead96a 100644 --- a/slither/detectors/abstract_detector.py +++ b/slither/detectors/abstract_detector.py @@ -189,7 +189,7 @@ class AbstractDetector(metaclass=abc.ABCMeta): if results and self.slither.triage_mode: while True: indexes = input( - f'Results to hide during next runs: "0,1,...,{len(results)}" or "All" (enter to not hide results): ' + f'Results to hide during next runs: "0,1,...,{len(results)}" or "All" (enter to not hide results):\n' ) if indexes == "All": self.slither.save_results_to_hide(results) From a92477db60d54ad353b818e67a4e25120ea18641 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Wed, 26 Oct 2022 11:03:52 +0200 Subject: [PATCH 78/87] Improve slither-flat suppport of top level objects --- slither/tools/flattening/flattening.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/slither/tools/flattening/flattening.py b/slither/tools/flattening/flattening.py index ef793f2f2..74a93ba2d 100644 --- a/slither/tools/flattening/flattening.py +++ b/slither/tools/flattening/flattening.py @@ -4,7 +4,7 @@ import uuid from collections import namedtuple from enum import Enum as PythonEnum from pathlib import Path -from typing import List, Set, Dict, Optional +from typing import List, Set, Dict, Optional, Sequence from slither.core.compilation_unit import SlitherCompilationUnit from slither.core.declarations import SolidityFunction, EnumContract, StructureContract @@ -78,12 +78,12 @@ class Flattening: 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: + def _get_source_code_top_level(self, elems: Sequence[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"] + 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): From 997b6b5fe39e5cbef926d080896563cf8e646aca Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Wed, 26 Oct 2022 13:52:06 +0200 Subject: [PATCH 79/87] Add testcase --- .../library_event-0.8.16.sol-0.8.16-compact.zip | Bin 0 -> 1876 bytes .../library_event-0.8.16.sol-0.8.16-compact.json | 6 ++++++ tests/ast-parsing/library_event-0.8.16.sol | 12 ++++++++++++ tests/test_ast_parsing.py | 1 + 4 files changed, 19 insertions(+) create mode 100644 tests/ast-parsing/compile/library_event-0.8.16.sol-0.8.16-compact.zip create mode 100644 tests/ast-parsing/expected/library_event-0.8.16.sol-0.8.16-compact.json create mode 100644 tests/ast-parsing/library_event-0.8.16.sol diff --git a/tests/ast-parsing/compile/library_event-0.8.16.sol-0.8.16-compact.zip b/tests/ast-parsing/compile/library_event-0.8.16.sol-0.8.16-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..830c0e4e8803e2224e2c9de9eb3f97374d15ac2b GIT binary patch literal 1876 zcmb8w`9IT-0|)T8tEe2gK3I-fNxrjY%tvmy5;Ai}EQB!ECLfF#A9sw}_oF#7a*SN% zt`Ox@7@{cmJJ$MCp)_e>&om?08l3Z z08jt`us-fMH(WTzGt@I6L>Ug#fT^g%@PSy2XIM}mE(GI-^SJL5>Iw732L|wQ^8hXY z5CZ@@NlD(SN2h4**Ut+UtHl$o${+Ku3wV!iBm@*oek`n8eO9M;EZ6o&<%rw&wdu;`>naoZ^=`f@9FU<4_`q7hCT zJ+5-nS57RC?QTO1BBC0Y7nOWhPdd_~vPNpICRS@Uw^%k?z?sq+UJkW&Qpsg{9`IIn zOhWCLR~o*LRr%cERL=^0Pr=02 zn03v7VV~;u>)gw&TY_`hMc`#aGR~7!UmGl<{KZdH<$n0Tg14|V+~kD&y^EH0NC&!o zz3=IS!>ai7Awl#z;P(8tvPBVXwF_!PQ}WN=$V1NvwK|iBKFG-2S7m7F^sd+j<+27r z(whRG?O`u3u=8Zo`(%k79}7dIQsQ;KI46EQ9(gvbvz`1N$*l&zN_o457WR+kRD1ko z!)#VMsXvD5n;J}uIMALkIqt=Xq3WTwd zV3cW4sJ_Ill{S@kQwF1>UiX|6j#NdRm*j@G9Z<{ZdY>k?2^(FuPbm?LO{OTM3D=^9 zQv$O(a|J(NTf+fW%ng&wSic1+cz8K$%Ev5B_#n-|&MfD_x=}?rO3M@4!J(FSXRkAz zZbNgnLxW7mJdHYgr71KcO9Zz6>Ti$9Ht;c&$3tn)nRnQJ{LLO6Rv6S$h zi4_d&RVOJDPjy?%+c1vmH#kS*Zz;R>D@G_qMt&0)rq7P~n6c-Qh*dNaz^&$R!{l%%8D z${|rD3jF@wWALnD-kU}m)FHki4vaaAe{}R^-~e}UHU@lkB>JGFko5-)Z@4tuh}H)k z>~dT)p1QGj#1$qa63fs=giNXW;+$QT1GIk;Gqu`CQ62 zkuy4l#E@FCxV|nCRoql+DfMiCq1&pzt8y0WVx7e2#}%thCM3>s-C~~T4IXnQUcef& zzP8CdTnpVzfEk=C@1g5PYBzQ?rL)C$7Gi%RKOtO(dq4?3%0lD(jL`^LrLNOqaBk|uJ z2oEu-DLc7bL{Z($90{KGZfPC4nU+fIUE=TkvAANJ tlauDd$xxIz2d5s_|5ol7bpIrV1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + } +} \ No newline at end of file diff --git a/tests/ast-parsing/library_event-0.8.16.sol b/tests/ast-parsing/library_event-0.8.16.sol new file mode 100644 index 000000000..dfb6d1d65 --- /dev/null +++ b/tests/ast-parsing/library_event-0.8.16.sol @@ -0,0 +1,12 @@ +pragma solidity 0.8.16; + +library Lib { + event Event(); +} + +contract Test { + function foo() external { + emit Lib.Event(); // This line specifically + } +} + diff --git a/tests/test_ast_parsing.py b/tests/test_ast_parsing.py index f94103893..ab51714ee 100644 --- a/tests/test_ast_parsing.py +++ b/tests/test_ast_parsing.py @@ -424,6 +424,7 @@ ALL_TESTS = [ 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"]), + Test("library_event-0.8.16.sol", ["0.8.16"]) ] # create the output folder if needed try: From 93a36990ac2cfed6cc627d68d35af32a1a9ea01c Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Wed, 26 Oct 2022 14:10:52 +0200 Subject: [PATCH 80/87] Minor --- tests/test_ast_parsing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_ast_parsing.py b/tests/test_ast_parsing.py index ab51714ee..e96a129b8 100644 --- a/tests/test_ast_parsing.py +++ b/tests/test_ast_parsing.py @@ -424,7 +424,7 @@ ALL_TESTS = [ 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"]), - Test("library_event-0.8.16.sol", ["0.8.16"]) + Test("library_event-0.8.16.sol", ["0.8.16"]), ] # create the output folder if needed try: From 566da16875179a77279792db8f2dd57acf7cde9f Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Wed, 26 Oct 2022 14:34:38 +0200 Subject: [PATCH 81/87] Code quality improvements --- .../possible_const_state_variables.py | 81 ++++++++++--------- 1 file changed, 44 insertions(+), 37 deletions(-) diff --git a/slither/detectors/variables/possible_const_state_variables.py b/slither/detectors/variables/possible_const_state_variables.py index 9ae30d254..e5b35bb79 100644 --- a/slither/detectors/variables/possible_const_state_variables.py +++ b/slither/detectors/variables/possible_const_state_variables.py @@ -1,17 +1,40 @@ """ Module detecting state variables that could be declared as constant """ +from typing import Set, List, Dict + from slither.core.compilation_unit import SlitherCompilationUnit from slither.core.solidity_types.elementary_type import ElementaryType from slither.core.solidity_types.user_defined_type import UserDefinedType +from slither.core.variables.variable import Variable from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification +from slither.utils.output import Output from slither.visitors.expression.export_values import ExportValues -from slither.core.declarations import Contract +from slither.core.declarations import Contract, Function from slither.core.declarations.solidity_variables import SolidityFunction from slither.core.variables.state_variable import StateVariable from slither.formatters.variables.possible_const_state_variables import custom_format +def _is_valid_type(v: StateVariable) -> bool: + t = v.type + if isinstance(t, ElementaryType): + return True + if isinstance(t, UserDefinedType) and isinstance(t.type, Contract): + return True + return False + + +def _valid_candidate(v: StateVariable) -> bool: + return _is_valid_type(v) and not (v.is_constant or v.is_immutable) + + +def _is_constant_var(v: Variable) -> bool: + if isinstance(v, StateVariable): + return v.is_constant + return False + + class ConstCandidateStateVars(AbstractDetector): """ State variables that could be declared as constant detector. @@ -31,21 +54,6 @@ class ConstCandidateStateVars(AbstractDetector): WIKI_DESCRIPTION = "Constant state variables should be declared constant to save gas." WIKI_RECOMMENDATION = "Add the `constant` attributes to state variables that never change." - - @staticmethod - def _is_valid_type(v): - t = v.type - if isinstance(t, ElementaryType): - return True - if isinstance(t, UserDefinedType) and isinstance(t.type, Contract): - return True - return False - - - @staticmethod - def _valid_candidate(v): - return ConstCandidateStateVars._is_valid_type(v) and not (v.is_constant or v.is_immutable) - # https://solidity.readthedocs.io/en/v0.5.2/contracts.html#constant-state-variables valid_solidity_function = [ SolidityFunction("keccak256()"), @@ -59,13 +67,7 @@ class ConstCandidateStateVars(AbstractDetector): SolidityFunction("mulmod(uint256,uint256,uint256)"), ] - @staticmethod - def _is_constant_var(v): - if isinstance(v, StateVariable): - return v.is_constant - return False - - def _constant_initial_expression(self, v): + def _constant_initial_expression(self, v: Variable) -> bool: if not v.expression: return True @@ -73,34 +75,39 @@ class ConstCandidateStateVars(AbstractDetector): values = export.result() if not values: return True - if all( - (val in self.valid_solidity_function or self._is_constant_var(val) for val in values) - ): + if all((val in self.valid_solidity_function or _is_constant_var(val) for val in values)): return True return False - def _detect(self): + def _detect(self) -> List[Output]: """Detect state variables that could be const""" results = [] - all_variables = [c.state_variables for c in self.compilation_unit.contracts] - all_variables = {item for sublist in all_variables for item in sublist} - all_non_constant_elementary_variables = { - v for v in all_variables if self._valid_candidate(v) + all_variables_l = [c.state_variables for c in self.compilation_unit.contracts] + all_variables: Set[StateVariable] = { + item for sublist in all_variables_l for item in sublist } - - all_functions = [c.all_functions_called for c in self.compilation_unit.contracts] - all_functions = list({item for sublist in all_functions for item in sublist}) + all_non_constant_elementary_variables = {v for v in all_variables if _valid_candidate(v)} + + all_functions_nested = [c.all_functions_called for c in self.compilation_unit.contracts] + all_functions = list( + { + item1 + for sublist in all_functions_nested + for item1 in sublist + if isinstance(item1, Function) + } + ) all_variables_written = [ f.state_variables_written for f in all_functions if not f.is_constructor_variables ] all_variables_written = {item for sublist in all_variables_written for item in sublist} - constable_variables = [ + constable_variables: List[Variable] = [ v for v in all_non_constant_elementary_variables - if (not v in all_variables_written) and self._constant_initial_expression(v) + if (v not in all_variables_written) and self._constant_initial_expression(v) ] # Order for deterministic results constable_variables = sorted(constable_variables, key=lambda x: x.canonical_name) @@ -114,5 +121,5 @@ class ConstCandidateStateVars(AbstractDetector): return results @staticmethod - def _format(compilation_unit: SlitherCompilationUnit, result): + def _format(compilation_unit: SlitherCompilationUnit, result: Dict) -> None: custom_format(compilation_unit, result) From 4479b61f2ff25cd22735590a770e7d4521b8013c Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 26 Oct 2022 08:45:49 -0500 Subject: [PATCH 82/87] use state_variables_ordered API it should be used over `(state_)variables` as it includes inherited, private variables, too. fixes #1322 --- slither/tools/read_storage/read_storage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/tools/read_storage/read_storage.py b/slither/tools/read_storage/read_storage.py index fd881c05e..bb662c4d5 100644 --- a/slither/tools/read_storage/read_storage.py +++ b/slither/tools/read_storage/read_storage.py @@ -253,7 +253,7 @@ class SlitherReadStorage: func, [ (contract, var) - for var in contract.variables + for var in contract.state_variables_ordered if not var.is_constant and not var.is_immutable ], ) From 882fc95756e876f93c4248dd6050c16d6a5a5c41 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 28 Jun 2022 12:30:00 -0500 Subject: [PATCH 83/87] replace pysha3 with pycryptodome --- setup.py | 2 +- slither/printers/summary/function_ids.py | 2 +- slither/utils/function.py | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/setup.py b/setup.py index 0b67d5070..169ed65cf 100644 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ setup( python_requires=">=3.8", install_requires=[ "prettytable>=0.7.2", - "pysha3>=1.0.2", + "pycryptodome>=3.15.0", "crytic-compile>=0.2.4", # "crytic-compile@git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile", ], diff --git a/slither/printers/summary/function_ids.py b/slither/printers/summary/function_ids.py index 368a81382..ca02dd754 100644 --- a/slither/printers/summary/function_ids.py +++ b/slither/printers/summary/function_ids.py @@ -9,7 +9,7 @@ from slither.utils.myprettytable import MyPrettyTable class FunctionIds(AbstractPrinter): ARGUMENT = "function-id" - HELP = "Print the keccack256 signature of the functions" + HELP = "Print the keccak256 signature of the functions" WIKI = "https://github.com/trailofbits/slither/wiki/Printer-documentation#function-id" diff --git a/slither/utils/function.py b/slither/utils/function.py index b86d8f4eb..1c3741cc7 100644 --- a/slither/utils/function.py +++ b/slither/utils/function.py @@ -1,4 +1,4 @@ -import sha3 +from Crypto.Hash import keccak def get_function_id(sig: str) -> int: @@ -9,6 +9,6 @@ def get_function_id(sig: str) -> int: Return: (int) """ - s = sha3.keccak_256() - s.update(sig.encode("utf-8")) - return int("0x" + s.hexdigest()[:8], 16) + hash = keccak.new(digest_bits=256) + hash.update(sig.encode("utf-8")) + return int("0x" + hash.hexdigest()[:8], 16) From 44a45e75a4036fa51c076f20d7fd2c04168156f3 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Sun, 6 Nov 2022 20:40:43 -0600 Subject: [PATCH 84/87] fix "redefine builtin" lint error --- slither/utils/function.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/slither/utils/function.py b/slither/utils/function.py index 1c3741cc7..34e6f221b 100644 --- a/slither/utils/function.py +++ b/slither/utils/function.py @@ -9,6 +9,6 @@ def get_function_id(sig: str) -> int: Return: (int) """ - hash = keccak.new(digest_bits=256) - hash.update(sig.encode("utf-8")) - return int("0x" + hash.hexdigest()[:8], 16) + digest = keccak.new(digest_bits=256) + digest.update(sig.encode("utf-8")) + return int("0x" + digest.hexdigest()[:8], 16) From 970380785d0c3c36d231570d5d8d5d1be90ce2ea Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Mon, 7 Nov 2022 14:50:48 +0000 Subject: [PATCH 85/87] fix broken links --- slither/detectors/erc/erc20/arbitrary_send_erc20_no_permit.py | 2 +- slither/detectors/erc/erc20/arbitrary_send_erc20_permit.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/slither/detectors/erc/erc20/arbitrary_send_erc20_no_permit.py b/slither/detectors/erc/erc20/arbitrary_send_erc20_no_permit.py index 8e29ecbef..f43b6302e 100644 --- a/slither/detectors/erc/erc20/arbitrary_send_erc20_no_permit.py +++ b/slither/detectors/erc/erc20/arbitrary_send_erc20_no_permit.py @@ -14,7 +14,7 @@ class ArbitrarySendErc20NoPermit(AbstractDetector): IMPACT = DetectorClassification.HIGH CONFIDENCE = DetectorClassification.HIGH - WIKI = "https://github.com/trailofbits/slither/wiki/Detector-Documentation#arbitrary-send-erc20" + WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#arbitrary-from-in-transferfrom" WIKI_TITLE = "Arbitrary `from` in transferFrom" WIKI_DESCRIPTION = "Detect when `msg.sender` is not used as `from` in transferFrom." diff --git a/slither/detectors/erc/erc20/arbitrary_send_erc20_permit.py b/slither/detectors/erc/erc20/arbitrary_send_erc20_permit.py index 48e80772b..b28a973b3 100644 --- a/slither/detectors/erc/erc20/arbitrary_send_erc20_permit.py +++ b/slither/detectors/erc/erc20/arbitrary_send_erc20_permit.py @@ -14,7 +14,7 @@ class ArbitrarySendErc20Permit(AbstractDetector): IMPACT = DetectorClassification.HIGH CONFIDENCE = DetectorClassification.MEDIUM - WIKI = "https://github.com/trailofbits/slither/wiki/Detector-Documentation#arbitrary-send-erc20-permit" + WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#arbitrary-from-in-transferfrom" WIKI_TITLE = "Arbitrary `from` in transferFrom used with permit" WIKI_DESCRIPTION = ( From eb730bebf2ac9ef34e5c2f9471e1021aee9ed9d5 Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Mon, 7 Nov 2022 14:53:22 +0000 Subject: [PATCH 86/87] update link for permit --- slither/detectors/erc/erc20/arbitrary_send_erc20_permit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/detectors/erc/erc20/arbitrary_send_erc20_permit.py b/slither/detectors/erc/erc20/arbitrary_send_erc20_permit.py index b28a973b3..1d311c442 100644 --- a/slither/detectors/erc/erc20/arbitrary_send_erc20_permit.py +++ b/slither/detectors/erc/erc20/arbitrary_send_erc20_permit.py @@ -14,7 +14,7 @@ class ArbitrarySendErc20Permit(AbstractDetector): IMPACT = DetectorClassification.HIGH CONFIDENCE = DetectorClassification.MEDIUM - WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#arbitrary-from-in-transferfrom" + WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#arbitrary-from-in-transferfrom-used-with-permit" WIKI_TITLE = "Arbitrary `from` in transferFrom used with permit" WIKI_DESCRIPTION = ( From 99c973d3e2124f1e80aff33f11b5552e0e56e19a Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 7 Nov 2022 08:54:13 -0600 Subject: [PATCH 87/87] more compatible version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 169ed65cf..e7ffc8758 100644 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ setup( python_requires=">=3.8", install_requires=[ "prettytable>=0.7.2", - "pycryptodome>=3.15.0", + "pycryptodome>=3.4.6", "crytic-compile>=0.2.4", # "crytic-compile@git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile", ],