From 0f54c6430cbc99dd597cc86962fa05f0b8170beb Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 20 Mar 2023 10:46:26 -0500 Subject: [PATCH 1/3] guess solc if pragma is avail, better error if file is a dir --- crytic_compile/platform/solc.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/crytic_compile/platform/solc.py b/crytic_compile/platform/solc.py index eb000442..60b2c82f 100644 --- a/crytic_compile/platform/solc.py +++ b/crytic_compile/platform/solc.py @@ -10,6 +10,9 @@ from pathlib import Path from typing import TYPE_CHECKING, Dict, List, Optional, Union, Any +from packaging import version +from solc_select import solc_select + from crytic_compile.compilation_unit import CompilationUnit from crytic_compile.compiler.compiler import CompilerVersion from crytic_compile.platform.abstract_platform import AbstractPlatform @@ -479,16 +482,33 @@ def _run_solc( Returns: Dict: Json compilation artifacts """ + if not os.path.isfile(filename) and ( not working_dir or not os.path.isfile(os.path.join(str(working_dir), filename)) ): - raise InvalidCompilation(f"{filename} does not exist (are you in the correct directory?)") + if os.path.isdir(filename): + raise InvalidCompilation( + f"{filename} is a directory. Expected a Solidity file when not using a compilation framework." + ) + else: + raise InvalidCompilation( + f"{filename} does not exist. Are you in the correct working directory?" + ) if not filename.endswith(".sol"): raise InvalidCompilation("Incorrect file format") + env_version = get_version(solc, env) + + guessed_version = _guess_solc(filename, working_dir)[0] + + if version.parse(env_version) != version.parse(guessed_version): + + solc_select.switch_global_version(guessed_version, always_install=True) + env_version = guessed_version + compilation_unit.compiler_version = CompilerVersion( - compiler="solc", version=get_version(solc, env), optimized=is_optimized(solc_arguments) + compiler="solc", version=env_version, optimized=is_optimized(solc_arguments) ) compiler_version = compilation_unit.compiler_version From 687da8c453a8107d18d77af99d9df1bbdd129923 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 20 Mar 2023 10:52:35 -0500 Subject: [PATCH 2/3] handle case where no match is found --- crytic_compile/platform/solc.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/crytic_compile/platform/solc.py b/crytic_compile/platform/solc.py index 60b2c82f..85791907 100644 --- a/crytic_compile/platform/solc.py +++ b/crytic_compile/platform/solc.py @@ -499,17 +499,16 @@ def _run_solc( raise InvalidCompilation("Incorrect file format") env_version = get_version(solc, env) - - guessed_version = _guess_solc(filename, working_dir)[0] - - if version.parse(env_version) != version.parse(guessed_version): - - solc_select.switch_global_version(guessed_version, always_install=True) - env_version = guessed_version - - compilation_unit.compiler_version = CompilerVersion( - compiler="solc", version=env_version, optimized=is_optimized(solc_arguments) - ) + pragma_matches = _guess_solc(filename, working_dir) + if len(pragma_matches): + guessed_version = pragma_matches[0] + if version.parse(env_version) != version.parse(guessed_version): + solc_select.switch_global_version(guessed_version, always_install=True) + env_version = guessed_version + + compilation_unit.compiler_version = CompilerVersion( + compiler="solc", version=env_version, optimized=is_optimized(solc_arguments) + ) compiler_version = compilation_unit.compiler_version assert compiler_version From 0e5457afa28723fb39c419c4d0e3e2097d4235a8 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 20 Mar 2023 10:57:06 -0500 Subject: [PATCH 3/3] move compiler version out of if statement --- crytic_compile/platform/solc.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crytic_compile/platform/solc.py b/crytic_compile/platform/solc.py index 85791907..2594746b 100644 --- a/crytic_compile/platform/solc.py +++ b/crytic_compile/platform/solc.py @@ -506,9 +506,9 @@ def _run_solc( solc_select.switch_global_version(guessed_version, always_install=True) env_version = guessed_version - compilation_unit.compiler_version = CompilerVersion( - compiler="solc", version=env_version, optimized=is_optimized(solc_arguments) - ) + compilation_unit.compiler_version = CompilerVersion( + compiler="solc", version=env_version, optimized=is_optimized(solc_arguments) + ) compiler_version = compilation_unit.compiler_version assert compiler_version