diff --git a/crytic_compile/compilation_unit.py b/crytic_compile/compilation_unit.py index d0ae18d3..253b2360 100644 --- a/crytic_compile/compilation_unit.py +++ b/crytic_compile/compilation_unit.py @@ -45,7 +45,7 @@ def __init__(self, crytic_compile: "CryticCompile", unique_id: str): # compiler.compiler self._compiler_version: CompilerVersion = CompilerVersion( - compiler="N/A", version="N/A", optimized=False + compiler="N/A", version="N/A", optimized=False, via_ir=False ) # if the compilation unit comes from etherscan-like service and is a proxy, diff --git a/crytic_compile/compiler/compiler.py b/crytic_compile/compiler/compiler.py index bca43d26..1f1ef1f9 100644 --- a/crytic_compile/compiler/compiler.py +++ b/crytic_compile/compiler/compiler.py @@ -18,20 +18,23 @@ def __init__( version: str | None, optimized: bool | None, optimize_runs: int | None = None, + via_ir: bool | None = None, ) -> None: """ - Initialize a compier version object + Initialize a compiler version object Args: compiler (str): compiler (in most of the case use "solc") version (str): compiler version optimized (Optional[bool]): true if optimization are enabled optimize_runs (Optional[int]): optimize runs number + via_ir: (Optional[bool]): true if --via-ir is used """ self.compiler: str = compiler self.version: str | None = version self.optimized: bool | None = optimized self.optimize_runs: int | None = optimize_runs + self.via_ir: bool | None = via_ir def look_for_installed_version(self) -> None: """ diff --git a/crytic_compile/platform/etherscan.py b/crytic_compile/platform/etherscan.py index b32d0f72..24c72c2a 100644 --- a/crytic_compile/platform/etherscan.py +++ b/crytic_compile/platform/etherscan.py @@ -468,6 +468,7 @@ def compile(self, crytic_compile: "CryticCompile", **kwargs: str) -> None: version=compiler_version, optimized=optimization_used, optimize_runs=optimize_runs, + via_ir=via_ir_enabled if via_ir_enabled else False, ) compilation_unit.compiler_version.look_for_installed_version() diff --git a/crytic_compile/platform/hardhat.py b/crytic_compile/platform/hardhat.py index fd63f4ad..491c4515 100755 --- a/crytic_compile/platform/hardhat.py +++ b/crytic_compile/platform/hardhat.py @@ -85,9 +85,10 @@ def hardhat_like_parsing( if "optimizer" in input_json["settings"] else False ) + via_ir = input_json["settings"]["viaIR"] if "viaIR" in input_json["settings"] else False compilation_unit.compiler_version = CompilerVersion( - compiler=compiler, version=version_from_config, optimized=optimized + compiler=compiler, version=version_from_config, optimized=optimized, via_ir=via_ir ) skip_filename = compilation_unit.compiler_version.version in [ diff --git a/crytic_compile/platform/solc.py b/crytic_compile/platform/solc.py index 50ca2762..820fa337 100644 --- a/crytic_compile/platform/solc.py +++ b/crytic_compile/platform/solc.py @@ -410,6 +410,20 @@ def is_optimized(solc_arguments: str | None) -> bool: return False +def is_via_ir(solc_arguments: str | None) -> bool: + """Check if --via-ir is used + + Args: + solc_arguments (Optional[str]): Solc arguments to check + + Returns: + bool: True if --via-ir is used + """ + if solc_arguments: + return "--via-ir" in solc_arguments or "--experimental-via-ir" in solc_arguments + return False + + def _build_options(compiler_version: CompilerVersion, force_legacy_json: bool) -> str: """ Build the solc command line options @@ -488,7 +502,10 @@ def _run_solc( raise InvalidCompilation(f"{filename} is not the expected format '.sol'") compilation_unit.compiler_version = CompilerVersion( - compiler="solc", version=get_version(solc, env), optimized=is_optimized(solc_arguments) + compiler="solc", + version=get_version(solc, env), + optimized=is_optimized(solc_arguments), + via_ir=is_via_ir(solc_arguments), ) compiler_version = compilation_unit.compiler_version diff --git a/crytic_compile/platform/solc_standard_json.py b/crytic_compile/platform/solc_standard_json.py index 9215ed25..69152b1d 100644 --- a/crytic_compile/platform/solc_standard_json.py +++ b/crytic_compile/platform/solc_standard_json.py @@ -17,6 +17,7 @@ Solc, get_version, is_optimized, + is_via_ir, relative_to_short, ) from crytic_compile.platform.types import Type @@ -473,6 +474,8 @@ def compile(self, crytic_compile: "CryticCompile", **kwargs: Any) -> None: optimized=is_optimized(solc_arguments) or self.to_dict().get("settings", {}).get("optimizer", {}).get("enabled", False), optimize_runs=self.to_dict().get("settings", {}).get("optimizer", {}).get("runs", None), + via_ir=is_via_ir(solc_arguments) + or self.to_dict().get("settings", {}).get("viaIR", False), ) add_optimization( diff --git a/crytic_compile/platform/sourcify.py b/crytic_compile/platform/sourcify.py index 35ae59ae..6c60e9d5 100644 --- a/crytic_compile/platform/sourcify.py +++ b/crytic_compile/platform/sourcify.py @@ -288,6 +288,7 @@ def compile(self, crytic_compile: "CryticCompile", **kwargs: str) -> None: optimizer = settings.get("optimizer", {}) optimization_used = optimizer.get("enabled", False) remappings = _sanitize_remappings(settings.get("remappings", []), working_dir) or None + via_ir = settings.get("viaIR") # Create and configure compilation unit compilation_unit = CompilationUnit(crytic_compile, compilation.get("name", "Contract")) @@ -296,6 +297,7 @@ def compile(self, crytic_compile: "CryticCompile", **kwargs: str) -> None: version=compiler_version, optimized=optimization_used, optimize_runs=optimizer.get("runs") if optimization_used else None, + via_ir=via_ir, ) compilation_unit.compiler_version.look_for_installed_version() diff --git a/crytic_compile/platform/vyper.py b/crytic_compile/platform/vyper.py index 5f7e6268..64f7a19a 100644 --- a/crytic_compile/platform/vyper.py +++ b/crytic_compile/platform/vyper.py @@ -81,7 +81,7 @@ def compile(self, crytic_compile: "CryticCompile", **kwargs: str) -> None: if compiler_version != "0.3.7": LOGGER.info("Vyper != 0.3.7 support is a best effort and might fail") compilation_unit.compiler_version = CompilerVersion( - compiler="vyper", version=compiler_version, optimized=False + compiler="vyper", version=compiler_version, optimized=False, via_ir=False ) for source_file, contract_info in compilation_artifacts["contracts"].items():